MainWindow.cpp 9.67 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);
34 35

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

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

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

49
	// load stylesheet
Anakin's avatar
Anakin committed
50 51 52
	QFile styleSheet(":/files/StyleSheet.txt");
	styleSheet.open(QIODevice::ReadOnly);
	this->setStyleSheet(styleSheet.readAll());
53 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 73
	OglViewerWidget* viewer = new OglViewerWidget(this);
	setCentralWidget(viewer);

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

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

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

Anakin's avatar
Anakin committed
91 92
	QSignalMapper* signalMapper = new QSignalMapper(this);

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

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

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

Anakin's avatar
Anakin committed
117 118 119
	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
120 121 122 123 124

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

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

127
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
128
	ui->mainToolBar->addSeparator();
Anakin's avatar
Anakin committed
129

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

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

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

155
	//////////////////////////////////////////////////
Anakin's avatar
Anakin committed
156 157
	ui->mainToolBar->addSeparator();

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

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

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

Anakin's avatar
Anakin committed
178 179
}

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

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

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

	file.close();

Anakin's avatar
Anakin committed
210
	dialog->exec();
Anakin's avatar
Anakin committed
211 212 213 214

	delete dialog;
}

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

220 221 222 223 224

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

void MainWindow::printMessage(QString message, int severity)
Anakin's avatar
Anakin committed
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 250 251
	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
252 253
}

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

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

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

Anakin's avatar
Anakin committed
315
		m_fileInfo += "Gloss:\t";
Anakin's avatar
Anakin committed
316
		m_fileInfo += QByteArray::number(it.shininess);
Anakin's avatar
Anakin committed
317 318 319 320
		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
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 352 353
		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
354
	}
Anakin's avatar
Anakin committed
355

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

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

363
}