diff --git a/tycho/cc/mapmodel.cc b/tycho/cc/mapmodel.cc index a86d90e..0fc6942 100644 --- a/tycho/cc/mapmodel.cc +++ b/tycho/cc/mapmodel.cc @@ -1,7 +1,7 @@ #include "tycho.h" -MapModel::MapModel(QObject *parent) : - AbstractMapModel(parent), +MapModel::MapModel(Project *parent) : + AbstractMapModel(static_cast(parent)), ProjectModel() { dbgPrintFunc(); @@ -12,11 +12,6 @@ MapModel::~MapModel() dbgPrintFunc(); } -ProjectModelType MapModel::type() const -{ - return ProjectModelType::Map; -} - bool MapModel::isDirty() const { return AbstractMapModel::isDirty(); diff --git a/tycho/cc/mapprops.cc b/tycho/cc/mapprops.cc index 6a4e0de..992a938 100644 --- a/tycho/cc/mapprops.cc +++ b/tycho/cc/mapprops.cc @@ -1,8 +1,8 @@ #include "tycho.h" -MapProps::MapProps(std::weak_ptr _mapModel, QWidget *parent) : - QDialog(parent), - mapModel(_mapModel) +MapProps::MapProps(Project *parent) : + QDialog(static_cast(parent)), + mapModel(parent->getMapModel()) { setupUi(this); @@ -12,8 +12,8 @@ MapProps::MapProps(std::weak_ptr _mapModel, QWidget *parent) : bbox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); verticalLayout->addWidget(bbox); - connect(bbox, SIGNAL(accepted()), this, SLOT(accept())); - connect(bbox, SIGNAL(rejected()), this, SLOT(reject())); + connect(bbox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(bbox, &QDialogButtonBox::rejected, this, &QDialog::reject); dbgPrintFunc(); } @@ -23,4 +23,9 @@ MapProps::~MapProps() dbgPrintFunc(); } +void MapProps::accept() +{ + done(QDialog::Accepted); +} + // EOF diff --git a/tycho/cc/mapview.cc b/tycho/cc/mapview.cc index c7617e8..18d2905 100644 --- a/tycho/cc/mapview.cc +++ b/tycho/cc/mapview.cc @@ -1,8 +1,8 @@ #include "tycho.h" -MapView::MapView(std::weak_ptr _mapModel, QWidget *parent) : - QWidget(parent), - mapModel(_mapModel) +MapView::MapView(Project *parent) : + QWidget(static_cast(parent)), + mapModel(parent->getMapModel()) { setupUi(this); diff --git a/tycho/cc/menu.cc b/tycho/cc/menu.cc index 9276e50..22ec6a5 100644 --- a/tycho/cc/menu.cc +++ b/tycho/cc/menu.cc @@ -22,7 +22,7 @@ Menu::~Menu() void Menu::mapNew() { - QScopedPointer proj{new Project(ProjectModelType::Map)}; + QScopedPointer proj{new Project(ProjectType::Map)}; addProject(proj.take()); } @@ -40,7 +40,7 @@ void Menu::mapOpen() "All files (*)")); if(!fname.isEmpty()) { - QScopedPointer proj{new Project(ProjectModelType::Map)}; + QScopedPointer proj{new Project(ProjectType::Map)}; if(proj->getModel()->open(fname)) { addProject(proj.take()); @@ -98,19 +98,22 @@ void Menu::openMapProperties() { auto proj = activeProject(); - if(proj && proj->getModel()->type() == ProjectModelType::Map) { - MapProps props{proj->getMapModel(), proj}; + if(proj && proj->getType() == ProjectType::Map) { + MapProps props{proj}; props.exec(); } } void Menu::updateActions() { - auto proj = activeProject(); - bool active = proj != nullptr; + std::optional active; - actionClose->setEnabled(active); - actionMapProps->setEnabled(active); + if(auto proj = activeProject()) { + active = proj->getType(); + } + + actionClose->setEnabled(!!active); + actionMapProps->setEnabled(active == ProjectType::Map); } void Menu::closeEvent(QCloseEvent *event) diff --git a/tycho/cc/project.cc b/tycho/cc/project.cc index 928078e..c07a0a7 100644 --- a/tycho/cc/project.cc +++ b/tycho/cc/project.cc @@ -1,9 +1,24 @@ #include "tycho.h" -Project::Project(ProjectModelType type) : +static ProjectModel *makeModel(Project *proj) +{ + switch(proj->getType()) { + case ProjectType::Map: return new MapModel(proj); + } +} + +static ProjectView *makeView(Project *proj) +{ + switch(proj->getType()) { + case ProjectType::Map: return new MapView(proj); + } +} + +Project::Project(ProjectType _type) : QMdiSubWindow(), - model(nullptr), - view(nullptr) + type(_type), + model(makeModel(this)), + view(makeView(this)) { auto widget = new QWidget(this); @@ -12,15 +27,13 @@ Project::Project(ProjectModelType type) : setWidget(widget); setAttribute(Qt::WA_DeleteOnClose); - switch(type) { - case ProjectModelType::Map: - model.reset(new MapModel(this)); - view = new MapView(getMapModel(), this); - break; - } + listView->setModel(dynamic_cast(model)); + verticalLayout->insertWidget(0, dynamic_cast(view)); - listView->setModel(dynamic_cast(model.get())); - verticalLayout->insertWidget(0, view); + connect(listView, + SIGNAL(doubleClicked(QModelIndex const &)), + dynamic_cast(model), + SLOT(select(QModelIndex const &))); dbgPrintFunc(); } @@ -30,14 +43,19 @@ Project::~Project() dbgPrintFunc(); } -std::shared_ptr Project::getModel() +ProjectType Project::getType() const +{ + return type; +} + +ProjectModel *Project::getModel() const { return model; } -std::shared_ptr Project::getMapModel() +MapModel *Project::getMapModel() const { - return std::dynamic_pointer_cast(model); + return dynamic_cast(model); } void Project::closeEvent(QCloseEvent *event) diff --git a/tycho/cc/tycho.h b/tycho/cc/tycho.h index e988173..e275dd9 100644 --- a/tycho/cc/tycho.h +++ b/tycho/cc/tycho.h @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -25,40 +25,48 @@ #include "../ui/ui_menu.h" #include "../ui/ui_project.h" +// Types ---------------------------------------------------------------------| + class MapModel; class MapProps; class MapView; class Menu; class Project; -enum class ProjectModelType +enum class ProjectType { Map, }; +// Interfaces ----------------------------------------------------------------| + class ProjectModel { public: virtual ~ProjectModel() {} - virtual ProjectModelType type() const = 0; - virtual bool isDirty() const = 0; virtual bool open(QString const &path) = 0; virtual bool save() const = 0; virtual bool saveAs(QString const &path) const = 0; }; +class ProjectView +{ +public: + virtual ~ProjectView() {} +}; + +// Implementations -----------------------------------------------------------| + class MapModel final : public AbstractMapModel, public ProjectModel { Q_OBJECT public: - explicit MapModel(QObject *parent = nullptr); + explicit MapModel(Project *parent); ~MapModel() override; - ProjectModelType type() const override; - bool isDirty() const override; bool open(QString const &path) override; bool save() const override; @@ -69,30 +77,32 @@ private: const override; }; +class MapView final : public QWidget, public ProjectView, private Ui::MapView +{ + Q_OBJECT + +public: + explicit MapView(Project *parent); + ~MapView(); + +private: + MapModel *const mapModel; +}; + +// UI ------------------------------------------------------------------------| + class MapProps final : public QDialog, private Ui::MapProps { Q_OBJECT public: - explicit MapProps(std::weak_ptr mapModel, - QWidget *parent = nullptr); + explicit MapProps(Project *parent); ~MapProps(); -private: - std::weak_ptr mapModel; -}; - -class MapView final : public QWidget, private Ui::MapView -{ - Q_OBJECT - -public: - explicit MapView(std::weak_ptr mapModel, - QWidget *parent = nullptr); - ~MapView(); + void accept() override; private: - std::weak_ptr mapModel; + MapModel *const mapModel; }; class Menu final : public QMainWindow, private Ui::Menu @@ -116,8 +126,9 @@ protected: void openLicense(QWidget *parent); private: - Project *activeProject() const; + Project *activeProject() const; QMdiSubWindow *activeSubWindow() const; + void addProject(Project *proj); }; @@ -126,18 +137,22 @@ class Project final : public QMdiSubWindow, private Ui::Project Q_OBJECT public: - explicit Project(ProjectModelType type); + explicit Project(ProjectType type); ~Project(); - std::shared_ptr getModel(); - std::shared_ptr getMapModel(); + ProjectType getType() const; + + ProjectModel *getModel() const; + MapModel *getMapModel() const; protected: void closeEvent(QCloseEvent *event) override; private: - std::shared_ptr model; - QWidget *view; + ProjectType const type; + + ProjectModel *const model; + ProjectView *const view; }; template