5 #include <QStackedWidget> |
5 #include <QStackedWidget> |
6 #include <QCloseEvent> |
6 #include <QCloseEvent> |
7 #include "mainwindow.h" |
7 #include "mainwindow.h" |
8 #include "ui_mainwindow.h" |
8 #include "ui_mainwindow.h" |
9 #include "version.h" |
9 #include "version.h" |
10 #include "ui/canvas.h" |
10 #include "gl/axesprogram.h" |
|
11 #include "gl/partrenderer.h" |
11 #include "document.h" |
12 #include "document.h" |
12 #include "settingseditor/settingseditor.h" |
13 #include "settingseditor/settingseditor.h" |
13 #include "widgets/colorselectdialog.h" |
14 #include "widgets/colorselectdialog.h" |
14 |
15 |
15 static const QDir LOCALE_DIR {":/locale"}; |
16 static const QDir LOCALE_DIR {":/locale"}; |
29 { |
30 { |
30 event->ignore(); |
31 event->ignore(); |
31 } |
32 } |
32 }; |
33 }; |
33 |
34 |
|
35 class ModelData : public QObject |
|
36 { |
|
37 Q_OBJECT |
|
38 public: |
|
39 ModelData(QObject* parent) : QObject {parent} {} |
|
40 std::unique_ptr<PartRenderer> canvas; |
|
41 std::unique_ptr<QItemSelectionModel> itemSelectionModel; |
|
42 std::unique_ptr<EditTools> tools; |
|
43 std::unique_ptr<AxesLayer> axesLayer; |
|
44 Model* model; |
|
45 }; |
|
46 #include "main.moc" |
|
47 |
34 static void doQtRegistrations() |
48 static void doQtRegistrations() |
35 { |
49 { |
36 QCoreApplication::setApplicationName(::appName); |
50 QCoreApplication::setApplicationName(::appName); |
37 QCoreApplication::setOrganizationName("hecknology.net"); |
51 QCoreApplication::setOrganizationName("hecknology.net"); |
38 QCoreApplication::setOrganizationDomain("hecknology.net"); |
52 QCoreApplication::setOrganizationDomain("hecknology.net"); |
48 constexpr MemberType memberInstance(BaseType* instance) const |
62 constexpr MemberType memberInstance(BaseType* instance) const |
49 { |
63 { |
50 return *reinterpret_cast<MemberType*>(reinterpret_cast<char*>(instance) + this->member); |
64 return *reinterpret_cast<MemberType*>(reinterpret_cast<char*>(instance) + this->member); |
51 } |
65 } |
52 }; |
66 }; |
53 |
|
54 class ModelData : public QObject |
|
55 { |
|
56 Q_OBJECT |
|
57 public: |
|
58 ModelData(QObject* parent) : QObject {parent} {} |
|
59 std::unique_ptr<Canvas> canvas; |
|
60 std::unique_ptr<QItemSelectionModel> itemSelectionModel; |
|
61 std::unique_ptr<EditTools> tools; |
|
62 Model* model; |
|
63 }; |
|
64 #include "main.moc" |
|
65 |
67 |
66 static constexpr MemberData<Ui_MainWindow, QAction*, gl::RenderStyle> renderStyleButtons[] = { |
68 static constexpr MemberData<Ui_MainWindow, QAction*, gl::RenderStyle> renderStyleButtons[] = { |
67 { offsetof(Ui_MainWindow, actionRenderStyleNormal), gl::RenderStyle::Normal }, |
69 { offsetof(Ui_MainWindow, actionRenderStyleNormal), gl::RenderStyle::Normal }, |
68 { offsetof(Ui_MainWindow, actionRenderStyleBfc), gl::RenderStyle::BfcRedGreen }, |
70 { offsetof(Ui_MainWindow, actionRenderStyleBfc), gl::RenderStyle::BfcRedGreen }, |
69 { offsetof(Ui_MainWindow, actionRenderStyleRandom), gl::RenderStyle::RandomColors }, |
71 { offsetof(Ui_MainWindow, actionRenderStyleRandom), gl::RenderStyle::RandomColors }, |
234 const DocumentManager* documents) |
236 const DocumentManager* documents) |
235 { |
237 { |
236 forModel(documents, [&renderPreferences](const void*, const ModelData* data){ |
238 forModel(documents, [&renderPreferences](const void*, const ModelData* data){ |
237 if (data->canvas != nullptr) { |
239 if (data->canvas != nullptr) { |
238 data->canvas->setRenderPreferences(*renderPreferences); |
240 data->canvas->setRenderPreferences(*renderPreferences); |
|
241 data->canvas->setLayerEnabled(data->axesLayer.get(), renderPreferences->drawAxes); |
239 } |
242 } |
240 }); |
243 }); |
241 for (auto data : ::renderStyleButtons) { |
244 for (auto data : ::renderStyleButtons) { |
242 QAction* action = data.memberInstance(ui); |
245 QAction* action = data.memberInstance(ui); |
243 action->setChecked(renderPreferences->style == data.payload); |
246 action->setChecked(renderPreferences->style == data.payload); |
389 const auto openModelForEditing = [&](const ModelId modelId){ |
392 const auto openModelForEditing = [&](const ModelId modelId){ |
390 Model* model = documents.getModelById(modelId); |
393 Model* model = documents.getModelById(modelId); |
391 if (model != nullptr) { |
394 if (model != nullptr) { |
392 ModelData* data = new ModelData(&documents); |
395 ModelData* data = new ModelData(&documents); |
393 data->tools = std::make_unique<EditTools>(model, colorTable); |
396 data->tools = std::make_unique<EditTools>(model, colorTable); |
394 data->canvas = std::make_unique<Canvas>(model, data->tools.get(), &documents, colorTable); |
397 data->canvas = std::make_unique<PartRenderer>(model, &documents, colorTable); |
395 data->itemSelectionModel = std::make_unique<QItemSelectionModel>(model); |
398 data->itemSelectionModel = std::make_unique<QItemSelectionModel>(model); |
|
399 data->axesLayer = std::make_unique<AxesLayer>(); |
396 data->model = model; |
400 data->model = model; |
|
401 data->canvas->addRenderLayer(data->axesLayer.get()); |
|
402 data->canvas->setLayerEnabled(data->axesLayer.get(), settings.drawAxes()); |
|
403 documents.setModelPayload(modelId, data); |
397 QObject::connect( |
404 QObject::connect( |
398 data->tools.get(), |
405 data->tools.get(), |
399 &EditTools::modelAction, |
406 &EditTools::modelAction, |
400 std::bind(executeAction, model, std::placeholders::_1)); |
407 std::bind(executeAction, model, std::placeholders::_1)); |
|
408 #if 0 |
401 QObject::connect(data->itemSelectionModel.get(), &QItemSelectionModel::selectionChanged, |
409 QObject::connect(data->itemSelectionModel.get(), &QItemSelectionModel::selectionChanged, |
402 [modelId, &documents]( |
410 [modelId, &documents]( |
403 const QItemSelection& selected, |
411 const QItemSelection& selected, |
404 const QItemSelection& deselected) |
412 const QItemSelection& deselected) |
405 { |
413 { |
413 return fn::map<QSet<ModelId>>(selection.indexes(), resolveIndex); |
421 return fn::map<QSet<ModelId>>(selection.indexes(), resolveIndex); |
414 }; |
422 }; |
415 data->canvas->handleSelectionChange(resolve(selected), resolve(deselected)); |
423 data->canvas->handleSelectionChange(resolve(selected), resolve(deselected)); |
416 } |
424 } |
417 }); |
425 }); |
|
426 #endif |
418 data->canvas->setRenderPreferences(renderPreferences); |
427 data->canvas->setRenderPreferences(renderPreferences); |
419 QObject::connect( |
428 QObject::connect( |
420 data->tools.get(), |
429 data->tools.get(), |
421 &EditTools::newStatusText, |
430 &EditTools::newStatusText, |
422 [&](const QString& newStatusText) { |
431 [&](const QString& newStatusText) { |
449 { |
458 { |
450 restoreSettings(); |
459 restoreSettings(); |
451 } |
460 } |
452 }); |
461 }); |
453 QObject::connect(ui.actionQuit, &QAction::triggered, &mainWindow, &QMainWindow::close); |
462 QObject::connect(ui.actionQuit, &QAction::triggered, &mainWindow, &QMainWindow::close); |
|
463 #if 0 |
454 QObject::connect(ui.actionAdjustGridToView, &QAction::triggered, [&]{ |
464 QObject::connect(ui.actionAdjustGridToView, &QAction::triggered, [&]{ |
455 if (ModelData* data = currentModelData(&ui, &documents)) { |
465 if (ModelData* data = currentModelData(&ui, &documents)) { |
456 adjustGridToView(data->canvas.get()); |
466 adjustGridToView(data->canvas.get()); |
457 } |
467 } |
458 }); |
468 }); |
|
469 #endif |
459 QObject::connect(ui.actionClose, &QAction::triggered, [&ui, &documents]{ |
470 QObject::connect(ui.actionClose, &QAction::triggered, [&ui, &documents]{ |
460 if (ModelData* data = currentModelData(&ui, &documents)) { |
471 if (ModelData* data = currentModelData(&ui, &documents)) { |
461 // TODO |
472 // TODO |
462 } |
473 } |
463 }); |
474 }); |