diff --git a/radio/src/gui/colorlcd/channel_bar.h b/radio/src/gui/colorlcd/channel_bar.h index 84bf3a354..8e915d3e4 100644 --- a/radio/src/gui/colorlcd/channel_bar.h +++ b/radio/src/gui/colorlcd/channel_bar.h @@ -123,6 +123,11 @@ class OutputChannelBar : public ChannelBar public: using ChannelBar::ChannelBar; + void setOutputBarLimitColor(uint32_t color) + { + outputBarLimitsColor = color; + } + void paint(BitmapBuffer * dc) override { if (!enabled) return; @@ -196,13 +201,13 @@ class OutputChannelBar : public ChannelBar void drawOutputBarLimits(BitmapBuffer * dc, coord_t left, coord_t right) { - dc->drawSolidVerticalLine(left, 0, BAR_HEIGHT, COLOR_THEME_SECONDARY1); - dc->drawSolidHorizontalLine(left, 0, 3, COLOR_THEME_SECONDARY1); - dc->drawSolidHorizontalLine(left, BAR_HEIGHT - 1, 3, COLOR_THEME_SECONDARY1); + dc->drawSolidVerticalLine(left, 0, BAR_HEIGHT, outputBarLimitsColor); + dc->drawSolidHorizontalLine(left, 0, 3, outputBarLimitsColor); + dc->drawSolidHorizontalLine(left, BAR_HEIGHT - 1, 3, outputBarLimitsColor); - dc->drawSolidVerticalLine(right, 0, BAR_HEIGHT, COLOR_THEME_SECONDARY1); - dc->drawSolidHorizontalLine(right - 3, 0, 3, COLOR_THEME_SECONDARY1); - dc->drawSolidHorizontalLine(right - 3, BAR_HEIGHT - 1, 3, COLOR_THEME_SECONDARY1); + dc->drawSolidVerticalLine(right, 0, BAR_HEIGHT, outputBarLimitsColor); + dc->drawSolidHorizontalLine(right - 3, 0, 3, outputBarLimitsColor); + dc->drawSolidHorizontalLine(right - 3, BAR_HEIGHT - 1, 3, outputBarLimitsColor); } void checkEvents() override @@ -236,6 +241,7 @@ class OutputChannelBar : public ChannelBar int value = 0; int limMax = 0; int limMin = 0; + uint32_t outputBarLimitsColor = COLOR_THEME_SECONDARY1; }; constexpr coord_t lmargin = 25; @@ -247,8 +253,26 @@ class ComboChannelBar : public ChannelBar ComboChannelBar(Window * parent, const rect_t & rect, uint8_t channel): ChannelBar(parent, rect, channel) { - new OutputChannelBar(this, {lmargin, BAR_HEIGHT, width() - lmargin, BAR_HEIGHT}, channel); - new MixerChannelBar(this, {lmargin, 2 * BAR_HEIGHT + 1, width() - lmargin, BAR_HEIGHT}, channel); + outputChannelBar = new OutputChannelBar(this, {leftMargin, BAR_HEIGHT, width() - leftMargin, BAR_HEIGHT}, channel); + new MixerChannelBar(this, {leftMargin, 2 * BAR_HEIGHT + 1, width() - leftMargin, BAR_HEIGHT}, channel); + } + + void setOutputChannelBarLimitColor(uint32_t color) + { + if (outputChannelBar != nullptr) { + outputChannelBar->setOutputBarLimitColor(color); + } + } + + void setTextColor(uint32_t color) + { + textColor = color; + invalidate(); + } + + void setLeftMargin(int margin) + { + leftMargin = margin; } void paint(BitmapBuffer * dc) override @@ -260,24 +284,24 @@ class ComboChannelBar : public ChannelBar // Channel number strAppendSigned(&chanString[2], channel + 1, 2); - dc->drawText(lmargin, 0, chanString, FONT(XS) | COLOR_THEME_SECONDARY1 | LEFT); + dc->drawText(leftMargin, 0, chanString, FONT(XS) | textColor | LEFT); // Channel name - dc->drawSizedText(lmargin + 45, 0, g_model.limitData[channel].name, sizeof(g_model.limitData[channel].name), FONT(XS) | COLOR_THEME_SECONDARY1 | LEFT); + dc->drawSizedText(leftMargin + 45, 0, g_model.limitData[channel].name, sizeof(g_model.limitData[channel].name), FONT(XS) | textColor | LEFT); // Channel value in µS - dc->drawNumber(width(), 0, usValue, FONT(XS) | COLOR_THEME_SECONDARY1 | RIGHT, 0, nullptr, STR_US); + dc->drawNumber(width(), 0, usValue, FONT(XS) | textColor | RIGHT, 0, nullptr, STR_US); // Override icon #if defined(OVERRIDE_CHANNEL_FUNCTION) if (safetyCh[channel] != OVERRIDE_CHANNEL_UNDEFINED) - dc->drawMask(0, 1, chanMonLockedBitmap, COLOR_THEME_SECONDARY1); + dc->drawMask(0, 1, chanMonLockedBitmap, textColor); #endif // Channel reverted icon LimitData * ld = limitAddress(channel); if (ld && ld->revert) { - lcd->drawMask(0, 20, chanMonInvertedBitmap, COLOR_THEME_SECONDARY1); + lcd->drawMask(0, 20, chanMonInvertedBitmap, textColor); } } @@ -300,7 +324,10 @@ class ComboChannelBar : public ChannelBar } protected: + OutputChannelBar *outputChannelBar = nullptr; int value = 0; + int leftMargin = lmargin; + uint32_t textColor = COLOR_THEME_SECONDARY1; #if defined(OVERRIDE_CHANNEL_FUNCTION) int safetyChValue = OVERRIDE_CHANNEL_UNDEFINED; #endif diff --git a/radio/src/gui/colorlcd/menu_screen.cpp b/radio/src/gui/colorlcd/menu_screen.cpp index b5fe53bd4..570084f2c 100644 --- a/radio/src/gui/colorlcd/menu_screen.cpp +++ b/radio/src/gui/colorlcd/menu_screen.cpp @@ -57,4 +57,8 @@ void ScreenMenu::updateTabs() break; } } + + // set the active tab to the currently sown screen on the MainView + if ((g_model.view + 1) < getTabs()) + setCurrentTab(g_model.view + 1); } diff --git a/radio/src/gui/colorlcd/model_mixes.cpp b/radio/src/gui/colorlcd/model_mixes.cpp index ea7d5543f..f27e6abe7 100644 --- a/radio/src/gui/colorlcd/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model_mixes.cpp @@ -28,6 +28,7 @@ #include "gvar_numberedit.h" #include "model_curves.h" #include "dataconstants.h" +#include "channel_bar.h" #define SET_DIRTY() storageDirty(EE_MODEL) @@ -57,6 +58,29 @@ bool reachMixesLimit() return false; } +class MixerEditStatusBar : public Window +{ + public: + MixerEditStatusBar(Window *parent, const rect_t &rect, int8_t channel) : + Window(parent, rect), + _channel(channel) + { + channelBar = new ComboChannelBar(this, {3, 0, rect.w - 6, rect.h}, channel); + channelBar->setLeftMargin(0); + channelBar->setTextColor(COLOR_THEME_PRIMARY2); + channelBar->setOutputChannelBarLimitColor(COLOR_THEME_EDIT); + } + + void paint(BitmapBuffer *dc) override + { + // dc->clear(COLOR_THEME_SECONDARY2); + } + + protected: + ComboChannelBar *channelBar; + int8_t _channel; +}; + class MixEditWindow : public Page { public: @@ -71,6 +95,7 @@ class MixEditWindow : public Page uint8_t channel; uint8_t mixIndex; FormGroup *curveParamField = nullptr; + MixerEditStatusBar *statusBar = nullptr; void buildHeader(Window *window) { @@ -82,6 +107,10 @@ class MixEditWindow : public Page {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_CH1 + channel), 0, COLOR_THEME_PRIMARY2); + + statusBar = new MixerEditStatusBar( + window, {window->getRect().w - 250, 0, 250, MENU_HEADER_HEIGHT + 3}, + channel); } void buildBody(FormWindow *window) diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index c72a3e463..1137caa3e 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -263,86 +263,6 @@ class SetupWidgetsPage: public FormWindow // } }; -class ThemeEditorPage : public Page -{ - public: - explicit ThemeEditorPage(Window *parent, ThemeFile *theme, WindowFlags flags = 0) : - Page(0), - theme(theme) - { - buildBody(&body); - buildHeader(&header); - } - - void buildHeader(FormGroup *window) - { - ThemePersistance *tp = ThemePersistance::instance(); - - new StaticText(window, - {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, - PAGE_LINE_HEIGHT}, - "Edit Theme", 0, COLOR_THEME_PRIMARY2); - new StaticText(window, - {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, - LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, - theme->getName(), 0, COLOR_THEME_PRIMARY2); - - rect_t r = {LCD_W - (BUTTON_WIDTH + 5), static_cast(PAGE_TITLE_TOP + ((header.getRect().h - BUTTON_HEIGHT) / 2)), BUTTON_WIDTH, BUTTON_HEIGHT }; - new TextButton(window, r, "Save", [=] () { - theme->serialize(); - tp->refresh(); - tp->applyTheme(tp->getThemeIndex()); - body.clear(); - buildBody(&body); - return 0; - }); - } - - void buildBody(FormGroup *window) - { - FormGridLayout grid; - grid.spacer(8); - - new StaticText(window, grid.getLabelSlot(), "Name", 0, COLOR_THEME_PRIMARY1); - new TextEdit(window, grid.getFieldSlot(), theme->getName(), NAME_LENGTH); - grid.nextLine(); - new StaticText(window, grid.getLabelSlot(), "Author", 0, COLOR_THEME_PRIMARY1); - new TextEdit(window, grid.getFieldSlot(), theme->getAuthor(), AUTHOR_LENGTH); - grid.nextLine(); - new StaticText(window, grid.getLineSlot(), "Description", 0, COLOR_THEME_PRIMARY1); - grid.nextLine(); - new TextEdit(window, grid.getLineSlot(), theme->getInfo(), INFO_LENGTH); - grid.nextLine(); - - grid.spacer(10); - new StaticText(window, grid.getLineSlot(), "Colors", 0, COLOR_THEME_PRIMARY1 | FONT(BOLD)); - grid.nextLine(); - grid.spacer(10); - - char **colorNames = ThemePersistance::getColorNames(); - for (int i = 0; i < COLOR_COUNT; i++) { - char * name = colorNames[i]; - new StaticText(window, grid.getLabelSlot(), name, 0, COLOR_THEME_PRIMARY1); - - new ColorEdit(window, grid.getFieldSlot(), - [=] () { - return theme->getColorByName(name); - }, - [=] (uint16_t value) { - theme->setColor((LcdColorIndex)i, value); - }); - - grid.nextLine(); - } - - grid.spacer(20); - window->setInnerHeight(grid.getWindowHeight()); - } - - protected: - ThemeFile *theme; -}; - ScreenUserInterfacePage::ScreenUserInterfacePage(ScreenMenu* menu): PageTab(STR_USER_INTERFACE, ICON_THEME_SETUP), menu(menu) diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index ef20a254f..95ee52012 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -638,8 +638,9 @@ void SpecialFunctionsPage::build(FormWindow *window, int8_t focusIndex) CustomFunctionData *cfn = &functions[i]; strAppendUnsigned(&s[2], i+1); + Button *button; if (cfn->swtch == 0) { - auto button = new TextButton(window, grid.getLabelSlot(), s); + button = new TextButton(window, grid.getLabelSlot(), s); button->setPressHandler([=]() { if (clipboard.type == CLIPBOARD_TYPE_CUSTOM_FUNCTION) { Menu *menu = new Menu(window); @@ -658,8 +659,7 @@ void SpecialFunctionsPage::build(FormWindow *window, int8_t focusIndex) } else { auto txt = new StaticText(window, grid.getLabelSlot(), s, BUTTON_BACKGROUND, COLOR_THEME_PRIMARY1 | CENTERED); - auto button = - new SpecialFunctionButton(window, grid.getFieldSlot(), functions, i); + button = new SpecialFunctionButton(window, grid.getFieldSlot(), functions, i); button->setPressHandler([=]() { button->bringToTop(); Menu *menu = new Menu(window); @@ -718,7 +718,6 @@ void SpecialFunctionsPage::build(FormWindow *window, int8_t focusIndex) }); if (focusIndex == i) { - button->setFocus(SET_FOCUS_DEFAULT); txt->setBackgroundColor(COLOR_THEME_FOCUS); txt->setTextFlags(COLOR_THEME_PRIMARY2 | CENTERED); txt->invalidate(); @@ -727,6 +726,11 @@ void SpecialFunctionsPage::build(FormWindow *window, int8_t focusIndex) txt->setHeight(button->height()); grid.spacer(button->height() + 5); } + + if (focusIndex == i) { // fix focus #303 + button->setFocus(SET_FOCUS_DEFAULT); + } + } grid.nextLine();