#include "..\Header\MainWindow.h" #include "..\Header\OglViewerWidget.h" #include #include #include #include #include #include #include #include #include #include #include "..\Header\FileInterface.h" #define WINDOW_NAME "Mesh Viewer" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindowClass) , m_curSeverity(0) , m_output(new QLabel(this)) { ui->setupUi(this); setWindowTitle(WINDOW_NAME); setWindowIcon(QIcon(":/images/icon.ico")); QSurfaceFormat format; format.setDepthBufferSize(24); QSurfaceFormat::setDefaultFormat(format); setupWidgets(); ui->statusBar->showMessage("MeshViewer by Anakin", 0); m_fileInfo += "Filename: -\nMaterials: -\nVertices: -\nTriangle: -\nNo file is open"; } MainWindow::~MainWindow() { delete ui; delete m_output; } void MainWindow::openFile() { QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)"); if(!fileName.isEmpty()) emit loadFile(fileName); } void MainWindow::setupWidgets() { OglViewerWidget* viewer = new OglViewerWidget(this); setCentralWidget(viewer); QAction *openFile = new QAction(QIcon(":/images/toolbar/open.png"), "Open file", this); connect(openFile, &QAction::triggered, this, &MainWindow::openFile); ui->mainToolBar->addAction(openFile); QAction *screenShot = new QAction(QIcon(":/images/toolbar/screenshot.png"), "Screenshot", this); connect(screenShot, &QAction::triggered, this, &MainWindow::takeScreenShot); ui->mainToolBar->addAction(screenShot); ui->mainToolBar->addSeparator(); QSignalMapper* signalMapper = new QSignalMapper(this); QAction *x = new QAction(QIcon(":/images/toolbar/X.png"), "X", this); x->setCheckable(true); x->setChecked(true); ui->mainToolBar->addAction(x); QAction *y = new QAction(QIcon(":/images/toolbar/Y.png"), "Y", this); y->setCheckable(true); y->setChecked(true); ui->mainToolBar->addAction(y); QAction *z = new QAction(QIcon(":/images/toolbar/Z.png"), "Z", this); z->setCheckable(true); z->setChecked(true); ui->mainToolBar->addAction(z); connect(x, SIGNAL(triggered()), signalMapper, SLOT(map())); connect(y, SIGNAL(triggered()), signalMapper, SLOT(map())); connect(z, SIGNAL(triggered()), signalMapper, SLOT(map())); signalMapper->setMapping(x, 1); signalMapper->setMapping(y, 2); signalMapper->setMapping(z, 3); connect(signalMapper, SIGNAL(mapped(int)), viewer, SLOT(changeDirection(int))); ui->mainToolBar->addSeparator(); QAction *wireframe = new QAction(QIcon(":/images/toolbar/wireframe.png"), "Wireframe", this); wireframe->setCheckable(true); wireframe->setChecked(false); connect(wireframe, &QAction::triggered, viewer, &OglViewerWidget::toggleWireframe); ui->mainToolBar->addAction(wireframe); ui->mainToolBar->addSeparator(); QAction *fileInfo = new QAction(QIcon(":/images/toolbar/info.png"), "File info", this); connect(fileInfo, &QAction::triggered, this, &MainWindow::aboutFile); ui->mainToolBar->addAction(fileInfo); QAction *help = new QAction(QIcon(":/images/toolbar/about.png"), "Help", this); connect(help, &QAction::triggered, this, &MainWindow::aboutTool); ui->mainToolBar->addAction(help); m_output->setObjectName("output"); m_output->setStyleSheet("QLabel#output{color : white; min-width: 400px; min-height: 50px;}"); m_output->setAlignment(Qt::AlignTop); m_output->setText("Name: -\nMaterials: -\nVertice: -\nTriangle: -"); m_output->raise(); } void MainWindow::aboutFile() { QMessageBox* dialog = new QMessageBox(QMessageBox::NoIcon, WINDOW_NAME, QString(m_fileInfo.left(m_fileInfo.indexOf(""))), QMessageBox::StandardButton::Close, this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); dialog->setStyleSheet("QLabel{min-width: 200px;}"); dialog->setDetailedText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("") - 8))); dialog->exec(); delete dialog; } 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, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); file.close(); dialog->exec(); delete dialog; } void MainWindow::takeScreenShot() { QString destination = QFileDialog::getSaveFileName(this, "Save as...", "", "PNG (*.png);; BMP (*.bmp);;TIFF (*.tiff, *.tif);;JPEG (*.jpg *jpeg)"); OglViewerWidget* viewer = dynamic_cast(centralWidget()); if (!destination.isEmpty() && viewer != NULL) viewer->grab().save(destination); } void MainWindow::resizeEvent(QResizeEvent * e) { m_output->move(40, e->size().height() - 80); } void MainWindow::setFileInfo(QString name, QVector* materials, int vertices, int triangle) { m_fileInfo = QByteArray("Filename: "); m_fileInfo += name; m_fileInfo += "\nMaterials: "; m_fileInfo += QByteArray::number(materials->size()); m_fileInfo += "\nVertices: "; m_fileInfo += QByteArray::number(vertices); m_fileInfo += "\nTriangle: "; m_fileInfo += QByteArray::number(triangle); m_fileInfo += ""; int count(0); //TODO: mark not opened textures for (auto& it : *materials) { m_fileInfo += "Material "; m_fileInfo += QByteArray::number(count++); m_fileInfo += " - "; m_fileInfo += it.name; m_fileInfo += "\n"; } m_output->setText(m_fileInfo.left(m_fileInfo.indexOf(""))); } 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); }