MainWindow.cpp 10.3 KB
Newer Older
1 2
#include "..\Header\MainWindow.h"
#include "..\Header\OglViewerWidget.h"
3
#include "..\Header\FileInterface.h"
4
#include "..\Header\OutputDevice.h"
5
#include <QSurfaceFormat>
Anakin's avatar
Anakin committed
6
#include <QSignalMapper>
7
#include <QToolButton>
Anakin's avatar
Anakin committed
8
#include <QFile>
9 10 11
#include <QFileDialog>
#include <QMessageBox>
#include <QPalette>
Anakin's avatar
Anakin committed
12
#include <QResizeEvent>
Anakin's avatar
Anakin committed
13 14

#define WINDOW_NAME "Mesh Viewer"
15

16 17 18 19

/////////////////////////////////////////////////////////////////////////
// constructor/destructor

20 21 22
MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
	, ui(new Ui::MainWindowClass)
Anakin's avatar
Anakin committed
23
	, m_output(new QLabel(this))
24
	, m_curSeverity(0)
Anakin's avatar
Anakin committed
25
	, m_infoWindow(new FileInfoWindow(this))
26
{
27
	// setup window
28 29
	ui->setupUi(this);

Anakin's avatar
Anakin committed
30 31 32
	setWindowTitle(WINDOW_NAME);
	setWindowIcon(QIcon(":/images/icon.ico"));

33
	connect(OutputDevice::getInstance(this), &OutputDevice::sendMessage, this, &MainWindow::printMessage);
Anakin's avatar
Anakin committed
34
	connect(OutputDevice::getInstance(this), &OutputDevice::sendFileInfo, this, &MainWindow::setFileInfo);
35 36

	// setup opengl things
37 38 39 40
	QSurfaceFormat format;
	format.setDepthBufferSize(24);
	QSurfaceFormat::setDefaultFormat(format);

41 42
	// set default text to file info
	m_fileInfo = "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
Anakin's avatar
Anakin committed
43

44 45
	// add widgets to the window
	setupWidgets();
Anakin's avatar
Anakin committed
46

47
	// load stylesheet
Anakin's avatar
Anakin committed
48 49 50
	QFile styleSheet(":/files/StyleSheet.txt");
	styleSheet.open(QIODevice::ReadOnly);
	this->setStyleSheet(styleSheet.readAll());
51

Anakin's avatar
Anakin committed
52 53
	getAssetLibrary();

54
	printMessage("MeshViewer by Anakin", 0);
55 56 57 58 59
}

MainWindow::~MainWindow()
{
	delete ui;
Anakin's avatar
Anakin committed
60
	delete m_output;
Anakin's avatar
Anakin committed
61
	delete m_infoWindow;
Anakin's avatar
Anakin committed
62 63
}

64 65 66

/////////////////////////////////////////////////////////////////////////
// functions
Anakin's avatar
Anakin committed
67

