dockWidget refactoring, and added resource Widget

This commit is contained in:
Anselme 2015-07-09 01:34:19 +02:00
parent 2f793bd15f
commit 1668101b46
15 changed files with 447 additions and 293 deletions

View File

@ -1,45 +1,67 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "sparrowrenderer.h"
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenu>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include "modulewidget.h"
#include "resourcewidget.h"
#include "myglwidget.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
ui->setupUi(this);
setWindowTitle("SparrowRenderer");
resize(800, 600);
// modules widget
moduleWidget = new ModuleWidget(this);
addDockWidget(Qt::LeftDockWidgetArea, moduleWidget);
// resources widget
resourceWidget = new ResourceWidget(this);
addDockWidget(Qt::RightDockWidgetArea, resourceWidget);
// opengl widget
openGLWidget = new OpenGLWidget(this);
openGLWidget->setRenderer(moduleWidget);
setCentralWidget(openGLWidget);
// actions
actionExit = new QAction(this);
actionExit->setText("Exit");
actionShowModuleWidget = new QAction(this);
actionShowModuleWidget->setText("Modules");
actionShowModuleWidget->setEnabled(false);
// menubar
menuBar = new QMenuBar(this);
menuBar->setGeometry(QRect(0, 0, 800, 22));
menuMenu = new QMenu(menuBar);
menuMenu->setTitle("Main menu");
menuMenu->addAction(actionShowModuleWidget);
menuMenu->addAction(actionExit);
menuBar->addAction(menuMenu->menuAction());
menuBar->setNativeMenuBar(false);
setMenuBar(menuBar);
// connect signals to slots
QObject::connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
QObject::connect(moduleWidget, SIGNAL(visibilityChanged(bool)), actionShowModuleWidget, SLOT(setDisabled(bool)));
QObject::connect(actionShowModuleWidget, SIGNAL(triggered()), this, SLOT(reopenModuleWidget()));
QObject::connect(openGLWidget, SIGNAL(modulesChanged()), moduleWidget, SLOT(updateList()));
QObject::connect(openGLWidget, SIGNAL(modulesChanged()), resourceWidget, SLOT(updateList()));
QMetaObject::connectSlotsByName(this);
}
MainWindow::~MainWindow()
void MainWindow::reopenModuleWidget()
{
delete ui;
}
void MainWindow::dockWidgetClosed()
{
emit(ui->dockWidget->setVisible(true));
}
void MainWindow::updateTree()
{
QTreeWidget* tree = ui->treeWidget;
SparrowRenderer* renderer = ui->openGLWidget->getRenderer();
tree->clear();
for(int i=0; i<renderer->getNbModules(); ++i)
{
std::string moduleName = renderer->getModuleName(i);
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, QString(moduleName.c_str()));
tree->addTopLevelItem(item);
}
}
void MainWindow::moduleSetEnabled(QTreeWidgetItem* item, int button)
{
SparrowRenderer* renderer = ui->openGLWidget->getRenderer();
std::string name = item->text(0).toStdString();
if(renderer->isModuleEnabled(name))
renderer->disableModule(name);
else
renderer->enableModule(name);
ui->openGLWidget->updateGL();
emit(moduleWidget->setVisible(true));
}

View File

@ -3,7 +3,9 @@
#include <QMainWindow>
class QTreeWidgetItem;
class OpenGLWidget;
class ModuleWidget;
class ResourceWidget;
namespace Ui {
class MainWindow;
@ -15,15 +17,18 @@ class MainWindow : public QMainWindow
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QAction *actionExit;
QAction *actionShowModuleWidget;
QMenuBar *menuBar;
QMenu *menuMenu;
OpenGLWidget *openGLWidget;
ModuleWidget *moduleWidget;
ResourceWidget *resourceWidget;
public slots:
void dockWidgetClosed();
void updateTree();
void moduleSetEnabled(QTreeWidgetItem* item, int button);
private slots:
void reopenModuleWidget();
};
#endif // MAINWINDOW_H

View File

