tycho: use smart pointers and dynamic casting for safer model passing
parent
8f6b690442
commit
4a0257324e
|
@ -17,26 +17,6 @@ ProjectModel::Type MapModel::type() const
|
|||
return ProjectModel::Map;
|
||||
}
|
||||
|
||||
QAbstractItemModel const *MapModel::getAbstract() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
QAbstractItemModel *MapModel::getAbstract()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
MapModel const *MapModel::getMap() const
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
MapModel *MapModel::getMap()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
bool MapModel::isDirty() const
|
||||
{
|
||||
return AbstractMapModel::isDirty();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "tycho.h"
|
||||
|
||||
MapProps::MapProps(MapModel *_mapModel, QWidget *parent) :
|
||||
MapProps::MapProps(std::weak_ptr<MapModel> _mapModel, QWidget *parent) :
|
||||
QDialog(parent),
|
||||
mapModel(_mapModel)
|
||||
{
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#include "tycho.h"
|
||||
|
||||
MapView::MapView(MapModel *mapModel, QWidget *parent) :
|
||||
QWidget(parent)
|
||||
MapView::MapView(std::weak_ptr<MapModel> _mapModel, QWidget *parent) :
|
||||
QWidget(parent),
|
||||
mapModel(_mapModel)
|
||||
{
|
||||
setupUi(this);
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ void Menu::mapOpen()
|
|||
if(!fname.isEmpty()) {
|
||||
QScopedPointer proj{new Project(new MapModel)};
|
||||
|
||||
if(proj->model->open(fname)) {
|
||||
if(proj->getModel()->open(fname)) {
|
||||
addProject(proj.take());
|
||||
}
|
||||
}
|
||||
|
@ -98,8 +98,8 @@ void Menu::openMapProperties()
|
|||
{
|
||||
auto proj = activeProject();
|
||||
|
||||
if(proj && proj->model->type() == ProjectModel::Map) {
|
||||
MapProps props{proj->model->getMap(), proj};
|
||||
if(proj && proj->getModel()->type() == ProjectModel::Map) {
|
||||
MapProps props{proj->getMapModel(), proj};
|
||||
props.exec();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ Project::Project(ProjectModel *_model, QWidget *parent) :
|
|||
setWidget(widget);
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
listView->setModel(model->getAbstract());
|
||||
listView->setModel(dynamic_cast<QAbstractItemModel *>(model.get()));
|
||||
|
||||
dbgPrintFunc();
|
||||
}
|
||||
|
@ -21,6 +21,16 @@ Project::~Project()
|
|||
dbgPrintFunc();
|
||||
}
|
||||
|
||||
std::shared_ptr<ProjectModel> Project::getModel()
|
||||
{
|
||||
return model;
|
||||
}
|
||||
|
||||
std::shared_ptr<MapModel> Project::getMapModel()
|
||||
{
|
||||
return std::dynamic_pointer_cast<MapModel>(model);
|
||||
}
|
||||
|
||||
void Project::closeEvent(QCloseEvent *event)
|
||||
{
|
||||
if(model->isDirty()) {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <QApplication>
|
||||
|
@ -29,42 +30,6 @@ class MapProps;
|
|||
class MapView;
|
||||
class Menu;
|
||||
class Project;
|
||||
class ProjectModel;
|
||||
|
||||
class MapProps : public QDialog, private Ui::MapProps
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MapProps(MapModel *mapModel, QWidget *parent = nullptr);
|
||||
~MapProps();
|
||||
|
||||
private:
|
||||
MapModel *mapModel;
|
||||
};
|
||||
|
||||
class MapView : public QWidget, private Ui::MapView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MapView(MapModel *mapModel, QWidget *parent = nullptr);
|
||||
~MapView();
|
||||
};
|
||||
|
||||
class Project : public QMdiSubWindow, private Ui::Project
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Project(ProjectModel *model, QWidget *parent = nullptr);
|
||||
~Project();
|
||||
|
||||
QSharedPointer<ProjectModel> model;
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
};
|
||||
|
||||
class ProjectModel
|
||||
{
|
||||
|
@ -78,18 +43,13 @@ public:
|
|||
|
||||
virtual Type type() const = 0;
|
||||
|
||||
virtual QAbstractItemModel const *getAbstract() const = 0;
|
||||
virtual QAbstractItemModel *getAbstract() = 0;
|
||||
virtual MapModel const *getMap() const = 0;
|
||||
virtual MapModel *getMap() = 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 MapModel final : private AbstractMapModel, public ProjectModel
|
||||
class MapModel final : public AbstractMapModel, public ProjectModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
@ -99,11 +59,6 @@ public:
|
|||
|
||||
ProjectModel::Type type() const override;
|
||||
|
||||
QAbstractItemModel const *getAbstract() const override;
|
||||
QAbstractItemModel *getAbstract() override;
|
||||
MapModel const *getMap() const override;
|
||||
MapModel *getMap() override;
|
||||
|
||||
bool isDirty() const override;
|
||||
bool open(QString const &path) override;
|
||||
bool save() const override;
|
||||
|
@ -114,7 +69,33 @@ private:
|
|||
const override;
|
||||
};
|
||||
|
||||
class Menu : public QMainWindow, private Ui::Menu
|
||||
class MapProps final : public QDialog, private Ui::MapProps
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MapProps(std::weak_ptr<MapModel> mapModel,
|
||||
QWidget *parent = nullptr);
|
||||
~MapProps();
|
||||
|
||||
private:
|
||||
std::weak_ptr<MapModel> mapModel;
|
||||
};
|
||||
|
||||
class MapView final : public QWidget, private Ui::MapView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MapView(std::weak_ptr<MapModel> mapModel,
|
||||
QWidget *parent = nullptr);
|
||||
~MapView();
|
||||
|
||||
private:
|
||||
std::weak_ptr<MapModel> mapModel;
|
||||
};
|
||||
|
||||
class Menu final : public QMainWindow, private Ui::Menu
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
@ -140,6 +121,25 @@ private:
|
|||
void addProject(Project *proj);
|
||||
};
|
||||
|
||||
class Project final : public QMdiSubWindow, private Ui::Project
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Project(ProjectModel *model, QWidget *parent = nullptr);
|
||||
~Project();
|
||||
|
||||
std::shared_ptr<ProjectModel> getModel();
|
||||
std::shared_ptr<MapModel> getMapModel();
|
||||
std::shared_ptr<QAbstractItemModel> getAbstractModel();
|
||||
|
||||
protected:
|
||||
void closeEvent(QCloseEvent *event) override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<ProjectModel> model;
|
||||
};
|
||||
|
||||
template<typename... VA>
|
||||
static inline void dbgPrint([[maybe_unused]] char const *fmt,
|
||||
[[maybe_unused]] VA &&...va)
|
||||
|
|
Loading…
Reference in New Issue