From 7d98adfb5680f9b8c18d7c129192648a3ea1cebe Mon Sep 17 00:00:00 2001 From: Phil Mitchell Date: Mon, 27 Feb 2023 12:52:13 +1100 Subject: [PATCH] Add scroll bar to radio settings/config pages. --- radio/src/gui/colorlcd/radio_hardware.cpp | 40 +++++++++++--------- radio/src/gui/colorlcd/radio_sdmanager.cpp | 1 + radio/src/gui/colorlcd/radio_setup.cpp | 33 +++++++++------- radio/src/gui/colorlcd/radio_theme.cpp | 1 + radio/src/gui/colorlcd/radio_tools.cpp | 14 +++++-- radio/src/gui/colorlcd/special_functions.cpp | 16 +++++--- 6 files changed, 64 insertions(+), 41 deletions(-) diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index de173cc596e..f980646c2d2 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -50,14 +50,18 @@ RadioHardwarePage::RadioHardwarePage(): void RadioHardwarePage::build(FormWindow * window) { - window->setFlexLayout(); + window->padAll(0); + lv_obj_set_scrollbar_mode(window->getLvObj(), LV_SCROLLBAR_MODE_AUTO); + + auto form = new FormWindow(window, rect_t{}); + form->setFlexLayout(); FlexGridLayout grid(col_dsc, row_dsc, 2); - lv_obj_set_style_pad_all(window->getLvObj(), lv_dpx(8), 0); + form->padAll(8); // TODO: sub-title? // Batt meter range - Range 3.0v to 16v - auto line = window->newLine(&grid); + auto line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_BATTERY_RANGE, 0, COLOR_THEME_PRIMARY1); auto box = new FormGroup(line, rect_t{}); @@ -89,7 +93,7 @@ void RadioHardwarePage::build(FormWindow * window) }); // Bat calibration - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_BATT_CALIB, 0, COLOR_THEME_PRIMARY1); auto batCal = new NumberEdit(line, rect_t{}, -127, 127, @@ -100,7 +104,7 @@ void RadioHardwarePage::build(FormWindow * window) batCal->setWindowFlags(REFRESH_ALWAYS); // RTC Batt check enable - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_RTC_CHECK, 0, COLOR_THEME_PRIMARY1); box = new FormGroup(line, rect_t{}); @@ -116,36 +120,36 @@ void RadioHardwarePage::build(FormWindow * window) }, COLOR_THEME_PRIMARY1 | PREC2, nullptr, "V"); // ADC filter - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_JITTER_FILTER, 0, COLOR_THEME_PRIMARY1); new CheckBox(line, rect_t{}, GET_SET_INVERTED(g_eeGeneral.noJitterFilter)); #if defined(HARDWARE_INTERNAL_MODULE) - new Subtitle(window, rect_t{}, STR_INTERNALRF, 0, COLOR_THEME_PRIMARY1); - auto intMod = new InternalModuleWindow(window); + new Subtitle(form, rect_t{}, STR_INTERNALRF, 0, COLOR_THEME_PRIMARY1); + auto intMod = new InternalModuleWindow(form); intMod->padLeft(lv_dpx(8)); #endif #if defined(HARDWARE_EXTERNAL_MODULE) - new Subtitle(window, rect_t{}, STR_EXTERNALRF, 0, COLOR_THEME_PRIMARY1); - auto extMod = new ExternalModuleWindow(window); + new Subtitle(form, rect_t{}, STR_EXTERNALRF, 0, COLOR_THEME_PRIMARY1); + auto extMod = new ExternalModuleWindow(form); extMod->padLeft(lv_dpx(8)); #endif #if defined(BLUETOOTH) - new Subtitle(window, rect_t{}, STR_BLUETOOTH, 0, COLOR_THEME_PRIMARY1); - auto bt = new BluetoothConfigWindow(window); + new Subtitle(form, rect_t{}, STR_BLUETOOTH, 0, COLOR_THEME_PRIMARY1); + auto bt = new BluetoothConfigWindow(form); bt->padLeft(lv_dpx(8)); #endif - new Subtitle(window, rect_t{}, STR_AUX_SERIAL_MODE, 0, COLOR_THEME_PRIMARY1); - auto serial = new SerialConfigWindow(window, rect_t{}); + new Subtitle(form, rect_t{}, STR_AUX_SERIAL_MODE, 0, COLOR_THEME_PRIMARY1); + auto serial = new SerialConfigWindow(form, rect_t{}); serial->padLeft(lv_dpx(8)); // Calibration - new Subtitle(window, rect_t{}, STR_INPUTS, 0, COLOR_THEME_PRIMARY1); + new Subtitle(form, rect_t{}, STR_INPUTS, 0, COLOR_THEME_PRIMARY1); - box = new FormGroup(window, rect_t{}); + box = new FormGroup(form, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8)); lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0); box->padRow(lv_dpx(8)); @@ -177,9 +181,9 @@ void RadioHardwarePage::build(FormWindow * window) lv_obj_set_style_min_width(btn->getLvObj(), LV_DPI_DEF, 0); // Debugs - new Subtitle(window, rect_t{}, STR_DEBUG, 0, COLOR_THEME_PRIMARY1); + new Subtitle(form, rect_t{}, STR_DEBUG, 0, COLOR_THEME_PRIMARY1); - box = new FormGroup(window, rect_t{}); + box = new FormGroup(form, rect_t{}); box->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8)); lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0); box->padRow(lv_dpx(8)); diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index 6dbc74cafda..b57923cf7b8 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -164,6 +164,7 @@ void RadioSdManagerPage::build(FormWindow * window) browser = new FileBrowser(form, rect_t{}, ROOT_PATH); grid.add(browser); grid.nextCell(); + lv_obj_set_scrollbar_mode(browser->getLvObj(), LV_SCROLLBAR_MODE_AUTO); auto obj = browser->getLvObj(); lv_obj_set_style_grid_cell_x_align(obj, LV_GRID_ALIGN_STRETCH, 0); diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index e59efe67037..f1f4390af52 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -647,14 +647,19 @@ RadioSetupPage::RadioSetupPage(): void RadioSetupPage::build(FormWindow * window) { + window->padAll(0); + window->padBottom(8); + lv_obj_set_scrollbar_mode(window->getLvObj(), LV_SCROLLBAR_MODE_AUTO); + + auto form = new FormWindow(window, rect_t{}); + form->setFlexLayout(); FlexGridLayout grid(col_three_dsc, row_dsc, 2); - window->setFlexLayout(); // Date & time picker including labels - new DateTimeWindow(window, rect_t{}); + new DateTimeWindow(form, rect_t{}); // Sub-pages - new WindowButtonGroup(window, rect_t{}, { + new WindowButtonGroup(form, rect_t{}, { {STR_SOUND_LABEL, []() { new SoundPage(); }}, #if defined(VARIO) {STR_VARIO, []() { new VarioPage(); }}, @@ -671,7 +676,7 @@ void RadioSetupPage::build(FormWindow * window) #if defined(PWR_BUTTON_PRESS) // Pwr Off Delay { - auto line = window->newLine(&grid); + auto line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_PWR_OFF_DELAY, 0, COLOR_THEME_PRIMARY1); new Choice(line, rect_t{}, STR_PWR_OFF_DELAYS, 0, 3, [=]() -> int32_t { @@ -687,7 +692,7 @@ void RadioSetupPage::build(FormWindow * window) #if defined(PXX2) // Owner ID { - auto line = window->newLine(&grid); + auto line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_OWNER_ID, 0, COLOR_THEME_PRIMARY1); new RadioTextEdit(line, rect_t{}, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); @@ -695,12 +700,12 @@ void RadioSetupPage::build(FormWindow * window) #endif // Country code - auto line = window->newLine(&grid); + auto line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_COUNTRY_CODE, 0, COLOR_THEME_PRIMARY1); new Choice(line, rect_t{}, STR_COUNTRY_CODES, 0, 2, GET_SET_DEFAULT(g_eeGeneral.countryCode)); // Audio language - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_VOICE_LANGUAGE, 0, COLOR_THEME_PRIMARY1); auto choice = new Choice(line, rect_t{}, 0, DIM(languagePacks) - 2, @@ -713,7 +718,7 @@ void RadioSetupPage::build(FormWindow * window) [](uint8_t value) { return languagePacks[value]->name; }); // Imperial units - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_UNITS_SYSTEM, 0, COLOR_THEME_PRIMARY1); new Choice(line, rect_t{}, STR_VUNITSSYSTEM, 0, 1, GET_SET_DEFAULT(g_eeGeneral.imperial)); @@ -734,7 +739,7 @@ void RadioSetupPage::build(FormWindow * window) #endif // Switches delay - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_SWITCHES_DELAY, 0, COLOR_THEME_PRIMARY1); grid.setColSpan(2); auto edit = @@ -744,13 +749,13 @@ void RadioSetupPage::build(FormWindow * window) grid.setColSpan(1); // USB mode - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_USBMODE, 0, COLOR_THEME_PRIMARY1); new Choice(line, rect_t{}, STR_USBMODES, USB_UNSELECTED_MODE, USB_MAX_MODE, GET_SET_DEFAULT(g_eeGeneral.USBMode)); #if defined(ROTARY_ENCODER_NAVIGATION) - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_ROTARY_ENC_MODE, 0, COLOR_THEME_PRIMARY1); new Choice(line, rect_t{}, STR_ROTARY_ENC_OPT, ROTARY_ENCODER_MODE_NORMAL, ROTARY_ENCODER_MODE_INVERT_BOTH, @@ -758,7 +763,7 @@ void RadioSetupPage::build(FormWindow * window) #endif // RX channel order - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_RXCHANNELORD, 0, COLOR_THEME_PRIMARY1); // RAET->AETR grid.setColSpan(2); @@ -774,7 +779,7 @@ void RadioSetupPage::build(FormWindow * window) grid.setColSpan(1); // Stick mode - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_MODE, 0, COLOR_THEME_PRIMARY1); grid.setColSpan(2); choice = new Choice(line, rect_t{}, 0, 3, GET_DEFAULT(g_eeGeneral.stickMode), @@ -795,7 +800,7 @@ void RadioSetupPage::build(FormWindow * window) grid.setColSpan(1); // Model quick select - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_MODEL_QUICK_SELECT, 0, COLOR_THEME_PRIMARY1); new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_eeGeneral.modelQuickSelect)); } diff --git a/radio/src/gui/colorlcd/radio_theme.cpp b/radio/src/gui/colorlcd/radio_theme.cpp index 9919f321b1c..93f257a5b4e 100644 --- a/radio/src/gui/colorlcd/radio_theme.cpp +++ b/radio/src/gui/colorlcd/radio_theme.cpp @@ -626,6 +626,7 @@ void ThemeSetupPage::setSelected(ThemePersistance *tp) void ThemeSetupPage::setupListbox(Window *window, rect_t r, ThemePersistance *tp) { listBox = new ListBox(window, r, tp->getNames()); + lv_obj_set_scrollbar_mode(listBox->getLvObj(), LV_SCROLLBAR_MODE_AUTO); listBox->setAutoEdit(true); listBox->setSelected(currentTheme); listBox->setActiveItem(tp->getThemeIndex()); diff --git a/radio/src/gui/colorlcd/radio_tools.cpp b/radio/src/gui/colorlcd/radio_tools.cpp index 397c42dfb10..17602ea13af 100644 --- a/radio/src/gui/colorlcd/radio_tools.cpp +++ b/radio/src/gui/colorlcd/radio_tools.cpp @@ -39,6 +39,7 @@ RadioToolsPage::RadioToolsPage(): void RadioToolsPage::build(FormWindow * window) { this->window = window; + lv_obj_set_scrollbar_mode(window->getLvObj(), LV_SCROLLBAR_MODE_AUTO); memclear(&reusableBuffer.radioTools, sizeof(reusableBuffer.radioTools)); waiting = 0; @@ -243,10 +244,15 @@ void RadioToolsPage::rebuild(FormWindow * window) tools.sort(tool_compare_nocase); - window->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8)); - window->padRow(lv_dpx(8)); - + window->padAll(0); + lv_obj_set_scrollbar_mode(window->getLvObj(), LV_SCROLLBAR_MODE_AUTO); + + auto form = new FormWindow(window, rect_t{}); + form->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8)); + form->padAll(lv_dpx(8)); + form->padRow(lv_dpx(8)); + for (const auto& tool : tools) { - new ToolButton(window, tool); + new ToolButton(form, tool); } } diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 7ddd44729d2..d6900057570 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -355,14 +355,19 @@ class SpecialFunctionEditPage : public Page void buildBody(FormWindow *window) { - window->setFlexLayout(); + window->padAll(0); + lv_obj_set_scrollbar_mode(window->getLvObj(), LV_SCROLLBAR_MODE_AUTO); + + auto form = new FormWindow(window, rect_t{}); + form->setFlexLayout(); + form->padAll(8); + FlexGridLayout grid(col_dsc, row_dsc, 2); - lv_obj_set_style_pad_all(window->getLvObj(), lv_dpx(8), 0); CustomFunctionData *cfn = &functions[index]; // Switch - auto line = window->newLine(&grid); + auto line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_SF_SWITCH, 0, COLOR_THEME_PRIMARY1); auto switchChoice = new SwitchChoice(line, rect_t{}, SWSRC_FIRST, SWSRC_LAST, @@ -386,7 +391,7 @@ class SpecialFunctionEditPage : public Page } // Function - line = window->newLine(&grid); + line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_FUNC, 0, COLOR_THEME_PRIMARY1); auto functionChoice = new Choice(line, rect_t{}, STR_VFSWFUNC, @@ -402,7 +407,7 @@ class SpecialFunctionEditPage : public Page return isAssignableFunctionAvailable(value, functions); }); - specialFunctionOneWindow = new FormWindow(window, rect_t{}); + specialFunctionOneWindow = new FormWindow(form, rect_t{}); updateSpecialFunctionOneWindow(); } }; @@ -784,6 +789,7 @@ void SpecialFunctionsPage::build(FormWindow *window) #endif window->padAll(4); + lv_obj_set_scrollbar_mode(window->getLvObj(), LV_SCROLLBAR_MODE_AUTO); auto form = new FormWindow(window, rect_t{}); form->setFlexLayout();