add OuputDevice as singleton to manage output to statusbar,

This commit is contained in:
Anakin 2017-01-29 11:35:43 +01:00
parent 96b7d6f736
commit 98302664ca
9 changed files with 52 additions and 34 deletions

View File

@ -1,5 +1,4 @@
#pragma once #pragma once
#include <QObject>
#include <QOpenGlTexture> #include <QOpenGlTexture>
#include <fstream> #include <fstream>
#include <QVector> #include <QVector>
@ -7,7 +6,6 @@
#include <QMatrix4x4> #include <QMatrix4x4>
#include <QQuaternion> #include <QQuaternion>
#include <QRegExp> #include <QRegExp>
#include "MainWindow.h"
struct BoundingBox { struct BoundingBox {
QQuaternion rotation; QQuaternion rotation;
@ -54,14 +52,12 @@ struct Material {
std::uint8_t dataValues[2] = { 0 }; std::uint8_t dataValues[2] = { 0 };
}; };
class FileInterface : public QObject class FileInterface
{ {
Q_OBJECT
public: public:
explicit FileInterface(QString path, QObject *parent) explicit FileInterface(QString path)
: QObject(parent) : m_models(new QVector<Model*>)
, m_models(new QVector<Model*>)
, m_materials(new QVector<Material>) , m_materials(new QVector<Material>)
{ {
//open file //open file
@ -70,10 +66,6 @@ public:
if (!m_file.is_open()) if (!m_file.is_open())
throw std::invalid_argument(std::string("ERROR: file not found: ") += path.toStdString()); throw std::invalid_argument(std::string("ERROR: file not found: ") += path.toStdString());
MainWindow* tmp = dynamic_cast<MainWindow*>(parent->parent()->parent());
if(tmp != NULL)
connect(this, SIGNAL(sendMessage(QString, int)), tmp, SLOT(printMessage(QString, int)));
m_filepath = path.left(path.lastIndexOf(QRegExp("/|\\\\"))); m_filepath = path.left(path.lastIndexOf(QRegExp("/|\\\\")));
}; };
@ -138,6 +130,4 @@ public:
return defMaterial; return defMaterial;
}; };
signals:
void sendMessage(QString msg, int severity);
}; };

View File

@ -46,7 +46,6 @@ public slots:
// signals // signals
signals: signals:
void requestResetView(); void requestResetView();
void sendMessage(QString message, int severity);
void requestUpdate(); void requestUpdate();
void sendFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle); void sendFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle);
}; };

View File

@ -20,7 +20,7 @@ enum ModelTyp {
class MshFile : public FileInterface class MshFile : public FileInterface
{ {
public: public:
explicit MshFile(QString path, QObject *parent = Q_NULLPTR); explicit MshFile(QString path);
virtual ~MshFile(); virtual ~MshFile();
private: private:

View File

@ -91,7 +91,6 @@ public slots:
// signals // signals
signals: signals:
void sendMessage(QString message, int severity);
void loadFile(QString); void loadFile(QString);
}; };

View File

@ -0,0 +1,27 @@
#pragma once
#include <QObject>
class OutputDevice : public QObject
{
Q_OBJECT
private:
OutputDevice(QObject *parent = Q_NULLPTR) : QObject(parent) {};
public:
OutputDevice(OutputDevice const&) = delete;
void operator=(OutputDevice const&) = delete;
~OutputDevice() {};
static OutputDevice* getInstance(QObject *parent = Q_NULLPTR) {
static OutputDevice* instance = new OutputDevice(parent);
return instance;
};
void print(QString message, int severity) { emit sendMessage(message, severity); };
signals:
void sendMessage(QString message, int severity);
};

View File

@ -2,6 +2,7 @@
#include "..\Header\MshFile.h" #include "..\Header\MshFile.h"
#include "..\Header\OglViewerWidget.h" #include "..\Header\OglViewerWidget.h"
#include "..\Header\MainWindow.h" #include "..\Header\MainWindow.h"
#include "..\Header\OutputDevice.h"
#include <QRegExp> #include <QRegExp>
@ -154,7 +155,7 @@ void GeometryEngine::loadFile(QString filePath)
//reset view //reset view
emit requestResetView(); emit requestResetView();
emit sendMessage("loading file..", 0); OutputDevice::getInstance()->print("loading file..", 0);
try try
{ {
@ -163,7 +164,7 @@ void GeometryEngine::loadFile(QString filePath)
QVector<GLuint> indexData; QVector<GLuint> indexData;
// open file and get the information // open file and get the information
MshFile file(filePath, this); MshFile file(filePath);
models = file.getModels(); models = file.getModels();
m_materials = file.getMaterials(); m_materials = file.getMaterials();
@ -213,13 +214,13 @@ void GeometryEngine::loadFile(QString filePath)
m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint)); m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint));
emit requestUpdate(); emit requestUpdate();
emit sendMessage("done..", 0); OutputDevice::getInstance()->print("done..", 0);
emit sendFileInfo(filePath.right(filePath.size() - filePath.lastIndexOf(QRegExp("/|\\\\")) - 1), m_materials, vertexData.size(), indexData.size() / 3); emit sendFileInfo(filePath.right(filePath.size() - filePath.lastIndexOf(QRegExp("/|\\\\")) - 1), m_materials, vertexData.size(), indexData.size() / 3);
} }
catch (std::invalid_argument e) catch (std::invalid_argument e)
{ {
clearData(); clearData();
emit sendMessage(QString(e.what()), 2); OutputDevice::getInstance()->print(QString(e.what()), 2);
} }
} }

