src/main.cpp

Thu, 15 Jun 2023 16:18:03 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Thu, 15 Jun 2023 16:18:03 +0300
changeset 383
530d23cd4e97
parent 376
3cef3b016330
permissions
-rw-r--r--

Refactor, make selecting elements from the model select the corresponding line from the editor as well

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>
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
26 #include "src/openedmodel.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
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
30 #include <main.moc>
243
959469a7e149 Make the grid black on bright backgrounds
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 241
diff changeset
31
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
32 using ModelData = EditableModel;
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
33
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
34 static void doQtRegistrations()
0
f9f4d4d6f162 initial commit
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35 {
281
afed72b544f0 - Add CMake build type to about page and window title
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 279
diff changeset
36 QCoreApplication::setApplicationName(QStringLiteral(CMAKE_PROJECT_NAME));
7
68443f5be176 added the settings editor
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
37 QCoreApplication::setOrganizationName("hecknology.net");
68443f5be176 added the settings editor
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
38 QCoreApplication::setOrganizationDomain("hecknology.net");
237
10a6298f636f Add an option to log opengl messages
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 236
diff changeset
39 qRegisterMetaType<Message>();
259
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
40 qRegisterMetaType<Library>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
41 qRegisterMetaType<QList<Library>>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
42 qRegisterMetaType<QMdiArea::ViewMode>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
43 qRegisterMetaType<gl::RenderStyle>();
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
44 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
45 qRegisterMetaTypeStreamOperators<Library>("Library");
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
46 qRegisterMetaTypeStreamOperators<Libraries>("Libraries");
218
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
47 qRegisterMetaTypeStreamOperators<gl::RenderStyle>();
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
48 qRegisterMetaTypeStreamOperators<QMdiArea::ViewMode>();
335
c5830bce1c23 Fix crashing
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 333
diff changeset
49 qRegisterMetaTypeStreamOperators<Qt::ToolButtonStyle>();
259
c27612f0eac0 - Made it build under Qt6
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 251
diff changeset
50 #endif
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
51 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 158
diff changeset
52
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
53 struct ToolWidgets
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
54 {
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
55 CircleToolOptionsWidget* circleToolOptions;
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
56 };
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
57
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
58 struct MainState
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
59 {
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
60 MainWindow mainWindow;
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
61 DocumentManager documents;
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
62 QString currentLanguage = "en";
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
63 QTranslator translator{&mainWindow};
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
64 LibrariesModel libraries{&mainWindow};
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
65 QStringList recentlyOpenedFiles;
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
66 ColorTable colorTable;
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
67 gl::RenderPreferences renderPreferences;
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
68 gl::build_preferences user_gl_build_preferences;
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
69 MessageLog messageLog;
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
70 ToolWidgets toolWidgets{
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
71 .circleToolOptions = new CircleToolOptionsWidget{&mainWindow},
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
72 };
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
73 };
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
74
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
75 static std::optional<ModelId> openModelFromPath(MainState* state, const QString& path)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
76 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
77 QString errorString;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
78 QTextStream errorStream{&errorString};
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
79 const std::optional<ModelId> modelIdOpt = state->documents.openModel(
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
80 path,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
81 errorStream,
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
82 OpenType::ManuallyOpened);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
83 if (modelIdOpt.has_value()) {
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
84 const DocumentManager::MissingDependencies missing = state->documents.loadDependenciesForAllModels(state->libraries);
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
85 if (not missing.empty()) {
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
86 QMessageBox::warning(
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
87 &state->mainWindow,
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
88 QObject::tr("Problem loading references"),
212
27259810da6d Rewrite dependency loading
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 206
diff changeset
89 errorStringFromMissingDependencies(missing));
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
90 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
91 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
92 else {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
93 QMessageBox::critical(
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
94 &state->mainWindow,
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
95 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
96 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
97 );
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
98 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
99 return modelIdOpt;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
100 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
101
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
102 static QString getOpenModelPath(QWidget* parent)
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
103 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
104 return QFileDialog::getOpenFileName(
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
105 parent,
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
106 QObject::tr("Open model"),
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 QObject::tr("LDraw models (*.ldr *.dat)"));
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
278
304386ff96a4 Make editing tools disabled until a document is selected
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 274
diff changeset
111 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
112 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
113 return documents->findPayload<ModelData>(modelId);
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
114 }
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
115
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
116 static ModelSubWindow* currentModelSubWindow(MainWindow* ui)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
117 {
217
6d95c1a41e6e reimplement EditTools as a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 216
diff changeset
118 auto* w = ui->mdiArea->activeSubWindow();
6d95c1a41e6e reimplement EditTools as a render layer
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 216
diff changeset
119 return qobject_cast<ModelSubWindow*>(w);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
120 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
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 ModelData* currentModelData(MainWindow* ui, const DocumentManager* documents)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
123 {
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
124 if (auto* const activeSubWindow = currentModelSubWindow(ui)) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
125 return findModelData(documents, activeSubWindow->modelId);
202
b05af0bab735 Replaced the tab widget with an MDI area
Teemu Piippo <teemu@hecknology.net>
parents: 201
diff changeset
126 }
b05af0bab735 Replaced the tab widget with an MDI area
Teemu Piippo <teemu@hecknology.net>
parents: 201
diff changeset
127 else {
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
128 return nullptr;
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
129 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
130 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
131
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
132 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
133 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
134 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
135 if (activeSubWindow != nullptr) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
136 return activeSubWindow->modelId;
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
137 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
138 else {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
139 return {};
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
140 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
141 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
142
230
a1f3f7d9078b rename LibraryManager -> LibrariesModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 229
diff changeset
143 static ColorTable loadColors(const LibrariesModel* libraries)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
144 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
145 QTextStream errors;
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
146 return libraries->loadColorTable(errors);
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
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
149 static QString tabName(const QFileInfo& fileInfo)
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 QString result = fileInfo.baseName();
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
152 if (result.isEmpty()) {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
153 result = QObject::tr("<unnamed>");
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 return result;
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
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
158 template<typename Fn>
352
59a31dd8a33a Rename forModel -> forEachModel
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 351
diff changeset
159 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
160 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
161 forValueInMap(*documents, [&fn](const DocumentManager::ModelInfo& info)
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
162 {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
163 ModelData* modelSpecificData = qobject_cast<ModelData*>(info.payload);
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
164 if (modelSpecificData != nullptr) {
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
165 fn(&info, modelSpecificData);
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 });
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
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
170 static void rebuild_polygons_for_all_models(MainState* state)
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
171 {
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
172 forEachModel(&state->documents, [](const void*, const ModelData* data){
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
173 if (data->canvas != nullptr) {
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
174 data->canvas->build();
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
175 data->canvas->update();
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
176 }
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
177 });
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
178 }
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
179
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
180 static void updateRenderPreferences(MainState* state)
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
181 {
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
182 forEachModel(&state->documents, [state](const void*, const ModelData* data){
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
183 if (data->canvas != nullptr) {
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
184 data->canvas->setLayerEnabled(data->axesLayer.get(), state->renderPreferences.drawAxes);
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
185 data->canvas->update();
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
186 }
214
8e1fe64ce4e3 begin refactor of gl side
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 212
diff changeset
187 });
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
188 state->mainWindow.setRenderStyle(state->renderPreferences.style);
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
189 state->mainWindow.actionDrawAxes->setChecked(state->renderPreferences.drawAxes);
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
190 state->mainWindow.actionWireframe->setChecked(state->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
191 }
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
192
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
193 static gl::build_preferences load_gl_build_preferences_from_settings()
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
194 {
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
195 return gl::build_preferences{
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
196 .mainColor = setting<Setting::MainColor>(),
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
197 .backgroundColor = setting<Setting::BackgroundColor>(),
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
198 };
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
199 }
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
200
218
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
201 static gl::RenderPreferences loadRenderPreferences()
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
202 {
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
203 return gl::RenderPreferences{
218
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
204 .style = setting<Setting::RenderStyle>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
205 .selectedColor = setting<Setting::SelectedColor>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
206 .lineThickness = setting<Setting::LineThickness>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
207 .lineAntiAliasing = setting<Setting::LineAntiAliasing>(),
63125c36de73 Replace config collector with a simpler system
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 217
diff changeset
208 .drawAxes = setting<Setting::DrawAxes>(),
231
a9bf6bab5ea2 Add wireframe button
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 230
diff changeset
209 .wireframe = setting<Setting::Wireframe>(),
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
210 };
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
211 }
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
212
354
91053052bb28 Readd the MainWindow class and renderstyle button handling to it
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 353
diff changeset
213 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
214 {
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
215 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
216 {
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 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
218 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
219 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
220 } 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
221 {
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 .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
223 .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
224 .icon = {":/icons/navigate-outline.png"},
330
edb6c09cdd3c Delete object editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 329
diff changeset
225 .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
226 },
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 {
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 .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
229 .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
230 .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
231 .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
232 },
232
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
233 {
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
234 .name = QObject::tr("Circle"),
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
235 .tooltip = QObject::tr("Draw circular primitives."),
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
236 .icon = {":/icons/linetype-circularprimitive.png"},
251
94b0a30a1886 Add object editor into main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 250
diff changeset
237 .widget = toolWidgets->circleToolOptions,
232
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
238 },
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
239 };
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 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
241 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
242 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
243 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
244 action->setEnabled(false);
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
245 action->setData(QVariant::fromValue(static_cast<editing_mode_e>(i)));
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
246 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
247 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
248 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
249 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
250 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
251 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
252 }
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
253 ui->toolWidgetStack->addWidget(widget);
232
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
254 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
255 ui->toolWidgetStack->setCurrentIndex(i);
8efa3a33172e Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 231
diff changeset
256 });
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
257 }
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
258 }
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
259
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
260 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
261 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
262 {
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 // 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
264 // 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
265 // 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
266 // 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
267 // 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
268 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
269 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
270 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
271 }
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
272
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
273 static void executeAction(QTextDocument* model, QPlainTextEdit* editor, const ModelAction& action)
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
274 {
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
275 std::visit(overloaded{
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
276 [model](const AppendToModel& action){
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
277 QTextCursor cursor{model};
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
278 cursor.movePosition(QTextCursor::End);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
279 const QString newText = modelElementToString(action.newElement);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
280 // Make sure we have an empty line
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
281 if (not model->lastBlock().text().isEmpty()) {
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
282 cursor.insertBlock();
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 cursor.insertText(newText);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
285 },
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
286 [](const DeleteFromModel&){},
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
287 [model](const ModifyModel& action){
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
288 QTextBlock block = model->findBlockByLineNumber((int) action.position);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
289 if (block.isValid()) {
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
290 QTextCursor cursor{block};
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
291 cursor.select(QTextCursor::LineUnderCursor);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
292 cursor.insertText(modelElementToString(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 //model->assignAt(action.position, action.newElement);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
295 },
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
296 [editor](const SelectInModel& action){
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
297 QTextCursor cursor = editor->textCursor();
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
298 cursor.movePosition(QTextCursor::Start);
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
299 cursor.movePosition(QTextCursor::NextBlock, QTextCursor::MoveAnchor, static_cast<signed>(action.position));
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
300 cursor.select(QTextCursor::LineUnderCursor);
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
301 editor->setTextCursor(cursor);
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
302 editor->update();
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
303 },
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
304 }, action);
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
305 }
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
306
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
307 QFont codeEditorFontFromSettings()
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 QFont font{};
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
310 if (setting<Setting::CodeEditorUseSystemFont>())
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
311 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
312 font.setStyleHint(QFont::Monospace);
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
313 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
314 else
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
315 {
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
316 font.setFamily(setting<Setting::CodeEditorFontFamily>());
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
317 font.setPointSize(setting<Setting::CodeEditorFontSize>());
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
318 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
319 return font;
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
320 }
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
321
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
322 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
323 {
e1d646a4cbd8 Extracted the state of the program into a MainState structure, and extracted local functions of main() into static functions.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 361
diff changeset
324 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
325 if (model != nullptr) {
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
326 ModelData* data = new ModelData(model, &state->documents, &state->colorTable);
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
327 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
328 QObject::connect(
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
329 data,
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
330 &EditableModel::modelAction,
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
331 std::bind(executeAction, model, state->mainWindow.modelEdit, std::placeholders::_1));
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
332 data->canvas->render_preferences = &state->renderPreferences;
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
333 data->canvas->build_preferences = &state->user_gl_build_preferences;
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
334 QObject::connect(
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
335 data,
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
336 &EditableModel::newStatusText,
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
337 [&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
338 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
339 });
328
3ea38fd469ca Replace item view with a text editor
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 327
diff changeset
340 #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
341 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
342 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
343 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
344 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
345 }
e1d646a4cbd8 Extracted the state of the program 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 });
e1d646a4cbd8 Extracted the state of the program 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 #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
348 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
349 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
350 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
351 &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
352 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
353 &QWidget::setCursor);
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
354 data->tools->setEditMode(editing_mode_e::select);
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
355 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
356 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
357 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
358 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
359 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
360 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
361 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
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
363 }
e1d646a4cbd8 Extracted the state of the program 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
e1d646a4cbd8 Extracted the state of the program 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 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
366 {
e1d646a4cbd8 Extracted the state of the program 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 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
368 }
e1d646a4cbd8 Extracted the state of the program 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
e1d646a4cbd8 Extracted the state of the program 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 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
371 {
e1d646a4cbd8 Extracted the state of the program 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 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
373 state->renderPreferences = loadRenderPreferences();
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
374 state->user_gl_build_preferences = load_gl_build_preferences_from_settings();
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
375 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
376 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
377 state->colorTable = loadColors(&state->libraries);
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
378 updateRenderPreferences(state);
376
3cef3b016330 Split GL preferences that affect GL build to a new build preferences structure, modifying that requires rebuild, modifying render preferences does not
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 375
diff changeset
379 rebuild_polygons_for_all_models(state);
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
380 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
381 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
382 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
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 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
386 {
e1d646a4cbd8 Extracted the state of the program 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 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
388 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
389 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
390 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
391 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
392 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
393 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
394 }
e1d646a4cbd8 Extracted the state of the program 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
e1d646a4cbd8 Extracted the state of the program 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 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
397 {
e1d646a4cbd8 Extracted the state of the program 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 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
399 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
400 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
401 while (state->recentlyOpenedFiles.size() > maxRecentlyOpenedFiles)
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
402 {
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
403 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
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 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
406 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
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
e1d646a4cbd8 Extracted the state of the program 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 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
410 {
e1d646a4cbd8 Extracted the state of the program 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 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
412 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
413 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
414 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
415 {
e1d646a4cbd8 Extracted the state of the program 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 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
417 }
e1d646a4cbd8 Extracted the state of the program 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 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
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 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
421 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
422 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
423 }
e1d646a4cbd8 Extracted the state of the program 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 }
e1d646a4cbd8 Extracted the state of the program 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 }
e1d646a4cbd8 Extracted the state of the program 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
e1d646a4cbd8 Extracted the state of the program 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 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
428 {
e1d646a4cbd8 Extracted the state of the program 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 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
430 if (modelId.has_value())
353
c229d38f04c6 Use explicit captures in main
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 352
diff changeset
431 {
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
432 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
433 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
434 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
435 &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
436 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
437 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
438 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
439 );
e1d646a4cbd8 Extracted the state of the program 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 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
441 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
442 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
443 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
444 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
445 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
446 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
447 }
e1d646a4cbd8 Extracted the state of the program 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 saveCurrentModel(state, *modelId);
350
676d0b43b577 Opening recently opened files works again now
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 338
diff changeset
449 }
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
450 }
e1d646a4cbd8 Extracted the state of the program 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
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
453 static void checkEditingModeAction(MainState* state, const editing_mode_e 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
454 {
e1d646a4cbd8 Extracted the state of the program 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 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
456 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
457 {
e1d646a4cbd8 Extracted the state of the program 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 action->setEnabled(hasDocument);
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
459 action->setChecked(hasDocument and action->data().value<editing_mode_e>() == 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
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
370
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
463 static void update_model_grid_matrix(MainState* state)
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
464 {
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
465 const glm::mat4 new_grid_matrix = state->mainWindow.gridMatrix->value();
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
466 forEachModel(&state->documents, [&](const void*, const ModelData* data)
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
467 {
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
468 if (data->gridLayer != nullptr and data->tools != nullptr and data->canvas != nullptr)
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
469 {
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
470 data->gridLayer->setGridMatrix(new_grid_matrix);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
471 data->tools->setGridMatrix(new_grid_matrix);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
472 data->canvas->setModelViewOrigin(new_grid_matrix[3]);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
473 data->canvas->update();
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
474 }
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
475 });
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
476 }
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
477
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
478 static void set_grid_scale(MainState* state, const float factor)
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
479 {
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
480 const glm::mat4 original = state->mainWindow.gridMatrix->value();
371
171d3f9638a9 rename some functions
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 370
diff changeset
481 const glm::mat4 unscaled = unscale_matrix(original).unscaled;
370
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
482 const glm::mat4 rescaled = factor * unscaled;
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
483 state->mainWindow.gridMatrix->setValue(rescaled);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
484 update_model_grid_matrix(state);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
485 }
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
486
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
487 static void replace_color_in_selected_code(QTextCursor* cursor, const ColorIndex color)
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
488 {
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
489 const auto pattern = R"(^(\s*(?:1|2|3|4|5)\s+)\d+)";
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
490 static const QRegularExpression regular_expression{pattern, QRegularExpression::MultilineOption};
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
491 QString text = cursor->selectedText();
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
492 // Qt has decided to be "smart" and uses strange unicode characters instead of newlines
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
493 text.replace("\u2029", "\n");
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
494 text.replace(regular_expression, QStringLiteral(R"(\1%1)").arg(color.index));
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
495 cursor->removeSelectedText();
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
496 cursor->insertText(text);
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
497 }
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
498
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
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) {
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
509 const auto id = openModelFromPath(&state, path);
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 {
368
9444de9762c3 Simplify signature of openModelFromPath
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 367
diff changeset
528 const std::optional<ModelId> id = openModelFromPath(&state, path);
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);
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
584 updateRenderPreferences(&state);
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);
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
591 updateRenderPreferences(&state);
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);
375
21a5ecbe34e4 Simplify signature of updateRenderPreferences
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 374
diff changeset
598 updateRenderPreferences(&state);
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 {
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
606 const editing_mode_e mode = action->data().value<editing_mode_e>();
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 {
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
628 checkEditingModeAction(&state, editing_mode_e::select);
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)) {
383
530d23cd4e97 Refactor, make selecting elements from the model select the corresponding line from the editor as well
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 376
diff changeset
659 executeAction(model, state.mainWindow.modelEdit, action);
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
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,
370
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
676 [&state]
356
65b4741b302d Made editor font configurable
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 355
diff changeset
677 {
370
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
678 update_model_grid_matrix(&state);
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 );
367
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
681 QObject::connect(
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
682 state.mainWindow.actionDelete,
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
683 &QAction::triggered,
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
684 [&state]{
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
685 QTextCursor cursor = state.mainWindow.modelEdit->textCursor();
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
686 cursor.removeSelectedText();
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
687 }
df61cd3d5ab4 Also connect up the "Delete" action
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 363
diff changeset
688 );
370
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
689 QObject::connect(
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
690 state.mainWindow.actionGridCoarse,
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
691 &QAction::triggered,
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
692 [&state]{
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
693 set_grid_scale(&state, 5.0f);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
694 }
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
695 );
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
696 QObject::connect(
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
697 state.mainWindow.actionGridMedium,
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
698 &QAction::triggered,
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
699 [&state]{
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
700 set_grid_scale(&state, 1.0f);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
701 }
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
702 );
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
703 QObject::connect(
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
704 state.mainWindow.actionGridFine,
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
705 &QAction::triggered,
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
706 [&state]{
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
707 set_grid_scale(&state, 0.1f);
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
708 }
b2f9ded235a6 Grid scaling buttons now work
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 368
diff changeset
709 );
374
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
710 QObject::connect(
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
711 state.mainWindow.action_make_stuff_red,
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
712 &QAction::triggered,
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
713 [&state]{
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
714 QTextCursor cursor = state.mainWindow.modelEdit->textCursor();
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
715 replace_color_in_selected_code(&cursor, ColorIndex{4});
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
716 }
75efc3ba5a56 More refactor and renaming
Teemu Piippo <teemu.s.piippo@gmail.com>
parents: 371
diff changeset
717 );
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
718 restoreSettings(&state);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
719 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
720 saveSettings(&state);
201
5d201ee4a9c3 Continue giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 200
diff changeset
721 return result;
0
f9f4d4d6f162 initial commit
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
722 }

mercurial