Anakin's avatar
Anakin committed
68 69
void MainWindow::setupWidgets()
{
70
	// Ogl Viewer
Anakin's avatar
Anakin committed
71 72
	OglViewerWidget* viewer = new OglViewerWidget(this);
	setCentralWidget(viewer);
Anakin's avatar
Anakin committed
73
	connect(this, &MainWindow::loadFile, viewer, &OglViewerWidget::loadFile);
Anakin's avatar
Anakin committed
74

75
	// open file
Anakin's avatar
Anakin committed
76 77 78 79 80
	QToolButton *openFile = new QToolButton(this);
	openFile->setObjectName("openFile");
	openFile->setToolTip("open file");
	connect(openFile, &QToolButton::pressed, this, &MainWindow::openFile);
	ui->mainToolBar->addWidget(openFile);
Anakin's avatar
Anakin committed
81

82
	// screenshot
Anakin's avatar
Anakin committed
83 84 85 86 87
	QToolButton *screenshot = new QToolButton(this);
	screenshot->setObjectName("screenshot");
	screenshot->setToolTip("take screenshot");
	connect(screenshot, &QToolButton::pressed, this, &MainWindow::takeScreenShot);
	ui->mainToolBar->addWidget(screenshot);
Anakin's avatar
Anakin committed
88

89
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
90 91
	ui->mainToolBar->addSeparator();

Anakin's avatar
Anakin committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
	// Free Camera
	QToolButton *freeCamera = new QToolButton(this);
	freeCamera->setObjectName("freeCamera");
	freeCamera->setToolTip("free camera");
	connect(freeCamera, &QToolButton::pressed, viewer, &OglViewerWidget::useFreeCamera);
	ui->mainToolBar->addWidget(freeCamera);

	// Orbital Camera
	QToolButton *orbitCamera = new QToolButton(this);
	orbitCamera->setObjectName("orbitalCamera");
	orbitCamera->setToolTip("orbital camera");
	connect(orbitCamera, &QToolButton::pressed, viewer, &OglViewerWidget::useOrbitCamera);
	ui->mainToolBar->addWidget(orbitCamera);

	// Move Camera
Anakin's avatar
Anakin committed
107 108 109 110 111
	QToolButton *walkCamera = new QToolButton(this);
	walkCamera->setObjectName("walkCamera");
	walkCamera->setToolTip("walk camera");
	connect(walkCamera, &QToolButton::pressed, viewer, &OglViewerWidget::useMoveCamera);
	ui->mainToolBar->addWidget(walkCamera);
Anakin's avatar
Anakin committed
112

113
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
114
	ui->mainToolBar->addSeparator();
Anakin's avatar
Anakin committed
115

116
	// wireframe
Anakin's avatar
Anakin committed
117 118 119
	QToolButton *wireframe = new QToolButton(this);
	wireframe->setObjectName("wireframe");
	wireframe->setToolTip("wireframe");
Anakin's avatar
Anakin committed
120 121
	wireframe->setCheckable(true);
	wireframe->setChecked(false);
Anakin's avatar
Anakin committed
122 123
	connect(wireframe, &QToolButton::pressed, viewer, &OglViewerWidget::toggleWireframe);
	ui->mainToolBar->addWidget(wireframe);
Anakin's avatar
Anakin committed
124

125
	// light
Anakin's avatar
Anakin committed
126 127 128
	QToolButton *light = new QToolButton(this);
	light->setObjectName("light");
	light->setToolTip("toggle light");
Anakin's avatar
Anakin committed
129 130
	light->setCheckable(true);
	light->setChecked(false);
Anakin's avatar
Anakin committed
131 132
	connect(light, &QToolButton::pressed, viewer, &OglViewerWidget::toggleLight);
	ui->mainToolBar->addWidget(light);
Anakin's avatar
Anakin committed
133

134
	// settings
Anakin's avatar
Anakin committed
135 136 137 138 139 140
	QToolButton *settings = new QToolButton(this);
	settings->setObjectName("settings");
	settings->setToolTip("settings");
	connect(settings, &QToolButton::pressed, viewer, &OglViewerWidget::showSettings);
	ui->mainToolBar->addWidget(settings);

141
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
142 143
	ui->mainToolBar->addSeparator();

144
	// fileinfo
Anakin's avatar
Anakin committed
145 146 147
	QToolButton *fileInfo = new QToolButton(this);
	fileInfo->setObjectName("fileInfo");
	fileInfo->setToolTip("file info");
148
	connect(fileInfo, &QToolButton::pressed, m_infoWindow, &FileInfoWindow::show);
Anakin's avatar
Anakin committed
149 150
	ui->mainToolBar->addWidget(fileInfo);

151
	// help
Anakin's avatar
Anakin committed
152 153 154 155 156
	QToolButton *help = new QToolButton(this);
	help->setObjectName("help");
	help->setToolTip("help");
	connect(help, &QToolButton::pressed, this, &MainWindow::aboutTool);
	ui->mainToolBar->addWidget(help);
Anakin's avatar
Anakin committed
157

158
	// output on screen
Anakin's avatar
Anakin committed
159 160
	m_output->setObjectName("output");
	m_output->setAlignment(Qt::AlignTop);
161
	m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
Anakin's avatar
Anakin committed
162
	m_output->raise();
Anakin's avatar
Anakin committed
163

Anakin's avatar
Anakin committed
164 165
}

Anakin's avatar
Anakin committed
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
void MainWindow::getAssetLibrary()
{
	QTreeWidgetItem* item = new QTreeWidgetItem;
	item->setData(0, Qt::DisplayRole, "Wuhu");
	ui->treeWidget->addTopLevelItem(item);

	searchMeshFiles("D:/workspaces/Visual Studio 2015/Projects/OpenGL/Release");

}