View File

@ -1,6 +1,7 @@
#include "..\Header\MainWindow.h" #include "..\Header\MainWindow.h"
#include "..\Header\OglViewerWidget.h" #include "..\Header\OglViewerWidget.h"
#include "..\Header\FileInterface.h" #include "..\Header\FileInterface.h"
#include "..\Header\OutputDevice.h"
#include <QSurfaceFormat> #include <QSurfaceFormat>
#include <QSignalMapper> #include <QSignalMapper>
#include <QToolButton> #include <QToolButton>
@ -29,7 +30,7 @@ MainWindow::MainWindow(QWidget *parent)
setWindowTitle(WINDOW_NAME); setWindowTitle(WINDOW_NAME);
setWindowIcon(QIcon(":/images/icon.ico")); setWindowIcon(QIcon(":/images/icon.ico"));
printMessage("MeshViewer by Anakin", 0); connect(OutputDevice::getInstance(this), &OutputDevice::sendMessage, this, &MainWindow::printMessage);
// setup opengl things // setup opengl things
QSurfaceFormat format; QSurfaceFormat format;
@ -49,6 +50,8 @@ MainWindow::MainWindow(QWidget *parent)
QFile styleSheet(":/files/StyleSheet.txt"); QFile styleSheet(":/files/StyleSheet.txt");
styleSheet.open(QIODevice::ReadOnly); styleSheet.open(QIODevice::ReadOnly);
this->setStyleSheet(styleSheet.readAll()); this->setStyleSheet(styleSheet.readAll());
printMessage("MeshViewer by Anakin", 0);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -67,7 +70,6 @@ void MainWindow::setupWidgets()
// Ogl Viewer // Ogl Viewer
OglViewerWidget* viewer = new OglViewerWidget(this); OglViewerWidget* viewer = new OglViewerWidget(this);
setCentralWidget(viewer); setCentralWidget(viewer);
connect(viewer, &OglViewerWidget::sendMessage, this, &MainWindow::printMessage);
// open file // open file
QToolButton *openFile = new QToolButton(this); QToolButton *openFile = new QToolButton(this);

View File

