ui: implemented gui abstraction and dummy view

- added abstract class tree for gui elements.
- implemented concrete gui classes that wrap the qt specific content.
- implemented first DummyView which plays nice with the ViewManager.

review id = 12
This commit is contained in:
malte_langkabel
2014-05-07 13:00:17 +02:00
parent 387618d922
commit 37d0dd33a4
51 changed files with 812 additions and 58 deletions
+12
View File
@@ -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
+8 -4
View File
@@ -2,21 +2,25 @@
#include <QApplication>
#include <QTextEdit>
#include <qlayout.h>
#include <qgroupbox.h>
#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<GuiElementFactory> elementFactory = std::make_shared<QtElementFactory>();
std::shared_ptr<Application> app = Application::create(elementFactory);
app->loadProject();
std::shared_ptr<QtWindow> window = std::make_shared<QtWindow>();
QTextEdit textEdit;
textEdit.show();
std::shared_ptr<Application> app = Application::create(elementFactory, window);
app->loadProject();
return qtApp.exec();
}
+16
View File
@@ -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<GuiArea> QtElementFactory::createArea() const
{
return std::make_shared<QtArea>();
}
std::shared_ptr<GuiCanvas> QtElementFactory::createCanvas(std::shared_ptr<GuiWindow> window) const
{
std::shared_ptr<GuiCanvas> canvas = std::make_shared<QtCanvas>();
window->setCanvas(canvas);
return canvas;
}
+8 -1
View File
@@ -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<GuiArea> createArea() const;
virtual std::shared_ptr<GuiCanvas> createCanvas(std::shared_ptr<GuiWindow> window) const;
};
# endif // QT_ELEMENT_FACTORY_H
+38
View File
@@ -0,0 +1,38 @@
#include "qt/QtWidgetWrapper.h"
#include "gui/GuiElement.h"
#include "utility/logging/logging.h"
std::shared_ptr<QWidget> QtWidgetWrapper::getWidgetOfElement(std::shared_ptr<GuiElement> element)
{
return getWidgetOfElement(element.get());
}
std::shared_ptr<QWidget> QtWidgetWrapper::getWidgetOfElement(GuiElement* element)
{
std::shared_ptr<QWidget> widget;
std::shared_ptr<QtWidgetWrapper> qtWidgetWrapper = std::dynamic_pointer_cast<QtWidgetWrapper>(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<QWidget> widget)
: m_widget(widget)
{
}
QtWidgetWrapper::~QtWidgetWrapper()
{
}
std::shared_ptr<QWidget> QtWidgetWrapper::getWidget()
{
return m_widget;
}
+27
View File
@@ -0,0 +1,27 @@
#ifndef QT_WIDGET_WRAPPER_H
#define QT_WIDGET_WRAPPER_H
#include <memory>
#include <QtWidgets/qwidget.h>
#include "gui/WidgetWrapper.h"
class GuiElement;
class QtWidgetWrapper: public WidgetWrapper
{
public:
static std::shared_ptr<QWidget> getWidgetOfElement(std::shared_ptr<GuiElement> element);
static std::shared_ptr<QWidget> getWidgetOfElement(GuiElement* element);
QtWidgetWrapper(std::shared_ptr<QWidget> widget);
virtual ~QtWidgetWrapper();
std::shared_ptr<QWidget> getWidget(); // not const because returned widget can be changed.
private:
std::shared_ptr<QWidget> m_widget;
};
#endif // QT_WIDGET_WRAPPER_H
+19
View File
@@ -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<GuiCanvas> canvas)
{
m_window.setCentralWidget(QtWidgetWrapper::getWidgetOfElement(canvas).get());
}
+24
View File
@@ -0,0 +1,24 @@
#ifndef QT_WINDOW_H
#define QT_WINDOW_H
#include <memory>
#include <QtWidgets/QMainWindow>
#include "gui/GuiWindow.h"
class GuiCanvas;
class QtWindow: public GuiWindow
{
public:
QtWindow();
~QtWindow();
void setCanvas(std::shared_ptr<GuiCanvas> canvas);
private:
QMainWindow m_window;
};
# endif // QT_WINDOW_H
+43
View File
@@ -0,0 +1,43 @@
#include "qt/element/QtArea.h"
#include <qframe.h>
#include "qt/QtWidgetWrapper.h"
#include "utility/utilityQt.h"
QtArea::QtArea()
: GuiArea(std::make_shared<QtWidgetWrapper>(std::make_shared<QFrame>()))
{
}
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<QWidget> QtArea::getWidget()
{
return QtWidgetWrapper::getWidgetOfElement(this);
}
+25
View File
@@ -0,0 +1,25 @@
#ifndef QT_AREA_H
#define QT_AREA_H
#include <qwidget.h>
#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<QWidget> getWidget();
};
# endif // QT_AREA_H
+59
View File
@@ -0,0 +1,59 @@
#include "qt/element/QtCanvas.h"
#include <qgroupbox.h>
#include <qlayout.h>
#include "qt/QtWidgetWrapper.h"
#include "utility/utilityQt.h"
QtCanvas::QtCanvas()
: GuiCanvas(std::make_shared<QtWidgetWrapper>(std::make_shared<QGroupBox>()))
{
QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom); // gets deleted by qt
getWidget()->setLayout(layout);
}
QtCanvas::~QtCanvas()
{
}
void QtCanvas::addChild(std::shared_ptr<GuiElement> element)
{
getWidget()->layout()->addWidget(QtWidgetWrapper::getWidgetOfElement(element).get());
}
void QtCanvas::removeChild(std::shared_ptr<GuiElement> element)
{
std::shared_ptr<QWidget> 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<QWidget> QtCanvas::getWidget()
{
return QtWidgetWrapper::getWidgetOfElement(this);
}
+29
View File
@@ -0,0 +1,29 @@
#ifndef QT_CANVAS_H
#define QT_CANVAS_H
#include <qwidget.h>
#include <QtWidgets/QMainWindow>
#include "gui/GuiCanvas.h"
class QtCanvas: public GuiCanvas
{
public:
QtCanvas();
virtual ~QtCanvas();
virtual void addChild(std::shared_ptr<GuiElement> element);
virtual void removeChild(std::shared_ptr<GuiElement> 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<QWidget> getWidget();
};
# endif // QT_CANVAS_H
+13
View File
@@ -0,0 +1,13 @@
#include "utilityQt.h"
namespace utility
{
void setWidgetBackgroundColor(std::shared_ptr<QWidget> 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);
}
}
+14
View File
@@ -0,0 +1,14 @@
#ifndef UTILITY_QT_H
#define UTILITY_QT_H
#include <memory>
#include <qwidget.h>
#include "utility/math/Color.h"
namespace utility
{
void setWidgetBackgroundColor(std::shared_ptr<QWidget> widget, const Colori& color);
}
# endif // UTILITY_QT_H