src/main.cpp

Sun, 09 Apr 2023 15:59:08 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Sun, 09 Apr 2023 15:59:08 +0300
changeset 362
e1d646a4cbd8
parent 361
c5e8b68e34f8
child 363
16f5dcfa7c9f
permissions
-rw-r--r--

Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
I was planning to make the core logic and state of the program into a Main class, which would be a QObject that would
have lots of signals and slots, but it looks like this works even without it

201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
1 #include <QApplication>
327
2aa15daa0216 Add copy action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 325
diff changeset
2 #include <QClipboard>
264
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
3 #include <QCloseEvent>
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
4 #include <QFileDialog>
264
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
5 #include <QMdiSubWindow>
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
6 #include <QMessageBox>
237
10a6298f636f Add an option to log opengl messages
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 236
diff changeset
7 #include <QScrollBar>
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
8 #include <QStackedWidget>
264
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
9 #include <QTranslator>
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
10 #include "src/gl/partrenderer.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
11 #include "src/layers/axeslayer.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
12 #include "src/layers/edittools.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
13 #include "src/layers/gridlayer.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
14 #include "src/ldrawalgorithm.h"
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
15 #include "src/mainwindow.h"
264
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
16 #include "src/messagelog.h"
355
e81f4ad53efd Move the about dialog to MainWindow. The hack to retrieve GL extensions is made a bit cleaner
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 354
diff changeset
17 #include "src/modelsubwindow.h"
264
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
18 #include "src/settings.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
19 #include "src/settingseditor/settingseditor.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
20 #include "src/ui/circletooloptionswidget.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
21 #include "src/version.h"
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
22 #include "src/widgets/colorselectdialog.h"
328
3ea38fd469ca Replace item view with a text editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 327
diff changeset
23 #include "src/parser.h"
331
638a7458ef5e Add basic syntax highlighting
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 330
diff changeset
24 #include "src/ldrawsyntaxhighlighter.h"
293
9f85a54ead29 Add OpenGL information to about page
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 292
diff changeset
25 #include <GL/glew.h>
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
26 #include "src/main.h"
24
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
27
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
28 static const QDir LOCALE_DIR {":/locale"};
0
f9f4d4d6f162 initial commit
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29
215
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
30 class ModelData : public QObject
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
31 {
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
32 Q_OBJECT
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
33 public:
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
34 ModelData(QObject* parent) : QObject {parent} {}
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
35 std::unique_ptr<PartRenderer> canvas;
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
36 std::unique_ptr<EditTools> tools;
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
37 std::unique_ptr<AxesLayer> axesLayer;
216
c7241f504117 Reworked grid program into a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 215
diff changeset
38 std::unique_ptr<GridLayer> gridLayer;
328
3ea38fd469ca Replace item view with a text editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 327
diff changeset
39 std::unique_ptr<QTextCursor> textcursor;
338
719b909a7d2b Delete unused code
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 337
diff changeset
40 QTextDocument* model;
215
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
41 };
243
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
42
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
43 class Signal final : public QObject
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
44 {
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
45 Q_OBJECT
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
46 public:
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
47 Signal() : QObject{}{}
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
48 virtual ~Signal(){}
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
49 void emit()
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
50 {
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
51 Q_EMIT this->triggered();
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
52 }
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
53 Q_SIGNALS:
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
54 void triggered();
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
55 };
264
76a025db4948 Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 263
diff changeset
56 #include <main.moc>
215
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
57
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
58 static void doQtRegistrations()
0
f9f4d4d6f162 initial commit
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
59 {
281
afed72b544f0 - Add CMake build type to about page and window title
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 279
diff changeset
60 QCoreApplication::setApplicationName(QStringLiteral(CMAKE_PROJECT_NAME));
7
68443f5be176 added the settings editor
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
61 QCoreApplication::setOrganizationName("hecknology.net");
68443f5be176 added the settings editor
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
62 QCoreApplication::setOrganizationDomain("hecknology.net");
237
10a6298f636f Add an option to log opengl messages
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 236
diff changeset
63 qRegisterMetaType<Message>();
259
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
64 qRegisterMetaType<Library>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
65 qRegisterMetaType<QList<Library>>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
66 qRegisterMetaType<QMdiArea::ViewMode>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
67 qRegisterMetaType<gl::RenderStyle>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
68 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
69 qRegisterMetaTypeStreamOperators<Library>("Library");
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
70 qRegisterMetaTypeStreamOperators<Libraries>("Libraries");
218
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
71 qRegisterMetaTypeStreamOperators<gl::RenderStyle>();
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
72 qRegisterMetaTypeStreamOperators<QMdiArea::ViewMode>();
335
c5830bce1c23 Fix crashing
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 333
diff changeset
73 qRegisterMetaTypeStreamOperators<Qt::ToolButtonStyle>();
259
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
74 #endif
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
75 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
76
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
77 static std::optional<ModelId> openModelFromPath(
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
78 const QString& path,
230
a1f3f7d9078b rename LibraryManager -> LibrariesModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 229
diff changeset
79 const LibrariesModel* libraries,
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
80 DocumentManager* documents,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
81 QWidget* parent)
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
82 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
83 QString errorString;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
84 QTextStream errorStream{&errorString};
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
85 const std::optional<ModelId> modelIdOpt = documents->openModel(
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
86 path,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
87 errorStream,
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
88 OpenType::ManuallyOpened);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
89 if (modelIdOpt.has_value()) {
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
90 const DocumentManager::MissingDependencies missing = documents->loadDependenciesForAllModels(*libraries);
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
91 if (not missing.empty()) {
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
92 QMessageBox::warning(
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
93 parent,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
94 QObject::tr("Problem loading references"),
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
95 errorStringFromMissingDependencies(missing));
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
96 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
97 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
98 else {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
99 QMessageBox::critical(
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
100 parent,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
101 QObject::tr("Problem opening file"),
206
654661eab7f3 More refactor, merged main.h, basics.h and utility.h into one header file basics.h and removed plenty of unused code
Teemu Piippo <teemu@hecknology.net>
parents: 205
diff changeset
102 QObject::tr("Could not open %1: %2").arg(quoted(path), errorString)
654661eab7f3 More refactor, merged main.h, basics.h and utility.h into one header file basics.h and removed plenty of unused code
Teemu Piippo <teemu@hecknology.net>
parents: 205
diff changeset
103 );
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
104 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
105 return modelIdOpt;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
106 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
107
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
108 static QString getOpenModelPath(QWidget* parent)
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
109 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
110 return QFileDialog::getOpenFileName(
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
111 parent,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
112 QObject::tr("Open model"),
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
113 "",
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
114 QObject::tr("LDraw models (*.ldr *.dat)"));
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
115 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
116
278
304386ff96a4 Make editing tools disabled until a document is selected
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 274
diff changeset
117 static ModelData* findModelData(const DocumentManager* documents, ModelId modelId)
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
118 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
119 return documents->findPayload<ModelData>(modelId);
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
120 }
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
121
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
122 static ModelSubWindow* currentModelSubWindow(MainWindow* ui)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
123 {
217
6d95c1a41e6e reimplement EditTools as a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 216
diff changeset
124 auto* w = ui->mdiArea->activeSubWindow();
6d95c1a41e6e reimplement EditTools as a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 216
diff changeset
125 return qobject_cast<ModelSubWindow*>(w);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
126 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
127
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
128 static ModelData* currentModelData(MainWindow* ui, const DocumentManager* documents)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
129 {
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
130 if (auto* const activeSubWindow = currentModelSubWindow(ui)) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
131 return findModelData(documents, activeSubWindow->modelId);
202
b05af0bab735 Replaced the tab widget with an MDI area
Teemu Piippo <teemu@hecknology.net>
parents: 201
diff changeset
132 }
b05af0bab735 Replaced the tab widget with an MDI area
Teemu Piippo <teemu@hecknology.net>
parents: 201
diff changeset
133 else {
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
134 return nullptr;
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
135 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
136 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
137
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
138 static std::optional<ModelId> findCurrentModelId(MainWindow* ui)
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
139 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
140 ModelSubWindow* activeSubWindow = qobject_cast<ModelSubWindow*>(ui->mdiArea->activeSubWindow());
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
141 if (activeSubWindow != nullptr) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
142 return activeSubWindow->modelId;
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
143 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
144 else {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
145 return {};
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
146 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
147 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
148
230
a1f3f7d9078b rename LibraryManager -> LibrariesModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 229
diff changeset
149 static ColorTable loadColors(const LibrariesModel* libraries)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
150 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
151 QTextStream errors;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
152 return libraries->loadColorTable(errors);
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
153 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
154
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
155 static QString tabName(const QFileInfo& fileInfo)
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
156 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
157 QString result = fileInfo.baseName();
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
158 if (result.isEmpty()) {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
159 result = QObject::tr("<unnamed>");
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
160 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
161 return result;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
162 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
163
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
164 template<typename Fn>
352
59a31dd8a33a Rename forModel -> forEachModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 351
diff changeset
165 static void forEachModel(const DocumentManager* documents, Fn&& fn)
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
166 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
167 forValueInMap(*documents, [&fn](const DocumentManager::ModelInfo& info)
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
168 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
169 ModelData* modelSpecificData = qobject_cast<ModelData*>(info.payload);
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
170 if (modelSpecificData != nullptr) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
171 fn(&info, modelSpecificData);
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
172 }
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
173 });
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
174 }
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
175
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
176 static void updateRenderPreferences(
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
177 MainWindow* ui,
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
178 const gl::RenderPreferences* renderPreferences,
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
179 const DocumentManager* documents)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
180 {
352
59a31dd8a33a Rename forModel -> forEachModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 351
diff changeset
181 forEachModel(documents, [&renderPreferences](const void*, const ModelData* data){
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
182 if (data->canvas != nullptr) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
183 data->canvas->setRenderPreferences(*renderPreferences);
215
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
184 data->canvas->setLayerEnabled(data->axesLayer.get(), renderPreferences->drawAxes);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
185 }
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
186 });
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
187 ui->setRenderStyle(renderPreferences->style);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
188 ui->actionDrawAxes->setChecked(renderPreferences->drawAxes);
231
a9bf6bab5ea2 Add wireframe button
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 230
diff changeset
189 ui->actionWireframe->setChecked(renderPreferences->wireframe);
250
2837b549e616 I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 249
diff changeset
190 }
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
191
218
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
192 static gl::RenderPreferences loadRenderPreferences()
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
193 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
194 return gl::RenderPreferences{
218
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
195 .style = setting<Setting::RenderStyle>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
196 .mainColor = setting<Setting::MainColor>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
197 .backgroundColor = setting<Setting::BackgroundColor>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
198 .selectedColor = setting<Setting::SelectedColor>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
199 .lineThickness = setting<Setting::LineThickness>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
200 .lineAntiAliasing = setting<Setting::LineAntiAliasing>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
201 .drawAxes = setting<Setting::DrawAxes>(),
231
a9bf6bab5ea2 Add wireframe button
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 230
diff changeset
202 .wireframe = setting<Setting::Wireframe>(),
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
203 };
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
204 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
205
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
206 struct ToolWidgets
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
207 {
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
208 CircleToolOptionsWidget* circleToolOptions;
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
209 };
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
210
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
211 static void initializeTools(MainWindow* ui, ToolWidgets* toolWidgets, QWidget* parent)
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
212 {
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
213 const struct
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
214 {
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
215 QString name, tooltip;
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
216 QPixmap icon;
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
217 QWidget* widget;
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
218 } editingModesInfo[] = {
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
219 {
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
220 .name = QObject::tr("Select"),
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
221 .tooltip = QObject::tr("Select elements from the model."),
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
222 .icon = {":/icons/navigate-outline.png"},
330
edb6c09cdd3c Delete object editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 329
diff changeset
223 .widget = nullptr,
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
224 },
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
225 {
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
226 .name = QObject::tr("Draw"),
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
227 .tooltip = QObject::tr("Draw new elements into the model."),
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
228 .icon = {":/icons/pencil-outline.png"},
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
229 .widget = nullptr,
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
230 },
232
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
231 {
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
232 .name = QObject::tr("Circle"),
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
233 .tooltip = QObject::tr("Draw circular primitives."),
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
234 .icon = {":/icons/linetype-circularprimitive.png"},
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
235 .widget = toolWidgets->circleToolOptions,
232
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
236 },
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
237 };
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
238 for (int i = 0; i < countof(editingModesInfo); ++i) {
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
239 const auto& editingModeInfo = editingModesInfo[i];
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
240 QAction* action = new QAction{editingModeInfo.name, parent};
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
241 action->setCheckable(true);
278
304386ff96a4 Make editing tools disabled until a document is selected
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 274
diff changeset
242 action->setEnabled(false);
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
243 action->setData(static_cast<EditingMode>(i));
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
244 action->setToolTip(editingModeInfo.tooltip);
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
245 action->setIcon(QPixmap{editingModeInfo.icon});
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
246 ui->editingModesToolBar->addAction(action);
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
247 QWidget* widget = editingModeInfo.widget;
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
248 if (widget == nullptr) {
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
249 widget = new QWidget{parent};
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
250 }
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
251 ui->toolWidgetStack->addWidget(widget);
232
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
252 QObject::connect(action, &QAction::triggered, [ui, i]{
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
253 ui->toolWidgetStack->setCurrentIndex(i);
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
254 });
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
255 }
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
256 }
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
257
289
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
258 template<class SubWindow, class... Args>
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
259 SubWindow* createSubWindow(QMdiArea* mdiArea, Args&&... args)
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
260 {
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
261 // Qt seems to have a bug where the first created sub window does not render
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
262 // properly until it is minimized and maximized again. This only happens
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
263 // if we give the mdi area as a parent argument. As a work-around, we create
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
264 // the sub window with parent=nullptr, and add it manually.
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
265 // c.f. https://bugreports.qt.io/browse/QTBUG-69495
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
266 SubWindow* subWindow = new SubWindow{args..., nullptr};
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
267 mdiArea->addSubWindow(subWindow);
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
268 return subWindow;
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
269 }
a0ddbc9a4e77 Work around a Qt bug involving the rendering behavior of the first created sub window
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 286
diff changeset
270
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
271 static void executeAction(QTextDocument* model, const ModelAction& action)
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
272 {
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
273 std::visit(overloaded{
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
274 [model](const AppendToModel& action){
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
275 QTextCursor cursor{model};
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
276 cursor.movePosition(QTextCursor::End);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
277 const QString newText = modelElementToString(action.newElement);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
278 // Make sure we have an empty line
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
279 if (not model->lastBlock().text().isEmpty()) {
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
280 cursor.insertBlock();
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
281 }
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
282 cursor.insertText(newText);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
283 },
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
284 [](const DeleteFromModel&){},
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
285 [model](const ModifyModel& action){
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
286 QTextBlock block = model->findBlockByLineNumber((int) action.position);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
287 if (block.isValid()) {
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
288 QTextCursor cursor{block};
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
289 cursor.select(QTextCursor::LineUnderCursor);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
290 cursor.insertText(modelElementToString(action.newElement));
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
291 }
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
292 //model->assignAt(action.position, action.newElement);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
293 },
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
294 }, action);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
295 }
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
296
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
297 QFont codeEditorFontFromSettings()
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
298 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
299 QFont font{};
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
300 if (setting<Setting::CodeEditorUseSystemFont>())
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
301 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
302 font.setStyleHint(QFont::Monospace);
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
303 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
304 else
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
305 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
306 font.setFamily(setting<Setting::CodeEditorFontFamily>());
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
307 font.setPointSize(setting<Setting::CodeEditorFontSize>());
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
308 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
309 return font;
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
310 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
311
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
312 struct MainState
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
313 {
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
314 MainWindow mainWindow;
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
315 DocumentManager documents;
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
316 QString currentLanguage = "en";
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
317 QTranslator translator{&mainWindow};
230
a1f3f7d9078b rename LibraryManager -> LibrariesModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 229
diff changeset
318 LibrariesModel libraries{&mainWindow};
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
319 QStringList recentlyOpenedFiles;
205
1a4342d80de7 Refactor colors.cpp/.h
Teemu Piippo <teemu@hecknology.net>
parents: 204
diff changeset
320 ColorTable colorTable;
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
321 gl::RenderPreferences renderPreferences;
236
1fa0e1de9f0a Made message log a model
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 235
diff changeset
322 MessageLog messageLog;
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
323 ToolWidgets toolWidgets{
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
324 .circleToolOptions = new CircleToolOptionsWidget{&mainWindow},
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
325 };
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
326 };
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
327
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
328 static void openModelForEditing(MainState* state, const ModelId modelId)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
329 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
330 QTextDocument* model = state->documents.getModelById(modelId);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
331 if (model != nullptr) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
332 ModelData* data = new ModelData(&state->documents);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
333 data->tools = std::make_unique<EditTools>();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
334 data->canvas = std::make_unique<PartRenderer>(model, &state->documents, state->colorTable);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
335 data->axesLayer = std::make_unique<AxesLayer>();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
336 data->gridLayer = std::make_unique<GridLayer>();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
337 data->gridLayer->setGridMatrix(DEFAULT_GRID_MATRIX);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
338 data->tools->setGridMatrix(DEFAULT_GRID_MATRIX);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
339 data->model = model;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
340 data->canvas->addRenderLayer(data->axesLayer.get());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
341 data->canvas->setLayerEnabled(data->axesLayer.get(), setting<Setting::DrawAxes>());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
342 data->canvas->addRenderLayer(data->gridLayer.get());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
343 data->canvas->addRenderLayer(data->tools.get());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
344 new LDrawSyntaxHighlighter{model};
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
345 data->textcursor = std::make_unique<QTextCursor>(model);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
346 state->documents.setModelPayload(modelId, data);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
347 QObject::connect(
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
348 data->tools.get(),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
349 &EditTools::modelAction,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
350 std::bind(executeAction, model, std::placeholders::_1));
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
351 data->canvas->setRenderPreferences(state->renderPreferences);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
352 QObject::connect(
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
353 data->tools.get(),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
354 &EditTools::newStatusText,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
355 [&state](const QString& newStatusText) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
356 state->mainWindow.statusBar()->showMessage(newStatusText);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
357 });
328
3ea38fd469ca Replace item view with a text editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 327
diff changeset
358 #if 0
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
359 QObject::connect(
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
360 data->tools.get(),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
361 &EditTools::select,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
362 [modelId, &documents](const QSet<ElementId>& indices, bool retain) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
363 ModelData* data = findModelData(&documents, modelId);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
364 if (data != nullptr) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
365 if (not retain) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
366 data->textcursor->clearSelection();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
367 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
368 for (const ElementId id : indices) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
369 opt<int> index = data->model->find(id);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
370 if (index.has_value()) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
371 const QModelIndex qindex = data->model->index(*index);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
372 data->itemSelectionModel->select(qindex, QItemSelectionModel::Select);
217
6d95c1a41e6e reimplement EditTools as a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 216
diff changeset
373 }
6d95c1a41e6e reimplement EditTools as a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 216
diff changeset
374 }
243
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
375 }
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
376 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
377 #endif
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
378 #if 0
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
379 QObject::connect(this, &Main::settingsChanged, [modelId, this]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
380 ModelData* data = findModelData(&state.documents, modelId);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
381 if (data != nullptr) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
382 data->gridLayer->settingsChanged();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
383 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
384 });
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
385 #endif
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
386 QObject::connect(data->canvas.get(), &PartRenderer::message, &state->messageLog, &MessageLog::addMessage);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
387 QObject::connect(
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
388 data->tools.get(),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
389 &EditTools::suggestCursor,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
390 data->canvas.get(),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
391 &QWidget::setCursor);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
392 data->tools->setEditMode(SelectMode);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
393 const QFileInfo fileInfo{*state->documents.modelPath(modelId)};
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
394 auto* const subWindow = createSubWindow<ModelSubWindow>(state->mainWindow.mdiArea, modelId);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
395 subWindow->setMinimumSize({96, 96});
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
396 subWindow->resize({320, 200});
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
397 subWindow->setWidget(data->canvas.get());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
398 subWindow->setWindowTitle(tabName(fileInfo));
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
399 subWindow->show();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
400 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
401 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
402
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
403 static void updateRecentlyOpenedDocumentsMenu(MainState* state)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
404 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
405 state->mainWindow.rebuildRecentFilesMenu(state->recentlyOpenedFiles);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
406 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
407
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
408 static void restoreSettings(MainState* state)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
409 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
410 state->recentlyOpenedFiles = setting<Setting::RecentFiles>();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
411 state->renderPreferences = loadRenderPreferences();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
412 state->libraries.restoreFromSettings();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
413 updateRecentlyOpenedDocumentsMenu(state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
414 state->colorTable = loadColors(&state->libraries);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
415 updateRenderPreferences(&state->mainWindow, &state->renderPreferences, &state->documents);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
416 state->mainWindow.mdiArea->setViewMode(setting<Setting::ViewMode>());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
417 state->mainWindow.retranslateUi(&state->mainWindow);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
418 state->mainWindow.setToolButtonStyle(setting<Setting::ToolButtonStyle>());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
419 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
420
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
421 static void saveSettings(MainState* state)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
422 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
423 setSetting<Setting::MainWindowGeometry>(state->mainWindow.saveGeometry());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
424 setSetting<Setting::MainWindowState>(state->mainWindow.saveState());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
425 setSetting<Setting::RecentFiles>(state->recentlyOpenedFiles);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
426 setSetting<Setting::RenderStyle>(state->renderPreferences.style);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
427 setSetting<Setting::DrawAxes>(state->renderPreferences.drawAxes);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
428 setSetting<Setting::Wireframe>(state->renderPreferences.wireframe);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
429 state->libraries.storeToSettings();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
430 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
431
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
432 static void addRecentlyOpenedFile(MainState* state, const QString& path)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
433 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
434 constexpr int maxRecentlyOpenedFiles = 10;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
435 state->recentlyOpenedFiles.removeAll(path);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
436 state->recentlyOpenedFiles.insert(0, path);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
437 while (state->recentlyOpenedFiles.size() > maxRecentlyOpenedFiles)
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
438 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
439 state->recentlyOpenedFiles.removeLast();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
440 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
441 saveSettings(state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
442 updateRecentlyOpenedDocumentsMenu(state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
443 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
444
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
445 static void saveCurrentModel(MainState* state, ModelId modelId)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
446 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
447 QString error;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
448 QTextStream errorStream{&error};
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
449 const bool succeeded = state->documents.saveModel(modelId, errorStream);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
450 if (not succeeded)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
451 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
452 QMessageBox::critical(&state->mainWindow, QObject::tr("Save error"), error);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
453 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
454 else
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
455 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
456 const QString* pathPtr = state->documents.modelPath(modelId);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
457 if (pathPtr != nullptr) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
458 addRecentlyOpenedFile(state, *pathPtr);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
459 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
460 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
461 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
462
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
463 static void saveCurrentModelAs(MainState* state)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
464 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
465 const std::optional<ModelId> modelId = findCurrentModelId(&state->mainWindow);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
466 if (modelId.has_value())
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
467 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
468 const QString* pathPtr = state->documents.modelPath(*modelId);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
469 QString defaultPath = (pathPtr != nullptr) ? *pathPtr : "";
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
470 const QString newPath = QFileDialog::getSaveFileName(
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
471 &state->mainWindow,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
472 QObject::tr("Save as…"),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
473 QFileInfo{defaultPath}.absoluteDir().path(),
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
474 QObject::tr("LDraw files (*.ldr *dat);;All files (*)")
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
475 );
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
476 if (not newPath.isEmpty()) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
477 QString error;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
478 QTextStream errorStream{&error};
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
479 state->documents.setModelPath(*modelId, newPath, state->libraries, errorStream);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
480 QMdiSubWindow* const subWindow = state->mainWindow.mdiArea->currentSubWindow();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
481 if (subWindow != nullptr) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
482 subWindow->setWindowTitle(tabName(QFileInfo{newPath}));
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
483 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
484 saveCurrentModel(state, *modelId);
350
676d0b43b577 Opening recently opened files works again now
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 338
diff changeset
485 }
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
486 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
487 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
488
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
489 static void checkEditingModeAction(MainState* state, const EditingMode mode)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
490 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
491 const bool hasDocument = currentModelData(&state->mainWindow, &state->documents) != nullptr;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
492 for (QAction* action : state->mainWindow.editingModesToolBar->actions())
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
493 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
494 action->setEnabled(hasDocument);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
495 action->setChecked(hasDocument and action->data().value<EditingMode>() == mode);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
496 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
497 }
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
498
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
499 int main(int argc, char *argv[])
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
500 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
501 doQtRegistrations();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
502 QApplication app{argc, argv};
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
503 QApplication::setWindowIcon(QIcon{":/icons/appicon.png"});
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
504 MainState state;
361
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
505 QObject::connect(
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
506 &state.mainWindow,
361
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
507 &MainWindow::recentFileSelected,
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
508 [&state](const QString& path) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
509 const auto id = openModelFromPath(path, &state.libraries, &state.documents, &state.mainWindow);
361
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
510 if (id.has_value())
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
511 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
512 openModelForEditing(&state, id.value());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
513 addRecentlyOpenedFile(&state, path);
361
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
514 }
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
515 }
c5e8b68e34f8 Move some recent file handling to MainWindow
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 359
diff changeset
516 );
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
517 QObject::connect(state.mainWindow.actionNew, &QAction::triggered,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
518 [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
519 openModelForEditing(&state, state.documents.newModel());
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
520 }
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
521 );
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
522 QObject::connect(state.mainWindow.actionOpen, &QAction::triggered,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
523 [&state]
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
524 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
525 const QString path = getOpenModelPath(&state.mainWindow);
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
526 if (not path.isEmpty())
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
527 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
528 const std::optional<ModelId> id = openModelFromPath(path, &state.libraries, &state.documents, &state.mainWindow);
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
529 if (id.has_value()) {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
530 openModelForEditing(&state, id.value());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
531 addRecentlyOpenedFile(&state, path);
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
532 }
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
533 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
534 }
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
535 );
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
536 QObject::connect(state.mainWindow.actionSettingsEditor, &QAction::triggered, [
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
537 &state,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
538 defaultKeyboardShortcuts = uiutilities::makeKeySequenceMap(uiutilities::collectActions(&state.mainWindow))]
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
539 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
540 if (state.mainWindow.mdiArea->findChildren<SettingsEditor*>().isEmpty())
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
541 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
542 auto* const settingsEditor = createSubWindow<SettingsEditor>(state.mainWindow.mdiArea, defaultKeyboardShortcuts);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
543 QObject::connect(settingsEditor, &SettingsEditor::settingsChanged, [&]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
544 restoreSettings(&state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
545 });
285
99af8bf63d10 Don't create more than one settings editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 284
diff changeset
546 settingsEditor->setAttribute(Qt::WA_DeleteOnClose);
99af8bf63d10 Don't create more than one settings editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 284
diff changeset
547 settingsEditor->show();
99af8bf63d10 Don't create more than one settings editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 284
diff changeset
548 }
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
549 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
550 QObject::connect(state.mainWindow.actionQuit, &QAction::triggered, &state.mainWindow, &QMainWindow::close);
215
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
551 #if 0
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
552 QObject::connect(ui.actionAdjustGridToView, &QAction::triggered, [&]{
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
553 if (ModelData* data = currentModelData(&ui, &documents)) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
554 adjustGridToView(data->canvas.get());
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
555 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
556 });
215
34c6e7bc4ee1 Reimplement the axes program as a layer that can be added to PartRenderer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 214
diff changeset
557 #endif
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
558 QObject::connect(state.mainWindow.actionClose, &QAction::triggered, [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
559 if (ModelData* data = currentModelData(&state.mainWindow, &state.documents)) {
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
560 // TODO
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
561 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
562 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
563 QObject::connect(state.mainWindow.actionSaveAs, &QAction::triggered, [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
564 saveCurrentModelAs(&state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
565 });
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
566 QObject::connect(state.mainWindow.actionSave, &QAction::triggered, [&state]
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
567 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
568 const std::optional<ModelId> modelId = findCurrentModelId(&state.mainWindow);
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
569 if (modelId.has_value()) {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
570 const QString* path = state.documents.modelPath(*modelId);
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
571 if (path == nullptr or path->isEmpty()) {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
572 saveCurrentModelAs(&state);
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
573 }
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
574 else {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
575 saveCurrentModel(&state, *modelId);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
576 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
577 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
578 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
579 QObject::connect(state.mainWindow.actionDrawAxes, &QAction::triggered, [&state]
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
580 (bool drawAxes)
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
581 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
582 state.renderPreferences.drawAxes = drawAxes;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
583 saveSettings(&state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
584 updateRenderPreferences(&state.mainWindow, &state.renderPreferences, &state.documents);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
585 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
586 QObject::connect(state.mainWindow.actionWireframe, &QAction::triggered, [&state]
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
587 (bool enabled)
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
588 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
589 state.renderPreferences.wireframe = enabled;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
590 saveSettings(&state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
591 updateRenderPreferences(&state.mainWindow, &state.renderPreferences, &state.documents);
231
a9bf6bab5ea2 Add wireframe button
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 230
diff changeset
592 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
593 QObject::connect(&state.mainWindow, &MainWindow::renderStyleSelected, [&state]
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
594 (gl::RenderStyle newStyle)
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
595 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
596 state.renderPreferences.style = newStyle;
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
597 saveSettings(&state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
598 updateRenderPreferences(&state.mainWindow, &state.renderPreferences, &state.documents);
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
599 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
600 initializeTools(&state.mainWindow, &state.toolWidgets, &state.mainWindow);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
601 for (QAction* action : state.mainWindow.editingModesToolBar->actions()) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
602 QObject::connect(action, &QAction::triggered, [action, &state]
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
603 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
604 if (ModelData* data = currentModelData(&state.mainWindow, &state.documents))
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
605 {
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
606 const EditingMode mode = action->data().value<EditingMode>();
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
607 data->tools->setEditMode(mode);
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
608 checkEditingModeAction(&state, mode);
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
609 }
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
610 });
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
611 }
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
612 QObject::connect(state.mainWindow.mdiArea, &QMdiArea::subWindowActivated,
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
613 [&state](QMdiSubWindow* subWindow)
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
614 {
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
615 ModelSubWindow* modelSubWindow = qobject_cast<ModelSubWindow*>(subWindow);
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
616 if (modelSubWindow != nullptr)
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
617 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
618 if (ModelData* data = state.documents.findPayload<ModelData>(modelSubWindow->modelId))
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
619 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
620 checkEditingModeAction(&state, data->tools->currentEditingMode());
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
621 state.mainWindow.modelEdit->setDocument(data->model);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
622 state.mainWindow.modelEdit->setTextCursor(*data->textcursor);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
623 state.mainWindow.modelEdit->setFont(codeEditorFontFromSettings());
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
624 }
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
625 }
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
626 else
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
627 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
628 checkEditingModeAction(&state, EditingMode::SelectMode);
282
f2dc3bbecbfa Make settings editor a sub window instead of a dialog
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 281
diff changeset
629 }
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
630 state.mainWindow.modelEdit->setEnabled(modelSubWindow != nullptr);
203
1909a0123c72 Move editing modes tool bar, tool options widget stack and model list view into the main window
Teemu Piippo <teemu@hecknology.net>
parents: 202
diff changeset
631 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
632 state.mainWindow.messageLog->setModel(&state.messageLog);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
633 QObject::connect(&state.documents, &DocumentManager::message, &state.messageLog, &MessageLog::addMessage);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
634 QObject::connect(&state.messageLog, &MessageLog::rowsAboutToBeInserted, [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
635 const auto bar = state.mainWindow.messageLog->verticalScrollBar();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
636 state.mainWindow.messageLog->setProperty("shouldAutoScroll", bar->value() == bar->maximum());
236
1fa0e1de9f0a Made message log a model
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 235
diff changeset
637 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
638 QObject::connect(&state.messageLog, &MessageLog::rowsInserted, [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
639 state.mainWindow.messageLog->resizeRowsToContents();
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
640 if (state.mainWindow.messageLog->property("shouldAutoScroll").toBool()) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
641 state.mainWindow.messageLog->scrollToBottom();
236
1fa0e1de9f0a Made message log a model
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 235
diff changeset
642 }
1fa0e1de9f0a Made message log a model
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 235
diff changeset
643 });
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
644 QObject::connect(
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
645 state.toolWidgets.circleToolOptions,
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
646 &CircleToolOptionsWidget::optionsChanged,
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
647 [&state](const CircleToolOptions& options) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
648 if (ModelData* data = currentModelData(&state.mainWindow, &state.documents)) {
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
649 data->tools->setCircleToolOptions(options);
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
650 }
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
651 });
262
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
652 QObject::connect(
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
653 state.mainWindow.actionMakeUnofficial,
262
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
654 &QAction::triggered,
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
655 [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
656 if (ModelData* data = currentModelData(&state.mainWindow, &state.documents)) {
338
719b909a7d2b Delete unused code
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 337
diff changeset
657 QTextDocument* const model = data->model;
262
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
658 for (const ModelAction& action : ldraw::makeUnofficial(model)) {
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
659 executeAction(model, action);
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
660 }
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
661 }
dc33f8a707c4 Add action to make a model unofficial (modifies the !LDRAW_ORG line)
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 259
diff changeset
662 });
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
663 QObject::connect(state.mainWindow.actionAboutQt, &QAction::triggered, &QApplication::aboutQt);
327
2aa15daa0216 Add copy action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 325
diff changeset
664 QObject::connect(
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
665 state.mainWindow.modelEdit,
328
3ea38fd469ca Replace item view with a text editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 327
diff changeset
666 &QPlainTextEdit::textChanged,
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
667 [&state]{
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
668 if (ModelData* data = currentModelData(&state.mainWindow, &state.documents)) {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
669 state.documents.loadDependenciesForAllModels(state.libraries);
328
3ea38fd469ca Replace item view with a text editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 327
diff changeset
670 data->canvas->update();
327
2aa15daa0216 Add copy action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 325
diff changeset
671 }
2aa15daa0216 Add copy action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 325
diff changeset
672 });
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
673 QObject::connect(
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
674 state.mainWindow.gridMatrix,
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
675 &MatrixEditor::valueChanged,
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
676 [&](const glm::mat4& newGridMatrix)
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
677 {
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
678 forEachModel(&state.documents, [&](const void*, const ModelData* data)
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
679 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
680 if (data->gridLayer != nullptr and data->tools != nullptr and data->canvas != nullptr)
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
681 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
682 data->gridLayer->setGridMatrix(newGridMatrix);
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
683 data->tools->setGridMatrix(newGridMatrix);
359
73b6c478378e The renderer now centers on the grid origin, not the part origin
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 356
diff changeset
684 data->canvas->setModelViewOrigin(newGridMatrix[3]);
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
685 data->canvas->update();
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
686 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
687 });
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
688 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
689 );
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
690 restoreSettings(&state);
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
691 updateRenderPreferences(&state.mainWindow, &state.renderPreferences, &state.documents);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
692 const int result = app.exec();
362
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
693 saveSettings(&state);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
694 return result;
0
f9f4d4d6f162 initial commit
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
695 }

mercurial