From a079d3987cad73093420f9960508540d4061f8a2 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 24 Jan 2022 07:44:09 +0100 Subject: [PATCH] LVGL sliders --- radio/src/thirdparty/libopenui/src/slider.cpp | 108 +++++++++++------- radio/src/thirdparty/libopenui/src/slider.h | 57 ++++----- 2 files changed, 85 insertions(+), 80 deletions(-) diff --git a/radio/src/thirdparty/libopenui/src/slider.cpp b/radio/src/thirdparty/libopenui/src/slider.cpp index 610af4639..e3c60d196 100644 --- a/radio/src/thirdparty/libopenui/src/slider.cpp +++ b/radio/src/thirdparty/libopenui/src/slider.cpp @@ -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 getValue, + std::function 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 diff --git a/radio/src/thirdparty/libopenui/src/slider.h b/radio/src/thirdparty/libopenui/src/slider.h index c144ec4bc..fb26e551e 100644 --- a/radio/src/thirdparty/libopenui/src/slider.h +++ b/radio/src/thirdparty/libopenui/src/slider.h @@ -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 getValue, std::function 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 getValue, std::function 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 getValue; - std::function _setValue; + protected: + int value(coord_t x) const; + int vmin; + int vmax; + bool sliding = false; + std::function getValue; + std::function _setValue; }; -