152 lines
3.7 KiB
C++
152 lines
3.7 KiB
C++
#include "..\Header\MainWindow.h"
|
|
#include "..\Header\OpenGlViewer.h"
|
|
#include "..\Header\MshFile.h"
|
|
#include "..\Header\defines.h"
|
|
#include <QKeyEvent>
|
|
#include <QMessageBox>
|
|
#include <QFileDialog>
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// constructor/destructor
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
: QMainWindow(parent)
|
|
, ui (new Ui::MainWindowClass)
|
|
{
|
|
setupWindow();
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// private functions
|
|
|
|
void MainWindow::setupWindow()
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
this->setWindowTitle(WINDOW_NAME);
|
|
this->setWindowIcon(QIcon(":/MainWindow/icon.ico"));
|
|
this->resize(WINDOW_WIDTH, WINDOW_HEIGHT);
|
|
|
|
this->setCentralWidget(new OpenGlViewer(this));
|
|
|
|
ui->mainToolBar->addAction("Open File", this, &MainWindow::openFile);
|
|
ui->mainToolBar->addAction("File Info", this, &MainWindow::aboutFile);
|
|
|
|
ui->statusBar->showMessage(DEFAULT_STATUS_MESSAGE);
|
|
}
|
|
|
|
void MainWindow::import(const char * path)
|
|
{
|
|
// variables
|
|
std::vector<Model*>* tmp_models = nullptr;
|
|
std::vector<TextureData*>* tmp_textures = new std::vector<TextureData*>;
|
|
std::vector<std::string> tmp_texNames;
|
|
BoundingBox tmp_bbox;
|
|
|
|
// model file
|
|
try
|
|
{
|
|
MshFile file(path);
|
|
tmp_models = file.getModels();
|
|
tmp_texNames = file.getTextureNames();
|
|
tmp_bbox = file.getBoundingBox();
|
|
}
|
|
catch (std::invalid_argument e)
|
|
{
|
|
QMessageBox msg(this);
|
|
msg.addButton(QMessageBox::Ok);
|
|
msg.setText(QString::fromStdString(e.what()));
|
|
msg.setIcon(QMessageBox::Critical);
|
|
msg.setWindowTitle("Open File Error");
|
|
|
|
msg.exec();
|
|
return;
|
|
}
|
|
|
|
// parth to texture
|
|
std::string tmp_path = path;
|
|
while (tmp_path.back() != '/' && tmp_path.back() != '\\')
|
|
tmp_path.pop_back();
|
|
|
|
// load all textures
|
|
for (auto& texIt : tmp_texNames)
|
|
{
|
|
TextureData* new_data = new TextureData;
|
|
try
|
|
{
|
|
TextureTGA tmp_texFile(std::string(tmp_path + texIt).c_str());
|
|
|
|
new_data->alpha = tmp_texFile.hasAlpha();
|
|
new_data->width = tmp_texFile.getWidth();
|
|
new_data->height = tmp_texFile.getHeight();
|
|
new_data->data = tmp_texFile.getData();
|
|
}
|
|
catch (std::invalid_argument e)
|
|
{
|
|
new_data->alpha = true;
|
|
new_data->width = 1;
|
|
new_data->height = 1;
|
|
new_data->data = new std::vector<std::uint8_t>({ 0, 0, 255, 255 });
|
|
}
|
|
|
|
tmp_textures->push_back(new_data);
|
|
}
|
|
|
|
// add a solid default color at the end (maybe there is an invalid index later)
|
|
TextureData* new_data = new TextureData;
|
|
new_data->alpha = true;
|
|
new_data->width = 1;
|
|
new_data->height = 1;
|
|
new_data->data = new std::vector<std::uint8_t>({ 0, 0, 255, 255 });
|
|
tmp_textures->push_back(new_data);
|
|
|
|
// clean up texture name list
|
|
tmp_texNames.clear();
|
|
|
|
// give the data to the viewer
|
|
OpenGlViewer* tmp_viewer = dynamic_cast<OpenGlViewer*>(centralWidget());
|
|
tmp_viewer->setData(tmp_models, tmp_textures, tmp_bbox);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// private slots
|
|
|
|
void MainWindow::openFile()
|
|
{
|
|
QString fileName = QFileDialog::getOpenFileName(this, "Open File", "../Release/Msh", "Mesh (*.msh)");
|
|
|
|
import(fileName.toStdString().c_str());
|
|
}
|
|
|
|
void MainWindow::aboutFile()
|
|
{
|
|
//TODO: Open Window with file information
|
|
QMessageBox* dialog = new QMessageBox(QMessageBox::Information, WINDOW_NAME, "File Info", QMessageBox::StandardButton::Close, this, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
|
|
dialog->setDetailedText("This is the cool detailed text\n");
|
|
dialog->exec();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// events
|
|
|
|
void MainWindow::keyPressEvent(QKeyEvent * keyEvent)
|
|
{
|
|
switch (keyEvent->key())
|
|
{
|
|
case Qt::Key::Key_Escape:
|
|
close();
|
|
break;
|
|
}
|
|
|
|
QMainWindow::keyPressEvent(keyEvent);
|
|
}
|