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

#define WINDOW_NAME "Mesh Viewer"
14

15 16 17 18

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

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

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

32 33 34
	printMessage("MeshViewer by Anakin", 0);

	// setup opengl things
35 36
	QSurfaceFormat format;
	format.setDepthBufferSize(24);
Anakin's avatar
Anakin committed
37 38 39
	format.setMajorVersion(2);
	format.setMinorVersion(0);
	format.setProfile(QSurfaceFormat::NoProfile);
40 41
	QSurfaceFormat::setDefaultFormat(format);

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

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

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

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

61 62 63

/////////////////////////////////////////////////////////////////////////
// functions
Anakin's avatar
Anakin committed
64

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

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

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

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

Anakin's avatar
Anakin committed
89 90
	QSignalMapper* signalMapper = new QSignalMapper(this);

91
	// X
Anakin's avatar
Anakin committed
92 93 94
	QToolButton *x = new QToolButton(this);
	x->setObjectName("x");
	x->setToolTip("x-direction");
Anakin's avatar
Anakin committed
95 96
	x->setCheckable(true);
	x->setChecked(true);
Anakin's avatar
Anakin committed
97
	ui->mainToolBar->addWidget(x);
Anakin's avatar
Anakin committed
98

99
	// Y
Anakin's avatar
Anakin committed
100 101 102
	QToolButton *y = new QToolButton(this);
	y->setObjectName("y");
	y->setToolTip("y-direction");
Anakin's avatar
Anakin committed
103 104
	y->setCheckable(true);
	y->setChecked(true);
Anakin's avatar
Anakin committed
105
	ui->mainToolBar->addWidget(y);
Anakin's avatar
Anakin committed
106

107
	// Z
Anakin's avatar
Anakin committed
108 109 110
	QToolButton *z = new QToolButton(this);
	z->setObjectName("z");
	z->setToolTip("z-direction");
Anakin's avatar
Anakin committed
111 112
	z->setCheckable(true);
	z->setChecked(true);
Anakin's avatar
Anakin committed
113
	ui->mainToolBar->addWidget(z);
Anakin's avatar
Anakin committed
114

Anakin's avatar
Anakin committed
115 116 117
	connect(x, SIGNAL(pressed()), signalMapper, SLOT(map()));
	connect(y, SIGNAL(pressed()), signalMapper, SLOT(map()));
	connect(z, SIGNAL(pressed()), signalMapper, SLOT(map()));
Anakin's avatar
Anakin committed
118 119 120 121 122

	signalMapper->setMapping(x, 1);
	signalMapper->setMapping(y, 2);
	signalMapper->setMapping(z, 3);

123
	connect(signalMapper, SIGNAL(mapped(int)), viewer, SLOT(toggleAxis(int)));
Anakin's avatar
Anakin committed
124

125
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
126
	ui->mainToolBar->addSeparator();
Anakin's avatar
Anakin committed
127

128
	// wireframe
Anakin's avatar
Anakin committed
129 130 131
	QToolButton *wireframe = new QToolButton(this);
	wireframe->setObjectName("wireframe");
	wireframe->setToolTip("wireframe");
Anakin's avatar
Anakin committed
132 133
	wireframe->setCheckable(true);
	wireframe->setChecked(false);
Anakin's avatar
Anakin committed
134 135
	connect(wireframe, &QToolButton::pressed, viewer, &OglViewerWidget::toggleWireframe);
	ui->mainToolBar->addWidget(wireframe);
Anakin's avatar
Anakin committed
136

137
	// light
Anakin's avatar
Anakin committed
138 139 140
	QToolButton *light = new QToolButton(this);
	light->setObjectName("light");
	light->setToolTip("toggle light");
Anakin's avatar
Anakin committed
141 142
	light->setCheckable(true);
	light->setChecked(false);
Anakin's avatar
Anakin committed
143 144
	connect(light, &QToolButton::pressed, viewer, &OglViewerWidget::toggleLight);
	ui->mainToolBar->addWidget(light);
Anakin's avatar
Anakin committed
145

146
	// settings
Anakin's avatar
Anakin committed
147 148 149 150 151 152
	QToolButton *settings = new QToolButton(this);
	settings->setObjectName("settings");
	settings->setToolTip("settings");
	connect(settings, &QToolButton::pressed, viewer, &OglViewerWidget::showSettings);
	ui->mainToolBar->addWidget(settings);