@ -1,202 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>854</width>
<height>510</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="MyGLWidget" name="openGLWidget"/>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>854</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuMenu">
<property name="title">
<string>menu</string>
</property>
<addaction name="actionShow_control_panel"/>
<addaction name="actionExit"/>
</widget>
<addaction name="menuMenu"/>
</widget>
<widget class="QDockWidget" name="dockWidget">
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeWidget" name="treeWidget">
<column>
<property name="text">
<string notr="true">rendering pipeline</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
<action name="actionExit">
<property name="text">
<string>exit</string>
</property>
</action>
<action name="actionShow_control_panel">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>show control panel</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>MyGLWidget</class>
<extends>QOpenGLWidget</extends>
<header>myglwidget.h</header>
<slots>
<signal>modulesChanged()</signal>
</slots>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>actionExit</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>426</x>
<y>254</y>
</hint>
</hints>
</connection>
<connection>
<sender>dockWidget</sender>
<signal>visibilityChanged(bool)</signal>
<receiver>actionShow_control_panel</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>127</x>
<y>265</y>
</hint>
<hint type="destinationlabel">
<x>-1</x>
<y>-1</y>
</hint>
</hints>
</connection>
<connection>
<sender>actionShow_control_panel</sender>
<signal>triggered()</signal>
<receiver>MainWindow</receiver>
<slot>dockWidgetClosed()</slot>
<hints>
<hint type="sourcelabel">
<x>-1</x>
<y>-1</y>
</hint>
<hint type="destinationlabel">
<x>426</x>
<y>254</y>
</hint>
</hints>
</connection>
<connection>
<sender>openGLWidget</sender>
<signal>modulesChanged()</signal>
<receiver>MainWindow</receiver>
<slot>updateTree()</slot>
<hints>
<hint type="sourcelabel">
<x>555</x>
<y>265</y>
</hint>
<hint type="destinationlabel">
<x>426</x>
<y>254</y>
</hint>
</hints>
</connection>
<connection>
<sender>treeWidget</sender>
<signal>itemClicked(QTreeWidgetItem*,int)</signal>
<receiver>MainWindow</receiver>
<slot>moduleSetEnabled(QTreeWidgetItem*,int)</slot>
<hints>
<hint type="sourcelabel">
<x>127</x>
<y>276</y>
</hint>
<hint type="destinationlabel">
<x>426</x>
<y>254</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>dockWidgetClosed()</slot>
<slot>updateTree()</slot>
<slot>moduleSetEnabled(QTreeWidgetItem*,int)</slot>
</slots>
</ui>

33
modulewidget.cpp Normal file
View File

@ -0,0 +1,33 @@
#include "modulewidget.h"
#include "ui_modulewidget.h"
ModuleWidget::ModuleWidget(QWidget *parent) :
QDockWidget(parent),
ui(new Ui::ModuleWidget)
{
ui->setupUi(this);
}
ModuleWidget::~ModuleWidget()
{
delete ui;
}
void ModuleWidget::updateList()
{
QListWidget* list = ui->listWidget;
list->clear();
for(ModuleNode& m : modules)
list->addItem(new QListWidgetItem(QString(m.name.c_str())));
}
/*void ModuleWidget::moduleSetEnabled(QTreeWidgetItem* item, int button)
{
SparrowRenderer* renderer = ui->openGLWidget->getRenderer();
std::string name = item->text(0).toStdString();
if(renderer->isModuleEnabled(name))
renderer->disableModule(name);
else
renderer->enableModule(name);
ui->openGLWidget->updateGL();
}*/

26
modulewidget.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef MODULEWIDGET_H
#define MODULEWIDGET_H
#include <QDockWidget>
#include "sparrowrenderer.h"
namespace Ui {
class ModuleWidget;
}
class ModuleWidget : public QDockWidget, public SparrowRenderer
{
Q_OBJECT
public:
explicit ModuleWidget(QWidget *parent = 0);
~ModuleWidget();
private:
Ui::ModuleWidget *ui;
public slots:
void updateList();
};
#endif // MODULEWIDGET_H

