fix(color): More consistent button colors, GV buttons checked/pressed (#2944)

Make ButtonMatrix button text color behave like TextButton for flight modes and pre-flight checks.
Show 'GV' button as checked if corresponding input value is a global var.
This commit is contained in:
philmoz
2023-01-01 11:30:12 +10:00
committed by GitHub
parent 7e503e823e
commit 655aa42c6f
7 changed files with 75 additions and 16 deletions
+15
View File
@@ -295,6 +295,21 @@ int8_t rotaryEncoderGetAccel() { return 0; }
#endif // defined(ROTARY_ENCODER_NAVIGATION)
// Return 32 bit version of color (for recolor of buttons)
uint32_t makeLvColor32(uint32_t colorFlags)
{
auto color = COLOR_VAL(colorFlags);
return (GET_RED(color) << 16u) | (GET_GREEN(color) << 8) | GET_BLUE(color);
}
// Create recolor version of string value
std::string makeRecolor(std::string value, uint32_t colorFlags)
{
char s[32];
snprintf(s, 32, "#%06x %s#", makeLvColor32(colorFlags), value.c_str());
return std::string(s);
}
/**
* Helper function to translate a colorFlags value to a lv_color_t suitable
* for passing to an lv_obj function
+2
View File
@@ -27,6 +27,8 @@
void initLvglTheme();
uint32_t makeLvColor32(uint32_t colorFlags);
std::string makeRecolor(std::string value, uint32_t colorFlags);
lv_color_t makeLvColor(uint32_t colorFlags);
typedef std::function<lv_obj_t *(lv_obj_t *parent)> LvObjConstructor;
+12 -3
View File
@@ -32,11 +32,13 @@ FMMatrix<T>::FMMatrix(Window* parent, const rect_t& r, T* input) :
initBtnMap(3, MAX_FLIGHT_MODES);
#endif
for (int i = 0; i < MAX_FLIGHT_MODES; i++) {
setText(i, std::to_string(i).c_str());
}
update();
for (int i = 0; i < MAX_FLIGHT_MODES; i++) {
lv_btnmatrix_set_btn_ctrl(lvobj, i, LV_BTNMATRIX_CTRL_RECOLOR);
setTextWithColor(i);
}
#if LCD_W > LCD_H
// hide last element
lv_btnmatrix_set_btn_ctrl(lvobj, MAX_FLIGHT_MODES, LV_BTNMATRIX_CTRL_HIDDEN);
@@ -57,11 +59,18 @@ FMMatrix<T>::FMMatrix(Window* parent, const rect_t& r, T* input) :
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
}
template<class T>
void FMMatrix<T>::setTextWithColor(uint8_t btn_id)
{
setText(btn_id, makeRecolor(std::to_string(btn_id), isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str());
}
template<class T>
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);
storageDirty(EE_MODEL);
}
+1
View File
@@ -32,6 +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);
};
extern template struct FMMatrix<ExpoData>;
+8 -3
View File
@@ -64,18 +64,21 @@ GVarNumberEdit::GVarNumberEdit(Window* parent, const rect_t& rect, int32_t vmin,
});
gvar_field->setTextHandler(
[=](int32_t value) { return getGVarString(value); });
gvar_field->setWidth(70);
num_field = new NumberEdit(
this, rect_t{}, vmin, vmax, [=]() { return getValue() + voffset; },
nullptr, windowFlags, textFlags);
num_field->setWidth(70);
#if defined(GVARS)
// The GVAR button
auto btn = new TextButton(this, rect_t{}, STR_GV, [=]() {
m_gvBtn = new TextButton(this, rect_t{}, STR_GV, [=]() {
switchGVarMode();
return 0;
return GV_IS_GV_VALUE(getValue(), vmin, vmax);
});
lv_obj_set_height(btn->getLvObj(), lv_obj_get_height(gvar_field->getLvObj()));
m_gvBtn->check(GV_IS_GV_VALUE(getValue(), vmin, vmax));
lv_obj_set_height(m_gvBtn->getLvObj(), lv_obj_get_height(gvar_field->getLvObj()));
#endif
lv_obj_add_event_cb(lvobj, GVarNumberEdit::value_changed,
@@ -95,6 +98,8 @@ void GVarNumberEdit::switchGVarMode()
: GET_GVAR(value, vmin, vmax, mixerCurrentFlightMode))
: GV_GET_GV1_VALUE(vmin, vmax));
m_gvBtn->check(GV_IS_GV_VALUE(value, vmin, vmax));
// update field type based on value
update();
}
+5
View File
@@ -29,6 +29,8 @@
constexpr coord_t GVAR_BUTTON_WIDTH = 30;
class TextButton;
class GVarNumberEdit : public Window
{
public:
@@ -47,6 +49,9 @@ class GVarNumberEdit : public Window
Choice* gvar_field = nullptr;
NumberEdit* num_field = nullptr;
FormField* act_field = nullptr;
#if defined(GVARS)
TextButton* m_gvBtn = nullptr;
#endif
int32_t vmin;
int32_t vmax;
+32 -10
View File
@@ -77,6 +77,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);
private:
uint8_t sw_idx[NUM_SWITCHES];
};
@@ -85,6 +86,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);
private:
uint8_t pot_idx[NUM_POTS + NUM_SLIDERS];
};
@@ -93,6 +95,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);
private:
uint8_t ana_idx[NUM_STICKS + NUM_POTS + NUM_SLIDERS];
};
@@ -175,16 +178,16 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) :
}
initBtnMap(4, btn_cnt);
update();
uint8_t btn_id = 0;
for (uint8_t i = 0; i < NUM_SWITCHES; i++) {
if (SWITCH_EXISTS(i)) {
std::string txt = switchWarninglabel(i);
setText(btn_id, txt.c_str());
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
setTextWithColor(i);
btn_id++;
}
}
update();
lv_obj_set_width(lvobj, LV_DPI_DEF * 2);
@@ -203,6 +206,11 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) :
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
}
void SwitchWarnMatrix::setTextWithColor(uint8_t btn_id)
{
setText(btn_id, makeRecolor(switchWarninglabel(sw_idx[btn_id]), isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str());
}
void SwitchWarnMatrix::onPress(uint8_t btn_id)
{
if (btn_id >= NUM_SWITCHES) return;
@@ -219,8 +227,7 @@ void SwitchWarnMatrix::onPress(uint8_t btn_id)
SET_DIRTY();
// TODO: save state in object
std::string txt = switchWarninglabel(sw);
setText(btn_id, txt.c_str());
setTextWithColor(sw);
}
bool SwitchWarnMatrix::isActive(uint8_t btn_id)
@@ -249,21 +256,23 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) :
}
initBtnMap(3, btn_cnt);
update();
uint8_t btn_id = 0;
for (uint16_t i = POT_FIRST; i <= POT_LAST; i++) {
if ((IS_POT(i) || IS_POT_MULTIPOS(i)) && IS_POT_AVAILABLE(i)) {
setText(btn_id, STR_VSRCRAW[i + 1]);
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
setTextWithColor(btn_id);
btn_id++;
}
}
for (int8_t i = SLIDER_FIRST; i <= SLIDER_LAST; i++) {
if (IS_SLIDER(i)) {
setText(btn_id, STR_VSRCRAW[i + 1]);
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
setTextWithColor(btn_id);
btn_id++;
}
}
update();
lv_obj_set_width(lvobj, (LV_DPI_DEF * 3) / 2);
@@ -282,6 +291,11 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) :
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
}
void PotWarnMatrix::setTextWithColor(uint8_t btn_id)
{
setText(btn_id, makeRecolor(STR_VSRCRAW[pot_idx[btn_id] + POT_FIRST + 1], isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str());
}
void PotWarnMatrix::onPress(uint8_t btn_id)
{
if (btn_id >= NUM_POTS + NUM_SLIDERS) return;
@@ -292,6 +306,7 @@ void PotWarnMatrix::onPress(uint8_t btn_id)
(g_model.potsWarnEnabled & (1 << pot))) {
SAVE_POT_POSITION(pot);
}
setTextWithColor(btn_id);
SET_DIRTY();
}
@@ -315,15 +330,16 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) :
}
initBtnMap(4, btn_cnt);
update();
uint8_t btn_id = 0;
for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) {
if (i < NUM_STICKS || (IS_POT_SLIDER_AVAILABLE(i) && !IS_POT_MULTIPOS(i))) {
setText(btn_id, STR_RETA123[i]);
lv_btnmatrix_set_btn_ctrl(lvobj, btn_id, LV_BTNMATRIX_CTRL_RECOLOR);
setTextWithColor(btn_id);
btn_id++;
}
}
update();
lv_obj_set_width(lvobj, (3 * LV_DPI_DEF) / 2);
@@ -342,11 +358,17 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) :
lv_obj_remove_style(lvobj, nullptr, LV_PART_MAIN | LV_STATE_EDITED);
}
void CenterBeepsMatrix::setTextWithColor(uint8_t btn_id)
{
setText(btn_id, makeRecolor(STR_RETA123[ana_idx[btn_id]], isActive(btn_id) ? COLOR_THEME_PRIMARY1 : COLOR_THEME_SECONDARY1).c_str());
}
void CenterBeepsMatrix::onPress(uint8_t btn_id)
{
if (btn_id >= NUM_STICKS + NUM_POTS + NUM_SLIDERS) return;
uint8_t i = ana_idx[btn_id];
BFBIT_FLIP(g_model.beepANACenter, bfBit<BeepANACenter>(i));
setTextWithColor(btn_id);
SET_DIRTY();
}