SWBF2-Classic-Msh-Viewer/QtMeshViewer/Source/MainWindow.cpp

366 lines
9.8 KiB
C++
Raw Normal View History

#include "..\Header\MainWindow.h"
#include "..\Header\OglViewerWidget.h"
#include "..\Header\FileInterface.h"
#include "..\Header\OutputDevice.h"
#include <QSurfaceFormat>
2017-01-05 15:04:51 +00:00
#include <QSignalMapper>
#include <QToolButton>
2017-01-07 14:59:16 +00:00
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QPalette>
#include <QResizeEvent>
#define WINDOW_NAME "Mesh Viewer"
/////////////////////////////////////////////////////////////////////////
// constructor/destructor
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindowClass)
, m_output(new QLabel(this))
, m_curSeverity(0)
, m_infoWindow(new FileInfoWindow(this))
{
// setup window
ui->setupUi(this);
setWindowTitle(WINDOW_NAME);
setWindowIcon(QIcon(":/images/icon.ico"));
connect(OutputDevice::getInstance(this), &OutputDevice::sendMessage, this, &MainWindow::printMessage);
connect(OutputDevice::getInstance(this), &OutputDevice::sendFileInfo, this, &MainWindow::setFileInfo);
// setup opengl things
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setMajorVersion(2);
format.setMinorVersion(0);
format.setProfile(QSurfaceFormat::NoProfile);
QSurfaceFormat::setDefaultFormat(format);
// set default text to file info
m_fileInfo = "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
2017-01-07 14:59:16 +00:00
// add widgets to the window
setupWidgets();
2017-01-21 15:33:03 +00:00
// load stylesheet
2017-01-21 15:33:03 +00:00
QFile styleSheet(":/files/StyleSheet.txt");
styleSheet.open(QIODevice::ReadOnly);
this->setStyleSheet(styleSheet.readAll());
printMessage("MeshViewer by Anakin", 0);
}
MainWindow::~MainWindow()
{
delete ui;
delete m_output;
delete m_infoWindow;
}
/////////////////////////////////////////////////////////////////////////
// functions
2017-01-05 15:04:51 +00:00
void MainWindow::setupWidgets()
{
// Ogl Viewer
2017-01-05 15:04:51 +00:00
OglViewerWidget* viewer = new OglViewerWidget(this);
setCentralWidget(viewer);
connect(this, &MainWindow::loadFile, viewer, &OglViewerWidget::loadFile);
2017-01-05 15:04:51 +00:00
// open file
2017-01-22 11:25:59 +00:00
QToolButton *openFile = new QToolButton(this);
openFile->setObjectName("openFile");
openFile->setToolTip("open file");
connect(openFile, &QToolButton::pressed, this, &MainWindow::openFile);
ui->mainToolBar->addWidget(openFile);
2017-01-05 15:04:51 +00:00
// screenshot
2017-01-22 11:25:59 +00:00
QToolButton *screenshot = new QToolButton(this);
screenshot->setObjectName("screenshot");
screenshot->setToolTip("take screenshot");
connect(screenshot, &QToolButton::pressed, this, &MainWindow::takeScreenShot);
ui->mainToolBar->addWidget(screenshot);
2017-01-11 15:28:51 +00:00
//////////////////////////////////////////////////
2017-01-09 15:34:54 +00:00
ui->mainToolBar->addSeparator();
2017-01-05 15:04:51 +00:00
QSignalMapper* signalMapper = new QSignalMapper(this);
// X
2017-01-22 11:25:59 +00:00
QToolButton *x = new QToolButton(this);
x->setObjectName("x");
x->setToolTip("x-direction");
2017-01-05 15:04:51 +00:00
x->setCheckable(true);
x->setChecked(true);
2017-01-22 11:25:59 +00:00
ui->mainToolBar->addWidget(x);
2017-01-05 15:04:51 +00:00
// Y
2017-01-22 11:25:59 +00:00
QToolButton *y = new QToolButton(this);
y->setObjectName("y");
y->setToolTip("y-direction");
2017-01-05 15:04:51 +00:00
y->setCheckable(true);
y->setChecked(true);
2017-01-22 11:25:59 +00:00
ui->mainToolBar->addWidget(y);
2017-01-05 15:04:51 +00:00
// Z
2017-01-22 11:25:59 +00:00
QToolButton *z = new QToolButton(this);
z->setObjectName("z");
z->setToolTip("z-direction");
2017-01-05 15:04:51 +00:00
z->setCheckable(true);
z->setChecked(true);
2017-01-22 11:25:59 +00:00
ui->mainToolBar->addWidget(z);
2017-01-05 15:04:51 +00:00
2017-01-22 11:25:59 +00:00
connect(x, SIGNAL(pressed()), signalMapper, SLOT(map()));
connect(y, SIGNAL(pressed()), signalMapper, SLOT(map()));
connect(z, SIGNAL(pressed()), signalMapper, SLOT(map()));
2017-01-05 15:04:51 +00:00
signalMapper->setMapping(x, 1);
signalMapper->setMapping(y, 2);
signalMapper->setMapping(z, 3);
connect(signalMapper, SIGNAL(mapped(int)), viewer, SLOT(toggleAxis(int)));
2017-01-05 15:04:51 +00:00
//////////////////////////////////////////////////
2017-01-09 15:34:54 +00:00
ui->mainToolBar->addSeparator();
2017-01-05 15:04:51 +00:00
// wireframe
2017-01-22 11:25:59 +00:00
QToolButton *wireframe = new QToolButton(this);
wireframe->setObjectName("wireframe");
wireframe->setToolTip("wireframe");
wireframe->setCheckable(true);
wireframe->setChecked(false);
2017-01-22 11:25:59 +00:00
connect(wireframe, &QToolButton::pressed, viewer, &OglViewerWidget::toggleWireframe);
ui->mainToolBar->addWidget(wireframe);
// light
2017-01-22 11:25:59 +00:00
QToolButton *light = new QToolButton(this);
light->setObjectName("light");
light->setToolTip("toggle light");
light->setCheckable(true);
light->setChecked(false);
2017-01-22 11:25:59 +00:00
connect(light, &QToolButton::pressed, viewer, &OglViewerWidget::toggleLight);
ui->mainToolBar->addWidget(light);
// settings
QToolButton *settings = new QToolButton(this);
settings->setObjectName("settings");
settings->setToolTip("settings");
connect(settings, &QToolButton::pressed, viewer, &OglViewerWidget::showSettings);
ui->mainToolBar->addWidget(settings);
//////////////////////////////////////////////////
ui->mainToolBar->addSeparator();
// fileinfo
2017-01-22 11:25:59 +00:00
QToolButton *fileInfo = new QToolButton(this);
fileInfo->setObjectName("fileInfo");
fileInfo->setToolTip("file info");
connect(fileInfo, &QToolButton::pressed, m_infoWindow, &FileInfoWindow::show);
2017-01-22 11:25:59 +00:00
ui->mainToolBar->addWidget(fileInfo);
// help
2017-01-22 11:25:59 +00:00
QToolButton *help = new QToolButton(this);
help->setObjectName("help");
help->setToolTip("help");
connect(help, &QToolButton::pressed, this, &MainWindow::aboutTool);
ui->mainToolBar->addWidget(help);
2017-01-21 15:33:03 +00:00
// output on screen
m_output->setObjectName("output");
m_output->setAlignment(Qt::AlignTop);
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
m_output->raise();
2017-01-05 15:04:51 +00:00
}
void MainWindow::openFile()
{
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
if(!fileName.isEmpty())
emit loadFile(fileName);
}
2017-01-07 14:59:16 +00:00
void MainWindow::takeScreenShot()
{
QString destination = QFileDialog::getSaveFileName(this, "Save as...", "", "PNG (*.png);; BMP (*.bmp);;TIFF (*.tiff, *.tif);;JPEG (*.jpg *jpeg)");
OglViewerWidget* viewer = dynamic_cast<OglViewerWidget*>(centralWidget());
if (!destination.isEmpty() && viewer != NULL)
viewer->grab().save(destination);
}
void MainWindow::aboutTool()
{
QFile file(":/files/about.txt");
file.open(QIODevice::ReadOnly);
QMessageBox* dialog = new QMessageBox(
QMessageBox::Question,
WINDOW_NAME,
QString(file.readAll()),
QMessageBox::StandardButton::Close,
this,
2017-01-07 14:59:16 +00:00
Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
file.close();
dialog->exec();
2017-01-07 14:59:16 +00:00
delete dialog;
}
void MainWindow::resizeEvent(QResizeEvent * e)
2017-01-11 15:28:51 +00:00
{
m_output->move(40, e->size().height() - 80);
2017-01-11 15:28:51 +00:00
}
/////////////////////////////////////////////////////////////////////////
// slots
void MainWindow::printMessage(QString message, int severity)
{
if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
return;
m_curSeverity = severity;
int time(0);
QPalette palette;
switch (severity)
{
case 1:
time = 3000;
palette.setColor(QPalette::WindowText, Qt::darkYellow);
break;
case 2:
time = 3000;
palette.setColor(QPalette::WindowText, Qt::red);
break;
case 0:
default:
time = 2000;
palette.setColor(QPalette::WindowText, Qt::black);
break;
}
ui->statusBar->setPalette(palette);
ui->statusBar->showMessage(message, time);
}
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
2017-01-07 14:59:16 +00:00
{
// save basic file information
2017-01-07 14:59:16 +00:00
m_fileInfo = QByteArray("Filename: ");
m_fileInfo += name;
m_fileInfo += "\nMaterials: ";
m_fileInfo += QByteArray::number(materials->size());
2017-01-07 14:59:16 +00:00
m_fileInfo += "\nVertices: ";
m_fileInfo += QByteArray::number(vertices);
m_fileInfo += "\nTriangle: ";
m_fileInfo += QByteArray::number(triangle);
m_fileInfo += "<detail>";
// add detailed information
for (auto& it : *materials)
2017-01-07 14:59:16 +00:00
{
m_fileInfo += it.name;
2017-01-07 14:59:16 +00:00
m_fileInfo += "\n";
m_fileInfo += "TX0D:\t\t";
if (it.tx0d.isEmpty())
m_fileInfo += "-";
else
m_fileInfo += it.tx0d;
m_fileInfo += "\n";
m_fileInfo += "TX1D:\t\t";
if (it.tx1d.isEmpty())
m_fileInfo += "-";
else
m_fileInfo += it.tx1d;
m_fileInfo += "\n";
m_fileInfo += "TX2D:\t\t";
if (it.tx2d.isEmpty())
m_fileInfo += "-";
else
m_fileInfo += it.tx2d;
m_fileInfo += "\n";
m_fileInfo += "TX3D:\t\t";
if (it.tx3d.isEmpty())
m_fileInfo += "-";
else
m_fileInfo += it.tx3d;
m_fileInfo += "\n";
m_fileInfo += "Flags:\t\t";
for (int i = 0; i < 8; i++)
{
if (it.flags[i])
m_fileInfo += "1";
else
m_fileInfo += "0";
}
m_fileInfo += "\n";
m_fileInfo += "Rendertype:\t";
m_fileInfo += QByteArray::number(it.rendertype);
m_fileInfo += "\n";
m_fileInfo += "Gloss:\t";
m_fileInfo += QByteArray::number(it.shininess);
m_fileInfo += "\tData0:\t";
m_fileInfo += QByteArray::number(it.dataValues[0]);
m_fileInfo += "\tData1:\t";
m_fileInfo += QByteArray::number(it.dataValues[1]);
m_fileInfo += "\n";
m_fileInfo += "Diffusecolor:\tR: ";
m_fileInfo += QByteArray::number(it.diffuseColor.x());
m_fileInfo += "\tG: ";
m_fileInfo += QByteArray::number(it.diffuseColor.y());
m_fileInfo += "\tB: ";
m_fileInfo += QByteArray::number(it.diffuseColor.z());
m_fileInfo += "\tA: ";
m_fileInfo += QByteArray::number(it.diffuseColor.w());
m_fileInfo += "\n";
m_fileInfo += "Ambientcolor:\tR: ";
m_fileInfo += QByteArray::number(it.ambientColor.x());
m_fileInfo += "\tG: ";
m_fileInfo += QByteArray::number(it.ambientColor.y());
m_fileInfo += "\tB: ";
m_fileInfo += QByteArray::number(it.ambientColor.z());
m_fileInfo += "\tA: ";
m_fileInfo += QByteArray::number(it.ambientColor.w());
m_fileInfo += "\n";
m_fileInfo += "Specularcolor:\tR: ";
m_fileInfo += QByteArray::number(it.specularColor.x());
m_fileInfo += "\tG: ";
m_fileInfo += QByteArray::number(it.specularColor.y());
m_fileInfo += " \tB: ";
m_fileInfo += QByteArray::number(it.specularColor.z());
m_fileInfo += " \tA: ";
m_fileInfo += QByteArray::number(it.specularColor.w());
m_fileInfo += "\n";
m_fileInfo += "-----------------------------------------------------------------\n";
2017-01-07 14:59:16 +00:00
}
// print basic information on screen
m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
// print basic and detailed information on info window
m_infoWindow->setBasicText(QString(m_fileInfo.left(m_fileInfo.indexOf("<detail>"))));
m_infoWindow->setDetailText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("<detail>") - 8)));
}