diff --git a/radio/src/gui/colorlcd/confirm_dialog.cpp b/radio/src/gui/colorlcd/confirm_dialog.cpp index 453daf182..0508401da 100644 --- a/radio/src/gui/colorlcd/confirm_dialog.cpp +++ b/radio/src/gui/colorlcd/confirm_dialog.cpp @@ -26,35 +26,42 @@ ConfirmDialog::ConfirmDialog(Window* parent, const char* title, const char* message, - std::function confirmHandler) : + std::function confirmHandler, + std::function cancelHandler) : Dialog(parent, title, rect_t{}), - confirmHandler(std::move(confirmHandler)) + confirmHandler(std::move(confirmHandler)), + cancelHandler(std::move(cancelHandler)) { auto form = &content->form; auto msg = new StaticText(form, rect_t{}, message); msg->padAll(lv_dpx(16)); - lv_obj_set_style_bg_color(content->getLvObj(), makeLvColor(COLOR_THEME_SECONDARY3), 0); + lv_obj_set_style_bg_color(content->getLvObj(), + makeLvColor(COLOR_THEME_SECONDARY3), 0); auto box = new FormGroup(form, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW); + lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0); - auto box_obj = box->getLvObj(); - lv_obj_set_style_flex_main_place(box_obj, LV_FLEX_ALIGN_SPACE_EVENLY, 0); - auto btn = new TextButton(box, rect_t{}, STR_NO, [=]() -> int8_t { - this->deleteLater(); + onCancel(); return 0; }); - lv_obj_set_width(btn->getLvObj(), LV_DPI_DEF); + btn->setWidth(LV_DPI_DEF); btn = new TextButton(box, rect_t{}, STR_YES, [=]() -> int8_t { this->deleteLater(); this->confirmHandler(); return 0; }); - lv_obj_set_width(btn->getLvObj(), LV_DPI_DEF); + btn->setWidth(LV_DPI_DEF); content->setWidth(LCD_W * 0.8); content->updateSize(); } + +void ConfirmDialog::onCancel() +{ + deleteLater(); + if (cancelHandler) cancelHandler(); +} diff --git a/radio/src/gui/colorlcd/confirm_dialog.h b/radio/src/gui/colorlcd/confirm_dialog.h index 3db62ec85..6940af622 100644 --- a/radio/src/gui/colorlcd/confirm_dialog.h +++ b/radio/src/gui/colorlcd/confirm_dialog.h @@ -28,10 +28,14 @@ class ConfirmDialog : public Dialog { public: ConfirmDialog(Window* parent, const char* title, const char* message, - std::function confirmHandler); + std::function confirmHandler, + std::function cancelHandler = nullptr); protected: std::function confirmHandler; + std::function cancelHandler; + + void onCancel() override; }; -#endif // _CONFIRM_DIALOG_H_ +#endif // _CONFIRM_DIALOG_H_ diff --git a/radio/src/gui/colorlcd/page.cpp b/radio/src/gui/colorlcd/page.cpp index ec95c8546..7d682e3a9 100644 --- a/radio/src/gui/colorlcd/page.cpp +++ b/radio/src/gui/colorlcd/page.cpp @@ -31,7 +31,7 @@ PageHeader::PageHeader(Page * parent, uint8_t icon): #if defined(HARDWARE_TOUCH) new Button(this, { 0, 0, MENU_HEADER_BACK_BUTTON_WIDTH, MENU_HEADER_BACK_BUTTON_HEIGHT }, [=]() -> uint8_t { - parent->deleteLater(); + parent->onCancel(); return 0; }, NO_FOCUS | FORM_NO_BORDER); #endif @@ -76,7 +76,8 @@ void Page::paint(BitmapBuffer * dc) void Page::onCancel() { - deleteLater(); + if (canCancel()) + deleteLater(); } void Page::onClicked() diff --git a/radio/src/gui/colorlcd/page.h b/radio/src/gui/colorlcd/page.h index ee85f14d4..3a267f19a 100644 --- a/radio/src/gui/colorlcd/page.h +++ b/radio/src/gui/colorlcd/page.h @@ -58,6 +58,8 @@ class Page : public Window void paint(BitmapBuffer* dc) override; void deleteLater(bool detach = true, bool trash = true) override; + virtual bool canCancel() { return true; } + protected: PageHeader header; FormWindow body; diff --git a/radio/src/gui/colorlcd/radio_theme.cpp b/radio/src/gui/colorlcd/radio_theme.cpp index 1b5cf65cf..03658563d 100644 --- a/radio/src/gui/colorlcd/radio_theme.cpp +++ b/radio/src/gui/colorlcd/radio_theme.cpp @@ -368,17 +368,23 @@ class ThemeEditPage : public Page buildHeader(&header); } - void deleteLater(bool detach = true, bool trash = true) override + bool canCancel() override { if (_dirty) { - if (confirmationDialog("Save Theme?", _theme.getName())) { - if (saveHandler != nullptr) { - saveHandler(_theme); - } - } + new ConfirmDialog( + this, STR_SAVE_THEME, _theme.getName(), + [=]() { + if (saveHandler != nullptr) { + saveHandler(_theme); + } + deleteLater(); + }, + [=]() { + deleteLater(); + }); + return false; } - - Page::deleteLater(detach, trash); + return true; } void editColorPage() @@ -401,10 +407,7 @@ class ThemeEditPage : public Page } // page title - new StaticText(window, - {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, - PAGE_LINE_HEIGHT}, - STR_EDIT_THEME, 0, COLOR_THEME_PRIMARY2 | flags); + header.setTitle(STR_EDIT_THEME); _themeName = new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, @@ -561,15 +564,17 @@ void ThemeSetupPage::displayThemeMenu(Window *window, ThemePersistance *tp) }); }); - // you cant delete the default theme or the currently active theme + // you can't delete the default theme or the currently active theme if (listBox->getSelected() != 0 && listBox->getSelected() != tp->getThemeIndex()) { menu->addLine(STR_DELETE, [=] () { - if (confirmationDialog("Delete Theme?", tp->getThemeByIndex(listBox->getSelected())->getName())) { - tp->deleteThemeByIndex(listBox->getSelected()); - listBox->setNames(tp->getNames()); - currentTheme = min(currentTheme, tp->getNames().size() - 1); - listBox->setSelected(currentTheme); - } + new ConfirmDialog( + window, STR_DELETE_THEME, + tp->getThemeByIndex(listBox->getSelected())->getName(), [=] { + tp->deleteThemeByIndex(listBox->getSelected()); + listBox->setNames(tp->getNames()); + currentTheme = min(currentTheme, tp->getNames().size() - 1); + listBox->setSelected(currentTheme); + }); }); } } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index ec905f2bd..c1c4a9d64 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -823,6 +823,8 @@ const char STR_LEFT_STICK[] = TR_LEFT_STICK; const char STR_SHOW_MIXER_MONITORS[] = TR_SHOW_MIXER_MONITORS; const char STR_MODEL_QUICK_SELECT[] = TR_MODEL_QUICK_SELECT; const char STR_LOADING[] = TR_LOADING; +const char STR_DELETE_THEME[] = TR_DELETE_THEME; +const char STR_SAVE_THEME[] = TR_SAVE_THEME; #endif #if !defined(COLORLCD) diff --git a/radio/src/translations.h b/radio/src/translations.h index 390838eb4..b5ea52c94 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -743,6 +743,8 @@ extern const char STR_LEFT_STICK[]; extern const char STR_SHOW_MIXER_MONITORS[]; extern const char STR_MODEL_QUICK_SELECT[]; extern const char STR_LOADING[]; +extern const char STR_DELETE_THEME[]; +extern const char STR_SAVE_THEME[]; #endif extern const char STR_EXECUTE_FILE[]; extern const char STR_DELETE_FILE[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 543e47557..6e82d81e7 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -775,6 +775,8 @@ #define TR_SAMPLE_MODE "采样模式" #define TR_SAMPLE_MODES "标准","OneBit" #define TR_LOADING "加载中..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "快速选择模型" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 7535f3714..c5e1918d8 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -681,7 +681,7 @@ #define TR_COPY_MODEL "Kopírovat" #define TR_MOVE_MODEL "Přesunout model" #define TR_BACKUP_MODEL "Zálohovat na SD kartu" -#define TR_DELETE_MODEL "Smaž model" +#define TR_DELETE_MODEL "Smazat model" #define TR_RESTORE_MODEL "Obnov model z SD karty" #define TR_DELETE_ERROR "Nelze odstranit" #define TR_SDCARD_ERROR "Chyba SD karty" @@ -791,9 +791,11 @@ #define TR_TIME "Čas" #define TR_MAXBAUDRATE "Max baudů" #define TR_BAUDRATE "Baudrate" -#define TR_SAMPLE_MODE "Sample Mode" -#define TR_SAMPLE_MODES "Normal","OneBit" +#define TR_SAMPLE_MODE "Vzorkovací režim" +#define TR_SAMPLE_MODES "Normální","OneBit" #define TR_LOADING "Načítání..." +#define TR_DELETE_THEME "Smazat motiv?" +#define TR_SAVE_THEME "Uložit motiv?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Rychlý výběr modelu" @@ -1161,7 +1163,7 @@ #define TR_REMOVE_SCREEN "Odstranit panel" #define TR_SETUP_WIDGETS "Nastavit widgety" #define TR_USER_INTERFACE "Uživatelské rozhraní" -#define TR_THEME "Téma" +#define TR_THEME "Motiv" #define TR_SETUP "Nastavení" #define TR_LAYOUT "Rozložení" #define TR_ADD_MAIN_VIEW "Přidat hlavní panel" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 9dc641804..e2ec574f9 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -781,6 +781,8 @@ #define TR_SAMPLE_MODE "Måle tilstand" #define TR_SAMPLE_MODES "Normal","EnBit" #define TR_LOADING "Indlæser..." +#define TR_DELETE_THEME "Slet tema?" +#define TR_SAVE_THEME "Gem tema?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Hurtigvalg af model" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 333b4a58f..94d62946b 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -776,6 +776,8 @@ #define TR_SAMPLE_MODE "Abtastmodus" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Wird geladen..." +#define TR_DELETE_THEME "Theme löschen?" +#define TR_SAVE_THEME "Theme speichern?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "schnelle Modellauswahl" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index b86f98048..fcab8b8d3 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -774,6 +774,8 @@ #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Model quick select" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index e4795197d..1416451a2 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -775,6 +775,8 @@ #define TR_SAMPLE_MODE "Modo de muestra" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Model quick select" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 2bc45b26d..ba1a56f02 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -803,6 +803,8 @@ #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Mallin pikavalinta" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 71121b6b4..6762f0f2a 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -796,6 +796,8 @@ #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal""OneBit" #define TR_LOADING "Loading..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Model quick select" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index fa19e116f..46fa2b52c 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -776,6 +776,8 @@ #define TR_SAMPLE_MODE "Modo Semplice" #define TR_SAMPLE_MODES "Normale","OneBit" #define TR_LOADING "Caricamento..." +#define TR_DELETE_THEME "Cancello Tema?" +#define TR_SAVE_THEME "Salvo Tema?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Selezione veloce modello" diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index ea8b37fbd..7921b255a 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -775,6 +775,8 @@ #define TR_SAMPLE_MODE "サンプルモード" #define TR_SAMPLE_MODES "標準","OneBit" #define TR_LOADING "読み込み中..." +#define TR_DELETE_THEME "テーマを削除しますか?" +#define TR_SAVE_THEME "テーマを保存しますか?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "モデル クイックセレクト" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 0461b7157..c38d72b99 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -780,6 +780,8 @@ #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal""OneBit" #define TR_LOADING "Loading..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Model quick select" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 163eeb379..ce2c76aff 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -772,6 +772,8 @@ #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Ładowanie..." +#define TR_DELETE_THEME "Usunąć motyw?" +#define TR_SAVE_THEME "Zapisać motyw?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Szybki wybór modelu" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 9928ddd19..2302e7dec 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -779,6 +779,8 @@ #define TR_SAMPLE_MODE "Sample Mode" #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Loading..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Model quick select" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 3bb48ade6..5bf438d14 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -817,6 +817,8 @@ #define TR_SAMPLE_MODE TR("Sample mod.", "Sample Mode") #define TR_SAMPLE_MODES "Normal","OneBit" #define TR_LOADING "Laddar..." +#define TR_DELETE_THEME "Radera tema?" +#define TR_SAVE_THEME "Spara tema?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "Snabbval av modell" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 219159406..973444d81 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -775,6 +775,8 @@ #define TR_SAMPLE_MODE "採樣模式" #define TR_SAMPLE_MODES "標準","OneBit" #define TR_LOADING "加載中..." +#define TR_DELETE_THEME "Delete Theme?" +#define TR_SAVE_THEME "Save Theme?" #if defined(COLORLCD) #define TR_MODEL_QUICK_SELECT "快速選擇模型"