src/main.cpp

changeset 215
34c6e7bc4ee1
parent 214
8e1fe64ce4e3
child 216
c7241f504117
equal deleted inserted replaced
214:8e1fe64ce4e3 215:34c6e7bc4ee1
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 });

mercurial