MainWindow.cpp 9.63 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
52

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

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

62
63
64

/////////////////////////////////////////////////////////////////////////
// functions
Anakin's avatar
Anakin committed
65

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

73
	// open file
Anakin's avatar
Anakin committed
74
75
76
77
78
	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
79

80
	// screenshot
Anakin's avatar
Anakin committed
81
82
83
84
85
	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
86

87
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
88
89
	ui->mainToolBar->addSeparator();

Anakin's avatar
Anakin committed
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
	// 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
	QToolButton *moveCamera = new QToolButton(this);
	moveCamera->setObjectName("moveCamera");
	moveCamera->setToolTip("move camera");
	connect(moveCamera, &QToolButton::pressed, viewer, &OglViewerWidget::useMoveCamera);
	ui->mainToolBar->addWidget(moveCamera);
Anakin's avatar
Anakin committed
110

111
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
112
	ui->mainToolBar->addSeparator();
Anakin's avatar
Anakin committed
113

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

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

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

139
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
140
141
	ui->mainToolBar->addSeparator();

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

149
	// help
Anakin's avatar
Anakin committed
150
151
152
153
154
	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
155

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

Anakin's avatar
Anakin committed
162
163
}

164
void MainWindow::openFile()
Anakin's avatar
Anakin committed
165
{
166
167
168
169
	QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
	if(!fileName.isEmpty())
		emit loadFile(fileName);
}
Anakin's avatar
Anakin committed
170

171
172
173
174
175
176
177
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
178
179
180
181
}

void MainWindow::aboutTool()
{
182
183
184
185
	QFile file(":/files/about.txt");
	file.open(QIODevice::ReadOnly);
	QMessageBox* dialog = new QMessageBox(
		QMessageBox::Question,
Anakin's avatar
Anakin committed
186
		WINDOW_NAME,
187
		QString(file.readAll()),
Anakin's avatar
Anakin committed
188
189
		QMessageBox::StandardButton::Close,
		this,
Anakin's avatar
Anakin committed
190
		Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
191
192
193

	file.close();

Anakin's avatar
Anakin committed
194
	dialog->exec();
Anakin's avatar
Anakin committed
195
196
197
198

	delete dialog;
}

199
void MainWindow::resizeEvent(QResizeEvent * e)
Anakin's avatar
Anakin committed
200
{
201
	m_output->move(40, e->size().height() - 80);
Anakin's avatar
Anakin committed
202
203
}

204
205
206
207
208

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

void MainWindow::printMessage(QString message, int severity)
Anakin's avatar
Anakin committed
209
{
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
	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
236
237
}

238
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
Anakin's avatar
Anakin committed
239
{
240
	// save basic file information
Anakin's avatar
Anakin committed
241
242
243
	m_fileInfo = QByteArray("Filename: ");
	m_fileInfo += name;
	m_fileInfo += "\nMaterials: ";
244
	m_fileInfo += QByteArray::number(materials->size());
Anakin's avatar
Anakin committed
245
246
247
248
249
250
	m_fileInfo += "\nVertices: ";
	m_fileInfo += QByteArray::number(vertices);
	m_fileInfo += "\nTriangle: ";
	m_fileInfo += QByteArray::number(triangle);
	m_fileInfo += "<detail>";

251
	// add detailed information
252
	for (auto& it : *materials)
Anakin's avatar
Anakin committed
253
	{
254
		m_fileInfo += it.name;
Anakin's avatar
Anakin committed
255
		m_fileInfo += "\n";
Anakin's avatar
Anakin committed
256
257

		m_fileInfo += "TX0D:\t\t";
258
		if (it.tx0d.isEmpty())
Anakin's avatar
Anakin committed
259
			m_fileInfo += "-";
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
		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
283
284
285
286
287
288
289
290
291
292
293
294
		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
295
296
		m_fileInfo += "Rendertype:\t";
		m_fileInfo += QByteArray::number(it.rendertype);
Anakin's avatar
Anakin committed
297
298
		m_fileInfo += "\n";

Anakin's avatar
Anakin committed
299
		m_fileInfo += "Gloss:\t";
Anakin's avatar
Anakin committed
300
		m_fileInfo += QByteArray::number(it.shininess);
Anakin's avatar
Anakin committed
301
302
303
304
		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
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
		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
338
	}
Anakin's avatar
Anakin committed
339

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

343
	// print basic and detailed information on info window
Anakin's avatar
Anakin committed
344
345
346
	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)));

347
}