153
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
154 155
	ui->mainToolBar->addSeparator();

156
	// fileinfo
Anakin's avatar
Anakin committed
157 158 159
	QToolButton *fileInfo = new QToolButton(this);
	fileInfo->setObjectName("fileInfo");
	fileInfo->setToolTip("file info");
160
	connect(fileInfo, &QToolButton::pressed, m_infoWindow, &FileInfoWindow::show);
Anakin's avatar
Anakin committed
161 162
	ui->mainToolBar->addWidget(fileInfo);

163
	// help
Anakin's avatar
Anakin committed
164 165 166 167 168
	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
169

170
	// output on screen
Anakin's avatar
Anakin committed
171 172
	m_output->setObjectName("output");
	m_output->setAlignment(Qt::AlignTop);
173
	m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
Anakin's avatar
Anakin committed
174
	m_output->raise();
Anakin's avatar
Anakin committed
175

Anakin's avatar
Anakin committed
176 177
}

178
void MainWindow::openFile()
Anakin's avatar
Anakin committed
179
{
180 181 182 183
	QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
	if(!fileName.isEmpty())
		emit loadFile(fileName);
}
Anakin's avatar
Anakin committed
184

185 186 187 188 189 190 191
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
192 193 194 195
}

void MainWindow::aboutTool()
{
196 197 198 199
	QFile file(":/files/about.txt");
	file.open(QIODevice::ReadOnly);
	QMessageBox* dialog = new QMessageBox(
		QMessageBox::Question,
Anakin's avatar
Anakin committed
200
		WINDOW_NAME,
201
		QString(file.readAll()),
Anakin's avatar
Anakin committed
202 203
		QMessageBox::StandardButton::Close,
		this,
Anakin's avatar
Anakin committed
204
		Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
205 206 207

	file.close();

Anakin's avatar
Anakin committed
208
	dialog->exec();
Anakin's avatar
Anakin committed
209 210 211 212

	delete dialog;
}

213
void MainWindow::resizeEvent(QResizeEvent * e)
Anakin's avatar
Anakin committed
214
{
215
	m_output->move(40, e->size().height() - 80);
Anakin's avatar
Anakin committed
216 217
}

218 219 220 221 222

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

void MainWindow::printMessage(QString message, int severity)
Anakin's avatar
Anakin committed
223
{
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
	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
250 251
}

252
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
Anakin's avatar
Anakin committed
253
{
254
	// save basic file information
Anakin's avatar
Anakin committed
255 256 257
	m_fileInfo = QByteArray("Filename: ");
	m_fileInfo += name;
	m_fileInfo += "\nMaterials: ";
258
	m_fileInfo += QByteArray::number(materials->size());
Anakin's avatar
Anakin committed
259 260 261 262 263 264
	m_fileInfo += "\nVertices: ";
	m_fileInfo += QByteArray::number(vertices);
	m_fileInfo += "\nTriangle: ";
	m_fileInfo += QByteArray::number(triangle);
	m_fileInfo += "<detail>";

265
	// add detailed information
266
	for (auto& it : *materials)
Anakin's avatar
Anakin committed
267
	{
268
		m_fileInfo += it.name;
Anakin's avatar
Anakin committed
269
		m_fileInfo += "\n";
Anakin's avatar
Anakin committed
270 271

		m_fileInfo += "TX0D:\t\t";
272
		if (it.tx0d.isEmpty())
Anakin's avatar
Anakin committed
273
			m_fileInfo += "-";
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
		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
297 298 299 300 301 302 303 304 305 306 307 308
		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
309 310
		m_fileInfo += "Rendertype:\t";
		m_fileInfo += QByteArray::number(it.rendertype);
Anakin's avatar
Anakin committed
311 312
		m_fileInfo += "\n";

Anakin's avatar
Anakin committed
313
		m_fileInfo += "Gloss:\t";
Anakin's avatar
Anakin committed
314
		m_fileInfo += QByteArray::number(it.shininess);
Anakin's avatar
Anakin committed
315 316 317 318
		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
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
		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
352
	}
Anakin's avatar
Anakin committed
353

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

357
	// print basic and detailed information on info window
Anakin's avatar
Anakin committed
358 359 360
	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)));

361
}