From 4d79034dbfa1f5c19e05c56045b779430919cf59 Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Sun, 20 Jul 2014 18:52:35 +0200 Subject: [PATCH] correctly handling the nestedTable for undo (but removing and adding rows in proper QT way is still TODO) --- apps/opencs/model/world/collection.hpp | 8 +++++--- apps/opencs/model/world/collectionbase.hpp | 2 +- apps/opencs/model/world/commands.cpp | 19 +++++++++++++++---- apps/opencs/model/world/commands.hpp | 8 ++++++-- apps/opencs/model/world/idtable.cpp | 5 ++++- apps/opencs/model/world/idtable.hpp | 2 +- .../opencs/model/world/nestedtablewrapper.hpp | 14 ++------------ apps/opencs/model/world/refidadapter.hpp | 2 +- apps/opencs/model/world/refidadapterimp.cpp | 18 +++++++++--------- apps/opencs/model/world/refidadapterimp.hpp | 2 +- apps/opencs/model/world/refidcollection.cpp | 2 +- apps/opencs/model/world/refidcollection.hpp | 2 +- 12 files changed, 47 insertions(+), 37 deletions(-) diff --git a/apps/opencs/model/world/collection.hpp b/apps/opencs/model/world/collection.hpp index ac4351986..591074372 100644 --- a/apps/opencs/model/world/collection.hpp +++ b/apps/opencs/model/world/collection.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -92,7 +93,7 @@ namespace CSMWorld virtual void setData (int index, int column, const QVariant& data); - virtual NestedTableWrapperBase nestedTable(int row, int column) const; + virtual NestedTableWrapperBase* nestedTable(int row, int column) const; virtual void setNestedTable(int row, int column, const NestedTableWrapperBase& nestedTable); @@ -308,9 +309,10 @@ namespace CSMWorld } template - NestedTableWrapperBase Collection::nestedTable(int row, int column) const + NestedTableWrapperBase* Collection::nestedTable(int row, int column) const { - return NestedTableWrapperBase(); + assert(false); + return new NestedTableWrapperBase(); } template diff --git a/apps/opencs/model/world/collectionbase.hpp b/apps/opencs/model/world/collectionbase.hpp index 62f4079fc..a6ee34e56 100644 --- a/apps/opencs/model/world/collectionbase.hpp +++ b/apps/opencs/model/world/collectionbase.hpp @@ -51,7 +51,7 @@ namespace CSMWorld virtual QVariant getNestedData(int row, int column, int subRow, int subColumn) const = 0; - virtual NestedTableWrapperBase nestedTable(int row, int column) const = 0; + virtual NestedTableWrapperBase* nestedTable(int row, int column) const = 0; virtual void setNestedTable(int row, int column, const NestedTableWrapperBase& nestedTable) = 0; diff --git a/apps/opencs/model/world/commands.cpp b/apps/opencs/model/world/commands.cpp index 5e886bdb4..f464d75c8 100644 --- a/apps/opencs/model/world/commands.cpp +++ b/apps/opencs/model/world/commands.cpp @@ -4,6 +4,7 @@ #include "idtable.hpp" #include +#include "nestedtablewrapper.hpp" CSMWorld::ModifyCommand::ModifyCommand (QAbstractItemModel& model, const QModelIndex& index, const QVariant& new_, QUndoCommand* parent) @@ -178,7 +179,7 @@ CSMWorld::DeleteNestedCommand::DeleteNestedCommand (IdTable& model, const std::s mParentColumn(parentColumn), QUndoCommand(parent), mNestedRow(nestedRow), - mOld(model.nestedTable(model.getModelIndex(id, parentColumn))) + mOld (model.nestedTable(model.getModelIndex(id, parentColumn))) { setText (("Delete nested row in " + mId).c_str()); } @@ -195,7 +196,12 @@ void CSMWorld::DeleteNestedCommand::undo() { const QModelIndex& parentIndex = mModel.getModelIndex(mId, mParentColumn); - mModel.setNestedTable(parentIndex, mOld); + mModel.setNestedTable(parentIndex, *mOld); +} + +CSMWorld::DeleteNestedCommand::~DeleteNestedCommand() +{ + delete mOld; } CSMWorld::AddNestedCommand::AddNestedCommand(IdTable& model, const std::string& id, int nestedRow, int parentColumn, QUndoCommand* parent) @@ -204,7 +210,7 @@ CSMWorld::AddNestedCommand::AddNestedCommand(IdTable& model, const std::string& mNewRow(nestedRow), mParentColumn(parentColumn), QUndoCommand(parent), - mOld(model.nestedTable(model.getModelIndex(id, parentColumn))) + mOld (model.nestedTable(model.getModelIndex(id, parentColumn))) { setText (("Added nested row in " + mId).c_str()); } @@ -220,5 +226,10 @@ void CSMWorld::AddNestedCommand::undo() { const QModelIndex& parentIndex = mModel.getModelIndex(mId, mParentColumn); - mModel.setNestedTable(parentIndex, mOld); + mModel.setNestedTable(parentIndex, *mOld); +} + +CSMWorld::AddNestedCommand::~AddNestedCommand() +{ + delete mOld; } diff --git a/apps/opencs/model/world/commands.hpp b/apps/opencs/model/world/commands.hpp index 214a5157e..d45ec1e36 100644 --- a/apps/opencs/model/world/commands.hpp +++ b/apps/opencs/model/world/commands.hpp @@ -145,7 +145,7 @@ namespace CSMWorld std::string mId; - NestedTableWrapperBase mOld; + NestedTableWrapperBase* mOld; int mParentColumn; @@ -155,6 +155,8 @@ namespace CSMWorld DeleteNestedCommand (IdTable& model, const std::string& id, int nestedRow, int parentColumn, QUndoCommand* parent = 0); + ~DeleteNestedCommand(); + virtual void redo(); virtual void undo(); @@ -166,7 +168,7 @@ namespace CSMWorld std::string mId; - NestedTableWrapperBase mOld; + NestedTableWrapperBase* mOld; int mNewRow; @@ -175,6 +177,8 @@ namespace CSMWorld public: AddNestedCommand(IdTable& model, const std::string& id, int nestedRow, int parentColumn, QUndoCommand* parent = 0); + + ~AddNestedCommand(); virtual void redo(); diff --git a/apps/opencs/model/world/idtable.cpp b/apps/opencs/model/world/idtable.cpp index df0f4546d..dd045cb78 100644 --- a/apps/opencs/model/world/idtable.cpp +++ b/apps/opencs/model/world/idtable.cpp @@ -367,9 +367,12 @@ void CSMWorld::IdTable::setNestedTable(const QModelIndex& index, const CSMWorld: } mIdCollection->setNestedTable(index.row(), index.column(), nestedTable); + + emit dataChanged (CSMWorld::IdTable::index (index.row(), 0), + CSMWorld::IdTable::index (index.row(), mIdCollection->getColumns()-1)); } -CSMWorld::NestedTableWrapperBase CSMWorld::IdTable::nestedTable(const QModelIndex& index) const +CSMWorld::NestedTableWrapperBase* CSMWorld::IdTable::nestedTable(const QModelIndex& index) const { if (!hasChildren(index)) { diff --git a/apps/opencs/model/world/idtable.hpp b/apps/opencs/model/world/idtable.hpp index fd3f699ba..b7ba8c342 100644 --- a/apps/opencs/model/world/idtable.hpp +++ b/apps/opencs/model/world/idtable.hpp @@ -53,7 +53,7 @@ namespace CSMWorld QVariant nestedHeaderData(int section, int subSection, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - NestedTableWrapperBase nestedTable(const QModelIndex &index) const; + NestedTableWrapperBase* nestedTable(const QModelIndex &index) const; void setNestedTable(const QModelIndex &index, const NestedTableWrapperBase& nestedTable); diff --git a/apps/opencs/model/world/nestedtablewrapper.hpp b/apps/opencs/model/world/nestedtablewrapper.hpp index c13a12c62..70e35f68a 100644 --- a/apps/opencs/model/world/nestedtablewrapper.hpp +++ b/apps/opencs/model/world/nestedtablewrapper.hpp @@ -1,9 +1,6 @@ #ifndef CSM_WOLRD_NESTEDTABLEWRAPPER_H #define CSM_WOLRD_NESTEDTABLEWRAPPER_H -#include - -#include namespace CSMWorld { struct NestedTableWrapperBase @@ -14,20 +11,13 @@ namespace CSMWorld }; template - class NestedTableWrapper : public NestedTableWrapperBase + struct NestedTableWrapper : public NestedTableWrapperBase { NestedTable mNestedTable; - public: - - NestedTableWrapper(const NestedTable& nestedTable) + NestedTableWrapper(const NestedTable& nestedTable) : mNestedTable(nestedTable) {} - NestedTable getNestedTable() const - { - return mNestedTable; - } - virtual ~NestedTableWrapper() {} }; } diff --git a/apps/opencs/model/world/refidadapter.hpp b/apps/opencs/model/world/refidadapter.hpp index f4aa769fd..f7064ab66 100644 --- a/apps/opencs/model/world/refidadapter.hpp +++ b/apps/opencs/model/world/refidadapter.hpp @@ -59,7 +59,7 @@ namespace CSMWorld virtual void setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) = 0; - virtual NestedTableWrapperBase nestedTable (const RefIdColumn * column, const RefIdData& data, int index) const = 0; + virtual NestedTableWrapperBase* nestedTable (const RefIdColumn* column, const RefIdData& data, int index) const = 0; }; } diff --git a/apps/opencs/model/world/refidadapterimp.cpp b/apps/opencs/model/world/refidadapterimp.cpp index d669a369c..173e89f56 100644 --- a/apps/opencs/model/world/refidadapterimp.cpp +++ b/apps/opencs/model/world/refidadapterimp.cpp @@ -227,24 +227,24 @@ void CSMWorld::ContainerRefIdAdapter::removeNestedRow (const RefIdColumn *column std::vector& list = static_cast&> ( data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Container))).get().mInventory.mList; - + list.erase (list.begin () + rowToRemove); } void CSMWorld::ContainerRefIdAdapter::addNestedRow (const RefIdColumn *column, RefIdData& data, int index, int position) const { assert(column==mContent); - + std::vector& list = static_cast&> ( data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Container))).get().mInventory.mList; - + ESM::ContItem newRow = {0, ""}; if (position >= (int)list.size()) { list.push_back(newRow); return; } - + list.insert(list.begin()+position, newRow); return; @@ -310,23 +310,23 @@ void CSMWorld::ContainerRefIdAdapter::setNestedData(const RefIdColumn *column, void CSMWorld::ContainerRefIdAdapter::setNestedTable(const RefIdColumn* column, RefIdData& data, - int index, + int index, const NestedTableWrapperBase& nestedTable) { Record& record = dynamic_cast&> ( data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Container))); - record.get().mInventory.mList = (dynamic_cast >&>(nestedTable)).getNestedTable(); + record.get().mInventory.mList = (static_cast >&>(nestedTable)).mNestedTable; } -CSMWorld::NestedTableWrapperBase CSMWorld::ContainerRefIdAdapter::nestedTable (const RefIdColumn* column, - const RefIdData& data, +CSMWorld::NestedTableWrapperBase* CSMWorld::ContainerRefIdAdapter::nestedTable (const RefIdColumn* column, + const RefIdData& data, int index) const { const Record& record = dynamic_cast&> ( data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Container))); - return NestedTableWrapper >(record.get().mInventory.mList); + return new NestedTableWrapper >(record.get().mInventory.mList); } QVariant CSMWorld::ContainerRefIdAdapter::getNestedData (const CSMWorld::RefIdColumn* column, diff --git a/apps/opencs/model/world/refidadapterimp.hpp b/apps/opencs/model/world/refidadapterimp.hpp index 4198fb367..ab05cfbc5 100644 --- a/apps/opencs/model/world/refidadapterimp.hpp +++ b/apps/opencs/model/world/refidadapterimp.hpp @@ -640,7 +640,7 @@ namespace CSMWorld virtual void addNestedRow (const RefIdColumn *column, RefIdData& data, int index, int position) const; - virtual NestedTableWrapperBase nestedTable (const RefIdColumn * column, const RefIdData& data, int index) const; + virtual NestedTableWrapperBase* nestedTable (const RefIdColumn * column, const RefIdData& data, int index) const; virtual void setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable); }; diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index 6ff0df802..80ac1cc3b 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -652,7 +652,7 @@ void CSMWorld::RefIdCollection::setNestedTable(int row, int column, const CSMWor adaptor.setNestedTable(&mColumns.at(column), mData, localIndex.first, nestedTable); } -CSMWorld::NestedTableWrapperBase CSMWorld::RefIdCollection::nestedTable(int row, int column) const +CSMWorld::NestedTableWrapperBase* CSMWorld::RefIdCollection::nestedTable(int row, int column) const { RefIdData::LocalIndex localIndex = mData.globalToLocalIndex (row); diff --git a/apps/opencs/model/world/refidcollection.hpp b/apps/opencs/model/world/refidcollection.hpp index 927331c93..cc7609a58 100644 --- a/apps/opencs/model/world/refidcollection.hpp +++ b/apps/opencs/model/world/refidcollection.hpp @@ -72,7 +72,7 @@ namespace CSMWorld virtual QVariant getNestedData(int row, int column, int subRow, int subColumn) const; - virtual NestedTableWrapperBase nestedTable(int row, int column) const; + virtual NestedTableWrapperBase* nestedTable(int row, int column) const; virtual void setNestedTable(int row, int column, const NestedTableWrapperBase& nestedTable);