void MainWindow::searchMeshFiles(QString path)
{
	QDir directory(path);
	directory.setNameFilters(QStringList("*.msh"));

	QStringList childDirectories = directory.entryList(QDir::AllDirs | QDir::NoDotAndDotDot);

	QStringList fileNames = directory.entryList(QDir::Files);

	for (auto &it : childDirectories)
		qDebug() << it;

	for (auto &it : fileNames)
		qDebug() << it;

}

193
void MainWindow::openFile()
Anakin's avatar
Anakin committed
194
{
195 196 197 198
	QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
	if(!fileName.isEmpty())
		emit loadFile(fileName);
}
Anakin's avatar
Anakin committed
199

200 201 202 203 204 205 206
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);
Anakin's avatar
Anakin committed
207 208 209 210
}

void MainWindow::aboutTool()
{
211 212 213 214
	QFile file(":/files/about.txt");
	file.open(QIODevice::ReadOnly);
	QMessageBox* dialog = new QMessageBox(
		QMessageBox::Question,
Anakin's avatar
Anakin committed
215
		WINDOW_NAME,
216
		QString(file.readAll()),
Anakin's avatar
Anakin committed
217 218
		QMessageBox::StandardButton::Close,
		this,
Anakin's avatar
Anakin committed
219
		Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
220 221 222

	file.close();

Anakin's avatar
Anakin committed
223
	dialog->exec();
Anakin's avatar
Anakin committed
224 225 226 227

	delete dialog;
}

228
void MainWindow::resizeEvent(QResizeEvent * e)
Anakin's avatar
Anakin committed
229
{
230
	m_output->move(40, e->size().height() - 80);
Anakin's avatar
Anakin committed
231 232
}

233 234 235 236 237

/////////////////////////////////////////////////////////////////////////
// slots

void MainWindow::printMessage(QString message, int severity)
Anakin's avatar
Anakin committed
238
{
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
	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);
Anakin's avatar
Anakin committed
265 266
}

267
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
Anakin's avatar
Anakin committed
268
{
269
	// save basic file information
Anakin's avatar
Anakin committed
270 271 272
	m_fileInfo = QByteArray("Filename: ");
	m_fileInfo += name;
	m_fileInfo += "\nMaterials: ";
273
	m_fileInfo += QByteArray::number(materials->size());
Anakin's avatar
Anakin committed
274 275 276 277 278 279
	m_fileInfo += "\nVertices: ";
	m_fileInfo += QByteArray::number(vertices);
	m_fileInfo += "\nTriangle: ";
	m_fileInfo += QByteArray::number(triangle);
	m_fileInfo += "<detail>";

280
	// add detailed information
281
	for (auto& it : *materials)
Anakin's avatar
Anakin committed
282
	{
283
		m_fileInfo += it.name;
Anakin's avatar
Anakin committed
284
		m_fileInfo += "\n";
285 286

		m_fileInfo += "TX0D:\t\t";
287
		if (it.tx0d.isEmpty())
288
			m_fileInfo += "-";
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
		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;
312 313 314 315 316 317 318 319 320 321 322 323
		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";

Anakin's avatar
Anakin committed
324 325
		m_fileInfo += "Rendertype:\t";
		m_fileInfo += QByteArray::number(it.rendertype);
326 327
		m_fileInfo += "\n";

Anakin's avatar
Anakin committed
328
		m_fileInfo += "Gloss:\t";
329
		m_fileInfo += QByteArray::number(it.shininess);
Anakin's avatar
Anakin committed
330 331 332 333
		m_fileInfo += "\tData0:\t";
		m_fileInfo += QByteArray::number(it.dataValues[0]);
		m_fileInfo += "\tData1:\t";
		m_fileInfo += QByteArray::number(it.dataValues[1]);
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
		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";
Anakin's avatar
Anakin committed
367
	}
Anakin's avatar
Anakin committed
368

369
	// print basic information on screen
Anakin's avatar
Anakin committed
370
	m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
Anakin's avatar
Anakin committed
371

372
	// print basic and detailed information on info window
Anakin's avatar
Anakin committed
373 374 375
	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)));

376
}