LVGL sliders

This commit is contained in:
Raphael Coeffic
2022-06-11 15:13:11 +02:00
committed by Raphael Coeffic
parent 49ba2e46b2
commit a079d3987c
2 changed files with 85 additions and 80 deletions
+65 -43
View File
@@ -20,9 +20,71 @@
#include "slider.h"
#include "theme.h"
#include "LvglWrapper.h"
static void slider_changed_cb(lv_event_t * e)
{
lv_obj_t * target = lv_event_get_target(e);
if (!lv_slider_is_dragged(target)) {
Slider* sl = (Slider*)lv_obj_get_user_data(target);
sl->setValue(lv_slider_get_value(target));
}
}
static lv_style_t style_main;
static lv_style_t style_ind;
static lv_style_t style_knob;
static lv_style_t style_focused;
static LvglWidgetFactory sliderFactory = { lv_slider_create, nullptr };
constexpr coord_t SLIDER_PADDING = 6;
Slider::Slider(Window* parent, const rect_t& rect, int32_t vmin, int32_t vmax,
std::function<int()> getValue,
std::function<void(int)> setValue) :
FormField(parent,
{rect.x + SLIDER_PADDING, rect.y + SLIDER_PADDING,
rect.w - 2 * SLIDER_PADDING, rect.h - 2 * SLIDER_PADDING},
0, 0, &sliderFactory),
vmin(vmin),
vmax(vmax),
getValue(std::move(getValue)),
_setValue(std::move(setValue))
{
lv_obj_add_event_cb(lvobj, slider_changed_cb, LV_EVENT_VALUE_CHANGED, NULL);
lv_slider_set_range(lvobj, vmin, vmax);
lv_slider_set_value(lvobj, getValue(), LV_ANIM_OFF);
// LV_PART_MAIN
lv_style_init(&style_main);
lv_style_set_bg_opa(&style_main, LV_OPA_100);
lv_style_set_bg_color(&style_main, makeLvColor(COLOR_THEME_SECONDARY1));
lv_style_set_radius(&style_main, LV_RADIUS_CIRCLE);
lv_obj_add_style(lvobj, &style_main, LV_PART_MAIN);
// LV_PART_INDICATOR
lv_style_init(&style_ind);
lv_style_set_bg_opa(&style_ind, LV_OPA_100);
lv_style_set_bg_color(&style_ind, makeLvColor(COLOR_THEME_SECONDARY1));
lv_obj_add_style(lvobj, &style_ind, LV_PART_INDICATOR);
// Knob
lv_style_init(&style_knob);
lv_style_set_bg_color(&style_knob, makeLvColor(COLOR_THEME_PRIMARY2));
lv_style_set_border_color(&style_knob, makeLvColor(COLOR_THEME_SECONDARY1));
lv_style_set_border_width(&style_knob, 2);
lv_obj_add_style(lvobj, &style_knob, LV_PART_KNOB);
// LV_STATE_FOCUSED
lv_style_init(&style_focused);
lv_style_set_bg_color(&style_focused, makeLvColor(COLOR_THEME_FOCUS));
lv_obj_add_style(lvobj, &style_focused, LV_PART_MAIN | LV_STATE_FOCUSED);
lv_obj_add_style(lvobj, &style_focused, LV_PART_INDICATOR | LV_STATE_FOCUSED);
}
void Slider::paint(BitmapBuffer * dc)
{
theme->drawSlider(dc, vmin, vmax, getValue(), rect, editMode, hasFocus());
}
int Slider::value(coord_t x) const
@@ -38,11 +100,13 @@ void Slider::onEvent(event_t event)
if (editMode) {
if (event == EVT_ROTARY_RIGHT) {
setValue(getValue() + ROTARY_ENCODER_SPEED());
lv_slider_set_value(lvobj, getValue(), LV_ANIM_OFF);
onKeyPress();
return;
}
else if (event == EVT_ROTARY_LEFT) {
setValue(getValue() - ROTARY_ENCODER_SPEED());
lv_slider_set_value(lvobj, getValue(), LV_ANIM_OFF);
onKeyPress();
return;
} else if (event == EVT_KEY_FIRST(KEY_EXIT))
@@ -52,45 +116,3 @@ void Slider::onEvent(event_t event)
FormField::onEvent(event);
}
#endif
#if defined(HARDWARE_TOUCH)
bool Slider::onTouchStart(coord_t x, coord_t y)
{
if(!enabled)
return true;
if (!hasFocus()) {
onKeyPress();
setFocus(SET_FOCUS_DEFAULT);
}
sliding = (value(x) == getValue());
return true;
}
bool Slider::onTouchEnd(coord_t x, coord_t y)
{
if(!enabled)
return true;
setValue(value(x));
invalidate();
onKeyPress();
return true;
}
bool Slider::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY)
{
if(!enabled)
return true;
if (hasFocus() && sliding) {
int newValue = value(x);
if (getValue() != newValue) {
setValue(newValue);
invalidate();
onKeyPress();
}
}
return true;
}
#endif
+20 -37
View File
@@ -21,50 +21,33 @@
#include "form.h"
class Slider: public FormField {
public:
Slider(Window * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function<int()> getValue, std::function<void(int)> setValue):
FormField(parent, rect),
vmin(vmin),
vmax(vmax),
getValue(std::move(getValue)),
_setValue(std::move(setValue))
{
}
class Slider : public FormField
{
public:
Slider(Window* parent, const rect_t& rect, int32_t vmin, int32_t vmax,
std::function<int()> getValue, std::function<void(int)> setValue);
#if defined(DEBUG_WINDOWS)
std::string getName() const override
{
return "Slider";
}
std::string getName() const override { return "Slider"; }
#endif
void setValue(int value)
{
_setValue(limit(vmin, value, vmax));
invalidate();
}
void setValue(int value)
{
_setValue(limit(vmin, value, vmax));
invalidate();
}
void paint(BitmapBuffer * dc) override;
void paint(BitmapBuffer* dc) override;
#if defined(HARDWARE_KEYS)
void onEvent(event_t event) override;
void onEvent(event_t event) override;
#endif
#if defined(HARDWARE_TOUCH)
bool onTouchStart(coord_t x, coord_t y) override;
bool onTouchEnd(coord_t x, coord_t y) override;
bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override;
#endif
protected:
int value(coord_t x) const;
int vmin;
int vmax;
bool sliding = false;
std::function<int()> getValue;
std::function<void(int)> _setValue;
protected:
int value(coord_t x) const;
int vmin;
int vmax;
bool sliding = false;
std::function<int()> getValue;
std::function<void(int)> _setValue;
};