From 6e63ccb61d421a2ad85606140876f2d757dd9751 Mon Sep 17 00:00:00 2001 From: Nicolas SANS Date: Fri, 10 Nov 2023 16:41:30 +0100 Subject: [PATCH] Ajout de la library WarehouseGUI --- .gitignore | 1 + lib/WarehouseGUI/src/GUIScreen.cpp | 56 ++++++++++++++++++ lib/WarehouseGUI/src/GUIScreen.h | 35 ++++++++++++ lib/WarehouseGUI/src/GUIWidget.cpp | 33 +++++++++++ lib/WarehouseGUI/src/GUIWidget.h | 35 ++++++++++++ lib/WarehouseGUI/src/WarehouseGUI.cpp | 82 +++++++++++++++++++++++++++ lib/WarehouseGUI/src/WarehouseGUI.h | 29 ++++++++++ 7 files changed, 271 insertions(+) create mode 100644 lib/WarehouseGUI/src/GUIScreen.cpp create mode 100644 lib/WarehouseGUI/src/GUIScreen.h create mode 100644 lib/WarehouseGUI/src/GUIWidget.cpp create mode 100644 lib/WarehouseGUI/src/GUIWidget.h create mode 100644 lib/WarehouseGUI/src/WarehouseGUI.cpp create mode 100644 lib/WarehouseGUI/src/WarehouseGUI.h diff --git a/.gitignore b/.gitignore index 53072ca..abe443e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ # Aptatio/Platformio specifics secrets.ini +.idea \ No newline at end of file diff --git a/lib/WarehouseGUI/src/GUIScreen.cpp b/lib/WarehouseGUI/src/GUIScreen.cpp new file mode 100644 index 0000000..3c3691b --- /dev/null +++ b/lib/WarehouseGUI/src/GUIScreen.cpp @@ -0,0 +1,56 @@ +#include +#include +#include "GUIScreen.h" + +// Abstract AGuiScreen definition + +gui::AGUIScreen::AGUIScreen() { + std::cout << "Hello form AGUIScreen" << "\n"; + this->widgets = std::vector(); +} + +int gui::AGUIScreen::update() { + std::sort(widgets.begin(), widgets.end(), [](AGUIWidget* aWidget, AGUIWidget* bWidget) { + return aWidget->getLayer() < bWidget->getLayer(); + }); + for (auto *widget: widgets) { + widget->update(); + } + return (0); +} + +int gui::AGUIScreen::addWidget(gui::AGUIWidget *widget) { + this->widgets.push_back(widget); + return 0; +} + +int gui::AGUIScreen::removeWidget(gui::AGUIWidget *_widget) { + return 0; +} + +int gui::AGUIScreen::removeWidget(int _index) { + return 0; +} + +int gui::AGUIScreen::removeWidget(const char *_name) { + return 0; +} + +std::vector gui::AGUIScreen::getWidgets() const { + return this->widgets; +} + + +// DefaultGuiScreen definition + +gui::DefaultGuiScreen::DefaultGuiScreen() { + std::cout << "Hello form DefaultGuiScreen" << "\n"; +} + +int gui::DefaultGuiScreen::setup() { + return 0; +} + +const char *gui::DefaultGuiScreen::getName() const { + return "DefaultGuiScreen"; +} diff --git a/lib/WarehouseGUI/src/GUIScreen.h b/lib/WarehouseGUI/src/GUIScreen.h new file mode 100644 index 0000000..1bc9065 --- /dev/null +++ b/lib/WarehouseGUI/src/GUIScreen.h @@ -0,0 +1,35 @@ +#ifndef T_IOT_901_CONVOYOR_GUICONTAINER_H +#define T_IOT_901_CONVOYOR_GUICONTAINER_H + +#include +#include "GUIWidget.h" + +namespace gui { + + class AGUIScreen { + public: + AGUIScreen(); + ~AGUIScreen() = default; + virtual const char* getName() const = 0; + virtual int setup() = 0; + int update(); + int addWidget(AGUIWidget* widget); + int removeWidget(AGUIWidget* widget); + int removeWidget(int index); + int removeWidget(const char* name); + std::vector getWidgets() const; + protected: + std::vector widgets; + }; + + class DefaultGuiScreen : public AGUIScreen { + public: + DefaultGuiScreen(); + ~DefaultGuiScreen() = default; + const char* getName() const override; + int setup() override; + }; + +} + +#endif //T_IOT_901_CONVOYOR_GUICONTAINER_H \ No newline at end of file diff --git a/lib/WarehouseGUI/src/GUIWidget.cpp b/lib/WarehouseGUI/src/GUIWidget.cpp new file mode 100644 index 0000000..d820330 --- /dev/null +++ b/lib/WarehouseGUI/src/GUIWidget.cpp @@ -0,0 +1,33 @@ +#include "GUIWidget.h" + +gui::AGUIWidget::AGUIWidget(int x, int y, int width, int height, int layer) : layer(layer) { + this->position.x = x; + this->position.y = y; + this->size.width = width; + this->size.height = height; +} + +int gui::AGUIWidget::getLayer() const { + return this->layer; +} + +void gui::AGUIWidget::setLayer(int newLayer) { + this->layer = newLayer; +} + +GuiWidgetPosition gui::AGUIWidget::getPosition() const { + return this->position; +} + +void gui::AGUIWidget::setPosition(GuiWidgetPosition pos) { + this->position = pos; +} + +GuiWidgetSize gui::AGUIWidget::getSize() const { + return this->size; +} + +void gui::AGUIWidget::setSize(GuiWidgetSize newSize) { + this->size = newSize; +} + diff --git a/lib/WarehouseGUI/src/GUIWidget.h b/lib/WarehouseGUI/src/GUIWidget.h new file mode 100644 index 0000000..d6f1b8c --- /dev/null +++ b/lib/WarehouseGUI/src/GUIWidget.h @@ -0,0 +1,35 @@ +#ifndef T_IOT_901_CONVOYOR_GUIWIDGET_H +#define T_IOT_901_CONVOYOR_GUIWIDGET_H + +struct GuiWidgetPosition { + int x; + int y; +}; + +struct GuiWidgetSize { + int width; + int height; +}; + +namespace gui { + class AGUIWidget { + public: + AGUIWidget(int x, int y, int width, int height, int layer = 0); + ~AGUIWidget() = default; + virtual const char* getName() const = 0; + virtual void setup() = 0; + virtual void update() = 0; + int getLayer() const; + void setLayer(int layer); + GuiWidgetPosition getPosition() const; + void setPosition(GuiWidgetPosition position); + GuiWidgetSize getSize() const; + void setSize(GuiWidgetSize size); + private: + GuiWidgetPosition position{}; + GuiWidgetSize size{}; + int layer; + }; +} + +#endif //T_IOT_901_CONVOYOR_GUIWIDGET_H diff --git a/lib/WarehouseGUI/src/WarehouseGUI.cpp b/lib/WarehouseGUI/src/WarehouseGUI.cpp new file mode 100644 index 0000000..407db1f --- /dev/null +++ b/lib/WarehouseGUI/src/WarehouseGUI.cpp @@ -0,0 +1,82 @@ +#include "WarehouseGUI.h" +#include "M5Stack.h" + +using namespace gui; + +WarehouseGUI::WarehouseGUI() { + this->screens = std::vector(); +} + +WarehouseGUI::~WarehouseGUI() = default; + +int WarehouseGUI::addScreens(gui::AGUIScreen *screen) { + this->screens.push_back(screen); + return 0; +} + +int WarehouseGUI::removeScreens(gui::AGUIScreen *screen) { + for (int i = 0; i < this->screens.size(); ++i) { + if (this->screens[i] == screen) { + this->screens.erase(this->screens.begin() + i); + return 0; + } + } + return -1; +} + +int WarehouseGUI::removeScreens(int index) { + if (index < 0 || index >= this->screens.size()) { + return -1; + } + this->screens.erase(this->screens.begin() + index); + return 0; +} + +int WarehouseGUI::removeScreens(const char *name) { + for (int i = 0; i < this->screens.size(); ++i) { + if (this->screens[i]->getName() == name) { + this->screens.erase(this->screens.begin() + i); + return 0; + } + } + return -1; +} + +int WarehouseGUI::update() { + return this->current_screen->update(); +} + +int WarehouseGUI::setup() { + if (this->current_screen == nullptr) { + return -1; + } + return this->current_screen->setup(); +} + +int WarehouseGUI::changeCurrentScreen(const char *name) { + for (auto *screen : this->screens) { + if (screen->getName() == name) { + this->current_screen = screen; + this->current_screen->setup(); + return 0; + } + } + return -1; +} + +int WarehouseGUI::changeCurrentScreen(int index) { + if (index < 0 || index >= this->screens.size()) { + return -1; + } + this->current_screen = this->screens[index]; + this->current_screen->setup(); + return 0; +} + +std::vector gui::WarehouseGUI::getAllScreens() { + return this->screens; +} + +AGUIScreen *gui::WarehouseGUI::getCurrentScreen() { + return this->current_screen; +} diff --git a/lib/WarehouseGUI/src/WarehouseGUI.h b/lib/WarehouseGUI/src/WarehouseGUI.h new file mode 100644 index 0000000..9bedc4d --- /dev/null +++ b/lib/WarehouseGUI/src/WarehouseGUI.h @@ -0,0 +1,29 @@ +#ifndef T_IOT_901_CONVOYOR_WAREHOUSEGUI_H +#define T_IOT_901_CONVOYOR_WAREHOUSEGUI_H + + +#include +#include "GUIScreen.h" + +namespace gui { + class WarehouseGUI { + public: + WarehouseGUI(); + ~WarehouseGUI(); + int addScreens(AGUIScreen* screen); + int removeScreens(AGUIScreen* screen); + int removeScreens(int index); + int removeScreens(const char *name); + int changeCurrentScreen(const char* name); + int changeCurrentScreen(int index); + std::vector getAllScreens(); + AGUIScreen* getCurrentScreen(); + int setup(); + int update(); + private: + std::vector screens; + AGUIScreen *current_screen{nullptr}; + }; +} // namespace gui + +#endif //T_IOT_901_CONVOYOR_WAREHOUSEGUI_H -- 2.47.1