Move logic related to owning widgets into its own class to prepare for a widget type that can own other widgets.
This commit is contained in:
parent
ddbfc13e55
commit
58787f5bf0
5 changed files with 101 additions and 77 deletions
55
Platformio/OmoteUI/core/WidgetContainer.cpp
Normal file
55
Platformio/OmoteUI/core/WidgetContainer.cpp
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include "WidgetContainer.hpp"
|
||||||
|
|
||||||
|
using namespace UI;
|
||||||
|
|
||||||
|
WidgetContainer::WidgetContainer(lv_obj_t *aLvglSelf, ID aID)
|
||||||
|
: UIElement(aLvglSelf, aID) {}
|
||||||
|
|
||||||
|
UI::Widget::Base *WidgetContainer::AddWidget(Widget::Base::Ptr aWidget) {
|
||||||
|
AddElement(aWidget.get());
|
||||||
|
mWidgets.push_back(std::move(aWidget));
|
||||||
|
return mWidgets[mWidgets.size() - 1].get();
|
||||||
|
}
|
||||||
|
|
||||||
|
UI::Widget::Base::Ptr
|
||||||
|
WidgetContainer::RemoveWidget(Widget::Base *aWidgetRefrence) {
|
||||||
|
auto widgetToRemoveIter = std::find_if(
|
||||||
|
mWidgets.begin(), mWidgets.end(), [aWidgetRefrence](auto &aWidget) {
|
||||||
|
return aWidget.get() == aWidgetRefrence;
|
||||||
|
});
|
||||||
|
if (widgetToRemoveIter != mWidgets.end()) {
|
||||||
|
auto widget = std::move(*widgetToRemoveIter);
|
||||||
|
mWidgets.erase(widgetToRemoveIter);
|
||||||
|
return widget;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WidgetContainer::KeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
|
||||||
|
if (OnKeyEvent(aKeyEvent)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (auto &widget : mWidgets) {
|
||||||
|
auto used = widget->KeyEvent(aKeyEvent);
|
||||||
|
if (used) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
void WidgetContainer::OnShow() {
|
||||||
|
for (auto &widget : mWidgets) {
|
||||||
|
if (widget->IsVisible()) {
|
||||||
|
widget->OnShow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void WidgetContainer::OnHide() {
|
||||||
|
for (auto &widget : mWidgets) {
|
||||||
|
if (widget->IsVisible()) {
|
||||||
|
widget->OnHide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
38
Platformio/OmoteUI/core/WidgetContainer.hpp
Normal file
38
Platformio/OmoteUI/core/WidgetContainer.hpp
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#pragma once
|
||||||
|
#include "UIElement.hpp"
|
||||||
|
#include "WidgetBase.hpp"
|
||||||
|
|
||||||
|
namespace UI {
|
||||||
|
|
||||||
|
class WidgetContainer : public UIElement {
|
||||||
|
public:
|
||||||
|
WidgetContainer(lv_obj_t *aLvglSelf, ID aID);
|
||||||
|
|
||||||
|
template <class ElementTy> ElementTy *AddWidget(Widget::Base::Ptr aWidget);
|
||||||
|
|
||||||
|
Widget::Base *AddWidget(Widget::Base::Ptr aWidget);
|
||||||
|
Widget::Base::Ptr RemoveWidget(Widget::Base *aWidgetRefrence);
|
||||||
|
size_t GetNumWidgets() { return mWidgets.size(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// @brief Forward To widgets that are visible
|
||||||
|
void OnShow() override;
|
||||||
|
|
||||||
|
/// @brief Forward To widgets that are visible
|
||||||
|
void OnHide() override;
|
||||||
|
|
||||||
|
/// @brief Pass Key Events to widgets until one is handled
|
||||||
|
/// TODO: consider an ability to have a selected widget be the first
|
||||||
|
/// one to get events.
|
||||||
|
bool KeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<Widget::Base::Ptr> mWidgets;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class ElementTy>
|
||||||
|
ElementTy *WidgetContainer::AddWidget(Widget::Base::Ptr aWidget) {
|
||||||
|
return static_cast<ElementTy *>(AddWidget(std::move(aWidget)));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace UI
|
|
@ -6,58 +6,8 @@ using namespace UI::Page;
|
||||||
Base::Base(ID aID)
|
Base::Base(ID aID)
|
||||||
: Base(lv_obj_create(Screen::BackgroundScreen::getLvInstance()), aID) {}
|
: Base(lv_obj_create(Screen::BackgroundScreen::getLvInstance()), aID) {}
|
||||||
|
|
||||||
Base::Base(lv_obj_t *aLvglSelf, ID aID) : UIElement(aLvglSelf, aID) {
|
Base::Base(lv_obj_t *aLvglSelf, ID aID) : WidgetContainer(aLvglSelf, aID) {
|
||||||
SetHeight(lv_pct(100));
|
SetHeight(lv_pct(100));
|
||||||
SetWidth(lv_pct(100));
|
SetWidth(lv_pct(100));
|
||||||
SetPadding(Padding()); // Set Padding to default
|
SetPadding(Padding()); // Set Padding to default
|
||||||
}
|
}
|
||||||
// Return non owning refrence to widget
|
|
||||||
UI::Widget::Base *Base::AddWidget(Widget::Base::Ptr aWidget) {
|
|
||||||
AddElement(aWidget.get());
|
|
||||||
mWidgets.push_back(std::move(aWidget));
|
|
||||||
return mWidgets[mWidgets.size() - 1].get();
|
|
||||||
}
|
|
||||||
|
|
||||||
UI::Widget::Base::Ptr Base::RemoveWidget(Widget::Base *aWidgetRefrence) {
|
|
||||||
auto widgetToRemoveIter = std::find_if(
|
|
||||||
mWidgets.begin(), mWidgets.end(), [aWidgetRefrence](auto &aWidget) {
|
|
||||||
return aWidget.get() == aWidgetRefrence;
|
|
||||||
});
|
|
||||||
if (widgetToRemoveIter != mWidgets.end()) {
|
|
||||||
auto widget = std::move(*widgetToRemoveIter);
|
|
||||||
mWidgets.erase(widgetToRemoveIter);
|
|
||||||
return widget;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Base::KeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) {
|
|
||||||
if (OnKeyEvent(aKeyEvent)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (auto &widget : mWidgets) {
|
|
||||||
auto used = widget->KeyEvent(aKeyEvent);
|
|
||||||
if (used) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool Base::OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) { return false; };
|
|
||||||
|
|
||||||
void Base::OnShow() {
|
|
||||||
for (auto &widget : mWidgets) {
|
|
||||||
if (widget->IsVisible()) {
|
|
||||||
widget->OnShow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void Base::OnHide() {
|
|
||||||
for (auto &widget : mWidgets) {
|
|
||||||
if (widget->IsVisible()) {
|
|
||||||
widget->OnHide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,6 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "UIElement.hpp"
|
#include "UIElement.hpp"
|
||||||
#include "WidgetBase.hpp"
|
#include "WidgetContainer.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -10,7 +10,7 @@ class PopUpScreen;
|
||||||
namespace UI::Page {
|
namespace UI::Page {
|
||||||
class Tab;
|
class Tab;
|
||||||
class TabView;
|
class TabView;
|
||||||
class Base : public UIElement {
|
class Base : public WidgetContainer {
|
||||||
// Classes that Own Pages
|
// Classes that Own Pages
|
||||||
friend Tab; // Allow Tab to Forward all Key Events to its page
|
friend Tab; // Allow Tab to Forward all Key Events to its page
|
||||||
friend TabView; // Allow Tab view to call OnShow and OnHide Since it can show
|
friend TabView; // Allow Tab view to call OnShow and OnHide Since it can show
|
||||||
|
@ -25,32 +25,13 @@ public:
|
||||||
Base(lv_obj_t *aLvglSelf, ID aID);
|
Base(lv_obj_t *aLvglSelf, ID aID);
|
||||||
virtual ~Base() = default;
|
virtual ~Base() = default;
|
||||||
|
|
||||||
template <class ElementTy> ElementTy *AddWidget(Widget::Base::Ptr aWidget);
|
|
||||||
|
|
||||||
Widget::Base *AddWidget(Widget::Base::Ptr aWidget);
|
|
||||||
Widget::Base::Ptr RemoveWidget(Widget::Base *aWidgetRefrence);
|
|
||||||
size_t GetNumWidgets() { return mWidgets.size(); }
|
|
||||||
|
|
||||||
// Override to have a title associated with your page.
|
// Override to have a title associated with your page.
|
||||||
virtual std::string GetTitle() { return ""; };
|
virtual std::string GetTitle() { return ""; };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// @brief Forward To widgets that are visible
|
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) { return false; };
|
||||||
void OnShow() override;
|
|
||||||
|
|
||||||
/// @brief Forward To widgets that are visible
|
|
||||||
void OnHide() override;
|
|
||||||
|
|
||||||
bool KeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;
|
|
||||||
bool OnKeyEvent(KeyPressAbstract::KeyEvent aKeyEvent) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Widget::Base::Ptr> mWidgets;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class ElementTy>
|
|
||||||
ElementTy *Base::AddWidget(Widget::Base::Ptr aWidget) {
|
|
||||||
return static_cast<ElementTy *>(AddWidget(std::move(aWidget)));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace UI::Page
|
} // namespace UI::Page
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace UI {
|
namespace UI {
|
||||||
namespace Page {
|
|
||||||
class Base;
|
class WidgetContainer;
|
||||||
}
|
|
||||||
namespace Screen {
|
namespace Screen {
|
||||||
class PopUpScreen;
|
class PopUpScreen;
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ namespace UI::Widget {
|
||||||
|
|
||||||
class Base : public UIElement {
|
class Base : public UIElement {
|
||||||
// Classes that Own Widgets
|
// Classes that Own Widgets
|
||||||
friend class UI::Page::Base;
|
friend class UI::WidgetContainer;
|
||||||
friend class UI::Screen::PopUpScreen;
|
friend class UI::Screen::PopUpScreen;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Reference in a new issue