]> git.sur5r.net Git - fstl/blob - src/window.cpp
2d809bfb0610c8a3924213148528d9693c377c22
[fstl] / src / window.cpp
1 #include <QMenuBar>
2 #include <QMessageBox>
3 #include <QFileDialog>
4
5 #include "window.h"
6 #include "canvas.h"
7 #include "loader.h"
8
9 Window::Window(QWidget *parent) :
10     QMainWindow(parent),
11     open_action(new QAction("Open", this)),
12     about_action(new QAction("About", this)),
13     quit_action(new QAction("Quit", this))
14
15 {
16     setWindowTitle("fstl");
17
18     QFile styleFile(":/qt/style.qss");
19     styleFile.open( QFile::ReadOnly );
20     setStyleSheet(styleFile.readAll());
21
22     QGLFormat format;
23     format.setVersion(2, 1);
24     format.setSampleBuffers(true);
25
26     canvas = new Canvas(format, this);
27     setCentralWidget(canvas);
28
29     open_action->setShortcut(QKeySequence::Open);
30     QObject::connect(open_action, &QAction::triggered,
31                      this, &Window::on_open);
32
33     quit_action->setShortcut(QKeySequence::Quit);
34     QObject::connect(quit_action, &QAction::triggered,
35                      this, &Window::close);
36
37     QObject::connect(about_action, &QAction::triggered,
38                      this, &Window::on_about);
39
40     auto file_menu = menuBar()->addMenu("File");
41     file_menu->addAction(open_action);
42     file_menu->addAction(quit_action);
43
44     auto help_menu = menuBar()->addMenu("Help");
45     help_menu->addAction(about_action);
46
47     resize(600, 400);
48 }
49
50 void Window::on_open()
51 {
52     QString filename = QFileDialog::getOpenFileName(
53                 this, "Load .stl file", QString(), "*.stl");
54     if (not filename.isNull())
55     {
56         load_stl(filename);
57     }
58 }
59
60 void Window::on_about()
61 {
62     QMessageBox::about(this, "",
63         "<p align=\"center\"><b>fstl</b></p>"
64         "<p>A fast viewer for <code>.stl</code> files.<br>"
65         "<a href=\"https://github.com/mkeeter/fstl\""
66         "   style=\"color: #93a1a1;\">https://github.com/mkeeter/fstl</a></p>"
67         "<p>© 2014 Matthew Keeter<br>"
68         "<a href=\"mailto:matt.j.keeter@gmail.com\""
69         "   style=\"color: #93a1a1;\">matt.j.keeter@gmail.com</a></p>");
70 }
71
72 void Window::on_ascii_stl()
73 {
74     QMessageBox::critical(this, "Error",
75                           "<b>Error:</b><br>"
76                           "Cannot open ASCII <code>.stl</code> file<br>"
77                           "Please convert to binary <code>.stl</code> and retry");
78 }
79
80 void Window::on_bad_stl()
81 {
82     QMessageBox::critical(this, "Error",
83                           "<b>Error:</b><br>"
84                           "This <code>.stl</code> file is invalid or corrupted.<br>"
85                           "Please export it from the original source, verify, and retry.");
86 }
87
88 void Window::enable_open()
89 {
90     open_action->setEnabled(true);
91 }
92
93 void Window::disable_open()
94 {
95     open_action->setEnabled(false);
96 }
97
98 bool Window::load_stl(const QString& filename)
99 {
100     if (!open_action->isEnabled())  return false;
101
102     canvas->set_status("Loading " + filename);
103
104     Loader* loader = new Loader(this, filename);
105     connect(loader, &Loader::started,
106               this, &Window::disable_open);
107
108     connect(loader, &Loader::got_mesh,
109             canvas, &Canvas::load_mesh);
110     connect(loader, &Loader::error_ascii_stl,
111               this, &Window::on_ascii_stl);
112     connect(loader, &Loader::error_bad_stl,
113               this, &Window::on_bad_stl);
114
115     connect(loader, &Loader::finished,
116             loader, &Loader::deleteLater);
117     connect(loader, &Loader::finished,
118               this, &Window::enable_open);
119     connect(loader, &Loader::finished,
120             canvas, &Canvas::clear_status);
121
122     if (filename[0] != ':')
123     {
124         connect(loader, &Loader::loaded_file,
125                   this, &Window::setWindowTitle);
126     }
127
128     loader->start();
129     return true;
130 }