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
#include <QObject>
#include <QOpenGlTexture>
#include <fstream>
#include <QVector>
@ -7,7 +6,6 @@
#include <QMatrix4x4>
#include <QQuaternion>
#include <QRegExp>
#include "MainWindow.h"
struct BoundingBox {
QQuaternion rotation;
@ -54,14 +52,12 @@ struct Material {
std::uint8_t dataValues[2] = { 0 };
};
class FileInterface : public QObject
class FileInterface
{
Q_OBJECT
public:
explicit FileInterface(QString path, QObject *parent)
: QObject(parent)
, m_models(new QVector<Model*>)
explicit FileInterface(QString path)
: m_models(new QVector<Model*>)
, m_materials(new QVector<Material>)
{
//open file
@ -70,10 +66,6 @@ public:
if (!m_file.is_open())
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("/|\\\\")));
};
@ -138,6 +130,4 @@ public:
return defMaterial;
};
signals:
void sendMessage(QString msg, int severity);
};

View File

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

View File

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

View File

@ -91,7 +91,6 @@ public slots:
// signals
signals:
void sendMessage(QString message, int severity);
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\OglViewerWidget.h"
#include "..\Header\MainWindow.h"
#include "..\Header\OutputDevice.h"
#include <QRegExp>
@ -154,7 +155,7 @@ void GeometryEngine::loadFile(QString filePath)
//reset view
emit requestResetView();
emit sendMessage("loading file..", 0);
OutputDevice::getInstance()->print("loading file..", 0);
try
{
@ -163,7 +164,7 @@ void GeometryEngine::loadFile(QString filePath)
QVector<GLuint> indexData;
// open file and get the information
MshFile file(filePath, this);
MshFile file(filePath);
models = file.getModels();
m_materials = file.getMaterials();
@ -213,13 +214,13 @@ void GeometryEngine::loadFile(QString filePath)
m_indexBuf.allocate(indexData.data(), indexData.size() * sizeof(GLuint));
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);
}
catch (std::invalid_argument e)
{
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\OglViewerWidget.h"
#include "..\Header\FileInterface.h"
#include "..\Header\OutputDevice.h"
#include <QSurfaceFormat>
#include <QSignalMapper>
#include <QToolButton>
@ -29,7 +30,7 @@ MainWindow::MainWindow(QWidget *parent)
setWindowTitle(WINDOW_NAME);
setWindowIcon(QIcon(":/images/icon.ico"));
printMessage("MeshViewer by Anakin", 0);
connect(OutputDevice::getInstance(this), &OutputDevice::sendMessage, this, &MainWindow::printMessage);
// setup opengl things
QSurfaceFormat format;
@ -49,6 +50,8 @@ MainWindow::MainWindow(QWidget *parent)
QFile styleSheet(":/files/StyleSheet.txt");
styleSheet.open(QIODevice::ReadOnly);
this->setStyleSheet(styleSheet.readAll());
printMessage("MeshViewer by Anakin", 0);
}
MainWindow::~MainWindow()
@ -67,7 +70,6 @@ void MainWindow::setupWidgets()
// Ogl Viewer
OglViewerWidget* viewer = new OglViewerWidget(this);
setCentralWidget(viewer);
connect(viewer, &OglViewerWidget::sendMessage, this, &MainWindow::printMessage);
// open file
QToolButton *openFile = new QToolButton(this);

View File

@ -1,5 +1,6 @@
#include "..\Header\MshFile.h"
#include "..\Header\tga.h"
#include "..\Header\OutputDevice.h"
#include <QColor>
// helper function to save data from file to any variable type
@ -9,8 +10,8 @@
/////////////////////////////////////////////////////////////////////////
// public constructor/destructor
MshFile::MshFile(QString path, QObject * parent)
: FileInterface(path, parent)
MshFile::MshFile(QString path)
: FileInterface(path)
{
import();
}
@ -89,7 +90,7 @@ void MshFile::loadChunks(std::list<ChunkHeader*>& destination, std::streampos st
// out of file. Maybe a size information is corrupted
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();
break;
}
@ -506,7 +507,7 @@ void MshFile::analyseSegmChunks(Model * dataDestination, std::list<ChunkHeader*>
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 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())
{
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();
}
@ -698,7 +699,7 @@ void MshFile::readUV(Segment * dataDestination, std::streampos position)
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 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())
{
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();
}
@ -722,7 +723,7 @@ void MshFile::loadTexture(QOpenGLTexture *& destination, QString filepath, QStri
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.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\OutputDevice.h"
#include <QMouseEvent>
#include <QDropEvent>
#include <QMimeData>
@ -65,7 +65,6 @@ void OglViewerWidget::setConnections()
connect(m_dataEngine, &GeometryEngine::requestResetView, this, &OglViewerWidget::resetView);
connect(parentWidget(), 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(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.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)
{
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);
}
}