MainWindow.cpp 7.03 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())
24
25
26
{
	ui->setupUi(this);

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

30
31
32
33
	QSurfaceFormat format;
	format.setDepthBufferSize(24);
	QSurfaceFormat::setDefaultFormat(format);

Anakin's avatar
Anakin committed
34
	setupWidgets();
35

Anakin's avatar
Anakin committed
36
	printMessage("MeshViewer by Anakin", 0);
Anakin's avatar
Anakin committed
37

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

	QFile styleSheet(":/files/StyleSheet.txt");
	styleSheet.open(QIODevice::ReadOnly);
	this->setStyleSheet(styleSheet.readAll());
43
44
45
46
47
}

MainWindow::~MainWindow()
{
	delete ui;
Anakin's avatar
Anakin committed
48
	delete m_output;
Anakin's avatar
Anakin committed
49
	delete m_infoWindow;
Anakin's avatar
Anakin committed
50
51
52
53
}

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

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

Anakin's avatar
Anakin committed
65
66
67
68
69
	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
70

Anakin's avatar
Anakin committed
71
72
73
74
75
	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
76

Anakin's avatar
Anakin committed
77
78
	ui->mainToolBar->addSeparator();

Anakin's avatar
Anakin committed
79
80
	QSignalMapper* signalMapper = new QSignalMapper(this);

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

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

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

Anakin's avatar
Anakin committed
102
103
104
	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
105
106
107
108
109
110
111

	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
112
	ui->mainToolBar->addSeparator();
Anakin's avatar
Anakin committed
113

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

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

Anakin's avatar
Anakin committed
130
131
	ui->mainToolBar->addSeparator();

Anakin's avatar
Anakin committed
132
133
134
135
136
137
138
139
140
141
142
	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
143

Anakin's avatar
Anakin committed
144
145
146
147
148
	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
149

Anakin's avatar
Anakin committed
150
151
}

Anakin's avatar
Anakin committed
152
153
void MainWindow::aboutFile()
{
Anakin's avatar
Anakin committed
154
	/*QMessageBox* dialog = new QMessageBox(QMessageBox::NoIcon,
Anakin's avatar
Anakin committed
155
		WINDOW_NAME,
Anakin's avatar
Anakin committed
156
		QString(m_fileInfo.left(m_fileInfo.indexOf("<detail>"))),
Anakin's avatar
Anakin committed
157
158
159
		QMessageBox::StandardButton::Close,
		this,
		Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
Anakin's avatar
Anakin committed
160
161
162

	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
163
	dialog->exec();
Anakin's avatar
Anakin committed
164
165
	delete dialog;*/
	m_infoWindow->show();
Anakin's avatar
Anakin committed
166
167
168
169
}

void MainWindow::aboutTool()
{
170
171
172
173
	QFile file(":/files/about.txt");
	file.open(QIODevice::ReadOnly);
	QMessageBox* dialog = new QMessageBox(
		QMessageBox::Question,
Anakin's avatar
Anakin committed
174
		WINDOW_NAME,
175
		QString(file.readAll()),
Anakin's avatar
Anakin committed
176
177
		QMessageBox::StandardButton::Close,
		this,
Anakin's avatar
Anakin committed
178
		Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
179
180
181

	file.close();

Anakin's avatar
Anakin committed
182
	dialog->exec();
Anakin's avatar
Anakin committed
183
184
185
186

	delete dialog;
}

Anakin's avatar
Anakin committed
187
188
189
190
191
192
193
194
195
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
196
197
198
199
200
void MainWindow::resizeEvent(QResizeEvent * e)
{
	m_output->move(40, e->size().height() - 80);
}

201
void MainWindow::setFileInfo(QString name, QVector<Material>* materials, int vertices, int triangle)
Anakin's avatar
Anakin committed
202
203
204
205
{
	m_fileInfo = QByteArray("Filename: ");
	m_fileInfo += name;
	m_fileInfo += "\nMaterials: ";
206
	m_fileInfo += QByteArray::number(materials->size());
Anakin's avatar
Anakin committed
207
208
209
210
211
212
213
	m_fileInfo += "\nVertices: ";
	m_fileInfo += QByteArray::number(vertices);
	m_fileInfo += "\nTriangle: ";
	m_fileInfo += QByteArray::number(triangle);
	m_fileInfo += "<detail>";

	int count(0);
214
	//TODO: mark not opened textures
215
	//TODO: add more information
216
	for (auto& it : *materials)
Anakin's avatar
Anakin committed
217
218
219
220
	{
		m_fileInfo += "Material ";
		m_fileInfo += QByteArray::number(count++);
		m_fileInfo += " - ";
221
		m_fileInfo += it.name;
Anakin's avatar
Anakin committed
222
223
		m_fileInfo += "\n";
	}
Anakin's avatar
Anakin committed
224
225

	m_output->setText(m_fileInfo.left(m_fileInfo.indexOf("<detail>")));
Anakin's avatar
Anakin committed
226
227
228
229

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

230
231
}

Anakin's avatar
Anakin committed
232
void MainWindow::printMessage(QString message, int severity)
233
{
Anakin's avatar
Anakin committed
234
	if (!ui->statusBar->currentMessage().isEmpty() && severity < m_curSeverity)
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
		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);
260
}