chore(color): support for reverting UI for 2.12 (#6823)

Co-authored-by: philmoz <phil.a.mitchell@gmail.com>
This commit is contained in:
Peter Feerick
2025-11-25 13:17:06 +10:00
committed by GitHub
co-authored by philmoz
parent ef32172454
commit 2932822e37
43 changed files with 537 additions and 100 deletions
@@ -386,7 +386,7 @@ Node convert<GeneralSettings>::encode(const GeneralSettings& rhs)
node["modelCustomScriptsDisabled"] = (int)rhs.modelCustomScriptsDisabled;
node["modelTelemetryDisabled"] = (int)rhs.modelTelemetryDisabled;
if (hasColorLcd) {
if (hasColorLcd && VERSION_MAJOR > 2) {
for (int i = 0; i < MAX_KEYSHORTCUTS; i += 1)
if (rhs.keyShortcuts[i] != GeneralSettings::QM_NONE)
node["keyShortcuts"][std::to_string(i)]["shortcut"] = QMPageLut << rhs.keyShortcuts[i];
+2 -2
View File
@@ -1092,9 +1092,9 @@ void GeneralSettings::setDefaultFavorites()
void GeneralSettings::setDefaultKeyShortcuts()
{
keyShortcuts[0] = QM_MODEL_SETUP; // MDL short
keyShortcuts[1] = QM_OPEN_QUICK_MENU; // SYS short
keyShortcuts[1] = (VERSION_MAJOR == 2) ? QM_TOOLS_APPS : QM_OPEN_QUICK_MENU; // SYS short
keyShortcuts[2] = QM_UI_SCREEN1; // TELE short
keyShortcuts[3] = QM_MANAGE_MODELS; // MDL long
keyShortcuts[4] = QM_TOOLS_APPS; // SYS long
keyShortcuts[4] = (VERSION_MAJOR == 2) ? QM_RADIO_SETUP : QM_TOOLS_APPS; // SYS long
keyShortcuts[5] = QM_TOOLS_CHAN_MON; // TELE long
}
@@ -358,9 +358,9 @@ int OpenTxFirmware::getCapability(::Capability capability)
return 46;
}
case QMFavourites:
return Boards::getCapability(board, Board::HasColorLcd) ? MAX_QMFAVOURITES : 0;
return VERSION_MAJOR > 2 && Boards::getCapability(board, Board::HasColorLcd) ? MAX_QMFAVOURITES : 0;
case KeyShortcuts:
return Boards::getCapability(board, Board::HasColorLcd) ? MAX_KEYSHORTCUTS : 0;
return VERSION_MAJOR > 2 && Boards::getCapability(board, Board::HasColorLcd) ? MAX_KEYSHORTCUTS : 0;
default:
return 0;
}
@@ -85,7 +85,6 @@ GeneralKeysPanel::GeneralKeysPanel(QWidget * parent, GeneralSettings & generalSe
GeneralKeysPanel::~GeneralKeysPanel()
{
}
void GeneralKeysPanel::addLabel(QString text)
+5
View File
@@ -1162,8 +1162,13 @@ PACK(struct RadioData {
NOBACKUP(uint8_t pwrOffIfInactive);
#if defined(COLORLCD)
#if VERSION_MAJOR == 2
NOBACKUP(QuickMenuPage keyShortcuts[MAX_KEY_SHORTCUTS] SKIP);
NOBACKUP(QuickMenuPage qmFavorites[MAX_QM_FAVORITES] SKIP);
#else
NOBACKUP(QuickMenuPage keyShortcuts[MAX_KEY_SHORTCUTS]);
NOBACKUP(QuickMenuPage qmFavorites[MAX_QM_FAVORITES]);
#endif
#endif
NOBACKUP(uint8_t getBrightness() const
+7 -1
View File
@@ -25,6 +25,7 @@
#include "tasks/mixer_task.h"
#if defined(COLORLCD)
#include "quick_menu_def.h"
#include "view_main.h"
#endif
@@ -159,9 +160,14 @@ void RadioData::defaultKeyShortcuts()
{
setKeyShortcut(EVT_KEY_BREAK(KEY_MODEL), QM_MODEL_SETUP);
setKeyShortcut(EVT_KEY_LONG(KEY_MODEL), QM_MANAGE_MODELS);
#if VERSION_MAJOR == 2
setKeyShortcut(EVT_KEY_BREAK(KEY_SYS), QM_TOOLS_APPS);
setKeyShortcut(EVT_KEY_LONG(KEY_SYS), QM_RADIO_SETUP);
#else
setKeyShortcut(EVT_KEY_BREAK(KEY_SYS), QM_OPEN_QUICK_MENU);
setKeyShortcut(EVT_KEY_LONG(KEY_SYS), QM_TOOLS_APPS);
#endif
setKeyShortcut(EVT_KEY_BREAK(KEY_TELE), QM_UI_SCREEN1);
setKeyShortcut(EVT_KEY_LONG(KEY_TELE), QM_TOOLS_CHAN_MON);
}
#endif
#endif
+6
View File
@@ -78,11 +78,17 @@ Page::Page(EdgeTxIcon icon, PaddingSize padding, bool pauseRefresh) :
header = new PageHeader(this, icon);
#if VERSION_MAJOR > 2
new HeaderBackIcon(header);
#endif
#if defined(HARDWARE_TOUCH)
#if VERSION_MAJOR == 2
addCustomButton(0, 0, [=]() { onCancel(); });
#else
addCustomButton(0, 0, [=]() { openMenu(); });
addCustomButton(LCD_W - EdgeTxStyles::MENU_HEADER_HEIGHT, 0, [=]() { onCancel(); });
#endif
#endif
body = new Window(this,
@@ -186,8 +186,9 @@ void ScreenSetupPage::build(Window* window)
#endif
btn = new TextButton(line, rect_t{}, STR_SETUP_WIDGETS,
[=]() -> uint8_t {
auto idx = customScreenIndex;
window->getParent()->deleteLater();
new SetupWidgetsPage(customScreenIndex);
new SetupWidgetsPage(idx);
return 0;
});
lv_obj_set_style_grid_cell_y_align(btn->getLvObj(), LV_GRID_ALIGN_CENTER, 0);
@@ -274,3 +275,47 @@ void ScreenSetupPage::buildLayoutOptions()
}
}
}
#if VERSION_MAJOR == 2
ScreenAddPage::ScreenAddPage(PageDef& pageDef) : PageGroupItem(pageDef)
{
}
void ScreenAddPage::build(Window* window)
{
std::string s = replaceAll(STR_QM_ADD_SCREEN, "\n", " ");
new TextButton(window,
rect_t{LCD_W / 2 - ADD_TXT_W / 2, window->height() / 2 - EdgeTxStyles::UI_ELEMENT_HEIGHT, ADD_TXT_W, EdgeTxStyles::UI_ELEMENT_HEIGHT},
s, [this]() -> uint8_t {
int newIdx = 1;
for (; newIdx < MAX_CUSTOM_SCREENS; newIdx += 1)
if (customScreens[newIdx] == nullptr)
break;
TRACE("Add screen: add screen: newIdx = %d", newIdx);
auto& screen = customScreens[newIdx];
const LayoutFactory* factory = defaultLayout;
if (factory) {
TRACE("Add screen: add screen: factory = %p", factory);
auto viewMain = ViewMain::instance();
screen = factory->create(viewMain, newIdx);
viewMain->addMainView(screen, newIdx);
g_model.setScreenLayoutId(newIdx, factory->getId());
TRACE("Add screen: add screen: LayoutId = %s", g_model.getScreenLayoutId(newIdx));
Layer::getPageGroup()->deleteLater();
QuickMenu::openPage((QMPage)(QM_UI_SCREEN1 + newIdx));
storageDirty(EE_MODEL);
} else {
TRACE("Add screen: factory is NULL");
}
return 0;
});
}
#endif
@@ -25,6 +25,19 @@
#include "screen_user_interface.h"
#include "radio_theme.h"
#if VERSION_MAJOR == 2
class ScreenAddPage : public PageGroupItem
{
public:
ScreenAddPage(PageDef& pageDef);
void build(Window* window) override;
protected:
static LAYOUT_VAL_SCALED(ADD_TXT_W, 200)
};
#endif
class ScreenSetupPage : public PageGroupItem
{
public:
@@ -25,6 +25,9 @@
#include "libopenui.h"
#include "model_select.h"
#include "edgetx.h"
#if VERSION_MAJOR == 2
#include "view_logical_switches.h"
#endif
// TODO: find better way to detect only used channels!
#define ALL_CHANNELS true
@@ -161,5 +164,9 @@ ChannelsViewMenu::ChannelsViewMenu() :
i = end;
}
#if VERSION_MAJOR == 2
addTab(new LogicalSwitchesViewPage());
#endif
if (pages < 2) hidePageButtons();
}
@@ -24,6 +24,7 @@
#include "edgetx.h"
#include "switches.h"
#include "etx_lv_theme.h"
#include "quick_menu.h"
#if PORTRAIT
@@ -234,6 +235,12 @@ class LogicalSwitchDisplayButton : public TextButton
bool value = false;
};
LogicalSwitchesViewPage::LogicalSwitchesViewPage() :
PageGroupItem(STR_MONITOR_SWITCHES, QM_TOOLS_LS_MON)
{
setIcon(ICON_MONITOR_LOGICAL_SWITCHES);
}
LogicalSwitchesViewPage::LogicalSwitchesViewPage(PageDef& pageDef) :
PageGroupItem(pageDef)
{
@@ -28,6 +28,7 @@ class LogicalSwitchDisplayFooter;
class LogicalSwitchesViewPage : public PageGroupItem
{
public:
LogicalSwitchesViewPage();
LogicalSwitchesViewPage(PageDef& pageDef);
static LAYOUT_ORIENTATION_SCALED(FOOTER_HEIGHT, 20, 40)
@@ -36,5 +37,6 @@ class LogicalSwitchesViewPage : public PageGroupItem
protected:
void build(Window* window) override;
LogicalSwitchDisplayFooter* footer = nullptr;
};
@@ -27,6 +27,7 @@
#include "tasks/mixer_task.h"
#include "mixer_scheduler.h"
#include "lua/lua_states.h"
#include "quick_menu.h"
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_FR(1), LV_GRID_FR(1),
@@ -128,6 +129,11 @@ class ThrottleCurveWindow : public Window
int16_t graphSize = 0;
};
StatisticsViewPage::StatisticsViewPage(PageDef& pageDef) :
PageGroupItem(pageDef)
{
}
void StatisticsViewPage::build(Window* window)
{
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
@@ -201,6 +207,11 @@ void StatisticsViewPage::build(Window* window)
LV_GRID_ALIGN_START, 0, 1);
}
DebugViewPage::DebugViewPage(PageDef& pageDef) :
PageGroupItem(pageDef)
{
}
void DebugViewPage::build(Window* window)
{
window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO);
@@ -26,10 +26,7 @@
class StatisticsViewPage : public PageGroupItem
{
public:
StatisticsViewPage(PageDef& pageDef) :
PageGroupItem(pageDef, PAD_ZERO)
{
}
StatisticsViewPage(PageDef& pageDef);
protected:
void build(Window* window) override;
@@ -38,7 +35,7 @@ class StatisticsViewPage : public PageGroupItem
class DebugViewPage : public PageGroupItem
{
public:
DebugViewPage(PageDef& pageDef) : PageGroupItem(pageDef, PAD_ZERO) {}
DebugViewPage(PageDef& pageDef);
protected:
void build(Window* window) override;
+1 -1
View File
@@ -71,7 +71,7 @@ void MixEditWindow::buildHeader(Window *window)
new MixerEditStatusBar(
window,
{window->getRect().w - MIX_STATUS_BAR_WIDTH - PageGroup::PAGE_TOP_BAR_H, 0,
{window->getRect().w - MIX_STATUS_BAR_WIDTH - PageGroup::PAGE_GROUP_BACK_BTN_W, 0,
MIX_STATUS_BAR_WIDTH, EdgeTxStyles::MENU_HEADER_HEIGHT},
channel);
}
@@ -51,7 +51,8 @@ class CurveButton : public Button
hdrLeft = new StaticIcon(this, 0, 0, ICON_ROUND_TITLE_LEFT,
COLOR_THEME_SECONDARY2_INDEX);
hdrRight = new StaticIcon(this, width() - PAD_LARGE, 0,
auto mask = getBuiltinIcon(ICON_ROUND_TITLE_RIGHT);
hdrRight = new StaticIcon(this, width() - mask->width - PAD_BORDER * 2, 0,
ICON_ROUND_TITLE_RIGHT,
COLOR_THEME_SECONDARY2_INDEX);
+1 -1
View File
@@ -534,7 +534,7 @@ void ModelGVarsPage::build(Window* window)
if (modelFMEnabled()) {
window->padTop(PAD_OUTLINE);
hdr = new GVarHeader(window->getParent());
lv_obj_set_pos(hdr->getLvObj(), 0, PageGroup::PAGE_TOP_BAR_H);
lv_obj_set_pos(hdr->getLvObj(), 0, PageGroup::PAGE_GROUP_BODY_Y);
yo = GVarHeader::HDR_H;
}
@@ -39,11 +39,11 @@ struct ModelButtonLayout {
uint16_t columns;
};
static constexpr coord_t L0_W = (ModelLabelsWindow::MDLS_W - PAD_BORDER * 3) / 2;
static constexpr coord_t L0_W = (ModelLabelsWindow::MDLS_W - PAD_OUTLINE * 3) / 2;
static constexpr coord_t L0_H = L0_W * 11 / 20;
static constexpr coord_t L1_W = (ModelLabelsWindow::MDLS_W - PAD_BORDER * 4) / 3;
static constexpr coord_t L1_W = (ModelLabelsWindow::MDLS_W - PAD_OUTLINE * 4) / 3;
static constexpr coord_t L1_H = L1_W * 11 / 20;
static constexpr coord_t L3_W = ModelLabelsWindow::MDLS_W - PAD_BORDER * 2;
static constexpr coord_t L3_W = ModelLabelsWindow::MDLS_W - PAD_OUTLINE * 2;
ModelButtonLayout modelLayouts[] = {
{L0_W, L0_H, true, FONT(STD), 2},
@@ -679,7 +679,7 @@ void ModelLabelsWindow::buildHead(Window *hdr)
#if !PORTRAIT
// new model button
new TextButton(hdr, {LCD_W - PageGroup::PAGE_TOP_BAR_H - NEW_BTN_W - PAD_LARGE, PAD_MEDIUM, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() {
new TextButton(hdr, {LCD_W - PageGroup::PAGE_GROUP_BACK_BTN_W - NEW_BTN_W - PAD_LARGE, PAD_MEDIUM, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() {
auto menu = new Menu();
menu->setTitle(STR_CREATE_NEW);
menu->addLine(STR_NEW_MODEL, [=]() { newModel(); });
@@ -687,7 +687,7 @@ void ModelLabelsWindow::buildHead(Window *hdr)
return 0;
});
mdlLayout = new ModelLayoutButton(this, LCD_W - PageGroup::PAGE_TOP_BAR_H - LAYOUT_BTN_XO, PAD_MEDIUM, g_eeGeneral.modelSelectLayout, [=]() {
mdlLayout = new ModelLayoutButton(this, LCD_W - PageGroup::PAGE_GROUP_BACK_BTN_W - LAYOUT_BTN_XO, PAD_MEDIUM, g_eeGeneral.modelSelectLayout, [=]() {
uint8_t l = mdlLayout->getLayout();
l = (l + 1) & 3;
mdlLayout->setLayout(l);
@@ -23,6 +23,7 @@
#include "listbox.h"
#include "storage/modelslist.h"
#include "pagegroup.h"
#include "page.h"
#include "etx_lv_theme.h"
+1 -1
View File
@@ -96,7 +96,7 @@ void OutputEditWindow::buildHeader(Window *window)
{
statusBar = new OutputEditStatusBar(
window,
{window->getRect().w - OUTPUT_EDIT_STATUS_BAR_WIDTH - PageGroup::PAGE_TOP_BAR_H,
{window->getRect().w - OUTPUT_EDIT_STATUS_BAR_WIDTH - PageGroup::PAGE_GROUP_BACK_BTN_W,
0, OUTPUT_EDIT_STATUS_BAR_WIDTH, EdgeTxStyles::MENU_HEADER_HEIGHT},
channel);
}
@@ -179,18 +179,18 @@ PreviewWindow::PreviewWindow(Window *window, rect_t rect,
etx_obj_add_style(qmb->getLvObj(), styles->rounded, LV_PART_MAIN);
etx_txt_color(qmb->getLvObj(), COLOR_THEME_QM_FG_INDEX, LV_PART_MAIN);
etx_solid_bg(qmb->getLvObj(), COLOR_THEME_QM_BG_INDEX, LV_PART_MAIN);
auto iconPtr = new StaticIcon(qmb, (QuickMenuGroup::QM_BUTTON_WIDTH - QuickMenuGroup::QM_ICON_SIZE) / 2, PAD_SMALL,
new StaticIcon(qmb, (QuickMenuGroup::QM_BUTTON_WIDTH - QuickMenuGroup::QM_ICON_SIZE) / 2, PAD_SMALL,
ICON_MODEL_SELECT, COLOR_THEME_QM_FG_INDEX);
auto textPtr = new StaticText(qmb, {0, QuickMenuGroup::QM_ICON_SIZE + PAD_TINY * 2, QuickMenuGroup::QM_BUTTON_WIDTH - 1, 0},
new StaticText(qmb, {0, QuickMenuGroup::QM_ICON_SIZE + PAD_TINY * 2, QuickMenuGroup::QM_BUTTON_WIDTH - 1, 0},
STR_QM_MANAGE_MODELS, COLOR_THEME_QM_FG_INDEX, CENTERED | FONT(XS));
qmb = new Window(qm, {QuickMenuGroup::QM_BUTTON_WIDTH + PAD_SMALL * 2, mask->height + PAD_SMALL, QuickMenuGroup::QM_BUTTON_WIDTH, QuickMenuGroup::QM_BUTTON_HEIGHT});
etx_obj_add_style(qmb->getLvObj(), styles->rounded, LV_PART_MAIN);
etx_txt_color(qmb->getLvObj(), COLOR_THEME_QM_BG_INDEX, LV_PART_MAIN);
etx_solid_bg(qmb->getLvObj(), COLOR_THEME_QM_FG_INDEX, LV_PART_MAIN);
iconPtr = new StaticIcon(qmb, (QuickMenuGroup::QM_BUTTON_WIDTH - QuickMenuGroup::QM_ICON_SIZE) / 2, PAD_SMALL,
new StaticIcon(qmb, (QuickMenuGroup::QM_BUTTON_WIDTH - QuickMenuGroup::QM_ICON_SIZE) / 2, PAD_SMALL,
ICON_MODEL, COLOR_THEME_QM_BG_INDEX);
textPtr = new StaticText(qmb, {0, QuickMenuGroup::QM_ICON_SIZE + PAD_TINY * 2, QuickMenuGroup::QM_BUTTON_WIDTH - 1, 0},
new StaticText(qmb, {0, QuickMenuGroup::QM_ICON_SIZE + PAD_TINY * 2, QuickMenuGroup::QM_BUTTON_WIDTH - 1, 0},
STR_QM_MODEL_SETUP, COLOR_THEME_QM_BG_INDEX, CENTERED | FONT(XS));
lv_group_set_default(def_group);
@@ -957,6 +957,7 @@ static SetupLineDef setupLines[] = {
RadioSetupPage::RadioSetupPage(PageDef& pageDef) : PageGroupItem(pageDef, PAD_TINY) {}
#if VERSION_MAJOR > 2
static bool hasShortcutKeys()
{
#if defined(USE_HATS_AS_KEYS)
@@ -965,6 +966,7 @@ static bool hasShortcutKeys()
return keysGetSupported() & ((1 << KEY_MODEL) | (1 << KEY_SYS) | (1 << KEY_TELE));
#endif
}
#endif
void RadioSetupPage::build(Window* window)
{
@@ -991,8 +993,10 @@ void RadioSetupPage::build(Window* window)
{STR_DEF(STR_GPS), []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_GPS, gpsPageSetupLines, DIM(gpsPageSetupLines)); }},
{STR_DEF(STR_ENABLED_FEATURES), []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_ENABLED_FEATURES, viewOptionsPageSetupLines, DIM(viewOptionsPageSetupLines)); }},
{STR_DEF(STR_MAIN_MENU_MANAGE_MODELS), []() { new ManageModelsSetupPage(); }},
#if VERSION_MAJOR > 2
{STR_DEF(STR_KEY_SHORTCUTS), []() { new QMKeyShortcutsPage(); }, nullptr, [=]() { return hasShortcutKeys(); }},
{STR_DEF(STR_QUICK_MENU_FAVORITES), []() { new QMFavoritesPage(); }, nullptr},
#endif
}, BTN_H);
y += w->height() + padding;
@@ -332,7 +332,11 @@ class VersionDialog : public BaseDialog
#endif
};
#if VERSION_MAJOR == 2 && LCD_H == 272
const std::string copyright_str = "(C) " BUILD_YEAR " EdgeTX";
#else
const std::string copyright_str = "Copyright (C) " BUILD_YEAR " EdgeTX";
#endif
const std::string edgetx_url = "https://edgetx.org";
RadioVersionPage::RadioVersionPage(PageDef& pageDef) :
@@ -415,7 +419,7 @@ void RadioVersionPage::build(Window* window)
new StaticText(infoBox, {0, 0, LV_PCT(100), LV_SIZE_CONTENT}, version);
// Module and receivers versions
new TextButton(infoBox, {0, ih - EdgeTxStyles::UI_ELEMENT_HEIGHT - PAD_LARGE-PAD_SMALL, LV_PCT(100), 0},
new TextButton(infoBox, {0, ih - EdgeTxStyles::UI_ELEMENT_HEIGHT - PAD_LARGE - PAD_SMALL, LV_PCT(100), 0},
STR_MODULES_RX_VERSION, [=]() {
new VersionDialog();
return 0;
+170 -15
View File
@@ -52,6 +52,60 @@ static void on_draw_end(lv_event_t* e)
//-----------------------------------------------------------------------------
#if VERSION_MAJOR == 2
class SelectedTabIcon : public StaticIcon
{
public:
SelectedTabIcon(Window* parent) :
StaticIcon(parent, 0, 0, ICON_CURRENTMENU_SHADOW, COLOR_THEME_PRIMARY1_INDEX)
{
new StaticIcon(this, 0, 0, ICON_CURRENTMENU_BG, COLOR_THEME_FOCUS_INDEX);
new StaticIcon(this, SEL_DOT_X, SEL_DOT_Y, ICON_CURRENTMENU_DOT, COLOR_THEME_PRIMARY2_INDEX);
}
#if defined(DEBUG_WINDOWS)
std::string getName() const override { return "SelectedTabIcon"; }
#endif
static LAYOUT_VAL_SCALED(SEL_DOT_X, 10)
static LAYOUT_VAL_SCALED(SEL_DOT_Y, 39)
};
class PageGroupIconButton : public ButtonBase
{
public:
PageGroupIconButton(Window* parent, const rect_t& rect, PageGroupItem* page, int idx) :
ButtonBase(parent, rect, nullptr, window_create), pageTab(page), index(idx)
{
new StaticIcon(this, 2, ICON_Y, pageTab->getIcon(), COLOR_THEME_PRIMARY2_INDEX);
show(isVisible());
}
#if defined(DEBUG_WINDOWS)
std::string getName() const override
{
return "PageGroupIconButton(" + std::to_string(index) + ")";
}
#endif
bool isVisible() const { return pageTab->isVisible(); }
static LAYOUT_VAL_SCALED(ICON_Y, 7)
protected:
PageGroupItem* pageTab;
int index;
void checkEvents() override
{
show(isVisible());
ButtonBase::checkEvents();
}
};
#endif
//-----------------------------------------------------------------------------
PageGroupHeaderBase::PageGroupHeaderBase(Window* parent, coord_t height, EdgeTxIcon icon, const char* parentTitle, PageGroupBase* menu) :
Window(parent, {0, 0, LCD_W, height}), menu(menu)
{
@@ -59,24 +113,90 @@ PageGroupHeaderBase::PageGroupHeaderBase(Window* parent, coord_t height, EdgeTxI
hdrIcon = new HeaderIcon(this, icon);
#if VERSION_MAJOR > 2
new HeaderBackIcon(this);
parentLabel = etx_label_create(lvobj);
etx_txt_color(parentLabel, COLOR_THEME_PRIMARY2_INDEX);
lv_obj_set_pos(parentLabel, PageHeader::PAGE_TITLE_LEFT, PageHeader::PAGE_TITLE_TOP);
lv_obj_set_size(parentLabel, LCD_W - PageHeader::PAGE_TITLE_LEFT - PageGroup::PAGE_TOP_BAR_H * 2 - PAD_LARGE * 2, EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_size(parentLabel, LCD_W - PageHeader::PAGE_TITLE_LEFT - PageGroup::PAGE_GROUP_BACK_BTN_W * 2 - PAD_LARGE * 2, EdgeTxStyles::STD_FONT_HEIGHT);
lv_label_set_text(parentLabel, parentTitle);
#endif
titleLabel = etx_label_create(lvobj);
etx_txt_color(titleLabel, COLOR_THEME_PRIMARY2_INDEX);
#if VERSION_MAJOR == 2
auto sep = lv_obj_create(lvobj);
etx_solid_bg(sep);
lv_obj_set_pos(sep, 0, EdgeTxStyles::MENU_HEADER_HEIGHT);
lv_obj_set_size(sep, LCD_W, PageGroup::PAGE_GROUP_TOP_BAR_H - EdgeTxStyles::MENU_HEADER_HEIGHT);
lv_obj_set_style_pad_left(titleLabel, PAD_MEDIUM, LV_PART_MAIN);
lv_obj_set_style_pad_top(titleLabel, 1, LV_PART_MAIN);
lv_obj_set_pos(titleLabel, 0, PageGroup::PAGE_GROUP_TOP_BAR_H);
lv_obj_set_size(titleLabel, LCD_W, PageGroup::PAGE_GROUP_ALT_TITLE_H);
#else
lv_obj_set_pos(titleLabel, PageHeader::PAGE_TITLE_LEFT, PageHeader::PAGE_TITLE_TOP + EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_size(titleLabel, LCD_W - PageHeader::PAGE_TITLE_LEFT - PageGroup::PAGE_TOP_BAR_H * 2 - PAD_LARGE * 2, EdgeTxStyles::STD_FONT_HEIGHT);
lv_obj_set_size(titleLabel, LCD_W - PageHeader::PAGE_TITLE_LEFT - PageGroup::PAGE_GROUP_BACK_BTN_W * 2 - PAD_LARGE * 2, EdgeTxStyles::STD_FONT_HEIGHT);
#endif
setTitle("");
#if VERSION_MAJOR == 2
carousel = new Window(this,
{MENU_HEADER_BUTTONS_LEFT, 0,
LCD_W - MENU_HEADER_BUTTONS_LEFT, EdgeTxStyles::MENU_HEADER_HEIGHT + ICON_EXTRA_H});
carousel->padAll(PAD_ZERO);
carousel->setWindowFlag(NO_FOCUS);
selectedIcon = new SelectedTabIcon(carousel);
#endif
}
void PageGroupHeaderBase:: setTitle(const char* title)
#if VERSION_MAJOR == 2
coord_t PageGroupHeaderBase::getX(uint8_t idx)
{
if (titleLabel) lv_label_set_text(titleLabel, title);
coord_t x = 0;
for (uint8_t i = 0; i < idx; i += 1)
if (buttons[i]->isVisible())
x += MENU_HEADER_BUTTON_WIDTH;
return x;
}
#endif
void PageGroupHeaderBase::setCurrentIndex(uint8_t index)
{
if (index < pages.size()) {
currentIndex = index;
#if VERSION_MAJOR == 2
if (index < buttons.size()) {
buttons[currentIndex]->check(false);
currentIndex = index;
buttons[currentIndex]->check(true);
coord_t x = getX(currentIndex);
selectedIcon->setPos(x, 0);
coord_t sx = lv_obj_get_scroll_x(carousel->getLvObj());
if (x + MENU_HEADER_BUTTON_WIDTH - sx > carousel->width()) {
lv_obj_scroll_to(carousel->getLvObj(), x + MENU_HEADER_BUTTON_WIDTH - carousel->width(), 0, LV_ANIM_OFF);
} else if (x < sx) {
lv_obj_scroll_to(carousel->getLvObj(), x, 0, LV_ANIM_OFF);
}
}
#endif
}
}
void PageGroupHeaderBase::setTitle(const char* title)
{
if (titleLabel) {
#if VERSION_MAJOR == 2
std::string s = replaceAll(title, "\n", " ");
lv_label_set_text(titleLabel, s.c_str());
#else
lv_label_set_text(titleLabel, title);
#endif
}
}
void PageGroupHeaderBase::setIcon(EdgeTxIcon newIcon)
@@ -87,6 +207,18 @@ void PageGroupHeaderBase::setIcon(EdgeTxIcon newIcon)
void PageGroupHeaderBase::addTab(PageGroupItem* page)
{
pages.emplace_back(page);
#if VERSION_MAJOR == 2
uint8_t idx = buttons.size();
auto btn = new PageGroupIconButton(
carousel, {getX(idx), 0, MENU_HEADER_BUTTON_WIDTH + PAD_THREE, PageGroup::PAGE_GROUP_TOP_BAR_H + PAD_THREE + PAD_TINY}, page, idx);
btn->setPressHandler([=]() {
menu->setCurrentTab(idx);
return true;
});
btn->show(btn->isVisible());
buttons.emplace_back(btn);
#endif
}
bool PageGroupHeaderBase::hasSubMenu(QMPage qmPage)
@@ -109,13 +241,24 @@ void PageGroupHeaderBase::deleteLater(bool detach, bool trash)
Window::deleteLater(detach, trash);
}
#if VERSION_MAJOR == 2
void PageGroupHeaderBase::checkEvents()
{
for (uint8_t i = 0; i < buttons.size(); i += 1) {
buttons[i]->setPos(getX(i), 0);
}
Window::checkEvents();
}
#endif
//-----------------------------------------------------------------------------
class PageGroupHeader : public PageGroupHeaderBase
{
public:
PageGroupHeader(PageGroup* menu, EdgeTxIcon icon, const char* parentTitle) :
PageGroupHeaderBase(menu, PageGroup::PAGE_TOP_BAR_H, icon, parentTitle, menu)
PageGroupHeaderBase(menu, PageGroup::PAGE_GROUP_BODY_Y, icon, parentTitle, menu)
{
}
@@ -153,7 +296,7 @@ class PageGroupHeader : public PageGroupHeaderBase
void checkEvents() override
{
updateLayout();
Window::checkEvents();
PageGroupHeaderBase::checkEvents();
}
};
@@ -231,7 +374,9 @@ void PageGroupBase::setCurrentTab(unsigned index)
if (tab != currentTab && !deleted()) {
header->setTitle(tab->getTitle().c_str());
#if VERSION_MAJOR > 2
header->setIcon(tab->getIcon());
#endif
QuickMenu::setCurrentPage(tab->pageId(), icon);
@@ -315,7 +460,7 @@ void PageGroupBase::setScrollY(coord_t y)
//-----------------------------------------------------------------------------
PageGroup::PageGroup(EdgeTxIcon icon, const char* title, PageDef* pages) :
PageGroupBase(PAGE_TOP_BAR_H, icon)
PageGroupBase(PAGE_GROUP_BODY_Y, icon)
{
header = new PageGroupHeader(this, icon, title);
@@ -325,8 +470,12 @@ PageGroup::PageGroup(EdgeTxIcon icon, const char* title, PageDef* pages) :
}
#if defined(HARDWARE_TOUCH)
#if VERSION_MAJOR == 2
addCustomButton(0, 0, [=]() { onCancel(); });
#else
addCustomButton(0, 0, [=]() { openMenu(); });
addCustomButton(LCD_W - EdgeTxStyles::MENU_HEADER_HEIGHT, 0, [=]() { onCancel(); });
#endif
#endif
setCloseHandler([]{
@@ -359,30 +508,32 @@ class TabsGroupHeader : public PageGroupHeaderBase
TabsGroupHeader(TabsGroup* menu, EdgeTxIcon icon, const char* parentTitle) :
PageGroupHeaderBase(menu, TabsGroup::TABS_GROUP_BODY_Y, icon, parentTitle, menu)
{
#if PORTRAIT
lv_obj_set_pos(parentLabel, PageGroup::PAGE_TOP_BAR_H + PAD_LARGE, PAD_MEDIUM * 2);
lv_obj_set_size(parentLabel, LCD_W - PageGroup::PAGE_TOP_BAR_H * 2 - PAD_LARGE * 2, PageGroup::PAGE_TOP_BAR_H - PAD_MEDIUM * 2);
#if PORTRAIT && VERSION_MAJOR > 2
lv_obj_set_pos(parentLabel, PageGroup::PAGE_GROUP_TOP_BAR_H + PAD_LARGE, PAD_MEDIUM * 2);
lv_obj_set_size(parentLabel, LCD_W - PageGroup::PAGE_GROUP_TOP_BAR_H * 2 - PAD_LARGE * 2, PageGroup::PAGE_GROUP_TOP_BAR_H - PAD_MEDIUM * 2);
auto sep = lv_obj_create(lvobj);
etx_solid_bg(sep);
lv_obj_set_pos(sep, 0, EdgeTxStyles::MENU_HEADER_HEIGHT);
lv_obj_set_size(sep, LCD_W, TabsGroup::PAGE_TOP_BAR_H - EdgeTxStyles::MENU_HEADER_HEIGHT);
lv_obj_set_size(sep, LCD_W, TabsGroup::TABS_GROUP_TOP_BAR_H - EdgeTxStyles::MENU_HEADER_HEIGHT);
lv_obj_set_style_pad_left(titleLabel, PAD_MEDIUM, LV_PART_MAIN);
lv_obj_set_style_pad_top(titleLabel, 1, LV_PART_MAIN);
lv_obj_set_pos(titleLabel, 0, TabsGroup::PAGE_TOP_BAR_H);
lv_obj_set_size(titleLabel, LCD_W, TabsGroup::PAGE_ALT_TITLE_H);
lv_obj_set_pos(titleLabel, 0, TabsGroup::TABS_GROUP_TOP_BAR_H);
lv_obj_set_size(titleLabel, LCD_W, TabsGroup::TABS_GROUP_ALT_TITLE_H);
#endif
prevBtn = new IconButton(this, ICON_BTN_PREV, LCD_W - PageGroup::PAGE_TOP_BAR_H * 3, PAD_MEDIUM, [=]() {
#if VERSION_MAJOR > 2
prevBtn = new IconButton(this, ICON_BTN_PREV, LCD_W - PageGroup::PAGE_GROUP_BACK_BTN_W * 3, PAD_MEDIUM, [=]() {
prevTab();
return 0;
});
nextBtn = new IconButton(this, ICON_BTN_NEXT, LCD_W - PageGroup::PAGE_TOP_BAR_H * 2, PAD_MEDIUM, [=]() {
nextBtn = new IconButton(this, ICON_BTN_NEXT, LCD_W - PageGroup::PAGE_GROUP_BACK_BTN_W * 2, PAD_MEDIUM, [=]() {
nextTab();
return 0;
});
#endif
}
#if defined(DEBUG_WINDOWS)
@@ -417,9 +568,13 @@ TabsGroup::TabsGroup(EdgeTxIcon icon, const char* parentLabel) :
header = new TabsGroupHeader(this, icon, parentLabel);
#if defined(HARDWARE_TOUCH)
#if VERSION_MAJOR == 2
addCustomButton(0, 0, [=]() { onCancel(); });
#else
addCustomButton(0, 0, [=]() { openMenu(); });
addCustomButton(LCD_W - EdgeTxStyles::MENU_HEADER_HEIGHT, 0, [=]() { onCancel(); });
#endif
#endif
}
void TabsGroup::openMenu()
+38 -11
View File
@@ -27,7 +27,10 @@
class HeaderIcon;
class PageGroupItem;
class PageGroupBase;
#if VERSION_MAJOR == 2
class SelectedTabIcon;
class PageGroupIconButton;
#endif
//-----------------------------------------------------------------------------
enum PageDefAction {
@@ -46,7 +49,9 @@ struct PageDef {
std::function<void()> action;
};
#if VERSION_MAJOR > 2
extern PageDef favoritesMenuItems[];
#endif
enum QMTopDefAction {
QM_SUBMENU,
@@ -127,12 +132,7 @@ class PageGroupHeaderBase : public Window
virtual void removeTab(unsigned index) {}
void addTab(PageGroupItem* page);
void setCurrentIndex(uint8_t index)
{
if (index < pages.size()) {
currentIndex = index;
}
}
void setCurrentIndex(uint8_t index);
bool hasSubMenu(QMPage n);
@@ -142,6 +142,11 @@ class PageGroupHeaderBase : public Window
void deleteLater(bool detach = true, bool trash = true) override;
#if VERSION_MAJOR == 2
static LAYOUT_VAL_SCALED(ICON_EXTRA_H, 10)
static LAYOUT_VAL_SCALED(MENU_HEADER_BUTTON_WIDTH, 33)
#endif
protected:
uint8_t currentIndex = 0;
lv_obj_t* titleLabel = nullptr;
@@ -149,6 +154,14 @@ class PageGroupHeaderBase : public Window
HeaderIcon* hdrIcon = nullptr;
std::vector<PageGroupItem*> pages;
PageGroupBase* menu;
#if VERSION_MAJOR ==2
SelectedTabIcon* selectedIcon = nullptr;
Window* carousel = nullptr;
std::vector<PageGroupIconButton*> buttons;
coord_t getX(uint8_t idx);
void checkEvents() override;
#endif
};
//-----------------------------------------------------------------------------
@@ -220,7 +233,16 @@ class PageGroup : public PageGroupBase
bool isPageGroup() override { return true; }
static LAYOUT_VAL_SCALED(PAGE_TOP_BAR_H, 45)
#if VERSION_MAJOR == 2
static LAYOUT_VAL_SCALED(PAGE_GROUP_TOP_BAR_H, 48)
static constexpr coord_t PAGE_GROUP_ALT_TITLE_H = EdgeTxStyles::STD_FONT_HEIGHT;
static constexpr coord_t PAGE_GROUP_BACK_BTN_W = 0;
#else
static LAYOUT_VAL_SCALED(PAGE_GROUP_TOP_BAR_H, 45)
static constexpr coord_t PAGE_GROUP_ALT_TITLE_H = 0;
static constexpr coord_t PAGE_GROUP_BACK_BTN_W = PAGE_GROUP_TOP_BAR_H;
#endif
static constexpr coord_t PAGE_GROUP_BODY_Y = PAGE_GROUP_TOP_BAR_H + PAGE_GROUP_ALT_TITLE_H;
protected:
@@ -240,9 +262,14 @@ class TabsGroup : public PageGroupBase
void hidePageButtons();
static LAYOUT_ORIENTATION_SCALED(PAGE_TOP_BAR_H, 45, 48)
static LAYOUT_ORIENTATION(PAGE_ALT_TITLE_H, 0, EdgeTxStyles::STD_FONT_HEIGHT)
static constexpr coord_t TABS_GROUP_BODY_Y = PAGE_TOP_BAR_H + PAGE_ALT_TITLE_H;
#if VERSION_MAJOR == 2
static LAYOUT_VAL_SCALED(TABS_GROUP_TOP_BAR_H, 48)
static constexpr coord_t TABS_GROUP_ALT_TITLE_H = EdgeTxStyles::STD_FONT_HEIGHT;
#else
static LAYOUT_ORIENTATION_SCALED(TABS_GROUP_TOP_BAR_H, 45, 48)
static LAYOUT_ORIENTATION(TABS_GROUP_ALT_TITLE_H, 0, EdgeTxStyles::STD_FONT_HEIGHT)
#endif
static constexpr coord_t TABS_GROUP_BODY_Y = TABS_GROUP_TOP_BAR_H + TABS_GROUP_ALT_TITLE_H;
protected:
@@ -32,6 +32,7 @@
//-----------------------------------------------------------------------------
#if VERSION_MAJOR > 2
class QuickSubMenu
{
public:
@@ -196,6 +197,7 @@ class QuickSubMenu
QuickMenuGroup* subMenu = nullptr;
ButtonBase* menuButton = nullptr;
};
#endif
//-----------------------------------------------------------------------------
@@ -221,7 +223,7 @@ void QuickMenu::shutdownQuickMenu()
}
QuickMenu::QuickMenu() :
NavWindow(MainWindow::instance(), {0, 0, LCD_W, LCD_H})
NavWindow(MainWindow::instance(), {QM_X, QM_Y, QM_W, QM_H})
{
setWindowFlag(OPAQUE);
@@ -230,13 +232,13 @@ QuickMenu::QuickMenu() :
auto sep = lv_obj_create(lvobj);
etx_solid_bg(sep, COLOR_THEME_QM_FG_INDEX);
lv_obj_set_size(sep, LCD_W, PAD_THREE);
lv_obj_set_size(sep, QM_W, PAD_THREE);
auto mask = getBuiltinIcon(ICON_TOP_LOGO);
new StaticIcon(this, (LCD_W - mask->width) / 2, 0, ICON_TOP_LOGO, COLOR_THEME_QM_FG_INDEX);
new StaticIcon(this, (QM_W - mask->width) / 2, 0, ICON_TOP_LOGO, COLOR_THEME_QM_FG_INDEX);
new ButtonBase(
this, {0, 0, LCD_W, EdgeTxStyles::UI_ELEMENT_HEIGHT},
this, {0, 0, QM_W, EdgeTxStyles::UI_ELEMENT_HEIGHT},
[=]() -> uint8_t {
inSubMenu = false;
onCancel();
@@ -248,6 +250,7 @@ QuickMenu::QuickMenu() :
mainMenu = new QuickMenuGroup(box);
#if VERSION_MAJOR > 2
box = new Window(this, {QM_SUB_X, QM_SUB_Y, QM_SUB_W, QM_SUB_H});
int f = 0;
@@ -258,15 +261,18 @@ QuickMenu::QuickMenu() :
}
}
favoritesMenuItems[f].icon = EDGETX_ICONS_COUNT;
#endif
for (int i = 0; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
if ((qmTopItems[i].enabled == nullptr) || qmTopItems[i].enabled()) {
if (qmTopItems[i].pageAction == QM_ACTION) {
mainMenu->addButton(qmTopItems[i].icon, STR_VAL(qmTopItems[i].qmTitle), qmTopItems[i].action);
#if VERSION_MAJOR > 2
} else {
auto sub = new QuickSubMenu(box, this, qmTopItems[i].icon, STR_VAL(qmTopItems[i].qmTitle), STR_VAL(qmTopItems[i].title), qmTopItems[i].subMenuItems);
sub->addButton();
subMenus.emplace_back(sub);
#endif
}
}
}
@@ -287,9 +293,15 @@ void QuickMenu::openQM(std::function<void()> cancelHandler,
{
Layer::push(this);
#if VERSION_MAJOR == 2
curPage = QM_NONE;
#endif
mainMenu->doLayout(QM_MAIN_COLS);
#if VERSION_MAJOR > 2
for (size_t i = 0; i < subMenus.size(); i += 1)
subMenus[i]->doLayout();
#endif
this->cancelHandler = std::move(cancelHandler);
this->selectHandler = std::move(selectHandler);
@@ -309,8 +321,10 @@ void QuickMenu::openQM(std::function<void()> cancelHandler,
mainMenu->clearFocus();
setFocus(curPage);
} else {
#if VERSION_MAJOR > 2
if (curPage == QM_MANAGE_MODELS)
mainMenu->setCurrent(favoritesMenuItems[0].icon == EDGETX_ICONS_COUNT ? 0 : 1);
#endif
focusMainMenu();
}
}
@@ -324,9 +338,10 @@ void QuickMenu::selected()
void QuickMenu::openPage(QMPage page)
{
for (int i = 1; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
for (int i = FIRST_SEARCH_IDX; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
if (qmTopItems[i].pageAction == QM_ACTION) {
if (qmTopItems[i].qmPage == page) {
QuickMenu::selected();
qmTopItems[i].action();
return;
}
@@ -335,8 +350,10 @@ void QuickMenu::openPage(QMPage page)
for (int j = 0, k = 0; sub[j].icon != EDGETX_ICONS_COUNT; j += 1) {
if (sub[j].qmPage == page) {
if (sub[j].pageAction == PAGE_ACTION) {
QuickMenu::selected();
sub[j].action();
} else {
QuickMenu::selected();
auto pg = new PageGroup(qmTopItems[i].icon, STR_VAL(qmTopItems[i].title), sub);
pg->setCurrentTab(k);
return;
@@ -351,7 +368,7 @@ void QuickMenu::openPage(QMPage page)
EdgeTxIcon QuickMenu::pageIcon(QMPage page)
{
for (int i = 1; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
for (int i = FIRST_SEARCH_IDX; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
if (qmTopItems[i].pageAction == QM_ACTION) {
if (qmTopItems[i].qmPage == page) {
return qmTopItems[i].icon;
@@ -370,7 +387,7 @@ EdgeTxIcon QuickMenu::pageIcon(QMPage page)
int QuickMenu::pageIndex(QMPage page)
{
for (int i = 1; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
for (int i = FIRST_SEARCH_IDX; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
if (qmTopItems[i].pageAction == QM_ACTION) {
if (qmTopItems[i].qmPage == page) {
return 0;
@@ -392,7 +409,7 @@ int QuickMenu::pageIndex(QMPage page)
return 0;
}
static std::string replaceAll(std::string str, const std::string& from, const std::string& to)
std::string replaceAll(std::string str, const std::string& from, const std::string& to)
{
auto&& pos = str.find(from, size_t{});
while (pos != std::string::npos)
@@ -411,7 +428,7 @@ std::vector<std::string> QuickMenu::menuPageNames(bool forFavorites)
qmPages.emplace_back(STR_NONE);
qmPages.emplace_back(STR_OPEN_QUICK_MENU);
for (int i = 1; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
for (int i = FIRST_SEARCH_IDX; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
if (qmTopItems[i].pageAction == QM_ACTION) {
qmPages.emplace_back(STR_VAL(qmTopItems[i].title));
} else {
@@ -432,11 +449,12 @@ std::vector<std::string> QuickMenu::menuPageNames(bool forFavorites)
return qmPages;
}
#if VERSION_MAJOR > 2
void QuickMenu::setupFavorite(QMPage page, int f)
{
PageDef& fav = favoritesMenuItems[f];
for (int i = 1; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
for (int i = FIRST_SEARCH_IDX; qmTopItems[i].icon != EDGETX_ICONS_COUNT; i += 1) {
if (qmTopItems[i].pageAction == QM_ACTION) {
if (qmTopItems[i].qmPage == page) {
fav.icon = qmTopItems[i].icon;
@@ -467,6 +485,7 @@ void QuickMenu::setupFavorite(QMPage page, int f)
}
}
}
#endif
void QuickMenu::setCurrentPage(QMPage newPage, EdgeTxIcon newIcon)
{
@@ -480,8 +499,10 @@ void QuickMenu::focusMainMenu()
mainMenu->setFocus();
mainMenu->setEnabled();
mainMenu->setGroup();
#if VERSION_MAJOR > 2
for(auto sub : subMenus)
sub->setDisabled(true);
#endif
}
void QuickMenu::onSelect(bool close)
@@ -509,12 +530,14 @@ void QuickMenu::onCancel()
void QuickMenu::setFocus(QMPage selection)
{
#if VERSION_MAJOR > 2
for(auto sub : subMenus) {
if (sub->isSubMenu(selection, curIcon)) {
sub->setCurrent(selection);
return;
}
}
#endif
}
void QuickMenu::enableSubMenu()
@@ -545,12 +568,14 @@ void QuickMenu::afterPG()
{
auto b = mainMenu->getFocusedButton();
if (b) {
#if VERSION_MAJOR > 3
for(auto sub : subMenus) {
if (sub->isSubMenu(b)) {
sub->activate();
return;
}
}
#endif
focusMainMenu();
curPage = QM_NONE;
}
@@ -27,11 +27,15 @@
#include "quick_menu_group.h"
#include "quick_menu_def.h"
std::string replaceAll(std::string str, const std::string& from, const std::string& to);
class PageGroup;
class PageGroupBase;
class ButtonBase;
class QuickSubMenu;
struct PageDef;
#if VERSION_MAJOR > 2
class QuickSubMenu;
#endif
#define GRP_W(n) ((QuickMenuGroup::QM_BUTTON_WIDTH + PAD_MEDIUM) * n - PAD_MEDIUM + PAD_OUTLINE * 2)
#if LANDSCAPE
@@ -69,7 +73,6 @@ class QuickMenu : public NavWindow
static EdgeTxIcon pageIcon(QMPage page);
static int pageIndex(QMPage page);
static std::vector<std::string> menuPageNames(bool forFavorites);
static void setupFavorite(QMPage page, int f);
#if defined(HARDWARE_KEYS)
void doKeyShortcut(event_t event);
@@ -85,8 +88,17 @@ class QuickMenu : public NavWindow
void afterPG();
#endif
static constexpr int QM_MAIN_BTNS = 6;
static constexpr int QM_SUB_BTNS = 12;
#if VERSION_MAJOR == 2
static LAYOUT_ORIENTATION(QM_MAIN_COLS, 5, 3)
static LAYOUT_ORIENTATION(QM_MAIN_ROWS, 2, 4)
static constexpr int QM_MAIN_W = GRP_W(QM_MAIN_COLS);
static constexpr int QM_MAIN_H = GRP_H(QM_MAIN_ROWS);
static constexpr coord_t QM_W = QM_MAIN_W + PAD_LARGE * 2;
static constexpr coord_t QM_H = QM_MAIN_H + EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_MEDIUM * 2;
static constexpr coord_t QM_MAIN_X = (QM_W - QM_MAIN_W) / 2;
static constexpr coord_t QM_MAIN_Y = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE;
static constexpr int FIRST_SEARCH_IDX = 0;
#else
static LAYOUT_ORIENTATION(QM_MAIN_COLS, 6, 1)
static LAYOUT_ORIENTATION(QM_MAIN_ROWS, 1, 6)
static LAYOUT_ORIENTATION(QM_SUB_COLS, 6, 3)
@@ -95,10 +107,16 @@ class QuickMenu : public NavWindow
static constexpr int QM_MAIN_H = GRP_H(QM_MAIN_ROWS);
static constexpr int QM_SUB_W = GRP_W(QM_SUB_COLS);
static constexpr int QM_SUB_H = GRP_H(QM_SUB_ROWS);
static LAYOUT_ORIENTATION(QM_MAIN_X, (LCD_W - QM_MAIN_W) / 2, (LCD_W - QM_MAIN_W - QM_SUB_W - PAD_SMALL) / 2)
static constexpr coord_t QM_MAIN_Y = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY;
static constexpr coord_t QM_W = LCD_W;
static constexpr coord_t QM_H = LCD_H;
static LAYOUT_ORIENTATION(QM_MAIN_X, (QM_W - QM_MAIN_W) / 2, (QM_W - QM_MAIN_W - QM_SUB_W - PAD_SMALL) / 2)
static constexpr coord_t QM_MAIN_Y = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_OUTLINE;
static LAYOUT_ORIENTATION(QM_SUB_X, QM_MAIN_X, QM_MAIN_X + QM_MAIN_W + PAD_SMALL)
static LAYOUT_ORIENTATION(QM_SUB_Y, QM_MAIN_Y + QM_MAIN_H + PAD_LARGE, QM_MAIN_Y)
static constexpr int FIRST_SEARCH_IDX = 1; // Skip favorites
#endif
static constexpr coord_t QM_X = (LCD_W - QM_W) / 2;
static constexpr coord_t QM_Y = (LCD_H - QM_H) / 2;
protected:
static QuickMenu* instance;
@@ -106,7 +124,9 @@ class QuickMenu : public NavWindow
std::function<void(bool close)> selectHandler = nullptr;
bool inSubMenu = false;
QuickMenuGroup* mainMenu = nullptr;
#if VERSION_MAJOR > 2
std::vector<QuickSubMenu*> subMenus;
#endif
PageGroupBase* pageGroup = nullptr;
static QMPage curPage;
static EdgeTxIcon curIcon;
@@ -118,4 +138,8 @@ class QuickMenu : public NavWindow
void focusMainMenu();
void deleteLater(bool detach = true, bool trash = true) override;
#if VERSION_MAJOR > 2
static void setupFavorite(QMPage page, int f);
#endif
};
@@ -47,6 +47,98 @@
#include "view_logical_switches.h"
#include "view_channels.h"
#if VERSION_MAJOR == 2
PageDef modelMenuItems[] = {
{ ICON_MODEL_SETUP, STR_DEF(STR_QM_MODEL_SETTINGS), STR_DEF(STR_MAIN_MODEL_SETTINGS), PAGE_CREATE, QM_MODEL_SETUP, [](PageDef& pageDef) { return new ModelSetupPage(pageDef); }},
#if defined(FLIGHT_MODES)
{ ICON_MODEL_FLIGHT_MODES, STR_DEF(STR_QM_FLIGHT_MODES), STR_DEF(STR_MENUFLIGHTMODES), PAGE_CREATE, QM_MODEL_FLIGHTMODES, [](PageDef& pageDef) { return new ModelFlightModesPage(pageDef); }, modelFMEnabled},
#endif
{ ICON_MODEL_INPUTS, STR_DEF(STR_QM_INPUTS), STR_DEF(STR_MENUINPUTS), PAGE_CREATE, QM_MODEL_INPUTS, [](PageDef& pageDef) { return new ModelInputsPage(pageDef); }},
{ ICON_MODEL_MIXER, STR_DEF(STR_QM_MIXES), STR_DEF(STR_MIXES), PAGE_CREATE, QM_MODEL_MIXES, [](PageDef& pageDef) { return new ModelMixesPage(pageDef); }},
{ ICON_MODEL_OUTPUTS, STR_DEF(STR_QM_OUTPUTS), STR_DEF(STR_MENULIMITS), PAGE_CREATE, QM_MODEL_OUTPUTS, [](PageDef& pageDef) { return new ModelOutputsPage(pageDef); }},
{ ICON_MODEL_CURVES, STR_DEF(STR_QM_CURVES), STR_DEF(STR_MENUCURVES), PAGE_CREATE, QM_MODEL_CURVES, [](PageDef& pageDef) { return new ModelCurvesPage(pageDef); }, modelCurvesEnabled},
#if defined(GVARS)
{ ICON_MODEL_GVARS, STR_DEF(STR_QM_GLOBAL_VARS), STR_DEF(STR_MENU_GLOBAL_VARS), PAGE_CREATE, QM_MODEL_GVARS, [](PageDef& pageDef) { return new ModelGVarsPage(pageDef); }, modelGVEnabled},
#endif
{ ICON_MODEL_LOGICAL_SWITCHES, STR_DEF(STR_QM_LOGICAL_SW), STR_DEF(STR_MENULOGICALSWITCHES), PAGE_CREATE, QM_MODEL_LS, [](PageDef& pageDef) { return new ModelLogicalSwitchesPage(pageDef); }, modelLSEnabled},
{ ICON_MODEL_SPECIAL_FUNCTIONS, STR_DEF(STR_QM_SPEC_FUNC), STR_DEF(STR_MENUCUSTOMFUNC), PAGE_CREATE, QM_MODEL_SF, [](PageDef& pageDef) { return new SpecialFunctionsPage(pageDef); }, modelSFEnabled},
#if defined(LUA_MODEL_SCRIPTS)
{ ICON_MODEL_LUA_SCRIPTS, STR_DEF(STR_QM_CUSTOM_LUA), STR_DEF(STR_MENUCUSTOMSCRIPTS), PAGE_CREATE, QM_MODEL_SCRIPTS, [](PageDef& pageDef) { return new ModelMixerScriptsPage(pageDef); }, modelCustomScriptsEnabled},
#endif
{ ICON_MODEL_TELEMETRY, STR_DEF(STR_QM_TELEM), STR_DEF(STR_MENUTELEMETRY), PAGE_CREATE, QM_MODEL_TELEMETRY, [](PageDef& pageDef) { return new ModelTelemetryPage(pageDef); }, modelTelemetryEnabled},
{ EDGETX_ICONS_COUNT }
};
PageDef radioMenuItems[] = {
{ ICON_TOOLS_APPS, STR_DEF(STR_QM_APPS), STR_DEF(STR_MAIN_MENU_APPS), PAGE_CREATE, QM_TOOLS_APPS, [](PageDef& pageDef) { return new RadioToolsPage(pageDef); }},
{ ICON_RADIO_SD_MANAGER, STR_DEF(STR_QM_STORAGE), STR_DEF(STR_SD_CARD), PAGE_CREATE, QM_TOOLS_STORAGE, [](PageDef& pageDef) { return new RadioSdManagerPage(pageDef); }},
{ ICON_RADIO_SETUP, STR_DEF(STR_QM_RADIO_SETTINGS), STR_DEF(STR_MAIN_RADIO_SETTINGS), PAGE_CREATE, QM_RADIO_SETUP, [](PageDef& pageDef) { return new RadioSetupPage(pageDef); }},
{ ICON_RADIO_EDIT_THEME, STR_DEF(STR_QM_THEMES), STR_DEF(STR_MAIN_MENU_THEMES), PAGE_CREATE, QM_UI_THEMES, [](PageDef& pageDef) { return new ThemeSetupPage(pageDef); }, radioThemesEnabled},
{ ICON_RADIO_GLOBAL_FUNCTIONS, STR_DEF(STR_QM_GLOB_FUNC), STR_DEF(STR_MENUSPECIALFUNCS), PAGE_CREATE, QM_RADIO_GF, [](PageDef& pageDef) { return new GlobalFunctionsPage(pageDef); }, radioGFEnabled},
{ ICON_RADIO_TRAINER, STR_DEF(STR_QM_TRAINER), STR_DEF(STR_MENUTRAINER), PAGE_CREATE, QM_RADIO_TRAINER, [](PageDef& pageDef) { return new RadioTrainerPage(pageDef); }, radioTrainerEnabled},
{ ICON_RADIO_HARDWARE, STR_DEF(STR_QM_HARDWARE), STR_DEF(STR_HARDWARE), PAGE_CREATE, QM_RADIO_HARDWARE, [](PageDef& pageDef) { return new RadioHardwarePage(pageDef); }},
{ ICON_RADIO_VERSION, STR_DEF(STR_QM_ABOUT), STR_DEF(STR_MAIN_MENU_ABOUT_EDGETX), PAGE_CREATE, QM_RADIO_VERSION, [](PageDef& pageDef) { return new RadioVersionPage(pageDef); }},
{ EDGETX_ICONS_COUNT }
};
PageDef screensMenuItems[] = {
{ ICON_THEME_SETUP, STR_DEF(STR_QM_TOP_BAR), STR_DEF(STR_USER_INTERFACE), PAGE_CREATE, QM_UI_SETUP, [](PageDef& pageDef) { return new ScreenUserInterfacePage(pageDef); }},
{ ICON_THEME_VIEW1, STR_DEF(STR_QM_SCREEN_1), STR_DEF(STR_MAIN_VIEW_1), PAGE_CREATE, QM_UI_SCREEN1, [](PageDef& pageDef) { return new ScreenSetupPage(0, pageDef); }},
{ ICON_THEME_VIEW2, STR_DEF(STR_QM_SCREEN_2), STR_DEF(STR_MAIN_VIEW_2), PAGE_CREATE, QM_UI_SCREEN2, [](PageDef& pageDef) { return new ScreenSetupPage(1, pageDef); }, []() { return customScreens[1] != nullptr; }},
{ ICON_THEME_VIEW3, STR_DEF(STR_QM_SCREEN_3), STR_DEF(STR_MAIN_VIEW_3), PAGE_CREATE, QM_UI_SCREEN3, [](PageDef& pageDef) { return new ScreenSetupPage(2, pageDef); }, []() { return customScreens[2] != nullptr; }},
{ ICON_THEME_VIEW4, STR_DEF(STR_QM_SCREEN_4), STR_DEF(STR_MAIN_VIEW_4), PAGE_CREATE, QM_UI_SCREEN4, [](PageDef& pageDef) { return new ScreenSetupPage(3, pageDef); }, []() { return customScreens[3] != nullptr; }},
{ ICON_THEME_VIEW5, STR_DEF(STR_QM_SCREEN_5), STR_DEF(STR_MAIN_VIEW_5), PAGE_CREATE, QM_UI_SCREEN5, [](PageDef& pageDef) { return new ScreenSetupPage(4, pageDef); }, []() { return customScreens[4] != nullptr; }},
{ ICON_THEME_VIEW6, STR_DEF(STR_QM_SCREEN_6), STR_DEF(STR_MAIN_VIEW_6), PAGE_CREATE, QM_UI_SCREEN6, [](PageDef& pageDef) { return new ScreenSetupPage(5, pageDef); }, []() { return customScreens[5] != nullptr; }},
{ ICON_THEME_VIEW7, STR_DEF(STR_QM_SCREEN_7), STR_DEF(STR_MAIN_VIEW_7), PAGE_CREATE, QM_UI_SCREEN7, [](PageDef& pageDef) { return new ScreenSetupPage(6, pageDef); }, []() { return customScreens[6] != nullptr; }},
{ ICON_THEME_VIEW8, STR_DEF(STR_QM_SCREEN_8), STR_DEF(STR_MAIN_VIEW_8), PAGE_CREATE, QM_UI_SCREEN8, [](PageDef& pageDef) { return new ScreenSetupPage(7, pageDef); }, []() { return customScreens[7] != nullptr; }},
{ ICON_THEME_VIEW9, STR_DEF(STR_QM_SCREEN_9), STR_DEF(STR_MAIN_VIEW_9), PAGE_CREATE, QM_UI_SCREEN9, [](PageDef& pageDef) { return new ScreenSetupPage(8, pageDef); }, []() { return customScreens[8] != nullptr; }},
{ ICON_THEME_VIEW10, STR_DEF(STR_QM_SCREEN_10), STR_DEF(STR_MAIN_VIEW_10), PAGE_CREATE, QM_UI_SCREEN10, [](PageDef& pageDef) { return new ScreenSetupPage(9, pageDef); }, []() { return customScreens[9] != nullptr; }},
{ ICON_THEME_ADD_VIEW, STR_DEF(STR_QM_ADD_SCREEN), STR_DEF(STR_QM_ADD_SCREEN), PAGE_CREATE, QM_UI_ADD_PG, [](PageDef& pageDef) { return new ScreenAddPage(pageDef); }, []() { return customScreens[9] == nullptr; }},
{ EDGETX_ICONS_COUNT }
};
PageDef statsMenuItems[] = {
{ ICON_STATS, STR_DEF(STR_QM_STATS), STR_DEF(STR_MAIN_MENU_STATISTICS), PAGE_CREATE, QM_TOOLS_STATS, [](PageDef& pageDef) { return new StatisticsViewPage(pageDef); }},
{ ICON_STATS_DEBUG, STR_DEF(STR_QM_DEBUG), STR_DEF(STR_DEBUG), PAGE_CREATE, QM_TOOLS_DEBUG, [](PageDef& pageDef) { return new DebugViewPage(pageDef); }},
{ EDGETX_ICONS_COUNT }
};
QMTopDef qmTopItems[] = {
{ ICON_MODEL_SELECT, STR_DEF(STR_QM_MANAGE_MODELS), STR_DEF(STR_MANAGE_MODELS), QM_ACTION, QM_MANAGE_MODELS, nullptr, []() { QuickMenu::selected(); new ModelLabelsWindow(); }},
{ ICON_MODEL_NOTES, STR_DEF(STR_MAIN_MENU_MODEL_NOTES), STR_DEF(STR_MAIN_MENU_MODEL_NOTES), QM_ACTION, QM_NONE, nullptr, []() { QuickMenu::openPage(QM_MODEL_NOTES); }, modelHasNotes},
{ ICON_MONITOR, STR_DEF(STR_QM_CHAN_MON), STR_DEF(STR_QM_CHAN_MON), QM_ACTION, QM_TOOLS_CHAN_MON, nullptr,
[]() {
QuickMenu::selected();
new ChannelsViewMenu();
}
},
{ ICON_MODEL_SETUP, STR_DEF(STR_QM_MODEL_SETTINGS), STR_DEF(STR_MAIN_MODEL_SETTINGS), QM_ACTION, QM_NONE, nullptr, []() { QuickMenu::openPage(QM_MODEL_SETUP); }},
{ ICON_RADIO_SETUP, STR_DEF(STR_QM_RADIO_SETTINGS), STR_DEF(STR_MAIN_RADIO_SETTINGS), QM_ACTION, QM_NONE, nullptr, []() { QuickMenu::openPage(QM_RADIO_SETUP); }},
{ ICON_THEME, STR_DEF(STR_MAIN_MENU_SCREEN_SETTINGS), STR_DEF(STR_MAIN_MENU_SCREEN_SETTINGS), QM_ACTION, QM_NONE, nullptr, []() { QuickMenu::openPage(QM_UI_SCREEN1); }},
{ ICON_TOOLS_RESET, STR_DEF(STR_QM_RESET), STR_DEF(STR_QM_RESET), QM_ACTION, QM_TOOLS_RESET, nullptr,
[]() {
QuickMenu::selected();
Menu* resetMenu = new Menu();
resetMenu->addLine(STR_RESET_FLIGHT, []() { flightReset(); });
resetMenu->addLine(STR_RESET_TIMER1, []() { timerReset(0); });
resetMenu->addLine(STR_RESET_TIMER2, []() { timerReset(1); });
resetMenu->addLine(STR_RESET_TIMER3, []() { timerReset(2); });
resetMenu->addLine(STR_RESET_TELEMETRY, []() { telemetryReset(); });
}
},
{ ICON_STATS, STR_DEF(STR_QM_STATS), STR_DEF(STR_MAIN_MENU_STATISTICS), QM_ACTION, QM_NONE, nullptr, []() { QuickMenu::openPage(QM_TOOLS_STATS); }},
{ ICON_RADIO_VERSION, STR_DEF(STR_QM_ABOUT), STR_DEF(STR_MAIN_MENU_ABOUT_EDGETX), QM_ACTION, QM_NONE, nullptr, []() { QuickMenu::openPage(QM_RADIO_VERSION); }},
// Not displayed - search / run only
{ ICON_MODEL, STR_DEF(STR_QM_MODEL_SETUP), STR_DEF(STR_MAIN_MENU_MODEL_SETTINGS), QM_SUBMENU, QM_NONE, modelMenuItems},
{ ICON_RADIO, STR_DEF(STR_QM_RADIO_SETUP), STR_DEF(STR_MAIN_MENU_RADIO_SETTINGS), QM_SUBMENU, QM_NONE, radioMenuItems},
{ ICON_THEME, STR_DEF(STR_QM_UI_SETUP), STR_DEF(STR_MAIN_MENU_SCREEN_SETTINGS), QM_SUBMENU, QM_NONE, screensMenuItems},
{ ICON_STATS, STR_DEF(STR_QM_STATS), STR_DEF(STR_MAIN_MENU_STATISTICS), QM_SUBMENU, QM_NONE, statsMenuItems},
{ EDGETX_ICONS_COUNT }
};
#else
PageDef favoritesMenuItems[] = {
{ EDGETX_ICONS_COUNT, nullptr, nullptr, PAGE_CREATE, QM_NONE, nullptr},
{ EDGETX_ICONS_COUNT, nullptr, nullptr, PAGE_CREATE, QM_NONE, nullptr},
@@ -145,6 +237,7 @@ PageDef toolsMenuItems[] = {
{ ICON_RADIO_SD_MANAGER, STR_DEF(STR_QM_STORAGE), STR_DEF(STR_SD_CARD), PAGE_CREATE, QM_TOOLS_STORAGE, [](PageDef& pageDef) { return new RadioSdManagerPage(pageDef); }},
{ ICON_TOOLS_RESET, STR_DEF(STR_QM_RESET), STR_DEF(STR_QM_RESET), PAGE_ACTION, QM_TOOLS_RESET, nullptr, nullptr,
[]() {
QuickMenu::selected();
Menu* resetMenu = new Menu();
resetMenu->addLine(STR_RESET_FLIGHT, []() { flightReset(); });
resetMenu->addLine(STR_RESET_TIMER1, []() { timerReset(0); });
@@ -155,6 +248,7 @@ PageDef toolsMenuItems[] = {
},
{ ICON_MONITOR, STR_DEF(STR_QM_CHAN_MON), STR_DEF(STR_QM_CHAN_MON), PAGE_ACTION, QM_TOOLS_CHAN_MON, nullptr, nullptr,
[]() {
QuickMenu::selected();
new ChannelsViewMenu();
}
},
@@ -166,14 +260,12 @@ PageDef toolsMenuItems[] = {
QMTopDef qmTopItems[] = {
{ ICON_QM_FAVORITES, STR_DEF(STR_FAVORITE_LABEL), STR_DEF(STR_FAVORITE_LABEL), QM_SUBMENU, QM_NONE, favoritesMenuItems, nullptr, []() { return favoritesMenuItems[0].icon != EDGETX_ICONS_COUNT; }},
{ ICON_MODEL_SELECT, STR_DEF(STR_QM_MANAGE_MODELS), STR_DEF(STR_MANAGE_MODELS), QM_ACTION, QM_MANAGE_MODELS, nullptr,
[]() {
QuickMenu::selected();
new ModelLabelsWindow();
}},
{ ICON_MODEL_SELECT, STR_DEF(STR_QM_MANAGE_MODELS), STR_DEF(STR_MANAGE_MODELS), QM_ACTION, QM_MANAGE_MODELS, nullptr, []() { QuickMenu::selected(); new ModelLabelsWindow(); }},
{ ICON_MODEL, STR_DEF(STR_QM_MODEL_SETUP), STR_DEF(STR_MAIN_MENU_MODEL_SETTINGS), QM_SUBMENU, QM_NONE, modelMenuItems},
{ ICON_RADIO, STR_DEF(STR_QM_RADIO_SETUP), STR_DEF(STR_MAIN_MENU_RADIO_SETTINGS), QM_SUBMENU, QM_NONE, radioMenuItems},
{ ICON_THEME, STR_DEF(STR_QM_UI_SETUP), STR_DEF(STR_MAIN_MENU_SCREEN_SETTINGS), QM_SUBMENU, QM_NONE, screensMenuItems},
{ ICON_RADIO_TOOLS, STR_DEF(STR_QM_TOOLS), STR_DEF(STR_QM_TOOLS), QM_SUBMENU, QM_NONE, toolsMenuItems},
{ EDGETX_ICONS_COUNT }
};
#endif
@@ -21,6 +21,8 @@
#pragma once
#include "stamp.h"
enum QMPage {
QM_NONE = 0,
QM_OPEN_QUICK_MENU,
@@ -64,12 +64,16 @@ class QuickMenuButton : public ButtonBase
visibleHandler(std::move(visibleHandler))
{
iconPtr = new StaticIcon(this, (QuickMenuGroup::QM_BUTTON_WIDTH - QuickMenuGroup::QM_ICON_SIZE) / 2, PAD_SMALL, icon, COLOR_THEME_QM_FG_INDEX);
#if VERSION_MAJOR > 2
etx_obj_add_style(iconPtr->getLvObj(), styles->qmdisabled, LV_PART_MAIN | LV_STATE_DISABLED);
#endif
etx_img_color(iconPtr->getLvObj(), COLOR_THEME_QM_BG_INDEX, LV_STATE_USER_1);
textPtr = new StaticText(this, {0, QuickMenuGroup::QM_ICON_SIZE + PAD_TINY * 2, QuickMenuGroup::QM_BUTTON_WIDTH - 1, 0},
title, COLOR_THEME_QM_FG_INDEX, CENTERED | FONT(XS));
#if VERSION_MAJOR > 2
etx_obj_add_style(textPtr->getLvObj(), styles->qmdisabled, LV_PART_MAIN | LV_STATE_DISABLED);
#endif
etx_txt_color(textPtr->getLvObj(), COLOR_THEME_QM_BG_INDEX, LV_STATE_USER_1);
lv_obj_add_event_cb(lvobj, QuickMenuButton::focused_cb, LV_EVENT_FOCUSED, nullptr);
@@ -573,7 +573,7 @@ HeaderIcon::HeaderIcon(Window* parent, const char* iconFile, std::function<void(
}
HeaderBackIcon::HeaderBackIcon(Window* parent, std::function<void()> action) :
StaticIcon(parent, LCD_W - PageGroup::PAGE_TOP_BAR_H, 0, ICON_TOPRIGHT_BG, COLOR_THEME_FOCUS_INDEX),
StaticIcon(parent, LCD_W - PageGroup::PAGE_GROUP_BACK_BTN_W, 0, ICON_TOPRIGHT_BG, COLOR_THEME_FOCUS_INDEX),
action(std::move(action))
{
(new StaticIcon(this, 0, 0, ICON_BTN_CLOSE, COLOR_THEME_PRIMARY2_INDEX))->center(width() + PAD_MEDIUM, height());
+3 -3
View File
@@ -212,11 +212,11 @@ class TimerWidget : public Widget
static LAYOUT_VAL_SCALED(NM_LRG_W, 93)
static LAYOUT_VAL_SCALED(U0_X, 111)
static LAYOUT_VAL_SCALED(U0_Y, 33)
static LAYOUT_VAL_SCALED(U1_X, 161)
static LAYOUT_VAL_SCALED(U1_X, 162)
static LAYOUT_VAL_SCALED(U1_Y, 33)
static LAYOUT_VAL_SCALED(D0_X, 76)
static LAYOUT_VAL_SCALED(D0_X, 74)
static LAYOUT_VAL_SCALED(D0_Y, 31)
static LAYOUT_VAL_SCALED(D1_X, 126)
static LAYOUT_VAL_SCALED(D1_X, 125)
static LAYOUT_VAL_SCALED(D1_Y, 31)
protected:
@@ -447,8 +447,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -438,8 +438,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -445,8 +445,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -470,8 +470,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -445,8 +445,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -438,8 +438,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -470,8 +470,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -455,8 +455,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -470,8 +470,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -470,8 +470,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -446,8 +446,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelQuickSelect", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "pwrOffIfInactive", 8 ),
YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL),
YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL),
YAML_PADDING( 48 ),
YAML_PADDING( 96 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {