9 Window::Window(QWidget *parent) :
11 open_action(new QAction("Open", this)),
12 about_action(new QAction("About", this)),
13 quit_action(new QAction("Quit", this))
16 setWindowTitle("fstl");
18 QFile styleFile(":/qt/style.qss");
19 styleFile.open( QFile::ReadOnly );
20 setStyleSheet(styleFile.readAll());
23 format.setVersion(2, 1);
24 format.setSampleBuffers(true);
26 canvas = new Canvas(format, this);
27 setCentralWidget(canvas);
29 open_action->setShortcut(QKeySequence::Open);
30 QObject::connect(open_action, &QAction::triggered,
31 this, &Window::on_open);
33 quit_action->setShortcut(QKeySequence::Quit);
34 QObject::connect(quit_action, &QAction::triggered,
35 this, &Window::close);
37 QObject::connect(about_action, &QAction::triggered,
38 this, &Window::on_about);
40 auto file_menu = menuBar()->addMenu("File");
41 file_menu->addAction(open_action);
42 file_menu->addAction(quit_action);
44 auto help_menu = menuBar()->addMenu("Help");
45 help_menu->addAction(about_action);
50 void Window::on_open()
52 QString filename = QFileDialog::getOpenFileName(
53 this, "Load .stl file", QString(), "*.stl");
54 if (not filename.isNull())
60 void Window::on_about()
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>");
72 void Window::on_ascii_stl()
74 QMessageBox::critical(this, "Error",
76 "Cannot open ASCII <code>.stl</code> file<br>"
77 "Please convert to binary <code>.stl</code> and retry");
80 void Window::on_bad_stl()
82 QMessageBox::critical(this, "Error",
84 "This <code>.stl</code> file is invalid or corrupted.<br>"
85 "Please export it from the original source, verify, and retry.");
88 void Window::enable_open()
90 open_action->setEnabled(true);
93 void Window::disable_open()
95 open_action->setEnabled(false);
98 bool Window::load_stl(const QString& filename)
100 if (!open_action->isEnabled()) return false;
102 canvas->set_status("Loading " + filename);
104 Loader* loader = new Loader(this, filename);
105 connect(loader, &Loader::started,
106 this, &Window::disable_open);
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);
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);
122 if (filename[0] != ':')
124 connect(loader, &Loader::loaded_file,
125 this, &Window::setWindowTitle);