@ -1,5 +1,6 @@
#include "..\Header\MshFile.h" #include "..\Header\MshFile.h"
#include "..\Header\tga.h" #include "..\Header\tga.h"
#include "..\Header\OutputDevice.h"
#include <QColor> #include <QColor>
// helper function to save data from file to any variable type // helper function to save data from file to any variable type
@ -9,8 +10,8 @@
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// public constructor/destructor // public constructor/destructor
MshFile::MshFile(QString path, QObject * parent) MshFile::MshFile(QString path)
: FileInterface(path, parent) : FileInterface(path)
{ {
import(); import();
} }
@ -89,7 +90,7 @@ void MshFile::loadChunks(std::list<ChunkHeader*>& destination, std::streampos st
// out of file. Maybe a size information is corrupted // out of file. Maybe a size information is corrupted
if (!m_file.good()) if (!m_file.good())
{ {
emit sendMessage("WARNING: corrupted file. Trying to continue..", 1); OutputDevice::getInstance()->print("WARNING: corrupted file. Trying to continue..", 1);
m_file.clear(); m_file.clear();
break; break;
} }
@ -506,7 +507,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
if (tmp_size < (unsigned) new_segment->vertices.size()) if (tmp_size < (unsigned) new_segment->vertices.size())
{ {
emit sendMessage("WARNING: too less normals " + QString::number(tmp_size) + " < " + QString::number(new_segment->vertices.size()), 1); OutputDevice::getInstance()->print("WARNING: too less normals " + QString::number(tmp_size) + " < " + QString::number(new_segment->vertices.size()), 1);
for (unsigned int i = new_segment->vertices.size(); i != tmp_size; i--) for (unsigned int i = new_segment->vertices.size(); i != tmp_size; i--)
for (unsigned int j = 0; j < 3; j++) for (unsigned int j = 0; j < 3; j++)
@ -514,7 +515,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
} }
else if (tmp_size > (unsigned) new_segment->vertices.size()) else if (tmp_size > (unsigned) new_segment->vertices.size())
{ {
emit sendMessage("WARNING: too many normals " + QString::number(tmp_size) + " > " + QString::number(new_segment->vertices.size()), 1); OutputDevice::getInstance()->print("WARNING: too many normals " + QString::number(tmp_size) + " > " + QString::number(new_segment->vertices.size()), 1);
tmp_size = new_segment->vertices.size(); tmp_size = new_segment->vertices.size();
} }
@ -698,7 +699,7 @@ void MshFile::readUV(Segment * dataDestination, std::streampos position)
if (tmp_size < (unsigned) dataDestination->vertices.size()) if (tmp_size < (unsigned) dataDestination->vertices.size())
{ {
emit sendMessage("WARNING: too less UVs " + QString::number(tmp_size) + " < " + QString::number(dataDestination->vertices.size()),1); OutputDevice::getInstance()->print("WARNING: too less UVs " + QString::number(tmp_size) + " < " + QString::number(dataDestination->vertices.size()),1);
for (unsigned int i = dataDestination->vertices.size(); i != tmp_size; i--) for (unsigned int i = dataDestination->vertices.size(); i != tmp_size; i--)
for (unsigned int j = 0; j < 2; j++) for (unsigned int j = 0; j < 2; j++)
@ -706,7 +707,7 @@ void MshFile::readUV(Segment * dataDestination, std::streampos position)
} }
else if (tmp_size > (unsigned) dataDestination->vertices.size()) else if (tmp_size > (unsigned) dataDestination->vertices.size())
{ {
emit sendMessage("WARNING: too many UVs " + QString::number(tmp_size) + " > " + QString::number(dataDestination->vertices.size()), 1); OutputDevice::getInstance()->print("WARNING: too many UVs " + QString::number(tmp_size) + " > " + QString::number(dataDestination->vertices.size()), 1);
tmp_size = dataDestination->vertices.size(); tmp_size = dataDestination->vertices.size();
} }
@ -722,7 +723,7 @@ void MshFile::loadTexture(QOpenGLTexture *& destination, QString filepath, QStri
if (!loadSuccess) if (!loadSuccess)
{ {
emit sendMessage("WARNING: texture not found or corrupted: " + filename, 1); OutputDevice::getInstance()->print("WARNING: texture not found or corrupted: " + filename, 1);
img = QImage(1, 1, QImage::Format_RGB32); img = QImage(1, 1, QImage::Format_RGB32);
img.fill(QColor(m_materials->back().diffuseColor[0] * 255, m_materials->back().diffuseColor[1] * 255, m_materials->back().diffuseColor[2] * 255)); img.fill(QColor(m_materials->back().diffuseColor[0] * 255, m_materials->back().diffuseColor[1] * 255, m_materials->back().diffuseColor[2] * 255));

View File

@ -1,5 +1,5 @@
#include "..\Header\OglViewerWidget.h" #include "..\Header\OglViewerWidget.h"
#include "..\Header\OutputDevice.h"
#include <QMouseEvent> #include <QMouseEvent>
#include <QDropEvent> #include <QDropEvent>
#include <QMimeData> #include <QMimeData>
@ -65,7 +65,6 @@ void OglViewerWidget::setConnections()
connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView); connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView);
connect(parentWidget(), SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString))); connect(parentWidget(), SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString)));
connect(this, SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString))); connect(this, SIGNAL(loadFile(QString)), m_dataEngine, SLOT(loadFile(QString)));
connect(m_dataEngine, SIGNAL(sendMessage(QString, int)), parentWidget(), SLOT(printMessage(QString, int)));
connect(m_dataEngine, SIGNAL(requestUpdate()), this, SLOT(update())); connect(m_dataEngine, SIGNAL(requestUpdate()), this, SLOT(update()));
connect(m_dataEngine, SIGNAL(sendFileInfo(QString, QVector<Material>*, int, int)), parentWidget(), SLOT(setFileInfo(QString, QVector<Material>*, int, int))); connect(m_dataEngine, SIGNAL(sendFileInfo(QString, QVector<Material>*, int, int)), parentWidget(), SLOT(setFileInfo(QString, QVector<Material>*, int, int)));
} }
@ -308,12 +307,12 @@ void OglViewerWidget::keyPressEvent(QKeyEvent *e)
{ {
m_zSpeed -= 0.1; m_zSpeed -= 0.1;
m_zSpeed < 0.09 ? m_zSpeed = 0 : NULL; m_zSpeed < 0.09 ? m_zSpeed = 0 : NULL;
emit sendMessage(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0); OutputDevice::getInstance()->print(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0);
} }
else if (e->key() == Qt::Key_Plus) else if (e->key() == Qt::Key_Plus)
{ {
m_zSpeed += 0.1; m_zSpeed += 0.1;
emit sendMessage(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0); OutputDevice::getInstance()->print(QString("Zoom speed = %1%").arg(m_zSpeed * 100), 0);
} }
} }