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";
Anakin's avatar
Anakin committed
285
286

		m_fileInfo += "TX0D:\t\t";
287
		if (it.tx0d.isEmpty())
Anakin's avatar
Anakin committed
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;
Anakin's avatar
Anakin committed
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);
Anakin's avatar
Anakin committed
326
327
		m_fileInfo += "\n";

Anakin's avatar
Anakin committed
328
		m_fileInfo += "Gloss:\t";
Anakin's avatar
Anakin committed
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]);
Anakin's avatar
Anakin committed
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
}