button: add long press

This commit is contained in:
Raphael Coeffic
2022-06-11 15:13:11 +02:00
committed by Raphael Coeffic
parent 1ab128e084
commit cbe237a945
2 changed files with 53 additions and 37 deletions
+20 -5
View File
@@ -40,12 +40,14 @@ Button::Button(Window* parent, const rect_t& rect,
objConstruct ? objConstruct : simple_btn_create),
pressHandler(std::move(pressHandler))
{
lv_obj_add_event_cb(lvobj, Button::long_pressed, LV_EVENT_LONG_PRESSED, nullptr);
if (windowFlag & BUTTON_CHECKED)
lv_obj_add_state(lvobj, LV_STATE_CHECKED);
}
void Button::check(bool checked)
{
if (_deleted) return;
if (checked != bool(windowFlags & BUTTON_CHECKED)) {
windowFlags ^= BUTTON_CHECKED;
update_checked_flag(lvobj, windowFlags);
@@ -63,11 +65,16 @@ bool Button::checked() const
void Button::onPress()
{
bool check = (pressHandler && pressHandler());
windowFlags =
check ? windowFlags | BUTTON_CHECKED : windowFlags & ~BUTTON_CHECKED;
if (lvobj == nullptr) return;
update_checked_flag(lvobj, windowFlags);
check(pressHandler && pressHandler());
}
void Button::onLongPress()
{
if (longPressHandler) {
check(longPressHandler());
lv_obj_clear_state(lvobj, LV_STATE_PRESSED);
lv_indev_wait_release(lv_indev_get_act());
}
}
void Button::onClicked()
@@ -86,6 +93,14 @@ void Button::checkEvents()
if (checkHandler) checkHandler();
}
void Button::long_pressed(lv_event_t* e)
{
auto obj = lv_event_get_target(e);
auto btn = (Button*)lv_obj_get_user_data(obj);
if (obj) btn->onLongPress();
}
TextButton::TextButton(Window* parent, const rect_t& rect, std::string text,
std::function<uint8_t(void)> pressHandler,
WindowFlags windowFlags, LcdFlags textFlags) :
+33 -32
View File
@@ -25,52 +25,53 @@ constexpr WindowFlags BUTTON_BACKGROUND = FORM_FLAGS_LAST << 1u;
constexpr WindowFlags BUTTON_CHECKED = FORM_FLAGS_LAST << 2u;
constexpr WindowFlags BUTTON_CHECKED_ON_FOCUS = FORM_FLAGS_LAST << 3u;
class Button: public FormField
class Button : public FormField
{
public:
Button(Window* parent, const rect_t& rect,
std::function<uint8_t(void)> pressHandler = nullptr,
WindowFlags windowFlags = 0, LcdFlags textFlags = 0,
LvglCreate objConstruct = nullptr);
public:
Button(Window* parent, const rect_t& rect,
std::function<uint8_t(void)> pressHandler = nullptr,
WindowFlags windowFlags = 0, LcdFlags textFlags = 0,
LvglCreate objConstruct = nullptr);
#if defined(DEBUG_WINDOWS)
std::string getName() const override
{
return "Button";
}
std::string getName() const override { return "Button"; }
#endif
virtual void onPress();
void onClicked() override;
void checkEvents() override;
virtual void onPress();
virtual void onLongPress();
void check(bool checked = true);
bool checked() const;
void onClicked() override;
void checkEvents() override;
void setPressHandler(std::function<uint8_t(void)> handler)
{
pressHandler = std::move(handler);
}
void check(bool checked = true);
bool checked() const;
void setCheckHandler(std::function<void(void)> handler)
{
checkHandler = std::move(handler);
}
void setPressHandler(std::function<uint8_t(void)> handler)
{
pressHandler = std::move(handler);
}
// #if defined(HARDWARE_KEYS)
// void onEvent(event_t event) override;
// #endif
// void onEvent(lv_event_t* e);// override;
void setLongPressHandler(std::function<uint8_t(void)> handler)
{
longPressHandler = std::move(handler);
}
void setCheckHandler(std::function<void(void)> handler)
{
checkHandler = std::move(handler);
}
#if defined(HARDWARE_TOUCH)
bool onTouchEnd(coord_t x, coord_t y) override;
bool onTouchEnd(coord_t x, coord_t y) override;
#endif
protected:
std::function<uint8_t(void)> pressHandler;
std::function<void(void)> checkHandler;
};
protected:
std::function<uint8_t(void)> pressHandler;
std::function<uint8_t(void)> longPressHandler;
std::function<void(void)> checkHandler;
static void long_pressed(lv_event_t* e);
};
class TextButton: public Button
{