LVGL sliders
This commit is contained in:
committed by
Raphael Coeffic
parent
49ba2e46b2
commit
a079d3987c
+65
-43
@@ -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
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user