Maraiah/tycho/cc_source/project.cc

129 lines
2.4 KiB
C++

#include "tycho.h"
#include "project.h"
#include <QCloseEvent>
#include <QMessageBox>
ProjectModel::ProjectModel(MapModel *ptr) :
modelType(Map),
modelMap(ptr)
{
Q_ASSERT(modelMap != nullptr);
}
ProjectModel::ProjectModel(ProjectModel &&o) :
modelType(o.modelType),
modelMap(o.modelMap)
{
o.modelType = Invalid;
}
ProjectModel::~ProjectModel()
{
switch(modelType) {
case Map: delete modelMap; break;
}
}
ProjectModel::Type ProjectModel::type() const
{
return modelType;
}
QAbstractItemModel *ProjectModel::getAbstract() const
{
switch(modelType) {
case Map: return modelMap;
}
Q_UNREACHABLE();
}
MapModel *ProjectModel::getMap() const
{
return modelType == Map ? modelMap : nullptr;
}
bool ProjectModel::isDirty() const
{
switch(modelType) {
case Map: return modelMap->isDirty();
}
Q_UNREACHABLE();
}
bool ProjectModel::open(QString const &path)
{
switch(modelType) {
case Map: return modelMap->open(path);
}
Q_UNREACHABLE();
}
bool ProjectModel::saveAs(QString const &path) const
{
switch(modelType) {
case Map: return modelMap->saveAs(path);
}
Q_UNREACHABLE();
}
bool ProjectModel::save() const
{
switch(modelType) {
case Map: return modelMap->save();
}
Q_UNREACHABLE();
}
Project::Project(ProjectModel &&_model, QWidget *parent) :
QMdiSubWindow(parent),
model(std::move(_model))
{
auto widget = new QWidget(this);
setupUi(widget);
setWidget(widget);
setAttribute(Qt::WA_DeleteOnClose);
treeView->setModel(model.getAbstract());
dbgPrintFunc();
}
Project::~Project()
{
dbgPrintFunc();
}
void Project::closeEvent(QCloseEvent *event)
{
if(model.isDirty()) {
QMessageBox msg;
msg.setText(tr("Do you want to save your changes to this project before closing it?"));
msg.setInformativeText(tr("Unsaved changes will be lost unless you save."));
msg.setStandardButtons(QMessageBox::Save |
QMessageBox::Discard |
QMessageBox::Cancel);
msg.setDefaultButton(QMessageBox::Save);
switch(msg.exec()) {
case QMessageBox::Save:
model.save();
break;
case QMessageBox::Discard:
break;
case QMessageBox::Cancel:
event->ignore();
return;
default:
assert(true);
break;
}
}
event->accept();
}
// EOF