Release v0.6.33: warn about unsaved settings and expose menu access keys
This commit is contained in:
+43
-2
@@ -867,6 +867,7 @@ LRESULT CALLBACK historyProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
|
||||
AppendMenuW(menu, MF_STRING, 113, L"&Delete");
|
||||
AppendMenuW(menu, MF_STRING, 114, selectedImage(w,v)?L"&Edit image in screenshot editor":L"&Open full item");
|
||||
AppendMenuW(menu, MF_STRING, 115, L"&Copy text from image (OCR)");
|
||||
showMenuAccessKeys(menu);
|
||||
int cmd = TrackPopupMenu(menu, TPM_RETURNCMD, p.x, p.y, 0, w, nullptr);
|
||||
DestroyMenu(menu);
|
||||
if (cmd)
|
||||
@@ -1338,6 +1339,46 @@ void showOcrOptions(HWND parent, SettingsView *v)
|
||||
showRequestedWindow(w); SetForegroundWindow(w);
|
||||
}
|
||||
#include "ui_sync.inl"
|
||||
bool settingsChanged(HWND w, SettingsView *v)
|
||||
{
|
||||
try
|
||||
{
|
||||
return encodeSettings(collectSettings(w, v)) != encodeSettings(v->app->settings);
|
||||
}
|
||||
catch (const std::exception &)
|
||||
{
|
||||
// Invalid edits are unsaved changes too. Allow discarding them without
|
||||
// requiring the user to repair the fields first.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
void closeSettings(HWND w, SettingsView *v)
|
||||
{
|
||||
if (settingsChanged(w, v))
|
||||
{
|
||||
int choice = MessageBoxW(w,
|
||||
L"You have unsaved settings changes. Save them before closing?\n\n"
|
||||
L"Yes: save and close.\nNo: discard changes.\nCancel: keep editing.",
|
||||
L"KSwitcher — Unsaved settings", MB_YESNOCANCEL | MB_ICONWARNING | MB_DEFBUTTON3);
|
||||
if (choice != IDYES && choice != IDNO)
|
||||
return;
|
||||
if (choice == IDYES)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (v->app->busy)
|
||||
throw std::runtime_error("Wait for the current text operation to finish");
|
||||
v->app->applySettings(collectSettings(w, v));
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
error(w, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
DestroyWindow(w);
|
||||
}
|
||||
LRESULT CALLBACK settingsProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
|
||||
{
|
||||
if (msg == WM_DPICHANGED)
|
||||
@@ -1403,7 +1444,7 @@ LRESULT CALLBACK settingsProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
|
||||
}
|
||||
if (id == IDCANCEL)
|
||||
{
|
||||
DestroyWindow(w);
|
||||
closeSettings(w, v);
|
||||
return 0;
|
||||
}
|
||||
if (id == 250)
|
||||
@@ -1454,7 +1495,7 @@ LRESULT CALLBACK settingsProc(HWND w, UINT msg, WPARAM wp, LPARAM lp)
|
||||
break;
|
||||
}
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(w);
|
||||
closeSettings(w, v);
|
||||
return 0;
|
||||
case WM_NCDESTROY:
|
||||
disposeFont(w);
|
||||
|
||||
Reference in New Issue
Block a user