diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index d9b6b9a4..53e1d67d 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -1,8 +1,20 @@ add_files( APP_FILES + qt/element/QtArea.cpp + qt/element/QtArea.h + qt/element/QtCanvas.cpp + qt/element/QtCanvas.h + + qt/QtWidgetWrapper.cpp + qt/QtWidgetWrapper.h qt/QtElementFactory.cpp qt/QtElementFactory.h + qt/QtWindow.cpp + qt/QtWindow.h + + utility/utilityQt.cpp + utility/utilityQt.h includesWindows.h main.cpp diff --git a/src/app/main.cpp b/src/app/main.cpp index 75100ef0..ac001b85 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -2,21 +2,25 @@ #include #include +#include +#include #include "Application.h" #include "includes.h" +#include "qt/element/QtArea.h" +#include "qt/element/QtCanvas.h" #include "qt/QtElementFactory.h" +#include "qt/QtWindow.h" int main(int argv, char **args) { QApplication qtApp(argv, args); std::shared_ptr elementFactory = std::make_shared(); - std::shared_ptr app = Application::create(elementFactory); - app->loadProject(); + std::shared_ptr window = std::make_shared(); - QTextEdit textEdit; - textEdit.show(); + std::shared_ptr app = Application::create(elementFactory, window); + app->loadProject(); return qtApp.exec(); } \ No newline at end of file diff --git a/src/app/qt/QtElementFactory.cpp b/src/app/qt/QtElementFactory.cpp index f1c91017..dc811450 100644 --- a/src/app/qt/QtElementFactory.cpp +++ b/src/app/qt/QtElementFactory.cpp @@ -1,5 +1,9 @@ #include "qt/QtElementFactory.h" +#include "qt/element/QtArea.h" +#include "qt/element/QtCanvas.h" +#include "qt/QtWindow.h" + QtElementFactory::QtElementFactory() { } @@ -7,3 +11,15 @@ QtElementFactory::QtElementFactory() QtElementFactory::~QtElementFactory() { } + +std::shared_ptr QtElementFactory::createArea() const +{ + return std::make_shared(); +} + +std::shared_ptr QtElementFactory::createCanvas(std::shared_ptr window) const +{ + std::shared_ptr canvas = std::make_shared(); + window->setCanvas(canvas); + return canvas; +} diff --git a/src/app/qt/QtElementFactory.h b/src/app/qt/QtElementFactory.h index b2e574fe..9e82672d 100644 --- a/src/app/qt/QtElementFactory.h +++ b/src/app/qt/QtElementFactory.h @@ -3,11 +3,18 @@ #include "gui/GuiElementFactory.h" +class GuiArea; +class GuiCanvas; +class GuiWindow; + class QtElementFactory: public GuiElementFactory { public: QtElementFactory(); - ~QtElementFactory(); + virtual ~QtElementFactory(); + + virtual std::shared_ptr createArea() const; + virtual std::shared_ptr createCanvas(std::shared_ptr window) const; }; # endif // QT_ELEMENT_FACTORY_H diff --git a/src/app/qt/QtWidgetWrapper.cpp b/src/app/qt/QtWidgetWrapper.cpp new file mode 100644 index 00000000..eaec0dd2 --- /dev/null +++ b/src/app/qt/QtWidgetWrapper.cpp @@ -0,0 +1,38 @@ +#include "qt/QtWidgetWrapper.h" + +#include "gui/GuiElement.h" +#include "utility/logging/logging.h" + +std::shared_ptr QtWidgetWrapper::getWidgetOfElement(std::shared_ptr element) +{ + return getWidgetOfElement(element.get()); +} + +std::shared_ptr QtWidgetWrapper::getWidgetOfElement(GuiElement* element) +{ + std::shared_ptr widget; + std::shared_ptr qtWidgetWrapper = std::dynamic_pointer_cast(element->getWidgetWrapper()); + if (!qtWidgetWrapper || qtWidgetWrapper.use_count() == 0) + { + LOG_ERROR("Trying to get the qt widget of non qt gui element."); + } + else + { + widget = qtWidgetWrapper->getWidget(); + } + return widget; +} + +QtWidgetWrapper::QtWidgetWrapper(std::shared_ptr widget) + : m_widget(widget) +{ +} + +QtWidgetWrapper::~QtWidgetWrapper() +{ +} + +std::shared_ptr QtWidgetWrapper::getWidget() +{ + return m_widget; +} diff --git a/src/app/qt/QtWidgetWrapper.h b/src/app/qt/QtWidgetWrapper.h new file mode 100644 index 00000000..c9674404 --- /dev/null +++ b/src/app/qt/QtWidgetWrapper.h @@ -0,0 +1,27 @@ +#ifndef QT_WIDGET_WRAPPER_H +#define QT_WIDGET_WRAPPER_H + +#include + +#include + +#include "gui/WidgetWrapper.h" + +class GuiElement; + +class QtWidgetWrapper: public WidgetWrapper +{ +public: + static std::shared_ptr getWidgetOfElement(std::shared_ptr element); + static std::shared_ptr getWidgetOfElement(GuiElement* element); + + QtWidgetWrapper(std::shared_ptr widget); + virtual ~QtWidgetWrapper(); + + std::shared_ptr getWidget(); // not const because returned widget can be changed. + +private: + std::shared_ptr m_widget; +}; + +#endif // QT_WIDGET_WRAPPER_H diff --git a/src/app/qt/QtWindow.cpp b/src/app/qt/QtWindow.cpp new file mode 100644 index 00000000..1230a6e0 --- /dev/null +++ b/src/app/qt/QtWindow.cpp @@ -0,0 +1,19 @@ +#include "qt/QtWindow.h" + +#include "gui/GuiCanvas.h" +#include "QtWidgetWrapper.h" + +QtWindow::QtWindow() +{ + m_window.setObjectName("QtWindow"); + m_window.show(); +} + +QtWindow::~QtWindow() +{ +} + +void QtWindow::setCanvas(std::shared_ptr canvas) +{ + m_window.setCentralWidget(QtWidgetWrapper::getWidgetOfElement(canvas).get()); +} diff --git a/src/app/qt/QtWindow.h b/src/app/qt/QtWindow.h new file mode 100644 index 00000000..b11ad4e1 --- /dev/null +++ b/src/app/qt/QtWindow.h @@ -0,0 +1,24 @@ +#ifndef QT_WINDOW_H +#define QT_WINDOW_H + +#include + +#include + +#include "gui/GuiWindow.h" + +class GuiCanvas; + +class QtWindow: public GuiWindow +{ +public: + QtWindow(); + ~QtWindow(); + + void setCanvas(std::shared_ptr canvas); + +private: + QMainWindow m_window; +}; + +# endif // QT_WINDOW_H diff --git a/src/app/qt/element/QtArea.cpp b/src/app/qt/element/QtArea.cpp new file mode 100644 index 00000000..d51dd4d3 --- /dev/null +++ b/src/app/qt/element/QtArea.cpp @@ -0,0 +1,43 @@ +#include "qt/element/QtArea.h" + +#include + +#include "qt/QtWidgetWrapper.h" +#include "utility/utilityQt.h" + +QtArea::QtArea() + : GuiArea(std::make_shared(std::make_shared())) +{ +} + +QtArea::~QtArea() +{ +} + +void QtArea::setPosition(Vec2i position) +{ +} + +Vec2i QtArea::getPosition() const +{ + return Vec2i(); +} + +void QtArea::setSize(Vec2i size) +{ +} + +Vec2i QtArea::getSize() const +{ + return Vec2i(); +} + +void QtArea::setBackgroundColor(Colori color) +{ + utility::setWidgetBackgroundColor(getWidget(), color); +} + +std::shared_ptr QtArea::getWidget() +{ + return QtWidgetWrapper::getWidgetOfElement(this); +} diff --git a/src/app/qt/element/QtArea.h b/src/app/qt/element/QtArea.h new file mode 100644 index 00000000..c8d234af --- /dev/null +++ b/src/app/qt/element/QtArea.h @@ -0,0 +1,25 @@ +#ifndef QT_AREA_H +#define QT_AREA_H + +#include + +#include "gui/GuiArea.h" + +class QtArea: public GuiArea +{ +public: + QtArea(); + virtual ~QtArea(); + + virtual void setPosition(Vec2i position); + virtual Vec2i getPosition() const; + virtual void setSize(Vec2i size); + virtual Vec2i getSize() const; + + virtual void setBackgroundColor(Colori color); + +private: + std::shared_ptr getWidget(); +}; + +# endif // QT_AREA_H diff --git a/src/app/qt/element/QtCanvas.cpp b/src/app/qt/element/QtCanvas.cpp new file mode 100644 index 00000000..93e05fe0 --- /dev/null +++ b/src/app/qt/element/QtCanvas.cpp @@ -0,0 +1,59 @@ +#include "qt/element/QtCanvas.h" + +#include +#include + +#include "qt/QtWidgetWrapper.h" +#include "utility/utilityQt.h" + +QtCanvas::QtCanvas() + : GuiCanvas(std::make_shared(std::make_shared())) +{ + QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom); // gets deleted by qt + getWidget()->setLayout(layout); +} + +QtCanvas::~QtCanvas() +{ +} + +void QtCanvas::addChild(std::shared_ptr element) +{ + getWidget()->layout()->addWidget(QtWidgetWrapper::getWidgetOfElement(element).get()); +} + +void QtCanvas::removeChild(std::shared_ptr element) +{ + std::shared_ptr widgetToRemove = QtWidgetWrapper::getWidgetOfElement(element); + getWidget()->layout()->removeWidget(widgetToRemove.get()); + widgetToRemove->setGeometry(0, 0, 0, 0); +} + +void QtCanvas::setPosition(Vec2i position) +{ +} + +Vec2i QtCanvas::getPosition() const +{ + return Vec2i(); +} + +void QtCanvas::setSize(Vec2i size) +{ +} + +Vec2i QtCanvas::getSize() const +{ + return Vec2i(); +} + +void QtCanvas::setBackgroundColor(Colori color) +{ + utility::setWidgetBackgroundColor(getWidget(), color); +} + +std::shared_ptr QtCanvas::getWidget() +{ + return QtWidgetWrapper::getWidgetOfElement(this); +} + diff --git a/src/app/qt/element/QtCanvas.h b/src/app/qt/element/QtCanvas.h new file mode 100644 index 00000000..c6a8411a --- /dev/null +++ b/src/app/qt/element/QtCanvas.h @@ -0,0 +1,29 @@ +#ifndef QT_CANVAS_H +#define QT_CANVAS_H + +#include +#include + +#include "gui/GuiCanvas.h" + +class QtCanvas: public GuiCanvas +{ +public: + QtCanvas(); + virtual ~QtCanvas(); + + virtual void addChild(std::shared_ptr element); + virtual void removeChild(std::shared_ptr element); + + virtual void setPosition(Vec2i position); + virtual Vec2i getPosition() const; + virtual void setSize(Vec2i size); + virtual Vec2i getSize() const; + + virtual void setBackgroundColor(Colori color); + +private: + std::shared_ptr getWidget(); +}; + +# endif // QT_CANVAS_H diff --git a/src/app/utility/utilityQt.cpp b/src/app/utility/utilityQt.cpp new file mode 100644 index 00000000..db4e9363 --- /dev/null +++ b/src/app/utility/utilityQt.cpp @@ -0,0 +1,13 @@ +#include "utilityQt.h" + +namespace utility +{ + void setWidgetBackgroundColor(std::shared_ptr widget, const Colori& color) + { + QPalette palette = widget->palette(); + palette.setColor(widget->backgroundRole(), QColor(color.r, color.g, color.b, color.a)); + widget->setPalette(palette); + widget->setAutoFillBackground(true); + } +} + diff --git a/src/app/utility/utilityQt.h b/src/app/utility/utilityQt.h new file mode 100644 index 00000000..9b7f8101 --- /dev/null +++ b/src/app/utility/utilityQt.h @@ -0,0 +1,14 @@ +#ifndef UTILITY_QT_H +#define UTILITY_QT_H + +#include +#include + +#include "utility/math/Color.h" + +namespace utility +{ + void setWidgetBackgroundColor(std::shared_ptr widget, const Colori& color); +} + +# endif // UTILITY_QT_H diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 2da725d0..a028a83f 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -1,20 +1,24 @@ #include "Application.h" +#include "gui/GuiCanvas.h" #include "utility/logging/ConsoleLogger.h" #include "utility/logging/LogManager.h" -std::shared_ptr Application::create(std::shared_ptr guiElementFactory) +std::shared_ptr Application::create(std::shared_ptr guiElementFactory, std::shared_ptr window) { + std::shared_ptr consoleLogger = std::make_shared(); + LogManager::getInstance()->addLogger(consoleLogger); + + std::shared_ptr canvas = guiElementFactory->createCanvas(window); + canvas->setBackgroundColor(255, 0, 0, 255); + std::shared_ptr ptr(new Application()); - ptr->m_viewManager = std::make_shared(); + ptr->m_viewManager = std::make_shared(canvas); ptr->m_codeAccess = std::make_shared(); ptr->m_graphAccess = std::make_shared(); ptr->m_componentManager = ComponentManager::create(ptr->m_viewManager, guiElementFactory, ptr->m_codeAccess, ptr->m_graphAccess); - std::shared_ptr consoleLogger = std::make_shared(); - LogManager::getInstance()->addLogger(consoleLogger); - return ptr; } @@ -28,6 +32,7 @@ Application::~Application() void Application::loadProject() { + m_componentManager->setup(); m_project = Project::create(m_codeAccess, m_graphAccess); m_project->parseCode(); diff --git a/src/lib/Application.h b/src/lib/Application.h index 42ed2492..af82c237 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -13,7 +13,7 @@ class Application { public: - static std::shared_ptr create(std::shared_ptr guiElementFactory); + static std::shared_ptr create(std::shared_ptr guiElementFactory, std::shared_ptr window); ~Application(); diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 291bebe4..09a6eb50 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -20,9 +20,11 @@ add_files( component/controller/CodeController.h component/controller/Controller.cpp component/controller/Controller.h + component/controller/DummyController.cpp + component/controller/DummyController.h - component/view/CodeView.cpp - component/view/CodeView.h + component/view/DummyView.cpp + component/view/DummyView.h component/view/View.cpp component/view/View.h component/view/ViewManager.cpp @@ -67,10 +69,22 @@ add_files( data/TextLocationLine.cpp data/TextLocationLine.h + gui/GuiArea.cpp + gui/GuiArea.h + gui/GuiCanvas.cpp + gui/GuiCanvas.h + gui/GuiContainer.cpp + gui/GuiContainer.h + gui/GuiControl.cpp + gui/GuiControl.h gui/GuiElement.cpp gui/GuiElement.h gui/GuiElementFactory.cpp gui/GuiElementFactory.h + gui/GuiWindow.cpp + gui/GuiWindow.h + gui/WidgetWrapper.cpp + gui/WidgetWrapper.h utility/logging/ConsoleLogger.cpp utility/logging/ConsoleLogger.h @@ -84,11 +98,14 @@ add_files( utility/logging/LogManagerImplementation.cpp utility/logging/LogManagerImplementation.h utility/logging/LogMessage.h - + + utility/math/Color.h utility/math/Vector2.h + utility/math/Vector4.h utility/ConfigManager.cpp utility/ConfigManager.h + utility/Vector.h Application.cpp Application.h diff --git a/src/lib/component/Component.cpp b/src/lib/component/Component.cpp index 4e309b78..a4823ee6 100644 --- a/src/lib/component/Component.cpp +++ b/src/lib/component/Component.cpp @@ -1,8 +1,8 @@ #include "component/Component.h" -Component::Component(const std::shared_ptr& controller, const std::shared_ptr& view) -: m_controller(controller) -, m_view(view) +Component::Component(std::shared_ptr view, std::shared_ptr controller) + : m_controller(controller) + , m_view(view) { } diff --git a/src/lib/component/Component.h b/src/lib/component/Component.h index 25a44484..3a32b501 100644 --- a/src/lib/component/Component.h +++ b/src/lib/component/Component.h @@ -9,7 +9,7 @@ class Component { public: - Component(const std::shared_ptr& controller, const std::shared_ptr& view); + Component(std::shared_ptr view, std::shared_ptr controller); ~Component(); diff --git a/src/lib/component/ComponentFactory.cpp b/src/lib/component/ComponentFactory.cpp index 33ef6ea1..5a7bed9c 100644 --- a/src/lib/component/ComponentFactory.cpp +++ b/src/lib/component/ComponentFactory.cpp @@ -1,10 +1,13 @@ #include "component/ComponentFactory.h" +#include "component/view/DummyView.h" +#include "component/controller/DummyController.h" + std::shared_ptr ComponentFactory::create( - const std::shared_ptr& viewManager, - const std::shared_ptr& guiElementFactory, - const std::shared_ptr& codeAccess, - const std::shared_ptr& graphAccess) + std::shared_ptr viewManager, + std::shared_ptr guiElementFactory, + std::shared_ptr codeAccess, + std::shared_ptr graphAccess) { std::shared_ptr ptr(new ComponentFactory()); ptr->m_viewManger = viewManager; @@ -14,10 +17,19 @@ std::shared_ptr ComponentFactory::create( return ptr; } -ComponentFactory::ComponentFactory() -{ -} - ComponentFactory::~ComponentFactory() { } + +std::shared_ptr ComponentFactory::createDummyComponent() +{ + std::shared_ptr view = std::make_shared(m_viewManger, m_guiElementFactory); + std::shared_ptr controller = std::make_shared(); + + std::shared_ptr component = std::make_shared(view, controller); + return component; +} + +ComponentFactory::ComponentFactory() +{ +} diff --git a/src/lib/component/ComponentFactory.h b/src/lib/component/ComponentFactory.h index 9e0281e0..73a1c6f2 100644 --- a/src/lib/component/ComponentFactory.h +++ b/src/lib/component/ComponentFactory.h @@ -13,13 +13,15 @@ class ComponentFactory { public: static std::shared_ptr create( - const std::shared_ptr& viewManager, - const std::shared_ptr& guiElementFactory, - const std::shared_ptr& codeAccess, - const std::shared_ptr& graphAccess); + std::shared_ptr viewManager, + std::shared_ptr guiElementFactory, + std::shared_ptr codeAccess, + std::shared_ptr graphAccess); ~ComponentFactory(); + std::shared_ptr createDummyComponent(); + private: ComponentFactory(); ComponentFactory(const ComponentFactory&); diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp index d4d605f2..dd926506 100644 --- a/src/lib/component/ComponentManager.cpp +++ b/src/lib/component/ComponentManager.cpp @@ -1,16 +1,21 @@ #include "component/ComponentManager.h" std::shared_ptr ComponentManager::create( - const std::shared_ptr& viewManager, - const std::shared_ptr& guiElementFactory, - const std::shared_ptr& codeAccess, - const std::shared_ptr& graphAccess) + std::shared_ptr viewManager, + std::shared_ptr guiElementFactory, + std::shared_ptr codeAccess, + std::shared_ptr graphAccess) { std::shared_ptr ptr(new ComponentManager()); ptr->m_componentFactory = ComponentFactory::create(viewManager, guiElementFactory, codeAccess, graphAccess); return ptr; } +void ComponentManager::setup() +{ + m_components.push_back(m_componentFactory->createDummyComponent()); +} + ComponentManager::ComponentManager() { } diff --git a/src/lib/component/ComponentManager.h b/src/lib/component/ComponentManager.h index 455b8003..905cc49f 100644 --- a/src/lib/component/ComponentManager.h +++ b/src/lib/component/ComponentManager.h @@ -15,13 +15,15 @@ class ComponentManager { public: static std::shared_ptr create( - const std::shared_ptr& viewManager, - const std::shared_ptr& guiElementFactory, - const std::shared_ptr& codeAccess, - const std::shared_ptr& graphAccess); + std::shared_ptr viewManager, + std::shared_ptr guiElementFactory, + std::shared_ptr codeAccess, + std::shared_ptr graphAccess); ~ComponentManager(); + void setup(); + private: ComponentManager(); ComponentManager(const ComponentManager&); diff --git a/src/lib/component/controller/DummyController.cpp b/src/lib/component/controller/DummyController.cpp new file mode 100644 index 00000000..6435691e --- /dev/null +++ b/src/lib/component/controller/DummyController.cpp @@ -0,0 +1 @@ +#include "component/controller/DummyController.h" diff --git a/src/lib/component/controller/DummyController.h b/src/lib/component/controller/DummyController.h new file mode 100644 index 00000000..e9a394ec --- /dev/null +++ b/src/lib/component/controller/DummyController.h @@ -0,0 +1,11 @@ +#ifndef DUMMY_CONTROLLER_H +#define DUMMY_CONTROLLER_H + +#include "component/controller/Controller.h" + +class DummyController: public Controller +{ +}; + + +#endif // DUMMY_CONTROLLER_H diff --git a/src/lib/component/view/CodeView.cpp b/src/lib/component/view/CodeView.cpp deleted file mode 100644 index 7c7afac5..00000000 --- a/src/lib/component/view/CodeView.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "component/view/CodeView.h" - diff --git a/src/lib/component/view/CodeView.h b/src/lib/component/view/CodeView.h deleted file mode 100644 index 422c1ca8..00000000 --- a/src/lib/component/view/CodeView.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef CODE_VIEW_H -#define CODE_VIEW_H - -#include "component/view/View.h" - -class CodeView: public View -{ -}; - - -#endif // CODE_VIEW_H diff --git a/src/lib/component/view/DummyView.cpp b/src/lib/component/view/DummyView.cpp new file mode 100644 index 00000000..b231ccc7 --- /dev/null +++ b/src/lib/component/view/DummyView.cpp @@ -0,0 +1,15 @@ +#include "component/view/DummyView.h" + +#include "gui/GuiArea.h" +#include "gui/GuiElementFactory.h" + +DummyView::DummyView(std::shared_ptr viewManager, std::shared_ptr guiElementFactory) + : View(viewManager, guiElementFactory->createArea(), Vec2i(100, 100)) + , m_guiElementFactory(guiElementFactory) +{ + getRootElement()->setBackgroundColor(0, 255, 0, 255); +} + +DummyView::~DummyView() +{ +} diff --git a/src/lib/component/view/DummyView.h b/src/lib/component/view/DummyView.h new file mode 100644 index 00000000..ffaa3c5b --- /dev/null +++ b/src/lib/component/view/DummyView.h @@ -0,0 +1,19 @@ +#ifndef DUMMY_VIEW_H +#define DUMMY_VIEW_H + +#include "component/view/View.h" + +class GuiElementFactory; + +class DummyView: public View +{ +public: + DummyView(std::shared_ptr viewManager, std::shared_ptr guiElementFactory); + virtual ~DummyView(); + +private: + std::shared_ptr m_guiElementFactory; +}; + + +#endif // DUMMY_VIEW_H diff --git a/src/lib/component/view/View.cpp b/src/lib/component/view/View.cpp index 83739f75..b9fdf0ae 100644 --- a/src/lib/component/view/View.cpp +++ b/src/lib/component/view/View.cpp @@ -1,5 +1,35 @@ #include "component/view/View.h" +#include "component/view/ViewManager.h" + +View::View(std::shared_ptr viewManager, std::shared_ptr rootElement, const Vec2i& minSize) + : m_viewManager(viewManager) + , m_rootElement(rootElement) + , m_minSize(minSize) +{ + m_viewManager->addView(this); +} View::~View() { + m_viewManager->removeView(this); +} + +std::shared_ptr View::getRootElement() +{ + return m_rootElement; +} + +int View::getMinWidth() const +{ + return m_minSize.x; +} + +int View::getMinHeight() const +{ + return m_minSize.y; +} + +Vec2i View::getMinSize() const +{ + return m_minSize; } diff --git a/src/lib/component/view/View.h b/src/lib/component/view/View.h index ace2ce39..539854f0 100644 --- a/src/lib/component/view/View.h +++ b/src/lib/component/view/View.h @@ -1,11 +1,29 @@ #ifndef VIEW_H #define VIEW_H +#include + +#include "utility/math/Vector2.h" + +class GuiElement; +class ViewManager; + class View { public: + View(std::shared_ptr viewManager, std::shared_ptr rootElement, const Vec2i& minSize); virtual ~View(); + + std::shared_ptr getRootElement(); + + int getMinWidth() const; + int getMinHeight() const; + Vec2i getMinSize() const; + +private: + std::shared_ptr m_viewManager; + std::shared_ptr m_rootElement; + Vec2i m_minSize; }; - #endif // VIEW_H diff --git a/src/lib/component/view/ViewManager.cpp b/src/lib/component/view/ViewManager.cpp index dfd19c31..446c3498 100644 --- a/src/lib/component/view/ViewManager.cpp +++ b/src/lib/component/view/ViewManager.cpp @@ -1,9 +1,29 @@ #include "component/view/ViewManager.h" -ViewManager::ViewManager() +#include "gui/GuiCanvas.h" +#include "View.h" + +ViewManager::ViewManager(std::shared_ptr canvas) + : m_canvas(canvas) { } ViewManager::~ViewManager() { } + +void ViewManager::addView(View* view) +{ + m_views.push_back(view); + m_canvas->addChild(view->getRootElement()); +} + +void ViewManager::removeView(View* view) +{ + std::vector::iterator it = std::find(m_views.begin(), m_views.end(), view); + if (it != m_views.end()) + { + m_canvas->removeChild((*it)->getRootElement()); + m_views.erase(it); + } +} diff --git a/src/lib/component/view/ViewManager.h b/src/lib/component/view/ViewManager.h index 4f19a89c..3116bb6f 100644 --- a/src/lib/component/view/ViewManager.h +++ b/src/lib/component/view/ViewManager.h @@ -4,16 +4,21 @@ #include #include -#include "component/view/View.h" +class GuiCanvas; +class View; class ViewManager { public: - ViewManager(); + ViewManager(std::shared_ptr canvas); ~ViewManager(); + void addView(View* view); + void removeView(View* view); + private: - std::vector > m_views; + std::shared_ptr m_canvas; + std::vector m_views; }; diff --git a/src/lib/gui/GuiArea.cpp b/src/lib/gui/GuiArea.cpp new file mode 100644 index 00000000..1bf246f9 --- /dev/null +++ b/src/lib/gui/GuiArea.cpp @@ -0,0 +1,10 @@ +#include "gui/GuiArea.h" + +GuiArea::GuiArea(std::shared_ptr widgetWrapper) + : GuiControl(widgetWrapper) +{ +} + +GuiArea::~GuiArea() +{ +} diff --git a/src/lib/gui/GuiArea.h b/src/lib/gui/GuiArea.h new file mode 100644 index 00000000..2369501c --- /dev/null +++ b/src/lib/gui/GuiArea.h @@ -0,0 +1,14 @@ +#ifndef GUI_AREA_H +#define GUI_AREA_H + +#include "gui/GuiControl.h" + +class GuiArea: public GuiControl +{ +public: + GuiArea(std::shared_ptr widgetWrapper); + virtual ~GuiArea(); + +}; + +#endif // GUI_AREA_H diff --git a/src/lib/gui/GuiCanvas.cpp b/src/lib/gui/GuiCanvas.cpp new file mode 100644 index 00000000..11b92e6d --- /dev/null +++ b/src/lib/gui/GuiCanvas.cpp @@ -0,0 +1,10 @@ +#include "gui/GuiCanvas.h" + +GuiCanvas::GuiCanvas(std::shared_ptr widgetWrapper) + : GuiContainer(widgetWrapper) +{ +} + +GuiCanvas::~GuiCanvas() +{ +} diff --git a/src/lib/gui/GuiCanvas.h b/src/lib/gui/GuiCanvas.h new file mode 100644 index 00000000..3d2326c6 --- /dev/null +++ b/src/lib/gui/GuiCanvas.h @@ -0,0 +1,13 @@ +#ifndef GUI_CANVAS_H +#define GUI_CANVAS_H + +#include "gui/GuiContainer.h" + +class GuiCanvas: public GuiContainer +{ +public: + GuiCanvas(std::shared_ptr widgetWrapper); + virtual ~GuiCanvas(); +}; + +#endif // GUI_CANVAS_H diff --git a/src/lib/gui/GuiContainer.cpp b/src/lib/gui/GuiContainer.cpp new file mode 100644 index 00000000..27e06e3a --- /dev/null +++ b/src/lib/gui/GuiContainer.cpp @@ -0,0 +1,10 @@ +#include "gui/GuiContainer.h" + +GuiContainer::GuiContainer(std::shared_ptr widgetWrapper) + : GuiElement(widgetWrapper) +{ +} + +GuiContainer::~GuiContainer() +{ +} diff --git a/src/lib/gui/GuiContainer.h b/src/lib/gui/GuiContainer.h new file mode 100644 index 00000000..2fe50ce2 --- /dev/null +++ b/src/lib/gui/GuiContainer.h @@ -0,0 +1,19 @@ +#ifndef GUI_CONTAINER_H +#define GUI_CONTAINER_H + +#include + +#include "gui/GuiElement.h" + +class GuiContainer: public GuiElement +{ +public: + GuiContainer(std::shared_ptr widgetWrapper); + virtual ~GuiContainer(); + + virtual void addChild(std::shared_ptr element) = 0; + virtual void removeChild(std::shared_ptr element) = 0; + +}; + +#endif // GUI_CONTAINER_H diff --git a/src/lib/gui/GuiControl.cpp b/src/lib/gui/GuiControl.cpp new file mode 100644 index 00000000..919c5437 --- /dev/null +++ b/src/lib/gui/GuiControl.cpp @@ -0,0 +1,10 @@ +#include "gui/GuiControl.h" + +GuiControl::GuiControl(std::shared_ptr widgetWrapper) + : GuiElement(widgetWrapper) +{ +} + +GuiControl::~GuiControl() +{ +} diff --git a/src/lib/gui/GuiControl.h b/src/lib/gui/GuiControl.h new file mode 100644 index 00000000..7b9a9ed1 --- /dev/null +++ b/src/lib/gui/GuiControl.h @@ -0,0 +1,14 @@ +#ifndef GUI_CONTROL_H +#define GUI_CONTROL_H + +#include "gui/GuiElement.h" + +class GuiControl: public GuiElement +{ +public: + GuiControl(std::shared_ptr widgetWrapper); + virtual ~GuiControl(); + +}; + +#endif // GUI_CONTROL_H diff --git a/src/lib/gui/GuiElement.cpp b/src/lib/gui/GuiElement.cpp index e73ae156..40af9ee1 100644 --- a/src/lib/gui/GuiElement.cpp +++ b/src/lib/gui/GuiElement.cpp @@ -1,5 +1,22 @@ #include "gui/GuiElement.h" +#include "gui/WidgetWrapper.h" + +GuiElement::GuiElement(std::shared_ptr widgetWrapper) + : m_widgetWrapper(widgetWrapper) +{ +} + GuiElement::~GuiElement() { } + +void GuiElement::setBackgroundColor(int r, int g, int b, int a) +{ + setBackgroundColor(Colori(r, g, b, a)); +} + +std::shared_ptr GuiElement::getWidgetWrapper() +{ + return m_widgetWrapper; +} diff --git a/src/lib/gui/GuiElement.h b/src/lib/gui/GuiElement.h index 0f5d0afb..7a63a3de 100644 --- a/src/lib/gui/GuiElement.h +++ b/src/lib/gui/GuiElement.h @@ -1,11 +1,32 @@ #ifndef GUI_ELEMENT_H #define GUI_ELEMENT_H +#include + +#include "utility/math/Color.h" +#include "utility/math/Vector2.h" + +class WidgetWrapper; + class GuiElement { public: + GuiElement(std::shared_ptr widgetWrapper); virtual ~GuiElement(); + + virtual void setPosition(Vec2i position) = 0; + virtual Vec2i getPosition() const = 0; + virtual void setSize(Vec2i size) = 0; + virtual Vec2i getSize() const = 0; + + virtual void setBackgroundColor(Colori color) = 0; + void setBackgroundColor(int r, int g, int b, int a); + +//protected: + std::shared_ptr getWidgetWrapper(); + +private: + std::shared_ptr m_widgetWrapper; }; - #endif // GUI_ELEMENT_H diff --git a/src/lib/gui/GuiElementFactory.h b/src/lib/gui/GuiElementFactory.h index d430482e..785c0fef 100644 --- a/src/lib/gui/GuiElementFactory.h +++ b/src/lib/gui/GuiElementFactory.h @@ -1,11 +1,19 @@ #ifndef GUI_ELEMENT_FACTORY_H #define GUI_ELEMENT_FACTORY_H +#include + +class GuiArea; +class GuiCanvas; +class GuiWindow; + class GuiElementFactory { public: virtual ~GuiElementFactory(); + + virtual std::shared_ptr createArea() const = 0; + virtual std::shared_ptr createCanvas(std::shared_ptr window) const = 0; }; - #endif // GUI_ELEMENT_FACTORY_H diff --git a/src/lib/gui/GuiWindow.cpp b/src/lib/gui/GuiWindow.cpp new file mode 100644 index 00000000..3d5d85a4 --- /dev/null +++ b/src/lib/gui/GuiWindow.cpp @@ -0,0 +1,11 @@ +#include "gui/GuiWindow.h" + +#include "gui/GuiCanvas.h" + +GuiWindow::GuiWindow() +{ +} + +GuiWindow::~GuiWindow() +{ +} diff --git a/src/lib/gui/GuiWindow.h b/src/lib/gui/GuiWindow.h new file mode 100644 index 00000000..8148f31b --- /dev/null +++ b/src/lib/gui/GuiWindow.h @@ -0,0 +1,17 @@ +#ifndef GUI_WINDOW_H +#define GUI_WINDOW_H + +#include + +class GuiCanvas; + +class GuiWindow +{ +public: + GuiWindow(); + virtual ~GuiWindow(); + + virtual void setCanvas(std::shared_ptr canvas) = 0; +}; + +#endif // GUI_WINDOW_H diff --git a/src/lib/gui/WidgetWrapper.cpp b/src/lib/gui/WidgetWrapper.cpp new file mode 100644 index 00000000..c54d4cc0 --- /dev/null +++ b/src/lib/gui/WidgetWrapper.cpp @@ -0,0 +1,9 @@ +#include "gui/WidgetWrapper.h" + +WidgetWrapper::WidgetWrapper() +{ +} + +WidgetWrapper::~WidgetWrapper() +{ +} diff --git a/src/lib/gui/WidgetWrapper.h b/src/lib/gui/WidgetWrapper.h new file mode 100644 index 00000000..4dbc0f8b --- /dev/null +++ b/src/lib/gui/WidgetWrapper.h @@ -0,0 +1,11 @@ +#ifndef WIDGET_WRAPPER_H +#define WIDGET_WRAPPER_H + +class WidgetWrapper +{ +public: + WidgetWrapper(); + virtual ~WidgetWrapper(); +}; + +#endif // WIDGET_WRAPPER_H diff --git a/src/lib/utility/Vector.h b/src/lib/utility/Vector.h new file mode 100644 index 00000000..a544db96 --- /dev/null +++ b/src/lib/utility/Vector.h @@ -0,0 +1,16 @@ +#ifndef VECTOR_H +#define VECTOR_H + +struct Vec4i +{ + Vec4i(int x, int y, int z, int w) + : x(x) + , y(y) + , z(z) + , w(w) + {} + + int x, y, z, w; +}; + +#endif // VECTOR_H diff --git a/src/lib/utility/math/Color.h b/src/lib/utility/math/Color.h new file mode 100644 index 00000000..794cf6c1 --- /dev/null +++ b/src/lib/utility/math/Color.h @@ -0,0 +1,33 @@ +#ifndef COLOR_H +#define COLOR_H + +template +class Color +{ +public: + Color(); + Color(T r, T g, T b, T a); + + T r, g, b, a; +}; + +template +Color::Color() + : r(0) + , g(0) + , b(0) + , a(0) +{} + +template +Color::Color(T r, T g, T b, T a) + : r(r) + , g(g) + , b(b) + , a(a) +{} + +typedef Color Colorf; +typedef Color Colori; + +#endif // COLOR_H diff --git a/src/lib/utility/math/Vector4.h b/src/lib/utility/math/Vector4.h new file mode 100644 index 00000000..e73f1ae2 --- /dev/null +++ b/src/lib/utility/math/Vector4.h @@ -0,0 +1,32 @@ +#ifndef VECTOR_4_H +#define VECTOR_4_H + +template +class Vector4 +{ +public: + Vector4(); + Vector4(T x, T y, T z, T w); + + T x, y, z, w; +}; + +template +Vector4::Vector4() + : x(0) + , y(0) + , z(0) + , w(0) +{} + +template +Vector4::Vector4(T x, T y, T z, T w) + : x(x) + , y(y) + , z(z) + , w(w) +{} + +typedef Vector4 Vec4i; + +#endif // VECTOR_4_H