feat(color): Add tick marks to Sliders with less than 10 steps (#4125)

Also update Slider style so not so overwhelmingly large
This commit is contained in:
philmoz
2023-10-16 15:38:41 +10:00
committed by GitHub
parent d396b38e8b
commit 661542a474
3 changed files with 36 additions and 12 deletions
+11 -9
View File
@@ -257,11 +257,14 @@ static void style_init(void)
// Slider
lv_style_init(&styles.slider_main);
lv_style_set_bg_opa(&styles.slider_main, LV_OPA_100);
lv_style_set_pad_all(&styles.slider_main, 6);
lv_style_init(&styles.slider_knob);
lv_style_set_bg_opa(&styles.slider_knob, LV_OPA_COVER);
lv_style_set_border_width(&styles.slider_knob, 1);
lv_style_set_pad_all(&styles.slider_knob, lv_disp_dpx(theme.disp, 6));
lv_style_set_border_width(&styles.slider_knob, 2);
lv_style_set_pad_top(&styles.slider_knob, 9);
lv_style_set_pad_bottom(&styles.slider_knob, 9);
lv_style_set_pad_left(&styles.slider_knob, 4);
lv_style_set_pad_right(&styles.slider_knob, 4);
lv_style_set_radius(&styles.slider_knob, 4);
// Choice
lv_style_init(&styles.choice_main);
@@ -591,17 +594,16 @@ void etx_slider_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
lv_obj_add_style(obj, &styles.slider_main, LV_PART_MAIN);
lv_obj_add_style(obj, &styles.slider_knob, LV_PART_KNOB);
lv_obj_add_style(obj, &styles.circle, LV_PART_MAIN);
lv_obj_add_style(obj, &styles.circle, LV_PART_KNOB);
lv_obj_add_style(obj, &styles.bg_color_focus,
LV_PART_MAIN | LV_STATE_FOCUSED);
lv_obj_add_style(obj, &styles.bg_color_focus,
lv_obj_add_style(obj, &styles.bg_color_edit,
LV_PART_MAIN | LV_STATE_FOCUSED | LV_STATE_EDITED);
lv_obj_add_style(obj, &styles.bg_color_focus,
LV_PART_INDICATOR | LV_STATE_FOCUSED);
lv_obj_add_style(obj, &styles.bg_color_focus,
LV_PART_INDICATOR | LV_STATE_FOCUSED | LV_STATE_EDITED);
lv_obj_add_style(obj, &styles.bg_color_edit,
LV_PART_KNOB | LV_STATE_FOCUSED | LV_STATE_EDITED);
LV_PART_INDICATOR | LV_STATE_FOCUSED | LV_STATE_EDITED);
lv_obj_add_style(obj, &styles.focussed,
LV_PART_KNOB | LV_STATE_FOCUSED);
}
void etx_btnmatrix_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
@@ -788,7 +790,7 @@ const lv_obj_class_t etx_slider_class = {
.user_data = nullptr,
.event_cb = nullptr,
.width_def = 0,
.height_def = 16,
.height_def = 8,
.editable = LV_OBJ_CLASS_EDITABLE_INHERIT,
.group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT,
.instance_size = sizeof(lv_slider_t),
+22 -3
View File
@@ -17,9 +17,9 @@
*/
#include "slider.h"
#include "theme.h"
#include "LvglWrapper.h"
#include "theme.h"
static void slider_changed_cb(lv_event_t* e)
{
@@ -41,9 +41,11 @@ Slider::Slider(Window* parent, coord_t width, int32_t vmin, int32_t vmax,
_getValue(std::move(getValue)),
_setValue(std::move(setValue))
{
padAll(7);
padTop(9);
padLeft(8);
padRight(8);
auto slider = (new FormField(this, rect_t{}, 0, 0, etx_slider_create))->getLvObj();
slider = (new FormField(this, rect_t{}, 0, 0, etx_slider_create))->getLvObj();
lv_obj_set_width(slider, lv_pct(100));
lv_obj_add_event_cb(slider, slider_changed_cb, LV_EVENT_VALUE_CHANGED, this);
@@ -52,3 +54,20 @@ Slider::Slider(Window* parent, coord_t width, int32_t vmin, int32_t vmax,
if (_getValue != nullptr)
lv_slider_set_value(slider, _getValue(), LV_ANIM_OFF);
}
void Slider::paint(BitmapBuffer* dc)
{
coord_t w = lv_obj_get_width(slider);
coord_t x = (lv_obj_get_width(lvobj) - w) / 2 - 1;
int range = vmax - vmin;
LcdFlags color = lv_obj_has_state(slider, LV_STATE_EDITED) ? COLOR_THEME_EDIT
: lv_obj_has_state(slider, LV_STATE_FOCUSED)
? COLOR_THEME_FOCUS
: COLOR_THEME_SECONDARY1;
if (range < 10) {
for (int n = 1; n < range; n += 1) {
dc->drawSolidRect(x + (w * n) / range, 6, 2, 2, 1, color);
}
}
}
+3
View File
@@ -35,9 +35,12 @@ class Slider : public Window
if (_setValue != nullptr) _setValue(limit(vmin, value, vmax));
}
void paint(BitmapBuffer *) override;
protected:
int vmin;
int vmax;
lv_obj_t* slider;
std::function<int()> _getValue;
std::function<void(int)> _setValue;
};