OMOTE/Platformio/OmoteUI/core/UIElement.hpp
MatthewColvin 7b7045f62b convert Screen manager to use vector to allow popper of screen to use the Page.
Add ability to delay destruction of an object in LVGL after the core object has been destructed. This was added for animations to work .

make pop up Screen to allow for easy pushing of pages by wrapping it in a screen.

Use this all in the settings page to launch a fake display settings
2023-10-08 12:32:59 -05:00

107 lines
No EOL
3.1 KiB
C++

#pragma once
#include "UIElementIds.hpp"
#include <lvgl.h>
#include "KeyPressAbstract.hpp"
namespace UI {
class UIElement {
public:
UIElement(lv_obj_t *aLvglSelf, const ID aId = ID());
virtual ~UIElement();
virtual void SetBgColor(lv_color_t value,
lv_style_selector_t selector = LV_PART_MAIN);
void SetVisiblity(bool aVisibility);
bool IsVisible();
virtual void SetWidth(lv_coord_t aWidth);
virtual void SetHeight(lv_coord_t aHeight);
lv_coord_t GetWidth();
lv_coord_t GetHeight();
virtual void SetY(lv_coord_t aY);
virtual void SetX(lv_coord_t aX);
lv_coord_t GetY();
lv_coord_t GetX();
lv_coord_t GetBottom();
void AlignTo(UIElement *anElementToAlignWith, lv_align_t anAlignment,
lv_coord_t aXoffset = 0, lv_coord_t aYOffset = 0);
virtual void AddElement(UIElement *anElement);
ID GetID() { return mId; };
template <class UIElemTy> static UIElemTy GetElement(lv_obj_t *aLvglObject);
/// @brief There are use cases in which objects
/// need to stay alive in LVGL but can die
/// in terms of our usage this is a helper for these
/// use Sparengly!!!
/// @param aTimeToKeepLvglObj
void SetKeepAliveTime(uint32_t aTimeToKeepLvglObj) {
mLvglKeepAliveTime = aTimeToKeepLvglObj;
}
protected:
/// @brief get Lvgl object refernce to use in LVGL APIs
/// @return lvgl object a
lv_obj_t *LvglSelf() { return mLvglSelf; }
/// @brief Show Element
virtual void Show();
/// @brief Hide Element
virtual void Hide();
/// @brief Override in child class to run something after element is shown
virtual void OnShow() = 0;
/// @brief Override in child class to run something after element is hidden
virtual void OnHide() = 0;
// Override in object to handle LVGL events for that object
virtual void OnLvglEvent(lv_event_t *anEvent){};
/// @brief Set KeyEvent to the UI element to see if it wants to handle it
virtual bool KeyEvent(KeyPressAbstract::KeyEvent aKeyEvent);
/// @brief Override to Handle KeyEvent for the specific element
/// @return true - Key event was used
/// fasle - Key event was unused
virtual bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) = 0;
private:
static void LvglEventHandler(lv_event_t *anEvent);
lv_obj_t *mLvglSelf;
const ID mId;
uint32_t mLvglKeepAliveTime = 0;
};
/**
* @brief This helper allows conversion between anLvglObject and a
* core element by using the user data that links the LVGL object
* to its C++ counterpart. Do note that it is possible that this
* user data is not always there if the Lvgl Object has not been wrapped
* by UIElement
*
* @tparam UIElemTy - Type of element you want to cast to
* @param aLvglObject - object to extract User data from
* @return UIElemTy - object stored in user data (See constructor of
* UIElement)
*/
template <class UIElemTy>
UIElemTy UIElement::GetElement(lv_obj_t *aLvglObject) {
auto UIElement = lv_obj_get_user_data(aLvglObject);
if (UIElement) {
return static_cast<UIElemTy>(UIElement);
}
return nullptr;
}
} // namespace UI