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

#define WINDOW_NAME "Mesh Viewer"
17 18 19 20

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

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

30 31
	QSurfaceFormat format;
	format.setDepthBufferSize(24);
Anakin's avatar
Anakin committed
32 33 34
	format.setMajorVersion(2);
	format.setMinorVersion(0);
	format.setProfile(QSurfaceFormat::NoProfile);
35 36
	QSurfaceFormat::setDefaultFormat(format);

Anakin's avatar
Anakin committed
37
	setupWidgets();
38

Anakin's avatar
Anakin committed
39
	printMessage("MeshViewer by Anakin", 0);
Anakin's avatar
Anakin committed
40

Anakin's avatar
Anakin committed
41
	m_fileInfo += "Filename: -\nMaterials: -\nVertices: -\nTriangle: -<detail>No file is open";
Anakin's avatar
Anakin committed
42 43 44 45

	QFile styleSheet(":/files/StyleSheet.txt");
	styleSheet.open(QIODevice::ReadOnly);
	this->setStyleSheet(styleSheet.readAll());
46 47 48 49 50
}

MainWindow::~MainWindow()
{
	delete ui;
Anakin's avatar
Anakin committed
51
	delete m_output;
Anakin's avatar
Anakin committed
52
	delete m_infoWindow;
Anakin's avatar
Anakin committed
53 54 55 56
}

void MainWindow::openFile()
{
Anakin's avatar
Anakin committed
57
	QString fileName = QFileDialog::getOpenFileName(this, "Open File", "", "Mesh (*.msh)");
Anakin's avatar
Anakin committed
58 59
	if(!fileName.isEmpty())
		emit loadFile(fileName);
Anakin's avatar
Anakin committed
60 61
}

Anakin's avatar
Anakin committed
62 63 64 65
void MainWindow::setupWidgets()
{
	OglViewerWidget* viewer = new OglViewerWidget(this);
	setCentralWidget(viewer);
Anakin's avatar
Anakin committed
66
	connect(viewer, &OglViewerWidget::sendMessage, this, &MainWindow::printMessage);
Anakin's avatar
Anakin committed
67

Anakin's avatar
Anakin committed
68 69 70 71 72
	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
73

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

Anakin's avatar
Anakin committed
80 81
	ui->mainToolBar->addSeparator();

Anakin's avatar
Anakin committed
82 83
	QSignalMapper* signalMapper = new QSignalMapper(this);

Anakin's avatar
Anakin committed
84 85 86
	QToolButton *x = new QToolButton(this);
	x->setObjectName("x");
	x->setToolTip("x-direction");
Anakin's avatar
Anakin committed
87 88
	x->setCheckable(true);
	x->setChecked(true);
Anakin's avatar
Anakin committed
89
	ui->mainToolBar->addWidget(x);
Anakin's avatar
Anakin committed
90

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

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

Anakin's avatar
Anakin committed
105 106 107
	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
108 109 110 111 112 113 114

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

	connect(signalMapper, SIGNAL(mapped(int)), viewer, SLOT(changeDirection(int)));

Anakin's avatar
Anakin committed
115
	ui->mainToolBar->addSeparator();
Anakin's avatar
Anakin committed
116

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

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

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);

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

Anakin's avatar
Anakin committed
141 142 143 144 145 146 147 148 149 150 151
	QToolButton *fileInfo = new QToolButton(this);
	fileInfo->setObjectName("fileInfo");
	fileInfo->setToolTip("file info");
	connect(fileInfo, &QToolButton::pressed, this, &MainWindow::aboutFile);
	ui->mainToolBar->addWidget(fileInfo);

	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
152

Anakin's avatar
Anakin committed
153 154 155 156 157
	m_output->setObjectName("output");
	m_output->setStyleSheet("QLabel#output{color : white; min-width: 400px; min-height: 50px;}");
	m_output->setAlignment(Qt::AlignTop);
	m_output->setText("Name: -\nMaterials: -\nVertice: -\nTriangle: -");
	m_output->raise();
Anakin's avatar
Anakin committed
158

Anakin's avatar
Anakin committed
159 160
}

Anakin's avatar
Anakin committed
161 162
void MainWindow::aboutFile()
{
Anakin's avatar
Anakin committed
163
	/*QMessageBox* dialog = new QMessageBox(QMessageBox::NoIcon,
Anakin's avatar
Anakin committed
164
		WINDOW_NAME,
Anakin's avatar
Anakin committed
165
		QString(m_fileInfo.left(m_fileInfo.indexOf("<detail>"))),
Anakin's avatar
Anakin committed
166 167 168
		QMessageBox::StandardButton::Close,
		this,
		Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
Anakin's avatar
Anakin committed
169 170 171

	dialog->setStyleSheet("QLabel{min-width: 200px;}");
	dialog->setDetailedText(QString(m_fileInfo.right(m_fileInfo.size() - m_fileInfo.indexOf("<detail>") - 8)));
Anakin's avatar
Anakin committed
172
	dialog->exec();
Anakin's avatar
Anakin committed
173 174
	delete dialog;*/
	m_infoWindow->show();
Anakin's avatar
Anakin committed
175 176 177 178
}

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

	file.close();

Anakin's avatar
Anakin committed
191
	dialog->exec();
Anakin's avatar
Anakin committed
192 193 194 195

	delete dialog;
}

Anakin's avatar
Anakin committed
196 197 198 199 200 201 202 203 204
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
205 206 207 208 209
void MainWindow::resizeEvent(QResizeEvent * e)
{
	m_output->move(40, e->size().height() - 80);
}

210
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
Anakin's avatar
Anakin committed
211 212 213 214
{
	m_fileInfo = QByteArray("Filename: ");
	m_fileInfo += name;
	m_fileInfo += "\nMaterials: ";
215
	m_fileInfo += QByteArray::number(materials->size());
Anakin's avatar
Anakin committed
216 217 218 219 220 221
	m_fileInfo += "\nVertices: ";
	m_fileInfo += QByteArray::number(vertices);
	m_fileInfo += "\nTriangle: ";
	m_fileInfo += QByteArray::number(triangle);
	m_fileInfo += "<detail>";

222
	for (auto& it : *materials)
Anakin's avatar
Anakin committed
223
	{
224
		m_fileInfo += it.name;
Anakin's avatar
Anakin committed
225
		m_fileInfo += "\n";
Anakin's avatar
Anakin committed
226 227

		m_fileInfo += "TX0D:\t\t";
228
		if (it.tx0d.isEmpty())
Anakin's avatar
Anakin committed
229
			m_fileInfo += "-";
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
		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
253 254 255 256 257 258 259 260 261 262 263 264
		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
265 266
		m_fileInfo += "Rendertype:\t";
		m_fileInfo += QByteArray::number(it.rendertype);
Anakin's avatar
Anakin committed
267 268
		m_fileInfo += "\n";

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

	m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
Anakin's avatar
Anakin committed
311 312 313 314

	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)));

315 316
}

Anakin's avatar
Anakin committed
317
void MainWindow::printMessage(QString message, int severity)
318
{
Anakin's avatar
Anakin committed
319
	if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
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
		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);
345
}