chore(color): Libopenui refactor (#3614)
* Refactor object creation logic. Remove unused LVGL features. * Remove unused files. Fix height for widgets. * Rename 'OpenTxTheme' class to 'EdgeTxTheme'. Cleanup commented out code. Cleanup unused code from 'etx_lv_theme.cpp'. * More cleanup. * Move more style code to etx_lv_theme.cpp * Update license * Make default button height match other controls. * Fix curve edit layout. * Fix layouts. * FormWindow and FormGroup provided identical functionality - rename FormGroup to FormWindow and remove duplicate. * Simplify menu icon handling. Remove unused 'flysky.cpp' file. * Fix window size change. * Simplify page header code. Fix statistics view page. * Remove unused file. Replace redundant 'Subtitle' class with a macro. Fix compiler warnings. * Fix compiler warning in LvglWrapper.cpp. Remove unused code in static.h. Simplify about page. * Rename ICON_OPENTX to ICON_EDGETX. * Fix github build error. * Fix github build error (attempt 2). * Move ButtonMatrix styling to etx_lv_theme.cpp. * Scroll bar consistency. * Use styles for ButtonMatrix text color. * Use 'active' color for selected USB advanced setup buttons. Move error message to bottom of page. * Create style for popup window title bar. Simplify advanced USB setup code. Remove unused libopenui/carousel.* files. * Add style for modal popup content. * Remove unused BUTTON_BACKGROUND flag. * Replace GridLayout with FormWindow. Remove unused gridlayout.h file. * Fix rebase. * Merge ChoiceEx class into Choice class code. Remove unused CurveKeyboard. * Use LVGL bar for progress indicator. Update only style colors when theme changes (don't recreate all style settings). * Move ProgressDialog class to dlalog.h/dialog.cpp files. * Simplify trim and slider code in main view. Simplify the hardware inputs code. Fix dialog size. Remove unused code in layout factory. * Cleanup unused code. * Add style for FormWindow class. Merge BaseNumberEdit class into NumberEdit class and remove BaseNumberEdit. Remove more unused files. Cleanup libopenui_config.h files. * Re-organise libopenui include files to fix build error. * Fix build error. * Add missed styles to etx_lv_theme.cpp. Delete commented out #includes. More cleaning up of libopenui_xxx.h files and dependencies. Re-enable LVGL CHECKBOX feature. * Merge libopenui_helpers.h into opentx_helpers.h file. * Fix firmware build. * Use object constructors for LVGL object creation as suggested by gagarinlg. Add style for number edit text alignment. Fix background color for focussed control. * Move color related stuff from libopenui_defines.h to colors.h. Remove need for libopenui_depends.h file. * Merge libopenui_types.h content into opentx_types.h file. * Rename CheckBox class to ToggleSwitch. * Restore code to update flight mode text color when theme changes. * Cleanup some more unused code. * Remove redundant theme.h file. * Fix rebase. * Fix button matrix style. * Fix rebase * Fix rebase * Ensure correct initialisation of Choice object. * Fix rebase. * Make the slider control bigger to make touch activation easier. * Fix build error. * Fix slider logic and cleanup code. * Use ACTIVE theme color for inputs, mixes, LS, GV and SF. * Improved border width consistency and focussed state consistency. * Remove duplicate copy of the default theme colors.
This commit is contained in:
@@ -559,6 +559,8 @@ void audioTask(void * pdata);
|
||||
#define AUDIO_ERROR_MESSAGE(e) audioEvent(e)
|
||||
#define AUDIO_TIMER_MINUTE(t) playDuration(t, 0, 0)
|
||||
|
||||
void onKeyError();
|
||||
|
||||
void audioKeyPress();
|
||||
void audioKeyError();
|
||||
void audioTrimPress(int value);
|
||||
|
||||
@@ -834,7 +834,7 @@ PACK(struct TrainerData {
|
||||
#define THEME_NAME_LEN 8
|
||||
#define THEME_DATA \
|
||||
NOBACKUP(char themeName[THEME_NAME_LEN]); \
|
||||
NOBACKUP(OpenTxTheme::PersistentData themeData);
|
||||
NOBACKUP(EdgeTxTheme::PersistentData themeData);
|
||||
#else
|
||||
#define THEME_DATA
|
||||
#endif
|
||||
|
||||
@@ -27,10 +27,6 @@
|
||||
#include "opentx_types.h"
|
||||
#include "board.h"
|
||||
|
||||
typedef uint32_t LcdFlags;
|
||||
typedef uint8_t pixel_t;
|
||||
typedef int coord_t;
|
||||
|
||||
#define BOX_WIDTH 23
|
||||
#define CENTER
|
||||
#define CENTER_OFS 0
|
||||
|
||||
@@ -27,10 +27,6 @@
|
||||
#include "opentx_types.h"
|
||||
#include "board.h"
|
||||
|
||||
typedef uint32_t LcdFlags;
|
||||
typedef uint8_t pixel_t;
|
||||
typedef int coord_t;
|
||||
|
||||
#define BOX_WIDTH 31
|
||||
#define CENTER "\015"
|
||||
#define CENTER_OFS (7*FW-FW/2)
|
||||
|
||||
@@ -216,12 +216,6 @@ add_gui_src(input_mix_button.cpp)
|
||||
add_gui_src(channel_bar.cpp)
|
||||
|
||||
add_gui_src(list_line_button.cpp)
|
||||
add_gui_src(lvgl_widgets/input_mix_line.c)
|
||||
add_gui_src(lvgl_widgets/input_mix_group.c)
|
||||
|
||||
if(HARDWARE_TOUCH)
|
||||
add_gui_src(keyboard_curve.cpp)
|
||||
endif()
|
||||
|
||||
if(USBJ_EX)
|
||||
add_gui_src(model_usbjoystick.cpp)
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#include "LvglWrapper.h"
|
||||
#include "themes/etx_lv_theme.h"
|
||||
#include "widgets/field_edit.h"
|
||||
|
||||
#include "view_main.h"
|
||||
|
||||
@@ -277,12 +276,10 @@ static void rotaryDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data)
|
||||
}
|
||||
}
|
||||
|
||||
// libopenui_depends.h
|
||||
int8_t rotaryEncoderGetAccel() { return _rotary_enc_accel; }
|
||||
|
||||
#else // !defined(ROTARY_ENCODER_NAVIGATION)
|
||||
|
||||
// libopenui_depends.h
|
||||
int8_t rotaryEncoderGetAccel() { return 0; }
|
||||
|
||||
#endif // defined(ROTARY_ENCODER_NAVIGATION)
|
||||
@@ -342,7 +339,7 @@ void initLvglTheme()
|
||||
/* Initialize the ETX theme */
|
||||
lv_theme_t* th = etx_lv_theme_init(
|
||||
NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED),
|
||||
false, LV_FONT_DEFAULT);
|
||||
LV_FONT_DEFAULT);
|
||||
|
||||
/* Assign the theme to the current display*/
|
||||
lv_disp_set_theme(NULL, th);
|
||||
|
||||
@@ -55,4 +55,7 @@ class LvglWrapper
|
||||
static void runNested();
|
||||
};
|
||||
|
||||
// multiplication factor between 0 and 25
|
||||
int8_t rotaryEncoderGetAccel();
|
||||
|
||||
#endif // _LVGLWRAPPER_H_
|
||||
|
||||
@@ -342,7 +342,7 @@ RegisterDialog::RegisterDialog(Window* parent, uint8_t moduleIdx) :
|
||||
// new StaticText(line, rect_t{}, STR_STATUS, 0, COLOR_THEME_PRIMARY1);
|
||||
// status = new StaticText(line, rect_t{}, STR_WAITING_FOR_RX, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(form, rect_t{});
|
||||
auto box = new FormWindow(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->padAll(lv_dpx(8));
|
||||
@@ -522,7 +522,7 @@ void ModuleOptions::update()
|
||||
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_EXT_ANTENNA, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{},
|
||||
new ToggleSwitch(line, rect_t{},
|
||||
[]() {
|
||||
const auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
|
||||
return hwSettings.moduleSettings.externalAntenna;
|
||||
@@ -581,7 +581,7 @@ void ModuleOptions::update()
|
||||
|
||||
line = form->newLine(&grid);
|
||||
|
||||
auto box = new FormGroup(form, rect_t{});
|
||||
auto box = new FormWindow(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->padAll(lv_dpx(8));
|
||||
@@ -750,7 +750,7 @@ void RxOptions::update()
|
||||
// PWM rate
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, isModuleR9MAccess(moduleIdx) ? "6.67ms PWM" : "7ms PWM");
|
||||
new CheckBox(
|
||||
new ToggleSwitch(
|
||||
line, rect_t{},
|
||||
[]() {
|
||||
auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
|
||||
@@ -764,7 +764,7 @@ void RxOptions::update()
|
||||
// telemetry disabled
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_TELEMETRY_DISABLED);
|
||||
auto tele25mw = new CheckBox(
|
||||
auto tele25mw = new ToggleSwitch(
|
||||
line, rect_t{},
|
||||
[]() {
|
||||
auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
|
||||
@@ -785,7 +785,7 @@ void RxOptions::update()
|
||||
// telemetry 25 mW
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, "25mw Tele");
|
||||
new CheckBox(
|
||||
new ToggleSwitch(
|
||||
line, rect_t{},
|
||||
[]() {
|
||||
auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
|
||||
@@ -875,7 +875,7 @@ void RxOptions::update()
|
||||
line = form->newLine(&grid);
|
||||
new DynamicText(line, rect_t{}, [=]() { return statusText; });
|
||||
|
||||
auto box = new FormGroup(form, rect_t{});
|
||||
auto box = new FormWindow(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->padAll(lv_dpx(8));
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "afhds3_options.h"
|
||||
#include "opentx.h"
|
||||
|
||||
//#include "checkbox.h"
|
||||
|
||||
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
|
||||
LV_GRID_TEMPLATE_LAST};
|
||||
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT,
|
||||
@@ -75,7 +73,7 @@ static void pwmfreq_changedV0(lv_event_t* e)
|
||||
}
|
||||
}
|
||||
PWMfrequencyChoice::PWMfrequencyChoice(Window* parent, uint8_t moduleIdx, uint8_t channelIdx) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
|
||||
@@ -112,7 +110,7 @@ PWMfrequencyChoice::PWMfrequencyChoice(Window* parent, uint8_t moduleIdx, uint8_
|
||||
}
|
||||
|
||||
PWMfrequencyChoice::PWMfrequencyChoice(Window* parent, uint8_t moduleIdx ) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
|
||||
@@ -163,7 +161,7 @@ AFHDS3_Options::AFHDS3_Options(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
|
||||
title += ")";
|
||||
header.setTitle2(title);
|
||||
|
||||
auto form = new FormGroup(&body, rect_t{});
|
||||
auto form = new FormWindow(&body, rect_t{});
|
||||
form->setFlexLayout();
|
||||
form->padAll(lv_dpx(8));
|
||||
|
||||
@@ -183,7 +181,7 @@ AFHDS3_Options::AFHDS3_Options(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
|
||||
temp_str += " ";
|
||||
temp_str += STR_SYNC;
|
||||
new StaticText(line, rect_t{}, temp_str);
|
||||
new CheckBox(line, rect_t{}, GET_SET_AND_SYNC(cfg, vCfg->PWMFrequency.Synchronized,
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_AND_SYNC(cfg, vCfg->PWMFrequency.Synchronized,
|
||||
afhds3::DirtyConfig::DC_RX_CMD_FREQUENCY_V0));
|
||||
line = form->newLine(&grid);
|
||||
|
||||
@@ -212,7 +210,7 @@ AFHDS3_Options::AFHDS3_Options(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
|
||||
temp_str += " ";
|
||||
temp_str += STR_SYNC;
|
||||
new StaticText(line, rect_t{}, temp_str);
|
||||
new CheckBox(
|
||||
new ToggleSwitch(
|
||||
line, rect_t{}, GET_DEFAULT((vCfg->PWMFrequenciesV1.Synchronized&1<<i)>>i),
|
||||
[=](uint8_t newVal) {
|
||||
vCfg->PWMFrequenciesV1.Synchronized &= ~(1<<i);
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "page.h"
|
||||
#include "pulses/afhds3_config.h"
|
||||
|
||||
struct PWMfrequencyChoice : public FormGroup {
|
||||
struct PWMfrequencyChoice : public FormWindow {
|
||||
PWMfrequencyChoice(Window* parent, uint8_t moduleIdx, uint8_t channelIdx);
|
||||
PWMfrequencyChoice(Window* parent, uint8_t moduleIdx);
|
||||
void update() const;
|
||||
|
||||
@@ -317,7 +317,7 @@ struct _BuiltinIcon {
|
||||
};
|
||||
|
||||
static const _BuiltinIcon _builtinIcons[] = {
|
||||
{ICON_OPENTX, mask_edgetx},
|
||||
{ICON_EDGETX, mask_edgetx},
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
{ICON_NEXT, mask_next},
|
||||
{ICON_BACK, mask_back},
|
||||
|
||||
@@ -46,7 +46,7 @@ void cb_value_changed(lv_event_t* e) {
|
||||
}
|
||||
|
||||
ChannelRange::ChannelRange(Window* parent) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "form.h"
|
||||
#include "numberedit.h"
|
||||
|
||||
class ChannelRange : public FormGroup
|
||||
class ChannelRange : public FormWindow
|
||||
{
|
||||
public:
|
||||
ChannelRange(Window* parent);
|
||||
|
||||
@@ -65,7 +65,7 @@ void ColorBar::on_key(lv_event_t* e)
|
||||
uint32_t key = *(uint32_t*)lv_event_get_param(e);
|
||||
if (key == LV_KEY_LEFT) {
|
||||
if (bar->value > 0) {
|
||||
auto accel = rotaryEncoderGetAccel();
|
||||
uint32_t accel = rotaryEncoderGetAccel();
|
||||
bar->value--;
|
||||
if (accel > 0) {
|
||||
if (accel > bar->value) bar->value = 0;
|
||||
@@ -75,7 +75,7 @@ void ColorBar::on_key(lv_event_t* e)
|
||||
}
|
||||
} else if (key == LV_KEY_RIGHT) {
|
||||
if (bar->value < bar->maxValue) {
|
||||
auto accel = rotaryEncoderGetAccel();
|
||||
uint32_t accel = rotaryEncoderGetAccel();
|
||||
bar->value++;
|
||||
if (accel > 0) {
|
||||
if (accel < bar->maxValue - bar->value) bar->value += accel;
|
||||
@@ -327,7 +327,7 @@ void ThemeColorType::makeButton(Window* parent, uint32_t color)
|
||||
|
||||
void ThemeColorType::makeButtonsRow(Window* parent, uint32_t c1, uint32_t c2, uint32_t c3)
|
||||
{
|
||||
auto hbox = new FormGroup(parent, rect_t{});
|
||||
auto hbox = new FormWindow(parent, rect_t{});
|
||||
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_flex_align(hbox->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);
|
||||
|
||||
@@ -347,7 +347,7 @@ ThemeColorType::ThemeColorType(Window* parent, uint32_t color) :
|
||||
lv_style_set_border_width(&style, 2);
|
||||
lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_GREY));
|
||||
|
||||
auto vbox = new FormGroup(parent, rect_t{});
|
||||
auto vbox = new FormWindow(parent, rect_t{});
|
||||
vbox->setFlexLayout(LV_FLEX_FLOW_COLUMN, lv_dpx(8));
|
||||
|
||||
makeButtonsRow(vbox, COLOR_THEME_PRIMARY1, COLOR_THEME_PRIMARY2, COLOR_THEME_PRIMARY3);
|
||||
@@ -366,7 +366,7 @@ uint32_t ThemeColorType::getRGB()
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
ColorEditor::ColorEditor(Window *parent, const rect_t& rect, uint32_t color,
|
||||
std::function<void (uint32_t rgb)> setValue) :
|
||||
FormGroup(parent, rect),
|
||||
FormWindow(parent, rect),
|
||||
_setValue(std::move(setValue)),
|
||||
_color(color)
|
||||
{
|
||||
|
||||
@@ -122,7 +122,7 @@ enum COLOR_EDITOR_TYPE
|
||||
};
|
||||
|
||||
// the ColorEditor() control is a group of other controls
|
||||
class ColorEditor : public FormGroup
|
||||
class ColorEditor : public FormWindow
|
||||
{
|
||||
public:
|
||||
ColorEditor(Window* parent, const rect_t& rect, uint32_t color,
|
||||
|
||||
@@ -71,13 +71,13 @@ class ColorEditorPopup : public Dialog
|
||||
auto cedit = new ColorEditor(line, r, color, [=](uint32_t c) { updateColor(c); });
|
||||
lv_obj_set_style_grid_cell_x_align(cedit->getLvObj(), LV_GRID_ALIGN_CENTER, 0);
|
||||
|
||||
auto vbox = new FormGroup(line, rect_t{});
|
||||
auto vbox = new FormWindow(line, rect_t{});
|
||||
lv_obj_set_style_grid_cell_x_align(vbox->getLvObj(), LV_GRID_ALIGN_CENTER, 0);
|
||||
vbox->setFlexLayout(LV_FLEX_FLOW_COLUMN, lv_dpx(8));
|
||||
vbox->setWidth(r.w);
|
||||
vbox->setHeight(r.h);
|
||||
|
||||
auto hbox = new FormGroup(vbox, rect_t{});
|
||||
auto hbox = new FormWindow(vbox, rect_t{});
|
||||
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
auto hbox_obj = hbox->getLvObj();
|
||||
lv_obj_set_flex_align(hbox_obj, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_SPACE_AROUND);
|
||||
@@ -92,7 +92,7 @@ class ColorEditorPopup : public Dialog
|
||||
|
||||
updateColor(color);
|
||||
|
||||
hbox = new FormGroup(vbox, rect_t{});
|
||||
hbox = new FormWindow(vbox, rect_t{});
|
||||
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_flex_align(hbox->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);
|
||||
|
||||
@@ -127,7 +127,7 @@ class ColorEditorPopup : public Dialog
|
||||
// color editor defaults to HSV
|
||||
hsvBtn->check(true);
|
||||
|
||||
hbox = new FormGroup(vbox, rect_t{});
|
||||
hbox = new FormWindow(vbox, rect_t{});
|
||||
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_flex_align(hbox->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_SPACE_BETWEEN);
|
||||
lv_obj_set_flex_grow(hbox->getLvObj(), 1);
|
||||
@@ -170,7 +170,7 @@ static void color_editor_popup(lv_event_t* e)
|
||||
ColorPicker::ColorPicker(Window* parent, const rect_t& rect,
|
||||
std::function<uint16_t()> getValue,
|
||||
std::function<void(uint16_t)> setValue) :
|
||||
FormField(parent, rect, 0, 0, lv_btn_create),
|
||||
FormField(parent, rect, 0, 0, etx_button_create),
|
||||
setValue(std::move(setValue))
|
||||
{
|
||||
lv_obj_set_style_bg_opa(lvobj, LV_OPA_100, LV_PART_MAIN);
|
||||
|
||||
@@ -46,6 +46,42 @@ enum LcdColorIndex {
|
||||
LCD_COLOR_COUNT,
|
||||
};
|
||||
|
||||
#define ARGB_SPLIT(color, a, r, g, b) \
|
||||
uint16_t a = ((color) & 0xF000) >> 12; \
|
||||
uint16_t r = ((color) & 0x0F00) >> 8; \
|
||||
uint16_t g = ((color) & 0x00F0) >> 4; \
|
||||
uint16_t b = ((color) & 0x000F)
|
||||
|
||||
#define RGB_SPLIT(color, r, g, b) \
|
||||
uint16_t r = ((color) & 0xF800) >> 11; \
|
||||
uint16_t g = ((color) & 0x07E0) >> 5; \
|
||||
uint16_t b = ((color) & 0x001F)
|
||||
|
||||
#define ARGB_JOIN(a, r, g, b) \
|
||||
(((a&0xF) << 12) + ((r&0xF) << 8) + ((g&0xF) << 4) + (b&0xF))
|
||||
|
||||
#define RGB_JOIN(r, g, b) \
|
||||
(((r) << 11) + ((g) << 5) + (b))
|
||||
|
||||
#define GET_RED(color) \
|
||||
(((color) & 0xF800) >> 8)
|
||||
|
||||
#define GET_GREEN(color) \
|
||||
(((color) & 0x07E0) >> 3)
|
||||
|
||||
#define GET_BLUE(color) \
|
||||
(((color) & 0x001F) << 3)
|
||||
|
||||
#define OPACITY_MAX 0x0Fu
|
||||
#define OPACITY(value) ((value) & OPACITY_MAX)
|
||||
|
||||
#define RGB(r, g, b) (uint16_t)((((r) & 0xF8) << 8) + (((g) & 0xFC) << 3) + (((b) & 0xF8) >> 3))
|
||||
#define ARGB(a, r, g, b) (uint16_t)((((a) & 0xF0) << 8) + (((r) & 0xF0) << 4) + (((g) & 0xF0) << 0) + (((b) & 0xF0) >> 4))
|
||||
|
||||
#define COLOR2FLAGS(color) LcdFlags(unsigned(color) << 16u)
|
||||
#define COLOR_VAL(flags) ((flags) >> 16u)
|
||||
#define COLOR_MASK(flags) ((flags) & 0xFFFF0000u)
|
||||
|
||||
//
|
||||
// Basic color definitions
|
||||
//
|
||||
@@ -53,6 +89,7 @@ enum LcdColorIndex {
|
||||
#define WHITE RGB(0xFF, 0xFF, 0xFF)
|
||||
#define BLACK RGB(0, 0, 0)
|
||||
|
||||
#define RGB_FLAG 0x8000u
|
||||
#define RGB2FLAGS(r, g, b) (COLOR2FLAGS(RGB(r, g, b)) | RGB_FLAG)
|
||||
|
||||
//
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "opentx.h"
|
||||
#include "confirm_dialog.h"
|
||||
#include "static.h"
|
||||
#include "gridlayout.h"
|
||||
|
||||
ConfirmDialog::ConfirmDialog(Window* parent, const char* title,
|
||||
const char* message,
|
||||
@@ -39,7 +38,7 @@ ConfirmDialog::ConfirmDialog(Window* parent, const char* title,
|
||||
lv_obj_set_style_bg_color(content->getLvObj(),
|
||||
makeLvColor(COLOR_THEME_SECONDARY3), 0);
|
||||
|
||||
auto box = new FormGroup(form, rect_t{});
|
||||
auto box = new FormWindow(form, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0);
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
CrossfireSettings::CrossfireSettings(Window* parent, const FlexGridLayout& g,
|
||||
uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect_t{}), md(&g_model.moduleData[moduleIdx])
|
||||
FormWindow(parent, rect_t{}), md(&g_model.moduleData[moduleIdx])
|
||||
{
|
||||
FlexGridLayout grid(g);
|
||||
setFlexLayout();
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
struct ModuleData;
|
||||
|
||||
class CrossfireSettings : public FormGroup, public ModuleOptions
|
||||
class CrossfireSettings : public FormWindow, public ModuleOptions
|
||||
{
|
||||
ModuleData* md;
|
||||
|
||||
|
||||
@@ -109,9 +109,9 @@ void CurveRenderer::paint(BitmapBuffer * dc, uint8_t ofst)
|
||||
|
||||
Curve::Curve(Window * parent, const rect_t & rect, std::function<int(int)> function, std::function<int()> position):
|
||||
Window(parent, rect, OPAQUE),
|
||||
base(rect_t{0, 0, rect.w, rect.h}, function),
|
||||
function(std::move(function)),
|
||||
position(std::move(position)),
|
||||
base(rect_t{0, 0, rect.w, rect.h}, function)
|
||||
position(std::move(position))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ CurveParam::CurveParam(Window* parent, const rect_t& rect, CurveRef* ref,
|
||||
GET_DEFAULT(ref->value), setRefValue);
|
||||
|
||||
// CURVE_REF_CUSTOM
|
||||
cust_choice = new ChoiceEx(this, rect_t{}, -MAX_CURVES, MAX_CURVES,
|
||||
cust_choice = new Choice(this, rect_t{}, -MAX_CURVES, MAX_CURVES,
|
||||
GET_DEFAULT(ref->value), setRefValue);
|
||||
cust_choice->setTextHandler([](int value) { return getCurveString(value); });
|
||||
cust_choice->set_lv_LongPressHandler(LongPressHandler, &(ref->value));
|
||||
|
||||
@@ -27,7 +27,6 @@ struct CurveRef;
|
||||
|
||||
class GVarNumberEdit;
|
||||
class Choice;
|
||||
class ChoiceEx;
|
||||
|
||||
class CurveParam : public Window
|
||||
{
|
||||
@@ -38,7 +37,7 @@ class CurveParam : public Window
|
||||
// Controls
|
||||
GVarNumberEdit* value_edit;
|
||||
Choice* func_choice;
|
||||
ChoiceEx* cust_choice;
|
||||
Choice* cust_choice;
|
||||
|
||||
Window* act_field = nullptr;
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
*/
|
||||
|
||||
#include "curveedit.h"
|
||||
#include "keyboard_curve.h"
|
||||
#include "opentx.h" // TODO for applyCustomCurve
|
||||
#include "libopenui.h"
|
||||
|
||||
@@ -30,7 +29,7 @@ static const lv_coord_t default_col_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_L
|
||||
static const lv_coord_t default_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
CurveDataEdit::CurveDataEdit(Window * parent, const rect_t & rect, uint8_t index) :
|
||||
Window(parent, rect, FORM_FORWARD_FOCUS),
|
||||
Window(parent, rect),
|
||||
index(index)
|
||||
{
|
||||
lv_obj_set_style_bg_color(lvobj, makeLvColor(COLOR_THEME_SECONDARY3), 0);
|
||||
@@ -43,7 +42,7 @@ CurveDataEdit::CurveDataEdit(Window * parent, const rect_t & rect, uint8_t index
|
||||
#define NUM_BTN_WIDTH 48
|
||||
#endif
|
||||
|
||||
void CurveDataEdit::curvePointsRow(FormGroup::Line* parent, int start, int count, int curvePointsCount, bool isCustom)
|
||||
void CurveDataEdit::curvePointsRow(FormWindow::Line* parent, int start, int count, int curvePointsCount, bool isCustom)
|
||||
{
|
||||
static const lv_coord_t points_col_dsc[] = {11, LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
@@ -209,138 +208,6 @@ void CurveEdit::updatePreview()
|
||||
invalidate();
|
||||
}
|
||||
|
||||
// #if defined(HARDWARE_TOUCH)
|
||||
// bool CurveEdit::onTouchEnd(coord_t x, coord_t y)
|
||||
// {
|
||||
// if (!hasFocus()) {
|
||||
// setFocus(SET_FOCUS_DEFAULT);
|
||||
// }
|
||||
|
||||
// CurveKeyboard::show(this, isCustomCurve());
|
||||
|
||||
// CurveHeader & curve = g_model.curves[index];
|
||||
// for (int i=0; i<5 + curve.points; i++) {
|
||||
// if (i != current) {
|
||||
// point_t point = getPoint(index, i);
|
||||
// if (abs(preview.getPointX(point.x) - x) <= 10 && abs(preview.getPointY(point.y) - y) <= 10) {
|
||||
// current = i;
|
||||
// updatePreview();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// void CurveEdit::onFocusLost()
|
||||
// {
|
||||
// CurveKeyboard::hide();
|
||||
// }
|
||||
// #endif
|
||||
|
||||
void CurveEdit::next()
|
||||
{
|
||||
CurveHeader & curve = g_model.curves[index];
|
||||
if (current++ == 5 + curve.points - 1) {
|
||||
current = 0;
|
||||
}
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
void CurveEdit::previous()
|
||||
{
|
||||
CurveHeader & curve = g_model.curves[index];
|
||||
if (current-- == 0) {
|
||||
current = 5 + curve.points - 1;
|
||||
}
|
||||
updatePreview();
|
||||
}
|
||||
|
||||
void CurveEdit::up()
|
||||
{
|
||||
int8_t & point = curveAddress(index)[current];
|
||||
point = min<int8_t>(100, ++point);
|
||||
storageDirty(EE_MODEL);
|
||||
invalidate();
|
||||
}
|
||||
|
||||
void CurveEdit::down()
|
||||
{
|
||||
int8_t & point = curveAddress(index)[current];
|
||||
point = max<int8_t>(-100, --point);
|
||||
storageDirty(EE_MODEL);
|
||||
invalidate();
|
||||
}
|
||||
|
||||
void CurveEdit::right()
|
||||
{
|
||||
CurveHeader & curve = g_model.curves[index];
|
||||
if (curve.type == CURVE_TYPE_CUSTOM && current != 0 && current != curve.points + 5 - 1) {
|
||||
int8_t * points = curveAddress(index);
|
||||
int8_t * point = &points[5 + curve.points + current - 1];
|
||||
int8_t xmax = (current == (curve.points - 2) ? +100 : *(point + 1));
|
||||
*point = min<int8_t>(*point + 1, xmax-1);
|
||||
storageDirty(EE_MODEL);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
void CurveEdit::left()
|
||||
{
|
||||
CurveHeader & curve = g_model.curves[index];
|
||||
if (curve.type == CURVE_TYPE_CUSTOM && current != 0 && current != curve.points + 5 - 1) {
|
||||
int8_t * points = curveAddress(index);
|
||||
int8_t * point = &points[5 + curve.points + current - 1];
|
||||
int8_t xmin = (current == 1 ? -100 : *(point - 1));
|
||||
*point = max<int8_t>(xmin+1, *point - 1);
|
||||
storageDirty(EE_MODEL);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
bool CurveEdit::isCustomCurve() const
|
||||
{
|
||||
return g_model.curves[index].type == CURVE_TYPE_CUSTOM;
|
||||
}
|
||||
|
||||
void CurveEdit::onEvent(event_t event)
|
||||
{
|
||||
TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event);
|
||||
|
||||
switch (event) {
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
case EVT_VIRTUAL_KEY_LEFT:
|
||||
left();
|
||||
break;
|
||||
|
||||
case EVT_VIRTUAL_KEY_RIGHT:
|
||||
right();
|
||||
break;
|
||||
|
||||
case EVT_VIRTUAL_KEY_UP:
|
||||
up();
|
||||
break;
|
||||
|
||||
case EVT_VIRTUAL_KEY_DOWN:
|
||||
down();
|
||||
break;
|
||||
|
||||
case EVT_VIRTUAL_KEY_PREVIOUS:
|
||||
previous();
|
||||
break;
|
||||
|
||||
case EVT_VIRTUAL_KEY_NEXT:
|
||||
next();
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
FormField::onEvent(event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CurveEdit::checkEvents()
|
||||
{
|
||||
if (!lockSource) {
|
||||
@@ -425,14 +292,12 @@ void CurveEditWindow::buildBody(FormWindow * window)
|
||||
new ModelTextEdit(iLine, rect_t{0, 0, 100, 0}, curve.name, sizeof(curve.name));
|
||||
|
||||
// Smooth
|
||||
auto smooth = new TextButton(iLine, rect_t{}, STR_SMOOTH, [=]() {
|
||||
auto smooth = new TextButton(iLine, rect_t{0, 0, 70, 0}, STR_SMOOTH, [=]() {
|
||||
g_model.curves[index].smooth = !g_model.curves[index].smooth;
|
||||
curveEdit->updatePreview();
|
||||
return g_model.curves[index].smooth;
|
||||
});
|
||||
smooth->check(g_model.curves[index].smooth);
|
||||
smooth->padAll(2);
|
||||
smooth->setHeight(26);
|
||||
|
||||
iLine = form->newLine(&iGrid);
|
||||
iLine->padAll(4);
|
||||
@@ -463,7 +328,7 @@ void CurveEditWindow::buildBody(FormWindow * window)
|
||||
});
|
||||
|
||||
// Points count
|
||||
auto edit = new NumberEdit(iLine, rect_t{}, 2, 17, GET_DEFAULT(g_model.curves[index].points + 5),
|
||||
auto edit = new NumberEdit(iLine, rect_t{0, 0, 70, 0}, 2, 17, GET_DEFAULT(g_model.curves[index].points + 5),
|
||||
[=](int32_t newValue) {
|
||||
newValue -= 5;
|
||||
CurveHeader &curve = g_model.curves[index];
|
||||
@@ -492,7 +357,7 @@ void CurveEditWindow::buildBody(FormWindow * window)
|
||||
iLine->padAll(0);
|
||||
lv_obj_set_grid_align(iLine->getLvObj(), LV_GRID_ALIGN_SPACE_BETWEEN, LV_GRID_ALIGN_SPACE_BETWEEN);
|
||||
|
||||
curveDataEdit = new CurveDataEdit(iLine, rect_t{ 0, 0, box->width(), box->height() - 67 }, index);
|
||||
curveDataEdit = new CurveDataEdit(iLine, rect_t{ 0, 0, box->width(), box->height() - 72 }, index);
|
||||
|
||||
// Curve editor
|
||||
lv_obj_set_flex_align(line->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);
|
||||
|
||||
@@ -45,27 +45,14 @@ class CurveEdit: public FormField
|
||||
|
||||
void updatePreview();
|
||||
|
||||
void onEvent(event_t event) override;
|
||||
void checkEvents(void) override;
|
||||
|
||||
// #if defined(HARDWARE_TOUCH)
|
||||
// bool onTouchEnd(coord_t x, coord_t y) override;
|
||||
// void onFocusLost() override;
|
||||
// #endif
|
||||
|
||||
protected:
|
||||
Curve preview;
|
||||
uint8_t index;
|
||||
uint8_t current;
|
||||
static mixsrc_t currentSource;
|
||||
static bool lockSource;
|
||||
void next();
|
||||
void previous();
|
||||
void up();
|
||||
void down();
|
||||
void right();
|
||||
void left();
|
||||
bool isCustomCurve() const;
|
||||
};
|
||||
|
||||
class CurveDataEdit : public Window
|
||||
@@ -86,7 +73,7 @@ class CurveDataEdit : public Window
|
||||
CurveEdit * curveEdit;
|
||||
NumberEdit* numEditX[16];
|
||||
|
||||
void curvePointsRow(FormGroup::Line* parent, int start, int count, int curvePointsCount, bool isCustom);
|
||||
void curvePointsRow(FormWindow::Line* parent, int start, int count, int curvePointsCount, bool isCustom);
|
||||
};
|
||||
|
||||
class CurveEditWindow : public Page
|
||||
|
||||
@@ -154,13 +154,13 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class ChannelFSCombo : public FormGroup
|
||||
class ChannelFSCombo : public FormWindow
|
||||
{
|
||||
ChannelFailsafeEdit* edit = nullptr;
|
||||
|
||||
public:
|
||||
ChannelFSCombo(Window* parent, uint8_t ch, int vmin, int vmax) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
|
||||
@@ -211,7 +211,7 @@ FailSafePage::FailSafePage(uint8_t moduleIdx) :
|
||||
{
|
||||
header.setTitle(STR_FAILSAFESET);
|
||||
|
||||
auto form = new FormGroup(&body, rect_t{});
|
||||
auto form = new FormWindow(&body, rect_t{});
|
||||
form->setFlexLayout();
|
||||
form->padAll(lv_dpx(8));
|
||||
form->padRow(lv_dpx(8));
|
||||
|
||||
@@ -102,7 +102,7 @@ void drawSleepBitmap()
|
||||
lcdInitDirectDrawing();
|
||||
lcd->clear(bgColor);
|
||||
|
||||
const BitmapBuffer* bitmap = OpenTxTheme::instance()->shutdown;
|
||||
const BitmapBuffer* bitmap = EdgeTxTheme::instance()->shutdown;
|
||||
if (bitmap) {
|
||||
lcd->drawMask((LCD_W - bitmap->width()) / 2, (LCD_H - bitmap->height()) / 2,
|
||||
bitmap, fgColor);
|
||||
@@ -134,7 +134,7 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration,
|
||||
bgColor = COLOR_THEME_SECONDARY1;
|
||||
}
|
||||
|
||||
static const BitmapBuffer* shutdown = OpenTxTheme::instance()->shutdown;
|
||||
static const BitmapBuffer* shutdown = EdgeTxTheme::instance()->shutdown;
|
||||
|
||||
lcdInitDirectDrawing();
|
||||
lcd->clear(bgColor);
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "libopenui_config.h"
|
||||
#include "fab_button.h"
|
||||
#include "font.h"
|
||||
#include "theme.h"
|
||||
@@ -34,7 +33,7 @@ const uint8_t __alpha_button_off[] {
|
||||
};
|
||||
LZ4Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, __alpha_button_off);
|
||||
|
||||
FabButton::FabButton(FormGroup* parent, coord_t x, coord_t y, uint8_t icon,
|
||||
FabButton::FabButton(FormWindow* parent, coord_t x, coord_t y, uint8_t icon,
|
||||
std::function<uint8_t(void)> pressHandler,
|
||||
WindowFlags windowFlags) :
|
||||
Button(parent,
|
||||
@@ -44,7 +43,7 @@ FabButton::FabButton(FormGroup* parent, coord_t x, coord_t y, uint8_t icon,
|
||||
{
|
||||
}
|
||||
|
||||
FabButton::FabButton(FormGroup* parent, uint8_t icon,
|
||||
FabButton::FabButton(FormWindow* parent, uint8_t icon,
|
||||
std::function<uint8_t(void)> pressHandler,
|
||||
WindowFlags windowFlags) :
|
||||
Button(parent, {}, pressHandler, windowFlags), icon(icon)
|
||||
|
||||
@@ -28,11 +28,11 @@ constexpr coord_t FAB_BUTTON_SIZE = 68;
|
||||
|
||||
class FabButton: public Button {
|
||||
public:
|
||||
FabButton(FormGroup * parent, coord_t x, coord_t y,
|
||||
FabButton(FormWindow * parent, coord_t x, coord_t y,
|
||||
uint8_t icon, std::function<uint8_t(void)> pressHandler,
|
||||
WindowFlags windowFlags = 0);
|
||||
|
||||
FabButton(FormGroup * parent, uint8_t icon,
|
||||
FabButton(FormWindow * parent, uint8_t icon,
|
||||
std::function<uint8_t(void)> pressHandler,
|
||||
WindowFlags windowFlags = 0);
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ extern inline tmr10ms_t getTicks()
|
||||
|
||||
FileCarosell::FileCarosell(Window *parent, const rect_t &rect,
|
||||
std::vector<std::string> fileNames) :
|
||||
FormGroup(parent, rect, NO_FOCUS | FORM_NO_BORDER),
|
||||
FormWindow(parent, rect, NO_FOCUS),
|
||||
_fileNames(fileNames),
|
||||
fp(new FilePreview(this, {0, 0, rect.w, rect.h}, false))
|
||||
{
|
||||
@@ -65,7 +65,7 @@ void FileCarosell::setSelected(int n)
|
||||
|
||||
void FileCarosell::checkEvents()
|
||||
{
|
||||
FormGroup::checkEvents();
|
||||
FormWindow::checkEvents();
|
||||
|
||||
uint32_t newTicks = getTicks();
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#define PAGE_INTERVAL ((1000 / 10) * 2)
|
||||
#define SHORT_PAGE_INTERVAL ((1000 / 20)) // 500 MS
|
||||
|
||||
class FileCarosell : public FormGroup
|
||||
class FileCarosell : public FormWindow
|
||||
{
|
||||
public:
|
||||
FileCarosell(Window *parent, const rect_t &rect,
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
FilePreview::FilePreview(Window *parent, const rect_t &rect,
|
||||
bool drawCentered) :
|
||||
Window(parent, rect, NO_SCROLLBAR), _drawCentered(drawCentered)
|
||||
Window(parent, rect), _drawCentered(drawCentered)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ static const char* _afhds3_phy_mode[] = {
|
||||
"Lora 12ch",
|
||||
};
|
||||
|
||||
class FSProtoOpts : public FormGroup
|
||||
class FSProtoOpts : public FormWindow
|
||||
{
|
||||
std::function<uint8_t()> _getMode;
|
||||
std::function<void(uint8_t)> _setMode;
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
|
||||
FSProtoOpts::FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
|
||||
std::function<void(uint8_t)> setMode) :
|
||||
FormGroup(parent, rect_t{}),
|
||||
FormWindow(parent, rect_t{}),
|
||||
_getMode(std::move(getMode)),
|
||||
_setMode(std::move(setMode))
|
||||
{
|
||||
@@ -83,14 +83,14 @@ FSProtoOpts::FSProtoOpts(Window* parent, std::function<uint8_t()> getMode,
|
||||
|
||||
FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
|
||||
uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect_t{}),
|
||||
FormWindow(parent, rect_t{}),
|
||||
moduleIdx(moduleIdx),
|
||||
md(&g_model.moduleData[moduleIdx]),
|
||||
grid(g)
|
||||
{
|
||||
setFlexLayout();
|
||||
|
||||
FormGroup::Line* line;
|
||||
FormWindow::Line* line;
|
||||
|
||||
#if defined(AFHDS2)
|
||||
// RX options:
|
||||
@@ -132,7 +132,7 @@ FlySkySettings::FlySkySettings(Window* parent, const FlexGridLayout& g,
|
||||
line = newLine(&grid);
|
||||
afhds3TypeLabel = new StaticText(line, rect_t{}, STR_TYPE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
afhds3TypeForm = new FormGroup(line, rect_t{});
|
||||
afhds3TypeForm = new FormWindow(line, rect_t{});
|
||||
afhds3TypeForm->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP);
|
||||
lv_obj_set_style_grid_cell_x_align(afhds3TypeForm->getLvObj(), LV_GRID_ALIGN_STRETCH, 0);
|
||||
|
||||
@@ -234,7 +234,7 @@ void FlySkySettings::checkEvents() {
|
||||
if (afhds3::getConfig(moduleIdx)->others.lastUpdated > lastRefresh) {
|
||||
update();
|
||||
}
|
||||
FormGroup::checkEvents();
|
||||
FormWindow::checkEvents();
|
||||
}
|
||||
|
||||
void FlySkySettings::update()
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
struct ModuleData;
|
||||
|
||||
class FlySkySettings : public FormGroup, public ModuleOptions
|
||||
class FlySkySettings : public FormWindow, public ModuleOptions
|
||||
{
|
||||
uint8_t moduleIdx;
|
||||
ModuleData* md;
|
||||
@@ -49,7 +49,7 @@ class FlySkySettings : public FormGroup, public ModuleOptions
|
||||
Window* afhds3StatusLabel = nullptr;
|
||||
Window* afhds3StatusText = nullptr;
|
||||
Window* afhds3TypeLabel = nullptr;
|
||||
FormGroup* afhds3TypeForm = nullptr;
|
||||
FormWindow* afhds3TypeForm = nullptr;
|
||||
Choice *afhds3PhyMode = nullptr;
|
||||
Choice *afhds3Emi = nullptr;
|
||||
Choice *afhds3RfPower = nullptr;
|
||||
|
||||
@@ -35,8 +35,7 @@ FMMatrix<T>::FMMatrix(Window* parent, const rect_t& r, T* input) :
|
||||
update();
|
||||
|
||||
for (int i = 0; i < MAX_FLIGHT_MODES; i++) {
|
||||
lv_btnmatrix_set_btn_ctrl(lvobj, i, LV_BTNMATRIX_CTRL_RECOLOR);
|
||||
setTextWithColor(i);
|
||||
setTextAndState(i);
|
||||
}
|
||||
|
||||
#if LCD_W > LCD_H
|
||||
@@ -49,20 +48,16 @@ FMMatrix<T>::FMMatrix(Window* parent, const rect_t& r, T* input) :
|
||||
lv_obj_set_height(lvobj, LV_DPI_DEF);
|
||||
#endif
|
||||
|
||||
lv_obj_set_style_bg_opa(lvobj, LV_OPA_0, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_all(lvobj, lv_dpx(4), LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_row(lvobj, lv_dpx(4), LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_column(lvobj, lv_dpx(4), LV_PART_MAIN);
|
||||
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_FOCUSED);
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void FMMatrix<T>::setTextWithColor(uint8_t btn_id)
|
||||
void FMMatrix<T>::setTextAndState(uint8_t btn_id)
|
||||
{
|
||||
setText(btn_id, makeRecolor(std::to_string(btn_id), isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str());
|
||||
setText(btn_id, std::to_string(btn_id).c_str());
|
||||
setChecked(btn_id);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@@ -70,7 +65,7 @@ void FMMatrix<T>::onPress(uint8_t btn_id)
|
||||
{
|
||||
if (btn_id >= MAX_FLIGHT_MODES) return;
|
||||
BFBIT_FLIP(input->flightModes, bfBit<uint32_t>(btn_id));
|
||||
setTextWithColor(btn_id);
|
||||
setTextAndState(btn_id);
|
||||
storageDirty(EE_MODEL);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ struct FMMatrix : public ButtonMatrix {
|
||||
FMMatrix(Window* parent, const rect_t& rect, T* input);
|
||||
void onPress(uint8_t btn_id);
|
||||
bool isActive(uint8_t btn_id);
|
||||
void setTextWithColor(uint8_t btn_id);
|
||||
void setTextAndState(uint8_t btn_id);
|
||||
};
|
||||
|
||||
extern template struct FMMatrix<ExpoData>;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "libopenui_config.h"
|
||||
#include "libopenui_defines.h"
|
||||
#include "font.h"
|
||||
|
||||
#if !defined(BOOT)
|
||||
|
||||
@@ -110,20 +110,20 @@ void FullScreenDialog::init()
|
||||
|
||||
void FullScreenDialog::paint(BitmapBuffer * dc)
|
||||
{
|
||||
OpenTxTheme::instance()->drawBackground(dc);
|
||||
EdgeTxTheme::instance()->drawBackground(dc);
|
||||
|
||||
dc->drawFilledRect(0, ALERT_FRAME_TOP, LCD_W, ALERT_FRAME_HEIGHT, SOLID,
|
||||
COLOR_THEME_PRIMARY2, OPACITY(8));
|
||||
|
||||
if (type == WARNING_TYPE_ALERT || type == WARNING_TYPE_ASTERISK) {
|
||||
dc->drawMask(ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP,
|
||||
OpenTxTheme::instance()->error, COLOR_THEME_WARNING);
|
||||
EdgeTxTheme::instance()->error, COLOR_THEME_WARNING);
|
||||
} else if (type == WARNING_TYPE_INFO) {
|
||||
dc->drawMask(ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP,
|
||||
OpenTxTheme::instance()->busy, COLOR_THEME_WARNING);
|
||||
EdgeTxTheme::instance()->busy, COLOR_THEME_WARNING);
|
||||
} else { // confirmation
|
||||
dc->drawMask(ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP,
|
||||
OpenTxTheme::instance()->error, COLOR_THEME_WARNING);
|
||||
EdgeTxTheme::instance()->error, COLOR_THEME_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "draw_functions.h"
|
||||
#include "bitmaps.h"
|
||||
#include "theme.h"
|
||||
#include "libopenui_config.h"
|
||||
|
||||
#define LOAD_MODEL_BITMAP()
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ static void bt_mode_changed(lv_event_t* e)
|
||||
}
|
||||
|
||||
BluetoothConfigWindow::BluetoothConfigWindow(Window *parent) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout();
|
||||
FlexGridLayout grid(col_dsc, row_dsc, 2);
|
||||
@@ -107,7 +107,7 @@ BluetoothConfigWindow::BluetoothConfigWindow(Window *parent) :
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_MODE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8));
|
||||
lv_obj_set_style_grid_cell_x_align(box->getLvObj(), LV_GRID_ALIGN_STRETCH, 0);
|
||||
lv_obj_set_style_flex_cross_place(box->getLvObj(), LV_FLEX_ALIGN_CENTER, 0);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "form.h"
|
||||
|
||||
class BluetoothConfigWindow : public FormGroup
|
||||
class BluetoothConfigWindow : public FormWindow
|
||||
{
|
||||
public:
|
||||
BluetoothConfigWindow(Window* parent);
|
||||
|
||||
@@ -31,14 +31,14 @@ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(3),
|
||||
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
ExternalModuleWindow::ExternalModuleWindow(Window *parent) :
|
||||
FormGroup::Line(parent), lastModule(g_eeGeneral.internalModule)
|
||||
FormWindow::Line(parent), lastModule(g_eeGeneral.internalModule)
|
||||
{
|
||||
FlexGridLayout grid(col_dsc, row_dsc, 2);
|
||||
setLayout(&grid);
|
||||
|
||||
new StaticText(this, rect_t{}, STR_SAMPLE_MODE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(this, rect_t{});
|
||||
auto box = new FormWindow(this, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_style_grid_cell_x_align(box->getLvObj(), LV_GRID_ALIGN_STRETCH, 0);
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "form.h"
|
||||
|
||||
class ExternalModuleWindow : public FormGroup::Line
|
||||
class ExternalModuleWindow : public FormWindow::Line
|
||||
{
|
||||
public:
|
||||
ExternalModuleWindow(Window* parent);
|
||||
|
||||
@@ -39,10 +39,12 @@ struct HWInputEdit : public RadioTextEdit {
|
||||
|
||||
static const lv_coord_t col_two_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
|
||||
LV_GRID_TEMPLATE_LAST};
|
||||
static const lv_coord_t col_three_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(2),
|
||||
LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
HWSticks::HWSticks(Window* parent) : FormGroup(parent, rect_t{})
|
||||
HWSticks::HWSticks(Window* parent) : FormWindow(parent, rect_t{})
|
||||
{
|
||||
FlexGridLayout grid(col_two_dsc, row_dsc, 2);
|
||||
setFlexLayout();
|
||||
@@ -67,9 +69,9 @@ HWSticks::HWSticks(Window* parent) : FormGroup(parent, rect_t{})
|
||||
#endif
|
||||
}
|
||||
|
||||
HWPots::HWPots(Window* parent) : FormGroup(parent, rect_t{})
|
||||
HWPots::HWPots(Window* parent) : FormWindow(parent, rect_t{})
|
||||
{
|
||||
FlexGridLayout grid(col_two_dsc, row_dsc, 2);
|
||||
FlexGridLayout grid(col_three_dsc, row_dsc, 2);
|
||||
setFlexLayout();
|
||||
|
||||
auto max_pots = adcGetMaxInputs(ADC_INPUT_POT);
|
||||
@@ -85,7 +87,7 @@ HWPots::HWPots(Window* parent) : FormGroup(parent, rect_t{})
|
||||
new StaticText(line, rect_t{}, adcGetInputLabel(ADC_INPUT_POT, i), 0,
|
||||
COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(4));
|
||||
|
||||
auto box_obj = box->getLvObj();
|
||||
@@ -147,24 +149,18 @@ class SwitchDynamicLabel : public StaticText
|
||||
uint8_t lastpos = 0xff;
|
||||
};
|
||||
|
||||
HWSwitches::HWSwitches(Window* parent) : FormGroup(parent, rect_t{})
|
||||
HWSwitches::HWSwitches(Window* parent) : FormWindow(parent, rect_t{})
|
||||
{
|
||||
FlexGridLayout grid(col_two_dsc, row_dsc, 2);
|
||||
FlexGridLayout grid(col_three_dsc, row_dsc, 2);
|
||||
setFlexLayout();
|
||||
|
||||
for (int i = 0; i < switchGetMaxSwitches(); i++) {
|
||||
auto line = newLine(&grid);
|
||||
new SwitchDynamicLabel(line, i);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(4));
|
||||
|
||||
auto box_obj = box->getLvObj();
|
||||
lv_obj_set_style_flex_cross_place(box_obj, LV_FLEX_ALIGN_CENTER, 0);
|
||||
|
||||
new HWInputEdit(box, (char*)switchGetCustomName(i), LEN_SWITCH_NAME);
|
||||
new HWInputEdit(line, (char*)switchGetCustomName(i), LEN_SWITCH_NAME);
|
||||
new Choice(
|
||||
box, rect_t{}, STR_SWTYPES, SWITCH_NONE, switchGetMaxType(i),
|
||||
line, rect_t{}, STR_SWTYPES, SWITCH_NONE, switchGetMaxType(i),
|
||||
[=]() -> int { return SWITCH_CONFIG(i); },
|
||||
[=](int newValue) {
|
||||
swconfig_t mask = (swconfig_t)SWITCH_CONFIG_MASK(i);
|
||||
|
||||
@@ -25,16 +25,15 @@
|
||||
#include "dialog.h"
|
||||
#include "button.h"
|
||||
|
||||
struct HWSticks : public FormGroup {
|
||||
struct HWSticks : public FormWindow {
|
||||
HWSticks(Window* parent);
|
||||
};
|
||||
|
||||
struct HWPots : public FormGroup {
|
||||
struct HWPots : public FormWindow {
|
||||
HWPots(Window* parent);
|
||||
};
|
||||
|
||||
|
||||
struct HWSwitches : public FormGroup {
|
||||
struct HWSwitches : public FormWindow {
|
||||
HWSwitches(Window* parent);
|
||||
};
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(3),
|
||||
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
InternalModuleWindow::InternalModuleWindow(Window *parent) :
|
||||
FormGroup::Line(parent),
|
||||
FormWindow::Line(parent),
|
||||
lastModule(g_eeGeneral.internalModule)
|
||||
{
|
||||
FlexGridLayout grid(col_dsc, row_dsc, 2);
|
||||
@@ -42,7 +42,7 @@ InternalModuleWindow::InternalModuleWindow(Window *parent) :
|
||||
|
||||
new StaticText(this, rect_t{}, STR_TYPE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(this, rect_t{});
|
||||
auto box = new FormWindow(this, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_style_grid_cell_x_align(box->getLvObj(), LV_GRID_ALIGN_STRETCH, 0);
|
||||
|
||||
@@ -55,7 +55,7 @@ InternalModuleWindow::InternalModuleWindow(Window *parent) :
|
||||
[](int module) { return isInternalModuleSupported(module); });
|
||||
|
||||
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
|
||||
auto pxx1_box = new FormGroup(box, rect_t{});
|
||||
auto pxx1_box = new FormWindow(box, rect_t{});
|
||||
pxx1_box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
|
||||
ant_box = pxx1_box->getLvObj();
|
||||
@@ -87,7 +87,7 @@ InternalModuleWindow::InternalModuleWindow(Window *parent) :
|
||||
#endif
|
||||
|
||||
#if defined(CROSSFIRE)
|
||||
auto crsf_box = new FormGroup(box, rect_t{});
|
||||
auto crsf_box = new FormWindow(box, rect_t{});
|
||||
crsf_box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
|
||||
br_box = crsf_box->getLvObj();
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "form.h"
|
||||
|
||||
class InternalModuleWindow : public FormGroup::Line
|
||||
class InternalModuleWindow : public FormWindow::Line
|
||||
{
|
||||
public:
|
||||
InternalModuleWindow(Window *parent);
|
||||
|
||||
@@ -30,7 +30,7 @@ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(3),
|
||||
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
SerialConfigWindow::SerialConfigWindow(Window *parent, const rect_t &rect) :
|
||||
FormGroup(parent, rect, FORWARD_SCROLL)
|
||||
FormWindow(parent, rect)
|
||||
{
|
||||
setFlexLayout();
|
||||
FlexGridLayout grid(col_dsc, row_dsc, 2);
|
||||
@@ -45,7 +45,7 @@ SerialConfigWindow::SerialConfigWindow(Window *parent, const rect_t &rect) :
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, port->name, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_style_grid_cell_x_align(box->getLvObj(), LV_GRID_ALIGN_STRETCH, 0);
|
||||
lv_obj_set_style_flex_cross_place(box->getLvObj(), LV_FLEX_ALIGN_CENTER, 0);
|
||||
@@ -64,7 +64,7 @@ SerialConfigWindow::SerialConfigWindow(Window *parent, const rect_t &rect) :
|
||||
if (port->set_pwr != nullptr) {
|
||||
new StaticText(box, rect_t{}, STR_AUX_SERIAL_PORT_POWER, 0,
|
||||
COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(
|
||||
new ToggleSwitch(
|
||||
box, rect_t{}, [=] { return serialGetPower(port_nr); },
|
||||
[=](int8_t newValue) {
|
||||
serialSetPower(port_nr, (bool)newValue);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "form.h"
|
||||
|
||||
class SerialConfigWindow : public FormGroup
|
||||
class SerialConfigWindow : public FormWindow
|
||||
{
|
||||
public:
|
||||
SerialConfigWindow(Window *parent, const rect_t &rect);
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "input_mix_group.h"
|
||||
#include "channel_bar.h"
|
||||
|
||||
#include "lvgl_widgets/input_mix_group.h"
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
@@ -102,7 +102,7 @@ InputSource::InputSource(Window* parent, ExpoData* input) :
|
||||
});
|
||||
lv_obj_add_event_cb(lvobj, InputSource::value_changed, LV_EVENT_VALUE_CHANGED, nullptr);
|
||||
|
||||
sensor_form = new FormGroup(this, rect_t{});
|
||||
sensor_form = new FormWindow(this, rect_t{});
|
||||
sensor_form->setFlexLayout();
|
||||
|
||||
FlexGridLayout grid(col_dsc, row_dsc);
|
||||
|
||||
@@ -24,12 +24,12 @@
|
||||
#include "window.h"
|
||||
|
||||
struct ExpoData;
|
||||
class FormGroup;
|
||||
class FormWindow;
|
||||
|
||||
class InputSource : public Window
|
||||
{
|
||||
ExpoData* input;
|
||||
FormGroup* sensor_form;
|
||||
FormWindow* sensor_form;
|
||||
|
||||
void update();
|
||||
static void value_changed(lv_event_t* e);
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* Based on code named
|
||||
* opentx - https://github.com/opentx/opentx
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "keyboard_curve.h"
|
||||
#include "button.h"
|
||||
|
||||
#include "translations/untranslated.h"
|
||||
|
||||
constexpr coord_t KEYBOARD_HEIGHT = 110;
|
||||
|
||||
CurveKeyboard * CurveKeyboard::_instance = nullptr;
|
||||
|
||||
CurveKeyboard::CurveKeyboard() :
|
||||
Keyboard(KEYBOARD_HEIGHT)
|
||||
{
|
||||
// up
|
||||
new TextButton(this, {LCD_W / 2 - 20, 5, 40, 40}, STR_CHAR_UP,
|
||||
[=]() -> uint8_t {
|
||||
pushEvent(EVT_VIRTUAL_KEY_UP);
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS);
|
||||
|
||||
// down
|
||||
new TextButton(this, {LCD_W / 2 - 20, 65, 40, 40}, STR_CHAR_DOWN,
|
||||
[=]() -> uint8_t {
|
||||
pushEvent(EVT_VIRTUAL_KEY_DOWN);
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS);
|
||||
|
||||
// left
|
||||
left = new TextButton(this, {LCD_W / 2 - 70, 35, 40, 40}, STR_CHAR_LEFT,
|
||||
[=]() -> uint8_t {
|
||||
pushEvent(EVT_VIRTUAL_KEY_LEFT);
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS);
|
||||
|
||||
// right
|
||||
right = new TextButton(this, {LCD_W / 2 + 30, 35, 40, 40}, STR_CHAR_RIGHT,
|
||||
[=]() -> uint8_t {
|
||||
pushEvent(EVT_VIRTUAL_KEY_RIGHT);
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS);
|
||||
|
||||
// next
|
||||
new TextButton(this, {LCD_W / 2 + 80, 35, 60, 40}, "Next",
|
||||
[=]() -> uint8_t {
|
||||
pushEvent(EVT_VIRTUAL_KEY_NEXT);
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS);
|
||||
|
||||
// previous
|
||||
new TextButton(this, {LCD_W / 2 - 140, 35, 60, 40}, "Prev",
|
||||
[=]() -> uint8_t {
|
||||
pushEvent(EVT_VIRTUAL_KEY_PREVIOUS);
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | OPAQUE | NO_FOCUS);
|
||||
|
||||
}
|
||||
|
||||
void CurveKeyboard::enableRightLeft(bool enable)
|
||||
{
|
||||
TRACE("STOP %d", enable);
|
||||
left->enable(enable);
|
||||
right->enable(enable);
|
||||
}
|
||||
|
||||
CurveKeyboard::~CurveKeyboard()
|
||||
{
|
||||
_instance = nullptr;
|
||||
}
|
||||
|
||||
void CurveKeyboard::paint(BitmapBuffer * dc)
|
||||
{
|
||||
lcdSetColor(RGB(0xE0, 0xE0, 0xE0));
|
||||
dc->clear(CUSTOM_COLOR);
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* Based on code named
|
||||
* opentx - https://github.com/opentx/opentx
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _KEYBOARD_CURVE_H_
|
||||
#define _KEYBOARD_CURVE_H_
|
||||
|
||||
#include "keyboard_base.h"
|
||||
|
||||
class Button;
|
||||
|
||||
class CurveKeyboard : public Keyboard {
|
||||
public:
|
||||
CurveKeyboard();
|
||||
|
||||
~CurveKeyboard() override;
|
||||
|
||||
#if defined(DEBUG_WINDOWS)
|
||||
std::string getName() const override
|
||||
{
|
||||
return "CurveKeyboard";
|
||||
}
|
||||
#endif
|
||||
|
||||
void enableRightLeft(bool enable);
|
||||
|
||||
static void show(FormField * field, bool enableRightLeft)
|
||||
{
|
||||
if (!_instance)
|
||||
_instance = new CurveKeyboard();
|
||||
_instance->setField(field);
|
||||
_instance->enableRightLeft(enableRightLeft);
|
||||
}
|
||||
|
||||
void paint(BitmapBuffer * dc) override;
|
||||
|
||||
protected:
|
||||
static CurveKeyboard * _instance;
|
||||
Button * left = nullptr;
|
||||
Button * right = nullptr;
|
||||
};
|
||||
|
||||
#endif // _KEYBOARD_CURVE_H_
|
||||
@@ -88,7 +88,7 @@ void Layout::updateFromTheme()
|
||||
// Hack to fix flight mode color on main view
|
||||
// Required because theme is loaded after the main view has been created
|
||||
if (decoration)
|
||||
decoration->setFlightModeColor();
|
||||
decoration->updateFromTheme();
|
||||
}
|
||||
|
||||
void Layout::adjustLayout()
|
||||
|
||||
@@ -25,26 +25,9 @@
|
||||
|
||||
#include "hal/adc_driver.h"
|
||||
|
||||
enum slider_type {
|
||||
SLIDER_HORIZ,
|
||||
SLIDER_6POS,
|
||||
};
|
||||
|
||||
static void slider_self_size(lv_event_t* e)
|
||||
{
|
||||
lv_point_t* s = (lv_point_t*)lv_event_get_param(e);
|
||||
slider_type t = (slider_type)(intptr_t)lv_event_get_user_data(e);
|
||||
switch(t) {
|
||||
case SLIDER_HORIZ:
|
||||
s->x = HORIZONTAL_SLIDERS_WIDTH;
|
||||
s->y = TRIM_SQUARE_SIZE;
|
||||
break;
|
||||
case SLIDER_6POS:
|
||||
s->x = MULTIPOS_W;
|
||||
s->y = MULTIPOS_H;
|
||||
break;
|
||||
}
|
||||
}
|
||||
constexpr coord_t MULTIPOS_H = 18;
|
||||
constexpr coord_t MULTIPOS_W_SPACING = 12;
|
||||
constexpr coord_t MULTIPOS_W = (6+1)*MULTIPOS_W_SPACING;
|
||||
|
||||
MainViewSlider::MainViewSlider(Window* parent, const rect_t& rect,
|
||||
uint8_t idx) :
|
||||
@@ -65,27 +48,21 @@ void MainViewSlider::checkEvents()
|
||||
|
||||
MainViewHorizontalSlider::MainViewHorizontalSlider(Window* parent,
|
||||
uint8_t idx) :
|
||||
MainViewSlider(parent, rect_t{}, idx)
|
||||
MainViewSlider(parent, rect_t{0, 0, HORIZONTAL_SLIDERS_WIDTH, TRIM_SQUARE_SIZE}, idx)
|
||||
{
|
||||
void* user_data = (void*)SLIDER_HORIZ;
|
||||
lv_obj_add_event_cb(lvobj, slider_self_size, LV_EVENT_GET_SELF_SIZE,
|
||||
user_data);
|
||||
|
||||
setWidth(HORIZONTAL_SLIDERS_WIDTH);
|
||||
setHeight(TRIM_SQUARE_SIZE);
|
||||
}
|
||||
|
||||
void MainViewHorizontalSlider::paint(BitmapBuffer * dc)
|
||||
{
|
||||
// The ticks
|
||||
int delta = (width() - TRIM_SQUARE_SIZE) / SLIDER_TICKS_COUNT;
|
||||
int sliderTicksCount = (width() - TRIM_SQUARE_SIZE) / SLIDER_TICK_SPACING;
|
||||
coord_t x = TRIM_SQUARE_SIZE / 2;
|
||||
for (uint8_t i = 0; i <= SLIDER_TICKS_COUNT; i++) {
|
||||
if (i == 0 || i == SLIDER_TICKS_COUNT / 2 || i == SLIDER_TICKS_COUNT)
|
||||
for (uint8_t i = 0; i <= sliderTicksCount; i++) {
|
||||
if (i == 0 || i == sliderTicksCount / 2 || i == SLIDER_TICKS_COUNT)
|
||||
dc->drawSolidVerticalLine(x, 2, 13, COLOR_THEME_SECONDARY1);
|
||||
else
|
||||
dc->drawSolidVerticalLine(x, 4, 9, COLOR_THEME_SECONDARY1);
|
||||
x += delta;
|
||||
x += SLIDER_TICK_SPACING;
|
||||
}
|
||||
|
||||
// The square
|
||||
@@ -94,14 +71,8 @@ void MainViewHorizontalSlider::paint(BitmapBuffer * dc)
|
||||
}
|
||||
|
||||
MainView6POS::MainView6POS(Window* parent, uint8_t idx) :
|
||||
MainViewSlider(parent, rect_t{}, idx)
|
||||
MainViewSlider(parent, rect_t{0, 0, MULTIPOS_W, MULTIPOS_H}, idx)
|
||||
{
|
||||
void* user_data = (void*)SLIDER_6POS;
|
||||
lv_obj_add_event_cb(lvobj, slider_self_size, LV_EVENT_GET_SELF_SIZE,
|
||||
user_data);
|
||||
|
||||
setWidth(MULTIPOS_W);
|
||||
setHeight(MULTIPOS_H);
|
||||
}
|
||||
|
||||
void MainView6POS::paint(BitmapBuffer * dc)
|
||||
@@ -129,27 +100,22 @@ void MainView6POS::checkEvents()
|
||||
}
|
||||
}
|
||||
|
||||
MainViewVerticalSlider::MainViewVerticalSlider(Window* parent, uint8_t idx) :
|
||||
MainViewSlider(parent, rect_t{}, idx)
|
||||
MainViewVerticalSlider::MainViewVerticalSlider(Window* parent, const rect_t& rect, uint8_t idx) :
|
||||
MainViewSlider(parent, rect, idx)
|
||||
{
|
||||
lv_obj_set_style_max_height(lvobj, VERTICAL_SLIDERS_HEIGHT, 0);
|
||||
lv_obj_set_style_min_height(lvobj, VERTICAL_SLIDERS_HEIGHT/2, 0);
|
||||
lv_obj_set_style_flex_grow(lvobj, 1, 0);
|
||||
setWidth(TRIM_SQUARE_SIZE);
|
||||
}
|
||||
|
||||
void MainViewVerticalSlider::paint(BitmapBuffer * dc)
|
||||
{
|
||||
// The ticks
|
||||
int delta = 4;
|
||||
int sliderTicksCount = (height() - TRIM_SQUARE_SIZE) / delta;
|
||||
int sliderTicksCount = (height() - TRIM_SQUARE_SIZE) / SLIDER_TICK_SPACING;
|
||||
coord_t y = TRIM_SQUARE_SIZE / 2;
|
||||
for (uint8_t i = 0; i <= sliderTicksCount; i++) {
|
||||
if (i == 0 || i == sliderTicksCount / 2 || i == sliderTicksCount)
|
||||
dc->drawSolidHorizontalLine(2, y, 13, COLOR_THEME_SECONDARY1);
|
||||
else
|
||||
dc->drawSolidHorizontalLine(4, y, 9, COLOR_THEME_SECONDARY1);
|
||||
y += delta;
|
||||
y += SLIDER_TICK_SPACING;
|
||||
}
|
||||
|
||||
// The square
|
||||
|
||||
@@ -24,17 +24,14 @@
|
||||
#include "libopenui.h"
|
||||
#include "trims.h"
|
||||
|
||||
#if defined(PCBNV14)
|
||||
#if LCD_H > LCD_W
|
||||
constexpr uint8_t SLIDER_TICKS_COUNT = 30;
|
||||
#else
|
||||
constexpr uint8_t SLIDER_TICKS_COUNT = 40;
|
||||
#endif
|
||||
constexpr coord_t HMARGIN = 5;
|
||||
constexpr coord_t HORIZONTAL_SLIDERS_WIDTH = SLIDER_TICKS_COUNT * 4 + TRIM_SQUARE_SIZE;
|
||||
constexpr coord_t MULTIPOS_H = 18;
|
||||
constexpr coord_t MULTIPOS_W_SPACING = 12;
|
||||
constexpr coord_t MULTIPOS_W = (6+1)*MULTIPOS_W_SPACING;
|
||||
constexpr coord_t VERTICAL_SLIDERS_HEIGHT = SLIDER_TICKS_COUNT * 4 + TRIM_SQUARE_SIZE;
|
||||
constexpr coord_t SLIDER_TICK_SPACING = 4;
|
||||
constexpr coord_t HORIZONTAL_SLIDERS_WIDTH = SLIDER_TICKS_COUNT * SLIDER_TICK_SPACING + TRIM_SQUARE_SIZE;
|
||||
constexpr coord_t VERTICAL_SLIDERS_HEIGHT = SLIDER_TICKS_COUNT * SLIDER_TICK_SPACING + TRIM_SQUARE_SIZE;
|
||||
|
||||
class MainViewSlider : public Window
|
||||
{
|
||||
@@ -58,7 +55,6 @@ class MainViewHorizontalSlider : public MainViewSlider
|
||||
class MainView6POS : public MainViewSlider
|
||||
{
|
||||
public:
|
||||
// using MainViewSlider::MainViewSlider;
|
||||
MainView6POS(Window* parent, uint8_t idx);
|
||||
void paint(BitmapBuffer * dc) override;
|
||||
void checkEvents() override;
|
||||
@@ -67,6 +63,6 @@ class MainView6POS : public MainViewSlider
|
||||
class MainViewVerticalSlider : public MainViewSlider
|
||||
{
|
||||
public:
|
||||
MainViewVerticalSlider(Window* parent, uint8_t idx);
|
||||
MainViewVerticalSlider(Window* parent, const rect_t & rect, uint8_t idx);
|
||||
void paint(BitmapBuffer * dc) override;
|
||||
};
|
||||
|
||||
@@ -139,8 +139,7 @@ coord_t TopbarImpl::getVisibleHeight(float visible) const // 0.0 -> 1.0
|
||||
|
||||
void TopbarImpl::paint(BitmapBuffer * dc)
|
||||
{
|
||||
dc->drawSolidFilledRect(0, 0, width(), height(), COLOR_THEME_SECONDARY1);
|
||||
OpenTxTheme::instance()->drawTopLeftBitmap(dc);
|
||||
EdgeTxTheme::instance()->drawHeaderIcon(dc, ICON_EDGETX);
|
||||
const TimerOptions timerOptions = {.options = SHOW_TIME};
|
||||
struct gtm t;
|
||||
gettime(&t);
|
||||
|
||||
@@ -25,27 +25,6 @@
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
enum trim_type {
|
||||
TRIM_VERT,
|
||||
TRIM_HORIZ,
|
||||
};
|
||||
|
||||
static void trim_self_size(lv_event_t* e)
|
||||
{
|
||||
lv_point_t* s = (lv_point_t*)lv_event_get_param(e);
|
||||
trim_type t = (trim_type)(intptr_t)lv_event_get_user_data(e);
|
||||
switch(t) {
|
||||
case TRIM_VERT:
|
||||
s->y = VERTICAL_SLIDERS_HEIGHT;
|
||||
s->x = TRIM_SQUARE_SIZE;
|
||||
break;
|
||||
case TRIM_HORIZ:
|
||||
s->x = HORIZONTAL_SLIDERS_WIDTH;
|
||||
s->y = TRIM_SQUARE_SIZE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MainViewTrim::MainViewTrim(Window * parent, const rect_t & rect, uint8_t idx):
|
||||
Window(parent, rect),
|
||||
idx(idx)
|
||||
@@ -109,13 +88,8 @@ void MainViewTrim::paint(BitmapBuffer * dc)
|
||||
}
|
||||
|
||||
MainViewHorizontalTrim::MainViewHorizontalTrim(Window* parent, uint8_t idx) :
|
||||
MainViewTrim(parent, rect_t{}, idx)
|
||||
MainViewTrim(parent, rect_t{0, 0, HORIZONTAL_SLIDERS_WIDTH, TRIM_SQUARE_SIZE}, idx)
|
||||
{
|
||||
void* user_data = (void*)TRIM_HORIZ;
|
||||
lv_obj_add_event_cb(lvobj, trim_self_size, LV_EVENT_GET_SELF_SIZE, user_data);
|
||||
|
||||
setWidth(HORIZONTAL_SLIDERS_WIDTH);
|
||||
setHeight(TRIM_SQUARE_SIZE);
|
||||
}
|
||||
|
||||
coord_t MainViewHorizontalTrim::sx()
|
||||
@@ -153,13 +127,8 @@ void MainViewHorizontalTrim::drawValue(BitmapBuffer * dc)
|
||||
}
|
||||
|
||||
MainViewVerticalTrim::MainViewVerticalTrim(Window* parent, uint8_t idx) :
|
||||
MainViewTrim(parent, rect_t{}, idx)
|
||||
MainViewTrim(parent, rect_t{0, 0, TRIM_SQUARE_SIZE, VERTICAL_SLIDERS_HEIGHT}, idx)
|
||||
{
|
||||
void* user_data = (void*)TRIM_VERT;
|
||||
lv_obj_add_event_cb(lvobj, trim_self_size, LV_EVENT_GET_SELF_SIZE, user_data);
|
||||
|
||||
setWidth(TRIM_SQUARE_SIZE);
|
||||
setHeight(VERTICAL_SLIDERS_HEIGHT);
|
||||
}
|
||||
|
||||
coord_t MainViewVerticalTrim::sy()
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#pragma once
|
||||
|
||||
#if !defined(BOOT)
|
||||
#include "libopenui_config.h"
|
||||
#include "libopenui_defines.h"
|
||||
#include "libopenui_file.h"
|
||||
#include "font.h"
|
||||
#include "window.h"
|
||||
@@ -30,7 +30,7 @@
|
||||
#include "static.h"
|
||||
#include "button.h"
|
||||
#include "fab_button.h"
|
||||
#include "checkbox.h"
|
||||
#include "toggleswitch.h"
|
||||
#include "numberedit.h"
|
||||
#include "timeedit.h"
|
||||
#include "choice.h"
|
||||
@@ -39,10 +39,8 @@
|
||||
#include "filechoice.h"
|
||||
#include "textedit.h"
|
||||
#include "slider.h"
|
||||
#include "progress.h"
|
||||
#include "keyboard_text.h"
|
||||
#include "keyboard_number.h"
|
||||
#include "keyboard_curve.h"
|
||||
#include "tabsgroup.h"
|
||||
#include "page.h"
|
||||
#include "menu.h"
|
||||
@@ -51,7 +49,6 @@
|
||||
#include "message_dialog.h"
|
||||
#include "confirm_dialog.h"
|
||||
#include "dialog.h"
|
||||
#include "gridlayout.h"
|
||||
#include "getset_helpers.h"
|
||||
#include "curveedit.h"
|
||||
#include "draw_functions.h"
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "list_line_button.h"
|
||||
#include "opentx.h"
|
||||
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
|
||||
void ListLineButton::value_changed(lv_event_t* e)
|
||||
{
|
||||
auto obj = lv_event_get_target(e);
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "input_mix_group.h"
|
||||
|
||||
#define MY_CLASS &input_mix_group_class
|
||||
|
||||
const lv_obj_class_t input_mix_group_class = {
|
||||
.width_def = LV_PCT(100),
|
||||
.height_def = LV_SIZE_CONTENT,
|
||||
.editable = LV_OBJ_CLASS_EDITABLE_FALSE,
|
||||
.group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE,
|
||||
.instance_size = sizeof(lv_obj_t),
|
||||
.base_class = &lv_obj_class,
|
||||
};
|
||||
|
||||
lv_obj_t* input_mix_group_create(lv_obj_t* parent)
|
||||
{
|
||||
LV_LOG_INFO("begin");
|
||||
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
|
||||
lv_obj_class_init_obj(obj);
|
||||
return obj;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef INPUT_MIX_GROUP_H
|
||||
#define INPUT_MIX_GROUP_H
|
||||
|
||||
#include <lvgl/lvgl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern const lv_obj_class_t input_mix_group_class;
|
||||
lv_obj_t* input_mix_group_create(lv_obj_t* parent);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "input_mix_line.h"
|
||||
|
||||
#define MY_CLASS &input_mix_line_class
|
||||
|
||||
const lv_obj_class_t input_mix_line_class = {
|
||||
.width_def = LV_PCT(100),
|
||||
.height_def = LV_SIZE_CONTENT,
|
||||
.group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE,
|
||||
.instance_size = sizeof(lv_btn_t),
|
||||
.base_class = &lv_btn_class,
|
||||
};
|
||||
|
||||
lv_obj_t* input_mix_line_create(lv_obj_t* parent)
|
||||
{
|
||||
LV_LOG_INFO("begin");
|
||||
lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
|
||||
lv_obj_class_init_obj(obj);
|
||||
return obj;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) EdgeTX
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef INPUT_MIX_LINE_H
|
||||
#define INPUT_MIX_LINE_H
|
||||
|
||||
#include <lvgl/lvgl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern const lv_obj_class_t input_mix_line_class;
|
||||
lv_obj_t* input_mix_line_create(lv_obj_t* parent);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "lz4_bitmaps.h"
|
||||
#include "libopenui/thirdparty/lz4/lz4.h"
|
||||
#include "libopenui_helpers.h"
|
||||
#include "opentx_helpers.h"
|
||||
|
||||
const uint8_t* _decompressed_mask(const uint8_t* lz4_compressed, uint8_t** raw)
|
||||
{
|
||||
|
||||
@@ -1,200 +0,0 @@
|
||||
class Window
|
||||
{
|
||||
public:
|
||||
Window(coord_t x, coord_t y, coord_t width, coord_t height):
|
||||
x(x),
|
||||
y(y),
|
||||
width(width),
|
||||
height(height),
|
||||
offsetX(0),
|
||||
offsetY(0),
|
||||
innerWidth(width),
|
||||
innerHeight(height),
|
||||
focusX(-1),
|
||||
focusY(-1)
|
||||
{
|
||||
}
|
||||
|
||||
coord_t x, y, width, height, offsetX, offsetY, innerWidth, innerHeight, focusX, focusY;
|
||||
|
||||
void scroll() {
|
||||
if (touchState.Event == TE_SLIDE) {
|
||||
if (innerHeight > height && touchState.startX >= this->x && touchState.startX <= this->x + this->width) {
|
||||
this->offsetY = limit<coord_t>(-innerHeight + height, this->offsetY + touchState.Y - touchState.startY, 0);
|
||||
touchState.startY = touchState.Y;
|
||||
}
|
||||
if (innerWidth > width && touchState.startY >= this->y && touchState.startY <= this->y + this->height) {
|
||||
this->offsetX = limit<coord_t>(-innerWidth + width, this->offsetX + touchState.X - touchState.startX, 0);
|
||||
touchState.startX = touchState.X;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool touchPressed(coord_t x, coord_t y, coord_t w, coord_t h) {
|
||||
return ::touchPressed(this->x + this->offsetX + x, this->y + this->offsetY + y, w, h);
|
||||
}
|
||||
|
||||
void setHeight(coord_t height) {
|
||||
this->height = height;
|
||||
}
|
||||
|
||||
void setInnerWidth(coord_t value) {
|
||||
innerWidth = value;
|
||||
}
|
||||
|
||||
void setInnerHeight(coord_t value) {
|
||||
innerHeight = value;
|
||||
}
|
||||
|
||||
void setFocus(coord_t x, coord_t y) {
|
||||
focusX = x;
|
||||
focusY = y;
|
||||
}
|
||||
|
||||
void clearFocus() {
|
||||
setFocus(-1, -1);
|
||||
}
|
||||
|
||||
bool hasFocus(coord_t x, coord_t y) {
|
||||
return (x == focusX && y == focusY);
|
||||
}
|
||||
|
||||
void drawVerticalScrollbar();
|
||||
|
||||
void drawSolidFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags flags)
|
||||
{
|
||||
setClippingRect();
|
||||
lcd->drawSolidFilledRect(this->x + this->offsetX + x, this->y + this->offsetY + y, w, h, flags);
|
||||
clearLcdLimits();
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void drawBitmap(coord_t x, coord_t y, const T * bmp, coord_t srcx=0, coord_t srcy=0, coord_t w=0, coord_t h=0, float scale=0) {
|
||||
if (this->offsetX + x >= this->width || this->offsetY + y >= this->height) {
|
||||
return;
|
||||
}
|
||||
setClippingRect();
|
||||
lcd->drawBitmap(this->x + this->offsetX + x, this->y + this->offsetY + y, bmp, srcx, srcy, w, h, scale);
|
||||
clearLcdLimits();
|
||||
}
|
||||
|
||||
inline void setClippingRect() {
|
||||
lcd->setClippingRect(this->x, this->x + this->width, this->y, this->y + this->height);
|
||||
}
|
||||
|
||||
inline void clearLcdLimits() {
|
||||
lcd->clearClippingRect();
|
||||
}
|
||||
|
||||
void drawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags flags) {
|
||||
setClippingRect();
|
||||
lcd->drawSizedText(this->x + this->offsetX + x, this->y + this->offsetY + y, s, len, flags);
|
||||
clearLcdLimits();
|
||||
}
|
||||
|
||||
};
|
||||
template <class W>
|
||||
bool Subtitle(W * window, rect_t & rect, const char * label)
|
||||
{
|
||||
rect.h = 14;
|
||||
drawText(window, rect.x, rect.y, label, FONT(BOLD));
|
||||
}
|
||||
|
||||
template <class W>
|
||||
bool CheckBox(W * window, rect_t & rect, const char * label, uint8_t & value, LcdFlags flags=0)
|
||||
{
|
||||
rect.h = 30;
|
||||
bool hasFocus = (flags & HAS_FOCUS) || window->hasFocus(rect.x, rect.y);
|
||||
drawText(window, rect.x, rect.y+4, label);
|
||||
coord_t x = rect.x + rect.w - 20;
|
||||
if (hasFocus) {
|
||||
window->drawSolidFilledRect(x-1, rect.y+8, 14, 14, COLOR_THEME_FOCUS);
|
||||
window->drawSolidFilledRect(x+1, rect.y+10, 10, 10, COLOR_THEME_SECONDARY3);
|
||||
if (value) {
|
||||
window->drawSolidFilledRect(x+2, rect.y+11, 8, 8, COLOR_THEME_FOCUS);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (value) {
|
||||
window->drawSolidFilledRect(x+2, rect.y+11, 8, 8, COLOR_THEME_FOCUS);
|
||||
drawSolidRect(window, x, rect.y+9, 12, 12, 1, COLOR_THEME_PRIMARY3);
|
||||
}
|
||||
else {
|
||||
drawSolidRect(window, x, rect.y+9, 12, 12, 1, COLOR_THEME_PRIMARY3);
|
||||
}
|
||||
}
|
||||
if (window->touchPressed(rect.x, rect.y, rect.w, rect.h)) {
|
||||
value ^= 1;
|
||||
window->setFocus(rect.x, rect.y);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class W>
|
||||
void drawWidgetLabel(W * window, rect_t & rect, const char * label) {
|
||||
drawText(window, rect.x, rect.y, label, TINSIZE);
|
||||
}
|
||||
|
||||
template <class W>
|
||||
void drawWidgetLine(W * window, rect_t & rect, LcdFlags color) {
|
||||
window->drawSolidFilledRect(rect.x, rect.y + rect.h, rect.w, 1, color);
|
||||
}
|
||||
|
||||
template <class W>
|
||||
bool Choice(W * window, rect_t & rect, const char * label, const char * values, uint8_t & value, uint8_t vmin, uint8_t vmax, LcdFlags flags=0)
|
||||
{
|
||||
rect.h = 30;
|
||||
bool hasFocus = (flags & HAS_FOCUS) || window->hasFocus(rect.x, rect.y);
|
||||
LcdFlags textColor = 0;
|
||||
LcdFlags lineColor = COLOR_THEME_DISABLED;
|
||||
if (hasFocus) {
|
||||
textColor = COLOR_THEME_FOCUS;
|
||||
lineColor = COLOR_THEME_FOCUS;
|
||||
}
|
||||
drawTextAtIndex(window, rect.x, rect.y + 9, values, value, textColor);
|
||||
drawWidgetLine(window, rect, lineColor);
|
||||
drawWidgetLabel(window, rect, label);
|
||||
if (window->touchPressed(rect.x, rect.y, rect.w, rect.h)) {
|
||||
// value ^= 1;
|
||||
window->setFocus(rect.x, rect.y);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class W>
|
||||
bool TextEdit(W * window, rect_t & rect, const char * label, char * value, uint8_t length, LcdFlags flags=0)
|
||||
{
|
||||
rect.h = 30;
|
||||
bool hasFocus = (flags & HAS_FOCUS) || window->hasFocus(rect.x, rect.y);
|
||||
LcdFlags textColor = 0;
|
||||
LcdFlags lineColor = COLOR_THEME_DISABLED;
|
||||
if (hasFocus) {
|
||||
textColor = COLOR_THEME_FOCUS;
|
||||
lineColor = COLOR_THEME_FOCUS;
|
||||
}
|
||||
if (!hasFocus && zlen(value, length) == 0)
|
||||
menuBodyWindow.drawSizedText(rect.x, rect.y + 9, "---", length, textColor);
|
||||
else
|
||||
menuBodyWindow.drawSizedText(rect.x, rect.y + 9, value, length, ZCHAR | textColor);
|
||||
drawWidgetLine(window, rect, lineColor);
|
||||
drawWidgetLabel(window, rect, label);
|
||||
if (window->touchPressed(rect.x, rect.y, rect.w, rect.h)) {
|
||||
// value ^= 1;
|
||||
window->setFocus(rect.x, rect.y);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#define CHECKBOX(X, label, value) { rect.x = X; rect.w = LCD_W - (X) - 20; uint8_t _value = value; CheckBox(window, rect, label, _value); value = _value; rect.y += rect.h + 10; }
|
||||
#define CHECKBOX_INVERTED(X, label, value) { rect.x = X; rect.w = LCD_W - (X) - 20; uint8_t _value = !value; CheckBox(window, rect, label, _value); value = !_value; rect.y += rect.h + 10; }
|
||||
#endif
|
||||
@@ -121,7 +121,7 @@ void ModelMenu::onEvent(event_t event)
|
||||
#if defined(PCBNV14) || defined(PCBPL18)
|
||||
void ModelMenu::addGoToMonitorsButton()
|
||||
{
|
||||
OpenTxTheme::instance()->createTextButton(
|
||||
new TextButton(
|
||||
&header, {LCD_W / 2 + 6, MENU_TITLE_TOP + 1, LCD_W / 2 - 8, MENU_TITLE_HEIGHT - 2},
|
||||
STR_OPEN_CHANNEL_MONITORS, [=]() {
|
||||
pushEvent(EVT_KEY_FIRST(KEY_MODEL));
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
extern uint8_t menuCalibrationState;
|
||||
|
||||
enum MenuIcons {
|
||||
ICON_OPENTX,
|
||||
ICON_EDGETX,
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
ICON_NEXT,
|
||||
ICON_BACK,
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "form.h"
|
||||
#include "curve.h"
|
||||
|
||||
class FormGroup;
|
||||
class FormWindow;
|
||||
|
||||
class MixEditWindow : public Page
|
||||
{
|
||||
|
||||
@@ -77,38 +77,36 @@ void MixEditAdvanced::buildBody(FormWindow* form)
|
||||
// Trim
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_TRIM, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_INVERTED(mix->carryTrim));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_INVERTED(mix->carryTrim));
|
||||
|
||||
// Warning
|
||||
new StaticText(line, rect_t{}, STR_MIXWARNING, 0, COLOR_THEME_PRIMARY1);
|
||||
auto edit = new NumberEdit(line, rect_t{}, 0, 3, GET_SET_DEFAULT(mix->mixWarn));
|
||||
auto edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, 3, GET_SET_DEFAULT(mix->mixWarn));
|
||||
edit->setZeroText(STR_OFF);
|
||||
|
||||
// Delay up
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_DELAYUP, 0, COLOR_THEME_PRIMARY1);
|
||||
edit = new NumberEdit(line, rect_t{}, 0, DELAY_MAX, GET_DEFAULT(mix->delayUp),
|
||||
edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->delayUp),
|
||||
SET_VALUE(mix->delayUp, newValue), 0, PREC1);
|
||||
edit->setSuffix("s");
|
||||
|
||||
// Delay down
|
||||
new StaticText(line, rect_t{}, STR_DELAYDOWN, 0, COLOR_THEME_PRIMARY1);
|
||||
edit =
|
||||
new NumberEdit(line, rect_t{}, 0, DELAY_MAX, GET_DEFAULT(mix->delayDown),
|
||||
SET_VALUE(mix->delayDown, newValue), 0, PREC1);
|
||||
edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->delayDown),
|
||||
SET_VALUE(mix->delayDown, newValue), 0, PREC1);
|
||||
edit->setSuffix("s");
|
||||
|
||||
// Slow up
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_SLOWUP, 0, COLOR_THEME_PRIMARY1);
|
||||
edit = new NumberEdit(line, rect_t{}, 0, DELAY_MAX, GET_DEFAULT(mix->speedUp),
|
||||
edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->speedUp),
|
||||
SET_VALUE(mix->speedUp, newValue), 0, PREC1);
|
||||
edit->setSuffix("s");
|
||||
|
||||
// Slow down
|
||||
new StaticText(line, rect_t{}, STR_SLOWDOWN, 0, COLOR_THEME_PRIMARY1);
|
||||
edit =
|
||||
new NumberEdit(line, rect_t{}, 0, DELAY_MAX, GET_DEFAULT(mix->speedDown),
|
||||
SET_VALUE(mix->speedDown, newValue), 0, PREC1);
|
||||
edit = new NumberEdit(line, rect_t{0, 0, 100, 0}, 0, DELAY_MAX, GET_DEFAULT(mix->speedDown),
|
||||
SET_VALUE(mix->speedDown, newValue), 0, PREC1);
|
||||
edit->setSuffix("s");
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "form.h"
|
||||
#include "curve.h"
|
||||
|
||||
class FormGroup;
|
||||
class FormWindow;
|
||||
|
||||
class MixEditAdvanced : public Page
|
||||
{
|
||||
|
||||
@@ -42,7 +42,7 @@ DEFINE_LZ4_BITMAP(LBM_DOT);
|
||||
class CurveButton : public Button {
|
||||
public:
|
||||
CurveButton(Window * parent, const rect_t &rect, uint8_t index) :
|
||||
Button(parent, rect, nullptr, 0, 0, lv_btn_create),
|
||||
Button(parent, rect, nullptr, 0, 0, etx_button_create),
|
||||
index(index)
|
||||
{
|
||||
padAll(0);
|
||||
@@ -207,12 +207,11 @@ void ModelCurvesPage::build(FormWindow * window)
|
||||
|
||||
FlexGridLayout grid(col_dsc, row_dsc);
|
||||
|
||||
FormWindow::Line* line;
|
||||
FormWindow::Line* line = nullptr;
|
||||
|
||||
bool hasFocusButton = false;
|
||||
|
||||
uint8_t curveIndex = 0;
|
||||
uint8_t firstCurveIndex;
|
||||
CurveButton* firstCurveButton = nullptr;
|
||||
|
||||
for (uint8_t index = 0; index < MAX_CURVES; index++) {
|
||||
@@ -222,9 +221,6 @@ void ModelCurvesPage::build(FormWindow * window)
|
||||
lv_obj_set_grid_align(line->getLvObj(), LV_GRID_ALIGN_SPACE_BETWEEN, LV_GRID_ALIGN_SPACE_BETWEEN);
|
||||
}
|
||||
|
||||
CurveHeader &curve = g_model.curves[index];
|
||||
int8_t * points = curveAddress(index);
|
||||
|
||||
// Curve drawing
|
||||
auto button = new CurveButton(line, rect_t{0, 0, CURVE_BTN_W, CURVE_BTH_H}, index);
|
||||
button->setPressHandler([=]() -> uint8_t {
|
||||
@@ -260,7 +256,6 @@ void ModelCurvesPage::build(FormWindow * window)
|
||||
});
|
||||
|
||||
if (!firstCurveButton) {
|
||||
firstCurveIndex = index;
|
||||
firstCurveButton = button;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "model_flightmodes.h"
|
||||
#include "opentx.h"
|
||||
#include "libopenui.h"
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
#include "hal/key_driver.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -68,11 +66,9 @@ class FlightModeEdit : public Page
|
||||
header.setTitle(STR_MENUFLIGHTMODES);
|
||||
header.setTitle2(title2);
|
||||
|
||||
body.padAll(lv_dpx(8));
|
||||
lv_obj_set_scrollbar_mode(body.getLvObj(), LV_SCROLLBAR_MODE_AUTO);
|
||||
|
||||
FlexGridLayout grid(line_col_dsc, line_row_dsc, 2);
|
||||
auto form = new FormWindow(&body, rect_t{});
|
||||
form->padAll(8);
|
||||
form->setFlexLayout();
|
||||
|
||||
FlightModeData* p_fm = &g_model.flightModeData[index];
|
||||
@@ -116,7 +112,7 @@ class FlightModeEdit : public Page
|
||||
line->padLeft(10);
|
||||
}
|
||||
|
||||
auto trim = new FormGroup(line, rect_t{});
|
||||
auto trim = new FormWindow(line, rect_t{});
|
||||
trim->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
|
||||
auto trim_obj = trim->getLvObj();
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "model_gvars.h"
|
||||
#include "libopenui.h"
|
||||
#include "numberedit.h"
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -86,7 +85,7 @@ class GVarStyle
|
||||
|
||||
// Always update colors in case theme changes
|
||||
lv_style_set_bg_color(&fmContStyle, makeLvColor(COLOR_THEME_PRIMARY2));
|
||||
lv_style_set_bg_color(&fmContStyleChecked, makeLvColor(COLOR_THEME_SECONDARY3));
|
||||
lv_style_set_bg_color(&fmContStyleChecked, makeLvColor(COLOR_THEME_ACTIVE));
|
||||
lv_style_set_text_color(&fmLabelStyle, makeLvColor(COLOR_THEME_SECONDARY1));
|
||||
lv_style_set_text_color(&fmValueStyle, makeLvColor(COLOR_THEME_SECONDARY1));
|
||||
lv_style_set_text_color(&fmNameStyle, makeLvColor(COLOR_THEME_SECONDARY1));
|
||||
@@ -515,7 +514,7 @@ class GVarEditWindow : public Page
|
||||
}
|
||||
|
||||
if (flightMode > 0) {
|
||||
auto cb = new CheckBox(
|
||||
auto cb = new ToggleSwitch(
|
||||
line, rect_t{}, [=] { return fmData->gvars[index] <= GVAR_MAX; },
|
||||
[=](uint8_t checked) {
|
||||
fmData->gvars[index] = checked ? 0 : GVAR_MAX + 1;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include "opentx.h"
|
||||
#include "gvar_numberedit.h"
|
||||
#include "libopenui.h"
|
||||
#include "choiceex.h"
|
||||
#include "choice.h"
|
||||
#include "model_curves.h"
|
||||
#include "input_edit.h"
|
||||
#include "input_mix_group.h"
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "opentx.h"
|
||||
#include "libopenui.h"
|
||||
#include "switches.h"
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -46,7 +45,7 @@ class LogicalSwitchEditPage : public Page
|
||||
protected:
|
||||
uint8_t index;
|
||||
bool active = false;
|
||||
FormGroup* logicalSwitchOneWindow = nullptr;
|
||||
FormWindow* logicalSwitchOneWindow = nullptr;
|
||||
StaticText* headerSwitchName = nullptr;
|
||||
NumberEdit* v2Edit = nullptr;
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "translations.h"
|
||||
#include "menus.h"
|
||||
#include "libopenui.h"
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -99,7 +98,7 @@ class ScriptEditWindow : public Page {
|
||||
// File
|
||||
auto line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_SCRIPT, 0, COLOR_THEME_PRIMARY1);
|
||||
auto fc = new FileChoice(
|
||||
new FileChoice(
|
||||
line, rect_t{}, SCRIPTS_MIXES_PATH, SCRIPTS_EXT,
|
||||
LEN_SCRIPT_FILENAME,
|
||||
[=]() { return stringFromNtString(sd->file); },
|
||||
@@ -121,7 +120,7 @@ class ScriptEditWindow : public Page {
|
||||
|
||||
if (sio->inputsCount > 0) {
|
||||
line = form->newLine(&grid);
|
||||
new Subtitle(line, rect_t{}, STR_INPUTS, 0, COLOR_THEME_PRIMARY1);
|
||||
new Subtitle(line, STR_INPUTS);
|
||||
|
||||
for (int i = 0; i < sio->inputsCount; i++) {
|
||||
line = form->newLine(&grid);
|
||||
@@ -140,7 +139,7 @@ class ScriptEditWindow : public Page {
|
||||
|
||||
if (sio->outputsCount > 0) {
|
||||
line = form->newLine(&grid);
|
||||
new Subtitle(line, rect_t{}, STR_OUTPUTS, 0, COLOR_THEME_PRIMARY1);
|
||||
new Subtitle(line, STR_OUTPUTS);
|
||||
|
||||
for (int i = 0; i < sio->outputsCount; i++) {
|
||||
line = form->newLine(&grid);
|
||||
@@ -173,9 +172,9 @@ class ScriptLineButton : public Button
|
||||
const ScriptInternalData* runtimeData,
|
||||
uint8_t index) :
|
||||
Button(parent, rect, nullptr, 0, 0, input_mix_line_create),
|
||||
index(index),
|
||||
scriptData(scriptData),
|
||||
runtimeData(runtimeData),
|
||||
index(index)
|
||||
runtimeData(runtimeData)
|
||||
{
|
||||
#if LCD_H > LCD_W
|
||||
padTop(5);
|
||||
@@ -294,8 +293,6 @@ void ModelMixerScriptsPage::build(FormWindow * window, int8_t focusIdx)
|
||||
|
||||
FlexGridLayout grid(col_dsc, row_dsc, 2);
|
||||
|
||||
FormWindow::Line* line;
|
||||
|
||||
int8_t scriptIdx = 0;
|
||||
for (int8_t idx = 0; idx < MAX_SCRIPTS; idx++) {
|
||||
auto line = window->newLine(&grid);
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "model_mixes.h"
|
||||
#include "opentx.h"
|
||||
#include "libopenui.h"
|
||||
#include "choiceex.h"
|
||||
#include "choice.h"
|
||||
#include "bitfield.h"
|
||||
#include "model_inputs.h"
|
||||
#include "gvar_numberedit.h"
|
||||
@@ -532,7 +532,7 @@ void ModelMixesPage::build(FormWindow * window)
|
||||
lv_obj_set_style_flex_cross_place(box_obj, LV_FLEX_ALIGN_CENTER, 0);
|
||||
|
||||
new StaticText(box, rect_t{}, STR_SHOW_MIXER_MONITORS, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(
|
||||
new ToggleSwitch(
|
||||
box, rect_t{}, [=]() { return showMonitors; },
|
||||
[=](uint8_t val) { enableMonitors(val); });
|
||||
|
||||
|
||||
@@ -314,7 +314,7 @@ void ModelOutputsPage::build(FormWindow *window)
|
||||
lv_obj_set_style_flex_cross_place(box2->getLvObj(), LV_FLEX_ALIGN_CENTER, 0);
|
||||
|
||||
new StaticText(box2, rect_t{}, STR_ELIMITS, 0, COLOR_THEME_PRIMARY1);
|
||||
auto cb = new CheckBox(box2, rect_t{}, GET_SET_DEFAULT(g_model.extendedLimits));
|
||||
new ToggleSwitch(box2, rect_t{}, GET_SET_DEFAULT(g_model.extendedLimits));
|
||||
|
||||
for (uint8_t ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) {
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ constexpr coord_t MODEL_SELECT_CELL_WIDTH =
|
||||
class ToolbarButton : public Button
|
||||
{
|
||||
public:
|
||||
ToolbarButton(FormGroup *parent, const rect_t &rect, const uint8_t *bitmap,
|
||||
ToolbarButton(FormWindow *parent, const rect_t &rect, const uint8_t *bitmap,
|
||||
std::function<uint8_t()> pressHandler = nullptr) :
|
||||
Button(parent, rect, pressHandler, 0), _bitmap(bitmap)
|
||||
{
|
||||
@@ -240,7 +240,7 @@ class ButtonHolder : public FormWindow
|
||||
class ModelButton : public Button
|
||||
{
|
||||
public:
|
||||
ModelButton(FormGroup *parent, const rect_t &rect, ModelCell *modelCell, std::function<void()> setSelected) :
|
||||
ModelButton(FormWindow *parent, const rect_t &rect, ModelCell *modelCell, std::function<void()> setSelected) :
|
||||
Button(parent, rect), modelCell(modelCell)
|
||||
{
|
||||
m_setSelected = std::move(setSelected);
|
||||
@@ -606,7 +606,7 @@ class LabelDialog : public Dialog
|
||||
|
||||
new TextEdit(form, rect_t{}, label, LABEL_LENGTH);
|
||||
|
||||
auto box = new FormGroup(form, rect_t{});
|
||||
auto box = new FormWindow(form, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
|
||||
auto box_obj = box->getLvObj();
|
||||
@@ -738,7 +738,8 @@ void ModelLabelsWindow::newModel()
|
||||
|
||||
#if defined(LUA)
|
||||
// If there is a wizard Lua script, fire it up
|
||||
snprintf(path, LEN_BUFFER, "%s/%s%s", path, name.c_str(), SCRIPT_EXT);
|
||||
int len = strlen(path);
|
||||
snprintf(path+len, LEN_BUFFER-len, "/%s%s", name.c_str(), SCRIPT_EXT);
|
||||
if (f_stat(path, 0) == FR_OK) {
|
||||
luaExec(path);
|
||||
StandaloneLuaWindow::instance()->attach();
|
||||
@@ -898,7 +899,10 @@ void ModelLabelsWindow::buildBody(FormWindow *window)
|
||||
new ProgressDialog(this, STR_RENAME_LABEL, [=]() {});
|
||||
modelslabels.renameLabel(
|
||||
oldLabel, newLabel, [=](const char *name, int percentage) {
|
||||
rndialog->updateProgress(name, percentage);
|
||||
rndialog->setTitle(std::string(STR_RENAME_LABEL) + " " + name);
|
||||
rndialog->updateProgress(percentage);
|
||||
if (percentage >= 100)
|
||||
rndialog->closeDialog();
|
||||
});
|
||||
auto labels = getLabels();
|
||||
lblselector->setNames(labels);
|
||||
@@ -915,7 +919,10 @@ void ModelLabelsWindow::buildBody(FormWindow *window)
|
||||
new ProgressDialog(this, STR_DELETE_LABEL, [=]() {});
|
||||
modelslabels.removeLabel(
|
||||
labelToDelete, [=](const char *name, int percentage) {
|
||||
deldialog->updateProgress(name, percentage);
|
||||
deldialog->setTitle(std::string(STR_RENAME_LABEL) + " " + name);
|
||||
deldialog->updateProgress(percentage);
|
||||
if (percentage >= 100)
|
||||
deldialog->closeDialog();
|
||||
});
|
||||
auto labels = getLabels();
|
||||
std::set<uint32_t> newset;
|
||||
@@ -989,39 +996,3 @@ void ModelLabelsWindow::setTitle()
|
||||
header.setTitle(STR_MANAGE_MODELS);
|
||||
header.setTitle2(title2);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
ProgressDialog::ProgressDialog(Window *parent, std::string title,
|
||||
std::function<void()> onClose) :
|
||||
Dialog(parent, title, rect_t{}),
|
||||
progress(new Progress(&content->form, rect_t{})),
|
||||
onClose(std::move(onClose)),
|
||||
_title(title)
|
||||
{
|
||||
progress->setHeight(LV_DPI_DEF / 4);
|
||||
|
||||
content->setWidth(LCD_W * 0.8);
|
||||
content->updateSize();
|
||||
|
||||
auto content_w = lv_obj_get_content_width(content->form.getLvObj());
|
||||
progress->setWidth(content_w);
|
||||
|
||||
// disable canceling dialog
|
||||
setCloseWhenClickOutside(false);
|
||||
}
|
||||
|
||||
void ProgressDialog::updateProgress(const char *filename, int percentage)
|
||||
{
|
||||
content->setTitle(_title + " " + filename);
|
||||
progress->setValue(percentage);
|
||||
if (percentage >= 100) {
|
||||
deleteLater();
|
||||
onClose();
|
||||
} else {
|
||||
lv_refr_now(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
// disable keys
|
||||
void ProgressDialog::onEvent(event_t) { return; }
|
||||
|
||||
@@ -106,24 +106,4 @@ class ModelLabelsWindow : public Page
|
||||
void setTitle();
|
||||
};
|
||||
|
||||
class ProgressDialog : public Dialog
|
||||
{
|
||||
uint32_t lastUpdate = 0;
|
||||
Progress *progress;
|
||||
|
||||
std::function<void()> onClose;
|
||||
|
||||
public:
|
||||
ProgressDialog(Window *parent, std::string title,
|
||||
std::function<void()> onClose);
|
||||
|
||||
void updateProgress(const char *filename, int percentage);
|
||||
|
||||
// disable keys
|
||||
void onEvent(event_t) override;
|
||||
|
||||
protected:
|
||||
std::string _title;
|
||||
};
|
||||
|
||||
#endif // _MODEL_SELECT_H_
|
||||
|
||||
@@ -110,7 +110,7 @@ SubScreenButton::SubScreenButton(Window* parent, const char* text,
|
||||
Button(parent, rect_t{}, [=]() -> uint8_t {
|
||||
pressHandler();
|
||||
return 0;
|
||||
}, 0, 0, lv_btn_create),
|
||||
}, 0, 0, etx_vbutton_create),
|
||||
text(text)
|
||||
{
|
||||
lv_obj_add_event_cb(lvobj, SubScreenButton::event_cb, LV_EVENT_ALL, nullptr);
|
||||
@@ -404,12 +404,12 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
|
||||
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
auto oform = new FormGroup(window, rect_t{});
|
||||
auto oform = new FormWindow(window, rect_t{});
|
||||
oform->setFlexLayout(LV_FLEX_FLOW_COLUMN, lv_dpx(PAGE_PADDING));
|
||||
oform->padAll(PAGE_PADDING);
|
||||
|
||||
// Modules
|
||||
auto form = new FormGroup(oform, rect_t{});
|
||||
auto form = new FormWindow(oform, rect_t{});
|
||||
form->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(PAGE_PADDING));
|
||||
lv_obj_set_grid_dsc_array(form->getLvObj(), col_dsc, row_dsc);
|
||||
|
||||
@@ -423,7 +423,7 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
lv_obj_set_grid_cell(btn->getLvObj(), LV_GRID_ALIGN_STRETCH, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
|
||||
// Timer buttons
|
||||
form = new FormGroup(oform, rect_t{});
|
||||
form = new FormWindow(oform, rect_t{});
|
||||
form->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(PAGE_PADDING));
|
||||
lv_obj_set_grid_dsc_array(form->getLvObj(), col_dsc, row_dsc);
|
||||
|
||||
@@ -436,7 +436,7 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
btn = new SubScreenButton(form, TR_TIMER "3", []() { new TimerWindow(2); });
|
||||
lv_obj_set_grid_cell(btn->getLvObj(), LV_GRID_ALIGN_STRETCH, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
|
||||
form = new FormGroup(oform, rect_t{});
|
||||
form = new FormWindow(oform, rect_t{});
|
||||
form->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(PAGE_PADDING));
|
||||
lv_obj_set_grid_dsc_array(form->getLvObj(), col_dsc, row_dsc);
|
||||
|
||||
@@ -449,7 +449,7 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
btn = new SubScreenButton(form, STR_THROTTLE_LABEL, []() { new ThrottleParams(); });
|
||||
lv_obj_set_grid_cell(btn->getLvObj(), LV_GRID_ALIGN_STRETCH, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
|
||||
form = new FormGroup(oform, rect_t{});
|
||||
form = new FormWindow(oform, rect_t{});
|
||||
form->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(PAGE_PADDING));
|
||||
lv_obj_set_grid_dsc_array(form->getLvObj(), col_dsc, row_dsc);
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "model_telemetry.h"
|
||||
#include "opentx.h"
|
||||
#include "libopenui.h"
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -696,19 +695,19 @@ class SensorEditWindow : public Page {
|
||||
|
||||
paramLines[P_AUTOOFFSET] = form->newLine(&grid);
|
||||
new StaticText(paramLines[P_AUTOOFFSET], rect_t{}, STR_AUTOOFFSET, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(paramLines[P_AUTOOFFSET], rect_t{}, GET_SET_DEFAULT(sensor->autoOffset));
|
||||
new ToggleSwitch(paramLines[P_AUTOOFFSET], rect_t{}, GET_SET_DEFAULT(sensor->autoOffset));
|
||||
|
||||
paramLines[P_ONLYPOS] = form->newLine(&grid);
|
||||
new StaticText(paramLines[P_ONLYPOS], rect_t{}, STR_ONLYPOSITIVE, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(paramLines[P_ONLYPOS], rect_t{}, GET_SET_DEFAULT(sensor->onlyPositive));
|
||||
new ToggleSwitch(paramLines[P_ONLYPOS], rect_t{}, GET_SET_DEFAULT(sensor->onlyPositive));
|
||||
|
||||
paramLines[P_FILTER] = form->newLine(&grid);
|
||||
new StaticText(paramLines[P_FILTER], rect_t{}, STR_FILTER, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(paramLines[P_FILTER], rect_t{}, GET_SET_DEFAULT(sensor->filter));
|
||||
new ToggleSwitch(paramLines[P_FILTER], rect_t{}, GET_SET_DEFAULT(sensor->filter));
|
||||
|
||||
paramLines[P_PERSISTENT] = form->newLine(&grid);
|
||||
new StaticText(paramLines[P_PERSISTENT], rect_t{}, STR_PERSISTENT, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(paramLines[P_PERSISTENT], rect_t{}, GET_DEFAULT(sensor->persistent), [=](int32_t newValue) {
|
||||
new ToggleSwitch(paramLines[P_PERSISTENT], rect_t{}, GET_DEFAULT(sensor->persistent), [=](int32_t newValue) {
|
||||
sensor->persistent = newValue;
|
||||
if (!sensor->persistent)
|
||||
sensor->persistentValue = 0;
|
||||
@@ -718,7 +717,7 @@ class SensorEditWindow : public Page {
|
||||
// Logs
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_LOGS, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_DEFAULT(sensor->logs), [=](int32_t newValue) {
|
||||
new ToggleSwitch(line, rect_t{}, GET_DEFAULT(sensor->logs), [=](int32_t newValue) {
|
||||
sensor->logs = newValue;
|
||||
logsClose();
|
||||
SET_DIRTY();
|
||||
@@ -804,7 +803,7 @@ void ModelTelemetryPage::buildSensorList(int8_t focusSensorIndex)
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (uint8_t i = idx - 1; i >= 0; i -= 1) {
|
||||
for (int8_t i = idx - 1; i >= 0; i -= 1) {
|
||||
if (g_model.telemetrySensors[i].isAvailable()) {
|
||||
rebuild(window, i);
|
||||
return;
|
||||
@@ -836,6 +835,12 @@ void ModelTelemetryPage::buildSensorList(int8_t focusSensorIndex)
|
||||
}
|
||||
}
|
||||
|
||||
#if LCD_W > LCD_H
|
||||
#define NUM_EDIT_W 100
|
||||
#else
|
||||
#define NUM_EDIT_W 65
|
||||
#endif
|
||||
|
||||
void ModelTelemetryPage::build(FormWindow * window)
|
||||
{
|
||||
window->padAll(4);
|
||||
@@ -844,7 +849,7 @@ void ModelTelemetryPage::build(FormWindow * window)
|
||||
this->window = window;
|
||||
|
||||
// Sensors
|
||||
new Subtitle(window, rect_t{}, STR_TELEMETRY_SENSORS, 0, COLOR_THEME_PRIMARY1);
|
||||
new Subtitle(window, STR_TELEMETRY_SENSORS);
|
||||
|
||||
sensorWindow = new FormWindow(window, rect_t{});
|
||||
sensorWindow->padAll(0);
|
||||
@@ -906,34 +911,34 @@ void ModelTelemetryPage::build(FormWindow * window)
|
||||
line = window->newLine(&grid);
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_SHOW_INSTANCE_ID, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_model.showInstanceIds));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(g_model.showInstanceIds));
|
||||
|
||||
// Ignore instance button
|
||||
line = window->newLine(&grid);
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_IGNORE_INSTANCE, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_model.ignoreSensorIds));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(g_model.ignoreSensorIds));
|
||||
|
||||
// RX stat
|
||||
new Subtitle(window, rect_t{}, getRxStatLabels()->label, 0, COLOR_THEME_PRIMARY1);
|
||||
new Subtitle(window, getRxStatLabels()->label);
|
||||
|
||||
line = window->newLine(&grid);
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_LOWALARM, 0, COLOR_THEME_PRIMARY1);
|
||||
new NumberEdit(line, rect_t{}, 0, 100, GET_SET_DEFAULT(g_model.rfAlarms.warning));
|
||||
new NumberEdit(line, rect_t{0, 0, NUM_EDIT_W, 0}, 0, 100, GET_SET_DEFAULT(g_model.rfAlarms.warning));
|
||||
|
||||
line = window->newLine(&grid);
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_CRITICALALARM, 0, COLOR_THEME_PRIMARY1);
|
||||
new NumberEdit(line, rect_t{}, 0, 100, GET_SET_DEFAULT(g_model.rfAlarms.critical));
|
||||
new NumberEdit(line, rect_t{0, 0, NUM_EDIT_W, 0}, 0, 100, GET_SET_DEFAULT(g_model.rfAlarms.critical));
|
||||
|
||||
line = window->newLine(&grid);
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_DISABLE_ALARM, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_model.disableTelemetryWarning));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(g_model.disableTelemetryWarning));
|
||||
|
||||
// Vario
|
||||
new Subtitle(window, rect_t{}, STR_VARIO, 0, COLOR_THEME_PRIMARY1);
|
||||
new Subtitle(window, STR_VARIO);
|
||||
|
||||
FlexGridLayout grid5(col_dsc5, row_dsc, 4);
|
||||
|
||||
@@ -956,20 +961,20 @@ void ModelTelemetryPage::build(FormWindow * window)
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_RANGE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto vMin = new NumberEdit(line, rect_t{}, -17, 17, GET_SET_WITH_OFFSET(g_model.varioData.min, -10));
|
||||
auto vMin = new NumberEdit(line, rect_t{0, 0, NUM_EDIT_W, 0}, -17, 17, GET_SET_WITH_OFFSET(g_model.varioData.min, -10));
|
||||
vMin->setAvailableHandler([](int val) { return val < g_model.varioData.max + 10; });
|
||||
|
||||
auto vMax = new NumberEdit(line, rect_t{}, -17, 17, GET_SET_WITH_OFFSET(g_model.varioData.max, 10));
|
||||
auto vMax = new NumberEdit(line, rect_t{0, 0, NUM_EDIT_W, 0}, -17, 17, GET_SET_WITH_OFFSET(g_model.varioData.max, 10));
|
||||
vMax->setAvailableHandler([](int val) { return g_model.varioData.min - 10 < val; });
|
||||
|
||||
line = window->newLine(&grid5);
|
||||
line->padLeft(10);
|
||||
new StaticText(line, rect_t{}, STR_CENTER, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto cMin = new NumberEdit(line, rect_t{}, -15, 15, GET_SET_WITH_OFFSET(g_model.varioData.centerMin, -5), 0, PREC1);
|
||||
auto cMin = new NumberEdit(line, rect_t{0, 0, NUM_EDIT_W, 0}, -15, 15, GET_SET_WITH_OFFSET(g_model.varioData.centerMin, -5), 0, PREC1);
|
||||
cMin->setAvailableHandler([](int val) { return val < g_model.varioData.centerMax + 5; });
|
||||
|
||||
auto cMax = new NumberEdit(line, rect_t{}, -15, 15, GET_SET_WITH_OFFSET(g_model.varioData.centerMax, 5), 0, PREC1);
|
||||
auto cMax = new NumberEdit(line, rect_t{0, 0, NUM_EDIT_W, 0}, -15, 15, GET_SET_WITH_OFFSET(g_model.varioData.centerMax, 5), 0, PREC1);
|
||||
cMax->setAvailableHandler([](int val) { return g_model.varioData.centerMin - 5 < val; });
|
||||
|
||||
new Choice(line, rect_t{}, STR_VVARIOCENTER, 0, 1, GET_SET_DEFAULT(g_model.varioData.centerSilent));
|
||||
|
||||
@@ -30,8 +30,6 @@ static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST};
|
||||
|
||||
TemplatePage::TemplatePage() : Page(ICON_MODEL_SELECT)
|
||||
{
|
||||
body.padAll(0);
|
||||
|
||||
auto form = new FormWindow(&body, rect_t{});
|
||||
form->setFlexLayout();
|
||||
form->padAll(4);
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "usb_joystick.h"
|
||||
#include "channel_bar.h"
|
||||
#include "button_matrix.h"
|
||||
#include "lvgl_widgets/input_mix_line.h"
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
@@ -111,6 +110,15 @@ class USBChannelButtonSel : public ButtonMatrix
|
||||
m_channel(channel),
|
||||
m_setValue(std::move(_setValue))
|
||||
{
|
||||
bg_color[0] = makeLvColor(COLOR_THEME_PRIMARY2); // Unused
|
||||
fg_color[0] = makeLvColor(COLOR_THEME_SECONDARY1);
|
||||
bg_color[1] = makeLvColor(COLOR_THEME_DISABLED); // Used by other channel_bar
|
||||
fg_color[1] = makeLvColor(COLOR_THEME_PRIMARY1);
|
||||
bg_color[2] = makeLvColor(COLOR_THEME_ACTIVE); // Used by this channel
|
||||
fg_color[2] = makeLvColor(COLOR_THEME_PRIMARY1);
|
||||
bg_color[3] = makeLvColor(COLOR_THEME_WARNING); // Collision
|
||||
fg_color[3] = makeLvColor(COLOR_THEME_PRIMARY2);
|
||||
|
||||
initBtnMap(USBCH_BTNMX_COL, USBJ_BUTTON_SIZE);
|
||||
char snum[5];
|
||||
for (uint8_t btn = 0; btn < USBJ_BUTTON_SIZE; btn++) {
|
||||
@@ -119,6 +127,8 @@ class USBChannelButtonSel : public ButtonMatrix
|
||||
}
|
||||
update();
|
||||
|
||||
lv_obj_set_style_radius(lvobj, LV_RADIUS_CIRCLE, LV_PART_ITEMS);
|
||||
|
||||
lv_obj_add_event_cb(lvobj, btnsel_event_cb, LV_EVENT_DRAW_PART_BEGIN, this);
|
||||
|
||||
memset(m_btns, 0, USBJ_BUTTON_SIZE);
|
||||
@@ -137,16 +147,11 @@ class USBChannelButtonSel : public ButtonMatrix
|
||||
updateState();
|
||||
}
|
||||
|
||||
void setValue(int val)
|
||||
{
|
||||
if (m_setValue) {
|
||||
m_setValue(val);
|
||||
}
|
||||
}
|
||||
|
||||
void onPress(uint8_t btn_id) override
|
||||
{
|
||||
setValue(btn_id);
|
||||
if (m_setValue) {
|
||||
m_setValue(btn_id);
|
||||
}
|
||||
updateState();
|
||||
}
|
||||
|
||||
@@ -161,16 +166,29 @@ class USBChannelButtonSel : public ButtonMatrix
|
||||
void updateState()
|
||||
{
|
||||
USBJoystickChData * cch = usbJChAddress(m_channel);
|
||||
|
||||
for(uint8_t i = 0; i < USBJ_BUTTON_SIZE; i++) m_btns[i] &= 1;
|
||||
uint8_t last = cch->lastBtnNum();
|
||||
for(uint8_t b = cch->btn_num; b <= last; b++) m_btns[b] |= 2;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < USBJ_BUTTON_SIZE; i++)
|
||||
m_btns[i] &= 1;
|
||||
|
||||
for(i = cch->btn_num; i <= last; i++)
|
||||
m_btns[i] |= 2;
|
||||
}
|
||||
|
||||
void setColor(lv_obj_draw_part_dsc_t* dsc)
|
||||
{
|
||||
uint8_t state = getBtnState((uint8_t)dsc->id);
|
||||
dsc->rect_dsc->bg_color = bg_color[state];
|
||||
dsc->label_dsc->color = fg_color[state];
|
||||
}
|
||||
|
||||
protected:
|
||||
uint8_t m_channel = 0;
|
||||
std::function<void(int)> m_setValue;
|
||||
uint8_t m_btns[USBJ_BUTTON_SIZE];
|
||||
lv_color_t bg_color[4];
|
||||
lv_color_t fg_color[4];
|
||||
};
|
||||
|
||||
static void btnsel_event_cb(lv_event_t* e)
|
||||
@@ -181,26 +199,8 @@ static void btnsel_event_cb(lv_event_t* e)
|
||||
lv_obj_draw_part_dsc_t* dsc = lv_event_get_draw_part_dsc(e);
|
||||
|
||||
if(dsc->class_p == &lv_btnmatrix_class && dsc->type == LV_BTNMATRIX_DRAW_PART_BTN) {
|
||||
dsc->rect_dsc->radius = LV_RADIUS_CIRCLE;
|
||||
auto btsel = (USBChannelButtonSel*)lv_event_get_user_data(e);
|
||||
|
||||
uint8_t state = btsel->getBtnState((uint8_t)dsc->id);
|
||||
if (state == 1) {
|
||||
dsc->rect_dsc->bg_color = makeLvColor(COLOR_THEME_DISABLED);
|
||||
dsc->label_dsc->color = makeLvColor(COLOR_THEME_PRIMARY1);
|
||||
}
|
||||
else if (state == 2) {
|
||||
dsc->rect_dsc->bg_color = makeLvColor(COLOR_THEME_EDIT);
|
||||
dsc->label_dsc->color = makeLvColor(COLOR_THEME_PRIMARY2);
|
||||
}
|
||||
else if (state == 3) {
|
||||
dsc->rect_dsc->bg_color = makeLvColor(COLOR_THEME_WARNING);
|
||||
dsc->label_dsc->color = makeLvColor(COLOR_THEME_PRIMARY2);
|
||||
}
|
||||
else {
|
||||
dsc->rect_dsc->bg_color = makeLvColor(COLOR_THEME_PRIMARY2);
|
||||
dsc->label_dsc->color = makeLvColor(COLOR_THEME_SECONDARY1);
|
||||
}
|
||||
btsel->setColor(dsc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -298,13 +298,6 @@ class USBChannelEditWindow : public Page
|
||||
|
||||
auto line = form->newLine(&grid);
|
||||
|
||||
line->padTop(0);
|
||||
line->padBottom(0);
|
||||
collisionText = new StaticText(line, rect_t{}, "", OPAQUE, FONT(BOLD) | COLOR_THEME_PRIMARY2 | CENTERED);
|
||||
collisionText->setBackgroundColor(COLOR_THEME_WARNING);
|
||||
lv_obj_set_grid_cell(collisionText->getLvObj(), LV_GRID_ALIGN_STRETCH, 0, USBCH_COLS, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_USBJOYSTICK_CH_MODE, 0, COLOR_THEME_PRIMARY1);
|
||||
new Choice(line, rect_t{}, STR_VUSBJOYSTICK_CH_MODE, 0, USBJOYS_CH_LAST,
|
||||
GET_DEFAULT(cch->mode), SET_VALUE_WUPDATE(cch->mode));
|
||||
@@ -314,7 +307,7 @@ class USBChannelEditWindow : public Page
|
||||
#endif
|
||||
|
||||
new StaticText(line, rect_t{}, STR_USBJOYSTICK_CH_INVERSION, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(cch->inversion));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(cch->inversion));
|
||||
|
||||
line = form->newLine(&grid);
|
||||
m_btnModeFrame = new FormWindow(line, rect_t{});
|
||||
@@ -359,6 +352,13 @@ class USBChannelEditWindow : public Page
|
||||
new Choice(m_simModeLine, rect_t{}, STR_VUSBJOYSTICK_CH_SIM, 0, USBJOYS_SIM_LAST,
|
||||
GET_DEFAULT(cch->param), SET_VALUE_WUPDATE(cch->param));
|
||||
|
||||
line = form->newLine(&grid);
|
||||
line->padTop(0);
|
||||
line->padBottom(0);
|
||||
collisionText = new StaticText(line, rect_t{}, "", OPAQUE, FONT(BOLD) | COLOR_THEME_PRIMARY2 | CENTERED);
|
||||
collisionText->setBackgroundColor(COLOR_THEME_WARNING);
|
||||
lv_obj_set_grid_cell(collisionText->getLvObj(), LV_GRID_ALIGN_STRETCH, 0, USBCH_COLS, LV_GRID_ALIGN_CENTER, 0, 1);
|
||||
|
||||
update();
|
||||
}
|
||||
};
|
||||
@@ -546,7 +546,7 @@ ModelUSBJoystickPage::ModelUSBJoystickPage() :
|
||||
_ApplyBtn = new TextButton(line, rect_t{}, STR_USBJOYSTICK_APPLY_CHANGES,
|
||||
[=]() { onUSBJoystickModelChanged(); this->update(); return 0; });
|
||||
|
||||
auto btngrp = new FormGroup(form, rect_t{});
|
||||
auto btngrp = new FormWindow(form, rect_t{});
|
||||
_ChannelsGroup = btngrp;
|
||||
btngrp->setFlexLayout();
|
||||
btngrp->padRow(lv_dpx(4));
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "page.h"
|
||||
|
||||
class FormGroup;
|
||||
class FormWindow;
|
||||
class USBChannelLineButton;
|
||||
|
||||
class ModelUSBJoystickPage : public Page
|
||||
|
||||
@@ -69,7 +69,7 @@ static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT,
|
||||
|
||||
struct FailsafeChoice;
|
||||
|
||||
class ModuleWindow : public FormGroup
|
||||
class ModuleWindow : public FormWindow
|
||||
{
|
||||
public:
|
||||
ModuleWindow(Window* parent, uint8_t moduleIdx);
|
||||
@@ -99,7 +99,7 @@ class ModuleWindow : public FormGroup
|
||||
void updateIDStaticText(int mdIdx);
|
||||
};
|
||||
|
||||
struct FailsafeChoice : public FormGroup {
|
||||
struct FailsafeChoice : public FormWindow {
|
||||
FailsafeChoice(Window* parent, uint8_t moduleIdx);
|
||||
void update() const;
|
||||
|
||||
@@ -124,7 +124,7 @@ static void fs_changed(lv_event_t* e)
|
||||
}
|
||||
|
||||
FailsafeChoice::FailsafeChoice(Window* parent, uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
|
||||
@@ -163,7 +163,7 @@ static void mw_refresh_cb(lv_event_t* e)
|
||||
}
|
||||
|
||||
ModuleWindow::ModuleWindow(Window* parent, uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect_t{}),
|
||||
FormWindow(parent, rect_t{}),
|
||||
moduleIdx(moduleIdx)
|
||||
{
|
||||
setFlexLayout();
|
||||
@@ -260,7 +260,7 @@ void ModuleWindow::updateModule()
|
||||
if(isModuleModelIndexAvailable(moduleIdx)) {
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{},"");
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT);
|
||||
idUnique = new StaticText(box, rect_t{}, "", 0, 0);
|
||||
@@ -270,7 +270,7 @@ void ModuleWindow::updateModule()
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_RECEIVER, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT);
|
||||
|
||||
@@ -397,7 +397,7 @@ void ModuleWindow::updateModule()
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_MODULE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
|
||||
|
||||
registerButton = new TextButton(box, rect_t{}, STR_REGISTER);
|
||||
@@ -460,7 +460,7 @@ void ModuleWindow::updateModule()
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_REFRESHRATE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
|
||||
auto edit = new NumberEdit(
|
||||
@@ -483,7 +483,7 @@ void ModuleWindow::updateModule()
|
||||
if (isModuleGhost(moduleIdx)) {
|
||||
auto line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, "Raw 12 bits", 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(md->ghost.raw12bits));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(md->ghost.raw12bits));
|
||||
}
|
||||
|
||||
updateSubType();
|
||||
@@ -746,10 +746,7 @@ ModulePage::ModulePage(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
|
||||
header.setTitle(STR_MENU_MODEL_SETUP);
|
||||
header.setTitle2(title2);
|
||||
|
||||
body.padAll(0);
|
||||
lv_obj_set_scrollbar_mode(body.getLvObj(), LV_SCROLLBAR_MODE_AUTO);
|
||||
|
||||
auto form = new FormGroup(&body, rect_t{});
|
||||
auto form = new FormWindow(&body, rect_t{});
|
||||
form->setFlexLayout();
|
||||
form->padAll(lv_dpx(8));
|
||||
|
||||
@@ -759,7 +756,7 @@ ModulePage::ModulePage(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
|
||||
auto line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_MODE, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto box = new FormGroup(line, rect_t{});
|
||||
auto box = new FormWindow(line, rect_t{});
|
||||
box->setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT);
|
||||
|
||||
|
||||
@@ -36,20 +36,20 @@ static void update_mpm_settings(lv_event_t* e)
|
||||
lv_event_send(ms->getParent()->getLvObj(), LV_EVENT_REFRESH, nullptr);
|
||||
}
|
||||
|
||||
struct MPMProtoOption : public FormGroup::Line
|
||||
struct MPMProtoOption : public FormWindow::Line
|
||||
{
|
||||
StaticText* label;
|
||||
Choice* choice;
|
||||
NumberEdit* edit;
|
||||
CheckBox* cb;
|
||||
ToggleSwitch* cb;
|
||||
DynamicNumber<uint16_t>* rssi;
|
||||
|
||||
MPMProtoOption(FormGroup* form, FlexGridLayout *layout);
|
||||
MPMProtoOption(FormWindow* form, FlexGridLayout *layout);
|
||||
void update(const MultiRfProtocols::RfProto* rfProto, ModuleData* md, uint8_t moduleIdx);
|
||||
};
|
||||
|
||||
MPMProtoOption::MPMProtoOption(FormGroup* form, FlexGridLayout *layout) :
|
||||
FormGroup::Line(form, layout)
|
||||
MPMProtoOption::MPMProtoOption(FormWindow* form, FlexGridLayout *layout) :
|
||||
FormWindow::Line(form, layout)
|
||||
{
|
||||
if (layout) layout->resetPos();
|
||||
label = new StaticText(this, rect_t{}, "", 0, COLOR_THEME_PRIMARY1);
|
||||
@@ -60,7 +60,7 @@ MPMProtoOption::MPMProtoOption(FormGroup* form, FlexGridLayout *layout) :
|
||||
|
||||
choice = new Choice(box, rect_t{}, 0, 0, nullptr);
|
||||
edit = new NumberEdit(box, rect_t{}, 0, 0, nullptr);
|
||||
cb = new CheckBox(box, rect_t{}, nullptr, nullptr);
|
||||
cb = new ToggleSwitch(box, rect_t{}, nullptr, nullptr);
|
||||
rssi = new DynamicNumber<uint16_t>(
|
||||
box, rect_t{}, [] { return (uint16_t)TELEMETRY_RSSI(); }, 0, getRxStatLabels()->label, getRxStatLabels()->unit);
|
||||
rssi->padTop(5);
|
||||
@@ -148,11 +148,11 @@ void MPMProtoOption::update(const MultiRfProtocols::RfProto* rfProto, ModuleData
|
||||
}
|
||||
}
|
||||
|
||||
struct MPMSubtype : public FormGroup::Line
|
||||
struct MPMSubtype : public FormWindow::Line
|
||||
{
|
||||
Choice* choice;
|
||||
|
||||
MPMSubtype(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx);
|
||||
MPMSubtype(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx);
|
||||
void update(const MultiRfProtocols::RfProto* rfProto, uint8_t moduleIdx);
|
||||
void checkEvents();
|
||||
|
||||
@@ -187,8 +187,8 @@ static void subtype_event_cb(lv_event_t* e)
|
||||
if (obj) lv_event_send(obj, LV_EVENT_VALUE_CHANGED, nullptr);
|
||||
}
|
||||
|
||||
MPMSubtype::MPMSubtype(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormGroup::Line(form, layout)
|
||||
MPMSubtype::MPMSubtype(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormWindow::Line(form, layout)
|
||||
{
|
||||
this->moduleIdx = moduleIdx;
|
||||
this->DSM2lastSubType = g_model.moduleData[this->moduleIdx].subType;
|
||||
@@ -227,16 +227,16 @@ void MPMSubtype::update(const MultiRfProtocols::RfProto* rfProto, uint8_t module
|
||||
lv_event_send(choice->getLvObj(), LV_EVENT_VALUE_CHANGED, &stop);
|
||||
}
|
||||
|
||||
struct MPMServoRate : public FormGroup::Line {
|
||||
MPMServoRate(FormGroup* form, FlexGridLayout* layout, uint8_t moduleIdx);
|
||||
struct MPMServoRate : public FormWindow::Line {
|
||||
MPMServoRate(FormWindow* form, FlexGridLayout* layout, uint8_t moduleIdx);
|
||||
void update() const { lv_event_send(choice->getLvObj(), LV_EVENT_VALUE_CHANGED, nullptr); }
|
||||
|
||||
private:
|
||||
Choice* choice;
|
||||
};
|
||||
|
||||
MPMServoRate::MPMServoRate(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormGroup::Line(form, layout)
|
||||
MPMServoRate::MPMServoRate(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormWindow::Line(form, layout)
|
||||
{
|
||||
if (layout) layout->resetPos();
|
||||
new StaticText(this, rect_t{}, STR_MULTI_SERVOFREQ, 0, COLOR_THEME_PRIMARY1);
|
||||
@@ -249,40 +249,40 @@ MPMServoRate::MPMServoRate(FormGroup* form, FlexGridLayout *layout, uint8_t modu
|
||||
md->multi.optionValue, (md->multi.optionValue & 0xFD) + (newValue << 1)));
|
||||
}
|
||||
|
||||
struct MPMAutobind : public FormGroup::Line {
|
||||
MPMAutobind(FormGroup* form, FlexGridLayout* layout, uint8_t moduleIdx);
|
||||
struct MPMAutobind : public FormWindow::Line {
|
||||
MPMAutobind(FormWindow* form, FlexGridLayout* layout, uint8_t moduleIdx);
|
||||
void update() const { cb->update(); }
|
||||
|
||||
private:
|
||||
CheckBox* cb;
|
||||
ToggleSwitch* cb;
|
||||
};
|
||||
|
||||
MPMAutobind::MPMAutobind(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormGroup::Line(form, layout)
|
||||
MPMAutobind::MPMAutobind(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormWindow::Line(form, layout)
|
||||
{
|
||||
if (layout) layout->resetPos();
|
||||
new StaticText(this, rect_t{}, STR_MULTI_AUTOBIND, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto md = &g_model.moduleData[moduleIdx];
|
||||
cb = new CheckBox(this, rect_t{}, GET_SET_DEFAULT(md->multi.autoBindMode));
|
||||
cb = new ToggleSwitch(this, rect_t{}, GET_SET_DEFAULT(md->multi.autoBindMode));
|
||||
}
|
||||
|
||||
struct MPMChannelMap : public FormGroup::Line
|
||||
struct MPMChannelMap : public FormWindow::Line
|
||||
{
|
||||
MPMChannelMap(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx);
|
||||
MPMChannelMap(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx);
|
||||
void update(const MultiRfProtocols::RfProto* rfProto);
|
||||
private:
|
||||
CheckBox* cb;
|
||||
ToggleSwitch* cb;
|
||||
};
|
||||
|
||||
MPMChannelMap::MPMChannelMap(FormGroup* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormGroup::Line(form, layout)
|
||||
MPMChannelMap::MPMChannelMap(FormWindow* form, FlexGridLayout *layout, uint8_t moduleIdx) :
|
||||
FormWindow::Line(form, layout)
|
||||
{
|
||||
if (layout) layout->resetPos();
|
||||
new StaticText(this, rect_t{}, STR_DISABLE_CH_MAP, 0, COLOR_THEME_PRIMARY1);
|
||||
|
||||
auto md = &g_model.moduleData[moduleIdx];
|
||||
cb = new CheckBox(this, rect_t{}, GET_SET_DEFAULT(md->multi.disableMapping));
|
||||
cb = new ToggleSwitch(this, rect_t{}, GET_SET_DEFAULT(md->multi.disableMapping));
|
||||
}
|
||||
|
||||
void MPMChannelMap::update(const MultiRfProtocols::RfProto* rfProto)
|
||||
@@ -298,7 +298,7 @@ void MPMChannelMap::update(const MultiRfProtocols::RfProto* rfProto)
|
||||
MultimoduleSettings::MultimoduleSettings(Window *parent,
|
||||
const FlexGridLayout &g,
|
||||
uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect_t{}), md(&g_model.moduleData[moduleIdx]),
|
||||
FormWindow(parent, rect_t{}), md(&g_model.moduleData[moduleIdx]),
|
||||
moduleIdx(moduleIdx)
|
||||
{
|
||||
FlexGridLayout grid(g);
|
||||
@@ -336,13 +336,13 @@ MultimoduleSettings::MultimoduleSettings(Window *parent,
|
||||
// Low power mode
|
||||
line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_MULTI_LOWPOWER, 0, COLOR_THEME_PRIMARY1);
|
||||
lp_mode = new CheckBox(line, rect_t{}, GET_SET_DEFAULT(md->multi.lowPowerMode));
|
||||
lp_mode = new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(md->multi.lowPowerMode));
|
||||
|
||||
#if defined(MANUFACTURER_FRSKY)
|
||||
// Disable telemetry
|
||||
line = newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_DISABLE_TELEM, 0, COLOR_THEME_PRIMARY1);
|
||||
disable_telem = new CheckBox(line, rect_t{}, GET_SET_DEFAULT(md->multi.disableTelemetry));
|
||||
disable_telem = new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(md->multi.disableTelemetry));
|
||||
#endif
|
||||
|
||||
cm_line = new MPMChannelMap(this, &grid, moduleIdx);
|
||||
|
||||
@@ -22,9 +22,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "form.h"
|
||||
#include "checkbox.h"
|
||||
#include "module_setup.h"
|
||||
|
||||
class ToggleSwitch;
|
||||
|
||||
struct ModuleData;
|
||||
struct MPMProtoOption;
|
||||
struct MPMSubtype;
|
||||
@@ -32,7 +33,7 @@ struct MPMServoRate;
|
||||
struct MPMAutobind;
|
||||
struct MPMChannelMap;
|
||||
|
||||
class MultimoduleSettings : public FormGroup, public ModuleOptions
|
||||
class MultimoduleSettings : public FormWindow, public ModuleOptions
|
||||
{
|
||||
ModuleData* md;
|
||||
uint8_t moduleIdx;
|
||||
@@ -41,9 +42,9 @@ class MultimoduleSettings : public FormGroup, public ModuleOptions
|
||||
MPMProtoOption* opt_line;
|
||||
MPMServoRate* sr_line;
|
||||
MPMAutobind* ab_line;
|
||||
CheckBox* lp_mode;
|
||||
ToggleSwitch* lp_mode;
|
||||
#if defined(MANUFACTURER_FRSKY)
|
||||
CheckBox* disable_telem;
|
||||
ToggleSwitch* disable_telem;
|
||||
#endif
|
||||
MPMChannelMap* cm_line;
|
||||
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
#include "multi_rfprotos.h"
|
||||
#include "strhelpers.h"
|
||||
|
||||
#include "progress.h"
|
||||
|
||||
// TODO: format for LCD_WIDTH > LCD_HEIGHT
|
||||
|
||||
// TODO: translation
|
||||
@@ -32,37 +30,20 @@ const char* RFSCAN_TITLE = "MPM: Scanning protocols...";
|
||||
|
||||
RfScanDialog::RfScanDialog(Window* parent, MultiRfProtocols* protos,
|
||||
std::function<void()> onClose) :
|
||||
Dialog(parent, RFSCAN_TITLE, rect_t{}),
|
||||
protos(protos),
|
||||
progress(new Progress(&content->form, rect_t{})),
|
||||
onClose(std::move(onClose))
|
||||
ProgressDialog(parent, RFSCAN_TITLE, onClose),
|
||||
protos(protos)
|
||||
{
|
||||
progress->setHeight(LV_DPI_DEF / 4);
|
||||
|
||||
content->setWidth(LCD_W * 0.8);
|
||||
content->updateSize();
|
||||
|
||||
auto content_w = lv_obj_get_content_width(content->form.getLvObj());
|
||||
progress->setWidth(content_w);
|
||||
|
||||
// disable canceling dialog
|
||||
setCloseWhenClickOutside(false);
|
||||
// setFocus();
|
||||
}
|
||||
|
||||
void RfScanDialog::showProgress()
|
||||
{
|
||||
progress->setValue((int)(protos->getProgress() * 100.0));
|
||||
updateProgress((int)(protos->getProgress() * 100.0));
|
||||
}
|
||||
|
||||
// disable keys
|
||||
void RfScanDialog::onEvent(event_t) { return; }
|
||||
|
||||
void RfScanDialog::checkEvents()
|
||||
{
|
||||
if (!protos->isScanning()) {
|
||||
deleteLater();
|
||||
onClose();
|
||||
closeDialog();
|
||||
} else if (RTOS_GET_MS() - lastUpdate >= 200) {
|
||||
showProgress();
|
||||
lastUpdate = RTOS_GET_MS();
|
||||
|
||||
@@ -24,23 +24,17 @@
|
||||
|
||||
class MultiRfProtocols;
|
||||
|
||||
class RfScanDialog : public Dialog
|
||||
class RfScanDialog : public ProgressDialog
|
||||
{
|
||||
MultiRfProtocols* protos;
|
||||
uint32_t lastUpdate = 0;
|
||||
|
||||
Progress* progress;
|
||||
std::function<void()> onClose;
|
||||
|
||||
public:
|
||||
RfScanDialog(Window* parent, MultiRfProtocols* protos,
|
||||
std::function<void()> onClose);
|
||||
|
||||
void showProgress();
|
||||
|
||||
// disable keys
|
||||
void onEvent(event_t) override;
|
||||
|
||||
void checkEvents() override;
|
||||
};
|
||||
|
||||
|
||||
@@ -182,7 +182,7 @@ void OutputEditWindow::buildBody(FormWindow* form)
|
||||
// Direction
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_INVERTED, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_DEFAULT(output->revert),
|
||||
new ToggleSwitch(line, rect_t{}, GET_DEFAULT(output->revert),
|
||||
[output, this](uint8_t newValue) {
|
||||
output->revert = newValue;
|
||||
SET_DIRTY();
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "opentx.h"
|
||||
|
||||
PageHeader::PageHeader(Page * parent, uint8_t icon):
|
||||
FormGroup(parent, { 0, 0, LCD_W, MENU_HEADER_HEIGHT }, OPAQUE),
|
||||
FormWindow(parent, { 0, 0, LCD_W, MENU_HEADER_HEIGHT }, OPAQUE),
|
||||
icon(icon)
|
||||
{
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
@@ -33,7 +33,7 @@ PageHeader::PageHeader(Page * parent, uint8_t icon):
|
||||
[=]() -> uint8_t {
|
||||
parent->onCancel();
|
||||
return 0;
|
||||
}, NO_FOCUS | FORM_NO_BORDER);
|
||||
}, NO_FOCUS);
|
||||
#endif
|
||||
title = new StaticText(this,
|
||||
{PAGE_TITLE_LEFT, PAGE_TITLE_TOP,
|
||||
@@ -55,7 +55,7 @@ StaticText* PageHeader::setTitle2(std::string txt)
|
||||
|
||||
void PageHeader::paint(BitmapBuffer * dc)
|
||||
{
|
||||
OpenTxTheme::instance()->drawPageHeaderBackground(dc, getIcon(), "");
|
||||
EdgeTxTheme::instance()->drawPageHeaderBackground(dc, getIcon(), nullptr);
|
||||
dc->drawSolidFilledRect(MENU_HEADER_HEIGHT, 0, LCD_W - MENU_HEADER_HEIGHT,
|
||||
MENU_HEADER_HEIGHT, COLOR_THEME_SECONDARY1);
|
||||
}
|
||||
@@ -68,11 +68,14 @@ static constexpr rect_t _get_body_rect()
|
||||
Page::Page(unsigned icon):
|
||||
Window(Layer::back(), {0, 0, LCD_W, LCD_H}, OPAQUE),
|
||||
header(this, icon),
|
||||
body(this, _get_body_rect(), FORM_FORWARD_FOCUS)
|
||||
body(this, _get_body_rect())
|
||||
{
|
||||
Layer::push(this);
|
||||
|
||||
lv_obj_set_style_bg_color(lvobj, makeLvColor(COLOR_THEME_SECONDARY3), 0);
|
||||
|
||||
body.padAll(0);
|
||||
lv_obj_set_scrollbar_mode(body.getLvObj(), LV_SCROLLBAR_MODE_AUTO);
|
||||
}
|
||||
|
||||
void Page::deleteLater(bool detach, bool trash)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
class Page;
|
||||
|
||||
class PageHeader : public FormGroup
|
||||
class PageHeader : public FormWindow
|
||||
{
|
||||
public:
|
||||
PageHeader(Page* parent, uint8_t icon);
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
template <typename T>
|
||||
PpmFrameSettings<T>::PpmFrameSettings(Window* parent, T* ppm) :
|
||||
FormGroup(parent, rect_t{})
|
||||
FormWindow(parent, rect_t{})
|
||||
{
|
||||
setFlexLayout(LV_FLEX_FLOW_ROW);
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "numberedit.h"
|
||||
|
||||
template <typename T>
|
||||
struct PpmFrameSettings : public FormGroup {
|
||||
struct PpmFrameSettings : public FormWindow {
|
||||
private:
|
||||
NumberEdit* ppmFrameLenEditObject = nullptr;
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ static void cb_changed(lv_event_t* e)
|
||||
}
|
||||
}
|
||||
|
||||
static void make_conditional(Window* w, CheckBox* cb)
|
||||
static void make_conditional(Window* w, ToggleSwitch* cb)
|
||||
{
|
||||
lv_obj_t* w_obj = w->getLvObj();
|
||||
if (!cb->getValue()) { lv_obj_add_flag(w_obj, LV_OBJ_FLAG_HIDDEN); }
|
||||
@@ -81,7 +81,7 @@ struct SwitchWarnMatrix : public ButtonMatrix {
|
||||
SwitchWarnMatrix(Window* parent, const rect_t& rect);
|
||||
void onPress(uint8_t btn_id);
|
||||
bool isActive(uint8_t btn_id);
|
||||
void setTextWithColor(uint8_t btn_id);
|
||||
void setTextAndState(uint8_t btn_id);
|
||||
private:
|
||||
uint8_t sw_idx[MAX_SWITCHES];
|
||||
};
|
||||
@@ -90,7 +90,7 @@ struct PotWarnMatrix : public ButtonMatrix {
|
||||
PotWarnMatrix(Window* parent, const rect_t& rect);
|
||||
void onPress(uint8_t btn_id);
|
||||
bool isActive(uint8_t btn_id);
|
||||
void setTextWithColor(uint8_t btn_id);
|
||||
void setTextAndState(uint8_t btn_id);
|
||||
private:
|
||||
uint8_t pot_idx[MAX_POTS];
|
||||
};
|
||||
@@ -99,7 +99,7 @@ struct CenterBeepsMatrix : public ButtonMatrix {
|
||||
CenterBeepsMatrix(Window* parent, const rect_t& rect);
|
||||
void onPress(uint8_t btn_id);
|
||||
bool isActive(uint8_t btn_id);
|
||||
void setTextWithColor(uint8_t btn_id);
|
||||
void setTextAndState(uint8_t btn_id);
|
||||
private:
|
||||
uint8_t max_analogs;
|
||||
uint8_t ana_idx[MAX_ANALOG_INPUTS];
|
||||
@@ -110,33 +110,31 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP)
|
||||
header.setTitle(STR_MENU_MODEL_SETUP);
|
||||
header.setTitle2(STR_PREFLIGHT);
|
||||
|
||||
body.padAll(8);
|
||||
|
||||
auto form = new FormWindow(&body, rect_t{});
|
||||
form->setFlexLayout();
|
||||
form->padAll(4);
|
||||
form->padAll(8);
|
||||
FlexGridLayout grid(line_col_dsc, line_row_dsc, 2);
|
||||
|
||||
// Display checklist
|
||||
auto line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_CHECKLIST, 0, COLOR_THEME_PRIMARY1);
|
||||
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_model.displayChecklist));
|
||||
new ToggleSwitch(line, rect_t{}, GET_SET_DEFAULT(g_model.displayChecklist));
|
||||
|
||||
// Throttle warning
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_THROTTLE_WARNING, 0, COLOR_THEME_PRIMARY1);
|
||||
auto tw = new CheckBox(line, rect_t{}, GET_SET_INVERTED(g_model.disableThrottleWarning));
|
||||
auto tw = new ToggleSwitch(line, rect_t{}, GET_SET_INVERTED(g_model.disableThrottleWarning));
|
||||
|
||||
// Custom Throttle warning (conditional on previous field)
|
||||
line = form->newLine(&grid);
|
||||
make_conditional(line, tw);
|
||||
|
||||
new StaticText(line, rect_t{}, STR_CUSTOM_THROTTLE_WARNING, 0, COLOR_THEME_PRIMARY1);
|
||||
auto box = new FormGroup::Line(line, window_create(line->getLvObj()));
|
||||
auto box = new FormWindow::Line(line, window_create(line->getLvObj()));
|
||||
lv_obj_set_layout(box->getLvObj(), LV_LAYOUT_FLEX);
|
||||
box->setWidth(LCD_W /2 - 15);
|
||||
|
||||
auto cst_tw = new CheckBox(
|
||||
auto cst_tw = new ToggleSwitch(
|
||||
box, rect_t{}, GET_SET_DEFAULT(g_model.enableCustomThrottleWarning));
|
||||
|
||||
// Custom Throttle warning value
|
||||
@@ -147,7 +145,10 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP)
|
||||
|
||||
// Switch warnings (TODO: add display switch?)
|
||||
line = form->newLine(&grid);
|
||||
new StaticText(line, rect_t{}, STR_SWITCHES, 0, COLOR_THEME_PRIMARY1);
|
||||
line = form->newLine(&grid);
|
||||
line->padTop(0);
|
||||
line->padLeft(4);
|
||||
new SwitchWarnMatrix(line, rect_t{});
|
||||
|
||||
// Pots and sliders warning
|
||||
@@ -160,6 +161,7 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP)
|
||||
// Pot warnings
|
||||
line = form->newLine(&grid);
|
||||
line->padTop(0);
|
||||
line->padLeft(4);
|
||||
auto pwm = new PotWarnMatrix(line, rect_t{});
|
||||
make_conditional(pwm, pots_wm);
|
||||
}
|
||||
@@ -169,6 +171,7 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP)
|
||||
line->padTop(0);
|
||||
new StaticText(line, rect_t{}, STR_BEEPCTR, 0, COLOR_THEME_PRIMARY1);
|
||||
line = form->newLine(&grid);
|
||||
line->padLeft(4);
|
||||
new CenterBeepsMatrix(line, rect_t{});
|
||||
}
|
||||
|
||||
@@ -204,8 +207,7 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) :
|
||||
uint8_t btn_id = 0;
|
||||
for (uint8_t i = 0; i < MAX_SWITCHES; i++) {
|
||||
if (SWITCH_EXISTS(i)) {
|
||||
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
|
||||
setTextWithColor(i);
|
||||
setTextAndState(i);
|
||||
btn_id++;
|
||||
}
|
||||
}
|
||||
@@ -214,23 +216,17 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) :
|
||||
|
||||
uint8_t rows = ((btn_cnt - 1) / SW_BTNS) + 1;
|
||||
lv_obj_set_height(lvobj, (rows * LV_DPI_DEF) / 3);
|
||||
|
||||
lv_obj_set_style_bg_opa(lvobj, LV_OPA_0, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_all(lvobj, 4, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_left(lvobj, LV_DPI_DEF / 10, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_row(lvobj, 4, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_column(lvobj, 4, LV_PART_MAIN);
|
||||
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_FOCUSED);
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
|
||||
}
|
||||
|
||||
void SwitchWarnMatrix::setTextWithColor(uint8_t btn_id)
|
||||
void SwitchWarnMatrix::setTextAndState(uint8_t btn_id)
|
||||
{
|
||||
auto color = isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1;
|
||||
setText(btn_id, makeRecolor(switchWarninglabel(sw_idx[btn_id]), color).c_str());
|
||||
setText(btn_id, switchWarninglabel(sw_idx[btn_id]).c_str());
|
||||
setChecked(btn_id);
|
||||
}
|
||||
|
||||
void SwitchWarnMatrix::onPress(uint8_t btn_id)
|
||||
@@ -249,7 +245,7 @@ void SwitchWarnMatrix::onPress(uint8_t btn_id)
|
||||
SET_DIRTY();
|
||||
|
||||
// TODO: save state in object
|
||||
setTextWithColor(sw);
|
||||
setTextAndState(sw);
|
||||
}
|
||||
|
||||
bool SwitchWarnMatrix::isActive(uint8_t btn_id)
|
||||
@@ -276,8 +272,7 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) :
|
||||
uint8_t btn_id = 0;
|
||||
for (uint16_t i = 0; i < MAX_POTS; i++) {
|
||||
if (IS_POT_AVAILABLE(i)) {
|
||||
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
|
||||
setTextWithColor(btn_id);
|
||||
setTextAndState(btn_id);
|
||||
btn_id++;
|
||||
}
|
||||
}
|
||||
@@ -287,23 +282,16 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) :
|
||||
uint8_t rows = ((btn_cnt - 1) / SW_BTNS) + 1;
|
||||
lv_obj_set_height(lvobj, (rows * LV_DPI_DEF) / 3);
|
||||
|
||||
lv_obj_set_style_bg_opa(lvobj, LV_OPA_0, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_all(lvobj, 4, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_left(lvobj, LV_DPI_DEF / 10, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_row(lvobj, 4, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_column(lvobj, 4, LV_PART_MAIN);
|
||||
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_FOCUSED);
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
|
||||
}
|
||||
|
||||
void PotWarnMatrix::setTextWithColor(uint8_t btn_id)
|
||||
void PotWarnMatrix::setTextAndState(uint8_t btn_id)
|
||||
{
|
||||
auto idx = pot_idx[btn_id];
|
||||
auto color = isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1;
|
||||
setText(btn_id, makeRecolor(getPotLabel(idx), color).c_str());
|
||||
setText(btn_id, getPotLabel(pot_idx[btn_id]));
|
||||
setChecked(btn_id);
|
||||
}
|
||||
|
||||
void PotWarnMatrix::onPress(uint8_t btn_id)
|
||||
@@ -316,7 +304,7 @@ void PotWarnMatrix::onPress(uint8_t btn_id)
|
||||
(g_model.potsWarnEnabled & (1 << pot))) {
|
||||
SAVE_POT_POSITION(pot);
|
||||
}
|
||||
setTextWithColor(btn_id);
|
||||
setTextAndState(btn_id);
|
||||
SET_DIRTY();
|
||||
}
|
||||
|
||||
@@ -352,8 +340,7 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) :
|
||||
for (uint8_t i = 0; i < max_analogs; i++) {
|
||||
if (i < max_sticks || (IS_POT_SLIDER_AVAILABLE(i - max_sticks) &&
|
||||
!IS_POT_MULTIPOS(i - max_sticks))) {
|
||||
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
|
||||
setTextWithColor(btn_id);
|
||||
setTextAndState(btn_id);
|
||||
btn_id++;
|
||||
}
|
||||
}
|
||||
@@ -363,31 +350,20 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) :
|
||||
uint8_t rows = ((btn_cnt - 1) / SW_BTNS) + 1;
|
||||
lv_obj_set_height(lvobj, (rows * LV_DPI_DEF) / 3);
|
||||
|
||||
lv_obj_set_style_bg_opa(lvobj, LV_OPA_0, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_all(lvobj, 4, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_left(lvobj, LV_DPI_DEF / 10, LV_PART_MAIN);
|
||||
|
||||
lv_obj_set_style_pad_row(lvobj, 4, LV_PART_MAIN);
|
||||
lv_obj_set_style_pad_column(lvobj, 4, LV_PART_MAIN);
|
||||
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_FOCUSED);
|
||||
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
|
||||
}
|
||||
|
||||
void CenterBeepsMatrix::setTextWithColor(uint8_t btn_id)
|
||||
void CenterBeepsMatrix::setTextAndState(uint8_t btn_id)
|
||||
{
|
||||
auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN);
|
||||
if (ana_idx[btn_id] < max_sticks)
|
||||
setText(btn_id, makeRecolor(getAnalogShortLabel(ana_idx[btn_id]),
|
||||
isActive(btn_id) ? COLOR_THEME_PRIMARY1
|
||||
: COLOR_THEME_SECONDARY1)
|
||||
.c_str());
|
||||
setText(btn_id, getAnalogShortLabel(ana_idx[btn_id]));
|
||||
else
|
||||
setText(btn_id, makeRecolor(getAnalogLabel(ADC_INPUT_POT, ana_idx[btn_id] - max_sticks),
|
||||
isActive(btn_id) ? COLOR_THEME_PRIMARY1
|
||||
: COLOR_THEME_SECONDARY1)
|
||||
.c_str());
|
||||
setText(btn_id, getAnalogLabel(ADC_INPUT_POT, ana_idx[btn_id] - max_sticks));
|
||||
setChecked(btn_id);
|
||||
}
|
||||
|
||||
void CenterBeepsMatrix::onPress(uint8_t btn_id)
|
||||
@@ -395,7 +371,7 @@ void CenterBeepsMatrix::onPress(uint8_t btn_id)
|
||||
if (btn_id >= max_analogs) return;
|
||||
uint8_t i = ana_idx[btn_id];
|
||||
BFBIT_FLIP(g_model.beepANACenter, bfBit<BeepANACenter>(i));
|
||||
setTextWithColor(btn_id);
|
||||
setTextAndState(btn_id);
|
||||
SET_DIRTY();
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ extern ColorMaintainer colorMaintainer;
|
||||
class ThemedStaticText : public StaticText
|
||||
{
|
||||
public:
|
||||
ThemedStaticText(FormGroup *window, const rect_t &rect, std::string text, LcdColorIndex colorIndex) :
|
||||
ThemedStaticText(FormWindow *window, const rect_t &rect, std::string text, LcdColorIndex colorIndex) :
|
||||
StaticText(window, rect, text, 0, COLOR(colorIndex)),
|
||||
_colorIndex(colorIndex)
|
||||
{
|
||||
@@ -90,11 +90,11 @@ class ThemedStaticText : public StaticText
|
||||
LcdColorIndex _colorIndex;
|
||||
};
|
||||
|
||||
class ThemedCheckBox : public CheckBox
|
||||
class ThemedCheckBox : public ToggleSwitch
|
||||
{
|
||||
public:
|
||||
ThemedCheckBox(Window *parent, rect_t rect, bool checked) :
|
||||
CheckBox(parent, rect, [=]() { return checked; }, [](uint8_t value) {}, NO_FOCUS),
|
||||
ToggleSwitch(parent, rect, [=]() { return checked; }, [](uint8_t value) {}, NO_FOCUS),
|
||||
checked(checked)
|
||||
{
|
||||
enable(false);
|
||||
@@ -112,7 +112,7 @@ class ThemedCheckBox : public CheckBox
|
||||
void paint(BitmapBuffer *dc) override
|
||||
{
|
||||
colorMaintainer.applyColorValues();
|
||||
CheckBox::paint(dc);
|
||||
ToggleSwitch::paint(dc);
|
||||
colorMaintainer.restoreColorValues();
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ class ThemedMainViewHorizontalSlider : public MainViewHorizontalSlider
|
||||
class ThemedButton : public TextButton
|
||||
{
|
||||
public:
|
||||
ThemedButton(FormGroup *window, const rect_t &rect, std::string text, bool isChecked, WindowFlags windowFlags,
|
||||
ThemedButton(FormWindow *window, const rect_t &rect, std::string text, bool isChecked, WindowFlags windowFlags,
|
||||
LcdColorIndex colorIndex) :
|
||||
TextButton(window, rect, text, nullptr, windowFlags | NO_FOCUS),
|
||||
_colorIndex(colorIndex),
|
||||
@@ -219,31 +219,31 @@ class ThemedTextEdit : public TextEdit
|
||||
};
|
||||
|
||||
// display controls using the appropriate theme.
|
||||
class PreviewWindow : public FormGroup
|
||||
class PreviewWindow : public FormWindow
|
||||
{
|
||||
public:
|
||||
PreviewWindow(Window *window, rect_t rect,
|
||||
std::vector<ColorEntry> colorList) :
|
||||
FormGroup(window, rect, NO_FOCUS), _colorList(colorList)
|
||||
FormWindow(window, rect, NO_FOCUS), _colorList(colorList)
|
||||
{
|
||||
|
||||
// reset default group to avoid focus
|
||||
lv_group_t* def_group = lv_group_get_default();
|
||||
lv_group_set_default(nullptr);
|
||||
|
||||
new ThemedStaticText(this, {5, 40, 100, LINE_HEIGHT}, STR_THEME_CHECKBOX, COLOR_THEME_PRIMARY1_INDEX);
|
||||
new ThemedCheckBox(this, {100 + 15, 40, 20, LINE_HEIGHT}, true);
|
||||
new ThemedCheckBox(this, {140 + 15, 40, 20, LINE_HEIGHT}, false);
|
||||
new ThemedButton(this, {190, 40, 100, LINE_HEIGHT + 10}, STR_THEME_ACTIVE, true, BUTTON_CHECKED, COLOR_THEME_PRIMARY1_INDEX);
|
||||
new ThemedButton(this, {190, 75, 100, LINE_HEIGHT + 10}, STR_THEME_REGULAR, false, 0, COLOR_THEME_PRIMARY1_INDEX);
|
||||
new ThemedMainViewHorizontalTrim(this, {5, 65, HORIZONTAL_SLIDERS_WIDTH, 20}, 0);
|
||||
new ThemedMainViewHorizontalSlider(this, {5, 87, HORIZONTAL_SLIDERS_WIDTH, 20}, 0);
|
||||
new ThemedStaticText(this, {5, 115, 100, LINE_HEIGHT}, STR_THEME_WARNING, COLOR_THEME_WARNING_INDEX);
|
||||
new ThemedStaticText(this, {5, 140, 100, LINE_HEIGHT}, STR_THEME_DISABLED, COLOR_THEME_DISABLED_INDEX);
|
||||
new ThemedStaticText(this, {5, 44, 100, PAGE_LINE_HEIGHT}, STR_THEME_CHECKBOX, COLOR_THEME_PRIMARY1_INDEX);
|
||||
new ThemedCheckBox(this, {100, 40, 40, 28}, true);
|
||||
new ThemedCheckBox(this, {150, 40, 40, 28}, false);
|
||||
new ThemedButton(this, {210, 40, 100, PAGE_LINE_HEIGHT + 10}, STR_THEME_ACTIVE, true, BUTTON_CHECKED, COLOR_THEME_PRIMARY1_INDEX);
|
||||
new ThemedButton(this, {210, 75, 100, PAGE_LINE_HEIGHT + 10}, STR_THEME_REGULAR, false, 0, COLOR_THEME_PRIMARY1_INDEX);
|
||||
new ThemedMainViewHorizontalTrim(this, {5, 75, HORIZONTAL_SLIDERS_WIDTH, 20}, 0);
|
||||
new ThemedMainViewHorizontalSlider(this, {5, 97, HORIZONTAL_SLIDERS_WIDTH, 20}, 0);
|
||||
new ThemedStaticText(this, {5, 122, 100, PAGE_LINE_HEIGHT}, STR_THEME_WARNING, COLOR_THEME_WARNING_INDEX);
|
||||
new ThemedStaticText(this, {5, 144, 100, PAGE_LINE_HEIGHT}, STR_THEME_DISABLED, COLOR_THEME_DISABLED_INDEX);
|
||||
|
||||
new ThemedTextEdit(this, {5, 160, 100, LINE_HEIGHT + 1}, STR_THEME_EDIT,
|
||||
new ThemedTextEdit(this, {5, 170, 100, 32}, STR_THEME_EDIT,
|
||||
COLOR_THEME_EDIT_INDEX, COLOR_THEME_PRIMARY2_INDEX);
|
||||
new ThemedTextEdit(this, {110, 160, 100, LINE_HEIGHT + 1}, STR_THEME_FOCUS,
|
||||
new ThemedTextEdit(this, {110, 170, 100, 32}, STR_THEME_FOCUS,
|
||||
COLOR_THEME_FOCUS_INDEX, COLOR_THEME_PRIMARY2_INDEX);
|
||||
ticks = 0;
|
||||
|
||||
@@ -336,7 +336,7 @@ class PreviewWindow : public FormGroup
|
||||
|
||||
protected:
|
||||
std::vector<ColorEntry> _colorList;
|
||||
CheckBox *checkBox;
|
||||
ToggleSwitch *checkBox;
|
||||
tmr10ms_t ticks;
|
||||
};
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
PXX1AntennaSettings::PXX1AntennaSettings(Window* parent,
|
||||
const FlexGridLayout& g,
|
||||
uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect_t{}), md(&g_model.moduleData[moduleIdx])
|
||||
FormWindow(parent, rect_t{}), md(&g_model.moduleData[moduleIdx])
|
||||
{
|
||||
FlexGridLayout grid(g);
|
||||
setFlexLayout();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user