63
modulewidget.ui Normal file
View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ModuleWidget</class>
<widget class="QDockWidget" name="ModuleWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>141</width>
<height>392</height>
</rect>
</property>
<property name="allowedAreas">
<set>Qt::LeftDockWidgetArea</set>
</property>
<property name="windowTitle">
<string>Modules</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListWidget" name="listWidget"/>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>157</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -20,26 +20,25 @@
#include <QKeyEvent>
#include <QMouseEvent>
MyGLWidget::MyGLWidget(QWidget *parent) :
OpenGLWidget::OpenGLWidget(QWidget *parent) :
QGLWidget(parent),
renderer(NULL),
controller(NULL)
{}
MyGLWidget::~MyGLWidget()
OpenGLWidget::~OpenGLWidget()
{
if(renderer != NULL)
delete(renderer);
renderer->destroyGL();
if(controller != NULL)
delete(controller);
}
SparrowRenderer* MyGLWidget::getRenderer()
void OpenGLWidget::setRenderer(SparrowRenderer* myRenderer)
{
return renderer;
renderer = myRenderer;
}
void MyGLWidget::loadResources()
void OpenGLWidget::loadResources()
{
std::string filenames[6] = {
"../data/skybox_ft", "../data/skybox_bk",
@ -59,7 +58,7 @@ void MyGLWidget::loadResources()
ResourceBase::setShader("phong", new Shader(vertSource, fragSource));
}
void MyGLWidget::buildScene()
void OpenGLWidget::buildScene()
{
// camera positionning
Camera* cam = renderer->getCamera();
@ -94,59 +93,57 @@ void MyGLWidget::buildScene()
emit modulesChanged();
}
void MyGLWidget::initializeGL()
void OpenGLWidget::initializeGL()
{
if(renderer != NULL)
delete(renderer);
renderer = new SparrowRenderer(width(), height());
renderer->initGL(width(), height());
loadResources();
buildScene();
controller = new FocusController(new glm::vec3(0));
controller->setCamera(renderer->getCamera());
}
void MyGLWidget::resizeGL(int width, int height)
void OpenGLWidget::resizeGL(int width, int height)
{
renderer->resize(width, height);
updateGL();
}
void MyGLWidget::paintGL()
void OpenGLWidget::paintGL()
{
renderer->render();
}
void MyGLWidget::mouseMoveEvent(QMouseEvent *e)
void OpenGLWidget::mouseMoveEvent(QMouseEvent *e)
{
controller->mouseMove(e->pos().x() - last.x(), e->pos().y() - last.y());
last = e->pos();
updateGL();
}
void MyGLWidget::mousePressEvent(QMouseEvent* e)
void OpenGLWidget::mousePressEvent(QMouseEvent* e)
{
controller->mouseEvent(e->button(), true);
last = e->pos();
updateGL();
}
void MyGLWidget::mouseReleaseEvent(QMouseEvent* e)
void OpenGLWidget::mouseReleaseEvent(QMouseEvent* e)
{
controller->mouseEvent(e->button(), false);
updateGL();
}
void MyGLWidget::wheelEvent(QWheelEvent *e)
void OpenGLWidget::wheelEvent(QWheelEvent *e)
{
controller->mouseWheelEvent(e->delta());
updateGL();
}
void MyGLWidget::keyPressEvent(QKeyEvent *e)
void OpenGLWidget::keyPressEvent(QKeyEvent *e)
{
controller->mouseEvent(e->key(), true);
updateGL();
}
void MyGLWidget::keyReleaseEvent(QKeyEvent *e)
void OpenGLWidget::keyReleaseEvent(QKeyEvent *e)
{
controller->mouseEvent(e->key(), false);
updateGL();

View File

@ -10,7 +10,7 @@ namespace Ui {
class MyGLWidget;
}
class MyGLWidget : public QGLWidget
class OpenGLWidget : public QGLWidget
{
Q_OBJECT
@ -19,10 +19,9 @@ class MyGLWidget : public QGLWidget
QPoint last;
public:
explicit MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
SparrowRenderer* getRenderer();
explicit OpenGLWidget(QWidget *parent = 0);
~OpenGLWidget();
void setRenderer(SparrowRenderer* myRenderer);
protected:
void initializeGL();

View File

@ -26,7 +26,7 @@ public:
static Shader* getShader(const std::string &shaderName);
static Entity* getEntity(const std::string &entityName);
private:
protected:
template <typename T>
class DataBase
{
@ -42,7 +42,10 @@ private:
T* get(const std::string &name)
{
return data[name];
if(data.count(name))
return data[name];
else
return NULL;
}
};

76
resourcewidget.cpp Normal file
View File

@ -0,0 +1,76 @@
#include "resourcewidget.h"
#include "ui_resourcewidget.h"
#include <iostream>
ResourceWidget::ResourceWidget(QWidget *parent) :
QDockWidget(parent),
ui(new Ui::ResourceWidget)
{
ui->setupUi(this);
ui->treeWidget->resresizeColumnToContents(0);
ui->treeWidget->header()->setStretchLastSection(false);
}
ResourceWidget::~ResourceWidget()
{
delete ui;
}
void ResourceWidget::updateList()
{
QTreeWidget* tree = ui->treeWidget;
for(QTreeWidgetItemIterator it(tree); *it; ++it)
{
QTreeWidgetItem* item = *it;
if(item->parent())
continue;
item->setBackgroundColor(0, QColor(180, 220, 255));
item->setExpanded(true);
QString text = item->text(0);
if (text == "Textures")
{
for(std::string &name : textures.names)
{
QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
myItem->setText(0, QString(name.c_str()));
tree->addTopLevelItem(myItem);
}
}
else if(text == "Meshes")
{
for(std::string &name : meshes.names)
{
QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
myItem->setText(0, QString(name.c_str()));
tree->addTopLevelItem(myItem);
}
}
else if(text == "Materials")
{
for(std::string &name : materials.names)
{
QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
myItem->setText(0, QString(name.c_str()));
tree->addTopLevelItem(myItem);
}
}
else if(text == "Shaders")
{
for(std::string &name : shaders.names)
{
QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
myItem->setText(0, QString(name.c_str()));
tree->addTopLevelItem(myItem);
}
}
else if(text == "Entities")
{
for(std::string &name : entities.names)
{
QTreeWidgetItem* myItem = new QTreeWidgetItem(item);
myItem->setText(0, QString(name.c_str()));
tree->addTopLevelItem(myItem);
}
}
}
}

26
resourcewidget.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef RESOURCEWIDGET_H
#define RESOURCEWIDGET_H
#include <QDockWidget>
#include "resourcebase.h"
namespace Ui {
class ResourceWidget;
}
class ResourceWidget : public QDockWidget, public ResourceBase
{
Q_OBJECT
public:
explicit ResourceWidget(QWidget *parent = 0);
~ResourceWidget();
private:
Ui::ResourceWidget *ui;
public slots:
void updateList();
};
#endif // RESOURCEWIDGET_H

93
resourcewidget.ui Normal file
View File

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ResourceWidget</class>
<widget class="QDockWidget" name="ResourceWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>171</width>
<height>411</height>
</rect>
</property>
<property name="allowedAreas">
<set>Qt::RightDockWidgetArea</set>
</property>
<property name="windowTitle">
<string>Resources</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeWidget" name="treeWidget">
<property name="alternatingRowColors">
<bool>false</bool>
</property>
<property name="autoExpandDelay">
<number>-1</number>
</property>
<property name="indentation">
<number>20</number>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>name</string>
</property>
</column>
<item>
<property name="text">
<string>Textures</string>
</property>
</item>
<item>
<property name="text">
<string>Meshes</string>
</property>
</item>
<item>
<property name="text">
<string>Materials</string>
</property>
</item>
<item>
<property name="text">
<string>Shaders</string>
</property>
</item>
<item>
<property name="text">
<string>Entities</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -40,7 +40,9 @@ SOURCES += main.cpp\
focuscontroller.cpp \
phongmodule.cpp \
skyboxmodule.cpp \
basicmodule.cpp
basicmodule.cpp \
resourcewidget.cpp \
modulewidget.cpp
HEADERS += mainwindow.h \
myglwidget.h \
@ -64,9 +66,13 @@ HEADERS += mainwindow.h \
skyboxmodule.h \
basicmodule.h \
module.h \
resource.h
resource.h \
resourcewidget.h \
modulewidget.h
FORMS += mainwindow.ui
FORMS += \
resourcewidget.ui \
modulewidget.ui
OTHER_FILES += *.frag *.vert *.glsl *.todo

View File

@ -7,7 +7,7 @@
// main methods
SparrowRenderer::SparrowRenderer(int width, int height) : camera(width, height)
void SparrowRenderer::initGL(int width, int height)
{
glewExperimental = GL_TRUE;
GLenum err = glewInit();
@ -30,7 +30,12 @@ SparrowRenderer::SparrowRenderer(int width, int height) : camera(width, height)
glAssert(glEnable(GL_DEPTH_TEST));
glAssert(glEnable(GL_CULL_FACE));
glAssert(glEnable(GL_TEXTURE_2D));
glAssert(glViewport(0, 0, width, height));
resize(width, height);
}
void SparrowRenderer::destroyGL()
{
}
void SparrowRenderer::resize(int width, int height)

View File

@ -9,22 +9,10 @@ class Module;
class SparrowRenderer
{
typedef struct s_moduleNode{
Module* module;
std::string name;
bool isEnabled;
s_moduleNode(Module* myModule, const std::string &myName) : module(myModule), name(myName), isEnabled(true) {}
} ModuleNode;
std::list<ModuleNode>::iterator getModuleNode(std::string name);
Camera camera;
std::list<ModuleNode> modules;
public:
// main methods
SparrowRenderer(int width, int height);
void initGL(int width, int height);
void destroyGL();
void resize(int width, int height);
void render();
@ -46,6 +34,20 @@ public:
// camera methods
Camera* getCamera();
protected:
typedef struct s_moduleNode{
Module* module;
std::string name;
bool isEnabled;
s_moduleNode(Module* myModule, const std::string &myName) : module(myModule), name(myName), isEnabled(true) {}
} ModuleNode;
Camera camera;
std::list<ModuleNode> modules;
std::list<ModuleNode>::iterator getModuleNode(std::string name);
};
#endif // SPARROWRENDERER_H