chore(color): Update Special Functions edit screen to LVGL (#2745)

This commit is contained in:
Malte Langermann
2022-12-06 20:05:34 +10:00
committed by GitHub
parent 1fe9de6d79
commit 5d3e37e08c
+86 -82
View File
@@ -26,6 +26,11 @@
#define SET_DIRTY() storageDirty(functions == g_model.customFn ? EE_MODEL : EE_GENERAL)
static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2),
LV_GRID_TEMPLATE_LAST};
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT,
LV_GRID_TEMPLATE_LAST};
class SpecialFunctionEditPage : public Page
{
public:
@@ -37,6 +42,8 @@ class SpecialFunctionEditPage : public Page
{
buildHeader(&header);
buildBody(&body);
lv_obj_set_style_max_height(body.getLvObj(), LCD_H - header.height(), 0);
lv_obj_set_style_max_width(body.getLvObj(), LCD_W, 0);
}
protected:
@@ -90,8 +97,10 @@ class SpecialFunctionEditPage : public Page
void updateSpecialFunctionOneWindow()
{
FormGridLayout grid;
specialFunctionOneWindow->clear();
specialFunctionOneWindow->setFlexLayout();
FlexGridLayout grid(col_dsc, row_dsc, 2);
auto line = specialFunctionOneWindow->newLine(&grid);
CustomFunctionData *cfn = &functions[index];
uint8_t func = CFN_FUNC(cfn);
@@ -99,24 +108,24 @@ class SpecialFunctionEditPage : public Page
// Func param
switch (func) {
case FUNC_OVERRIDE_CHANNEL: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_CH, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), 1,
new StaticText(line, rect_t{}, STR_CH, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(line, rect_t{}, 1,
MAX_OUTPUT_CHANNELS,
GET_SET_VALUE_WITH_OFFSET(CFN_CH_INDEX(cfn), 1));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
int limit = (g_model.extendedLimits ? LIMIT_EXT_PERCENT : LIMIT_STD_PERCENT);
new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), -limit, limit,
new NumberEdit(line, rect_t{}, -limit, limit,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
}
case FUNC_TRAINER: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
auto choice =
new Choice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new Choice(line, rect_t{}, 0,
NUM_STICKS + 1, GET_SET_DEFAULT(CFN_CH_INDEX(cfn)));
choice->setTextHandler([=](int32_t value) {
if (value == 0)
@@ -127,15 +136,15 @@ class SpecialFunctionEditPage : public Page
return TEXT_AT_INDEX(STR_VSRCRAW, value);
;
});
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
}
case FUNC_RESET:
if (CFN_PARAM(cfn) < FUNC_RESET_PARAM_FIRST_TELEM) {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_RESET, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_RESET, 0, COLOR_THEME_PRIMARY1);
auto choice = new Choice(
specialFunctionOneWindow, grid.getFieldSlot(), 0,
line, rect_t{}, 0,
FUNC_RESET_PARAM_FIRST_TELEM + lastUsedTelemetryIndex(),
GET_SET_DEFAULT(CFN_PARAM(cfn)));
choice->setAvailableHandler(isSourceAvailableInResetSpecialFunction);
@@ -148,39 +157,39 @@ class SpecialFunctionEditPage : public Page
.label,
TELEM_LABEL_LEN);
});
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
}
break;
case FUNC_VOLUME:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VOLUME, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new StaticText(line, rect_t{}, STR_VOLUME, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(line, rect_t{}, 0,
MIXSRC_LAST_CH, GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_BACKLIGHT:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(line, rect_t{}, 0,
MIXSRC_LAST_CH, GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_PLAY_SOUND:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new Choice(specialFunctionOneWindow, grid.getFieldSlot(),
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new Choice(line, rect_t{},
STR_FUNCSOUNDS, 0,
AU_SPECIAL_SOUND_LAST - AU_SPECIAL_SOUND_FIRST - 1,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_PLAY_TRACK:
case FUNC_BACKGND_MUSIC:
case FUNC_PLAY_SCRIPT:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new FileChoice(
specialFunctionOneWindow, grid.getFieldSlot(),
line, rect_t{},
func == FUNC_PLAY_SCRIPT
? SCRIPTS_FUNCS_PATH
: std::string(SOUNDS_PATH, SOUNDS_PATH_LNG_OFS) +
@@ -194,52 +203,52 @@ class SpecialFunctionEditPage : public Page
LUA_LOAD_MODEL_SCRIPTS();
},
true); // strip extension
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_SET_TIMER: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_TIMER, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_TIMER, 0, COLOR_THEME_PRIMARY1);
auto timerchoice =
new Choice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new Choice(line, rect_t{}, 0,
TIMERS - 1, GET_SET_DEFAULT(CFN_TIMER_INDEX(cfn)));
timerchoice->setTextHandler([](int32_t value) {
return std::string(STR_TIMER) + std::to_string(value + 1);
});
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new TimeEdit(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new TimeEdit(line, rect_t{}, 0,
9 * 60 * 60 - 1, GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
}
case FUNC_SET_FAILSAFE:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_MODULE, 0, COLOR_THEME_PRIMARY1);
new Choice(specialFunctionOneWindow, grid.getFieldSlot(),
new StaticText(line, rect_t{}, STR_MODULE, 0, COLOR_THEME_PRIMARY1);
new Choice(line, rect_t{},
"\004Int.Ext.", 0, NUM_MODULES - 1,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_PLAY_VALUE:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(line, rect_t{}, 0,
MIXSRC_LAST_TELEM, GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_HAPTIC:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), 0, 3,
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new NumberEdit(line, rect_t{}, 0, 3,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_LOGS: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_VALUE, 0, COLOR_THEME_PRIMARY1);
auto edit =
new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new NumberEdit(line, rect_t{}, 0,
255, GET_SET_DEFAULT(CFN_PARAM(cfn)));
edit->setDisplayHandler(
[=](int32_t value) {
@@ -249,33 +258,33 @@ class SpecialFunctionEditPage : public Page
}
case FUNC_SET_SCREEN:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE,
new StaticText(line, rect_t{}, STR_VALUE,
0, COLOR_THEME_PRIMARY1);
CFN_PARAM(cfn) = (int16_t)max(CFN_PARAM(cfn), (int16_t)1);
CFN_PARAM(cfn) = (int16_t)min(
CFN_PARAM(cfn), (int16_t)ViewMain::instance()->getMainViewsCount());
new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), 1,
new NumberEdit(line, rect_t{}, 1,
ViewMain::instance()->getMainViewsCount(),
GET_SET_DEFAULT(CFN_PARAM(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
break;
case FUNC_ADJUST_GVAR: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_GLOBALVAR, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_GLOBALVAR, 0, COLOR_THEME_PRIMARY1);
auto gvarchoice =
new Choice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new Choice(line, rect_t{}, 0,
MAX_GVARS - 1, GET_SET_DEFAULT(CFN_GVAR_INDEX(cfn)));
gvarchoice->setTextHandler([](int32_t value) {
return std::string(STR_GV) + std::to_string(value + 1);
});
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_MODE, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_MODE, 0, COLOR_THEME_PRIMARY1);
auto modechoice =
new Choice(specialFunctionOneWindow, grid.getFieldSlot(),
new Choice(line, rect_t{},
FUNC_ADJUST_GVAR_CONSTANT, FUNC_ADJUST_GVAR_INCDEC,
GET_DEFAULT(CFN_GVAR_MODE(cfn)), nullptr);
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
modechoice->setTextHandler([](int32_t value) {
switch (value) {
@@ -300,23 +309,23 @@ class SpecialFunctionEditPage : public Page
switch (CFN_GVAR_MODE(cfn)) {
case FUNC_ADJUST_GVAR_CONSTANT: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_CONSTANT, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_CONSTANT, 0, COLOR_THEME_PRIMARY1);
int16_t val_min, val_max;
getMixSrcRange(CFN_GVAR_INDEX(cfn) + MIXSRC_FIRST_GVAR, val_min,
val_max);
new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(),
new NumberEdit(line, rect_t{},
val_min, val_max, GET_SET_DEFAULT(CFN_PARAM(cfn)));
break;
}
case FUNC_ADJUST_GVAR_SOURCE:
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_MIXSOURCE, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(specialFunctionOneWindow, grid.getFieldSlot(),
new StaticText(line, rect_t{}, STR_MIXSOURCE, 0, COLOR_THEME_PRIMARY1);
new SourceChoice(line, rect_t{},
0, MIXSRC_LAST_CH, GET_SET_DEFAULT(CFN_PARAM(cfn)));
break;
case FUNC_ADJUST_GVAR_GVAR: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_GLOBALVAR, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_GLOBALVAR, 0, COLOR_THEME_PRIMARY1);
auto gvarchoice =
new Choice(specialFunctionOneWindow, grid.getFieldSlot(), 0,
new Choice(line, rect_t{}, 0,
MAX_GVARS - 1, GET_SET_DEFAULT(CFN_PARAM(cfn)));
gvarchoice->setTextHandler([](int32_t value) {
return std::string(STR_GV) + std::to_string(value + 1);
@@ -327,12 +336,11 @@ class SpecialFunctionEditPage : public Page
break;
}
case FUNC_ADJUST_GVAR_INCDEC: {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_INCDEC, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_INCDEC, 0, COLOR_THEME_PRIMARY1);
int16_t val_min, val_max;
getMixSrcRange(CFN_GVAR_INDEX(cfn) + MIXSRC_FIRST_GVAR, val_min, val_max);
getGVarIncDecRange(val_min, val_max);
auto numedit = new NumberEdit(specialFunctionOneWindow,
grid.getFieldSlot(), val_min, val_max,
auto numedit = new NumberEdit(line, rect_t{}, val_min, val_max,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
numedit->setDisplayHandler(
[](int value) {
@@ -341,20 +349,20 @@ class SpecialFunctionEditPage : public Page
break;
}
}
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
}
}
if (HAS_ENABLE_PARAM(func)) {
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_ENABLE, 0, COLOR_THEME_PRIMARY1);
new CheckBox(specialFunctionOneWindow, grid.getFieldSlot(),
new StaticText(line, rect_t{}, STR_ENABLE, 0, COLOR_THEME_PRIMARY1);
new CheckBox(line, rect_t{},
GET_SET_DEFAULT(CFN_ACTIVE(cfn)));
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
} else if (HAS_REPEAT_PARAM(func)) { // !1x 1x 1s 2s 3s ...
new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_REPEAT,
new StaticText(line, rect_t{}, STR_REPEAT,
0, COLOR_THEME_PRIMARY1);
auto repeat = new NumberEdit(
specialFunctionOneWindow, grid.getFieldSlot(2, 1), -1,
line, rect_t{}, -1,
60 / CFN_PLAY_REPEAT_MUL, GET_DEFAULT((int8_t)CFN_PLAY_REPEAT(cfn)),
SET_DEFAULT(CFN_PLAY_REPEAT(cfn)));
repeat->setDisplayHandler(
@@ -367,31 +375,30 @@ class SpecialFunctionEditPage : public Page
return formatNumberAsString(value * CFN_PLAY_REPEAT_MUL, 0, 0, nullptr, "s");
}
});
grid.nextLine();
line = specialFunctionOneWindow->newLine(&grid);
}
specialFunctionOneWindow->adjustHeight();
}
void buildBody(FormWindow *window)
{
// SF.one
FormGridLayout grid;
grid.spacer(PAGE_PADDING);
window->setFlexLayout();
FlexGridLayout grid(col_dsc, row_dsc, 2);
lv_obj_set_style_pad_all(window->getLvObj(), lv_dpx(8), 0);
CustomFunctionData *cfn = &functions[index];
// Switch
new StaticText(window, grid.getLabelSlot(), STR_SWITCH, 0, COLOR_THEME_PRIMARY1);
auto line = window->newLine(&grid);
new StaticText(line, rect_t{}, STR_SWITCH, 0, COLOR_THEME_PRIMARY1);
auto switchChoice =
new SwitchChoice(window, grid.getFieldSlot(), SWSRC_FIRST, SWSRC_LAST,
new SwitchChoice(line, rect_t{}, SWSRC_FIRST, SWSRC_LAST,
GET_SET_DEFAULT(CFN_SWITCH(cfn)));
switchChoice->setAvailableHandler([=](int value) {
return (functions == g_model.customFn
? isSwitchAvailable(value, ModelCustomFunctionsContext)
: isSwitchAvailable(value, GeneralCustomFunctionsContext));
});
grid.nextLine();
line = window->newLine(&grid);
// Patch function in case not available
if (!isAssignableFunctionAvailable(CFN_FUNC(cfn), functions)) {
@@ -406,9 +413,9 @@ class SpecialFunctionEditPage : public Page
}
// Function
new StaticText(window, grid.getLabelSlot(), STR_FUNC, 0, COLOR_THEME_PRIMARY1);
new StaticText(line, rect_t{}, STR_FUNC, 0, COLOR_THEME_PRIMARY1);
auto functionChoice =
new Choice(window, grid.getFieldSlot(), STR_VFSWFUNC,
new Choice(line, rect_t{}, STR_VFSWFUNC,
0, FUNC_MAX - 1,
GET_DEFAULT(CFN_FUNC(cfn)));
functionChoice->setSetValueHandler([=](int32_t newValue) {
@@ -420,13 +427,10 @@ class SpecialFunctionEditPage : public Page
functionChoice->setAvailableHandler([=](int value) {
return isAssignableFunctionAvailable(value, functions);
});
grid.nextLine();
line = window->newLine(&grid);
specialFunctionOneWindow = new FormGroup(
window, {0, grid.getWindowHeight(), LCD_W, 0}// , FORM_FORWARD_FOCUS
);
specialFunctionOneWindow = new FormGroup(window, rect_t{});
updateSpecialFunctionOneWindow();
grid.addWindow(specialFunctionOneWindow);
}
};