button: add long press
This commit is contained in:
committed by
Raphael Coeffic
parent
1ab128e084
commit
cbe237a945
+20
-5
@@ -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
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user