From 1220369da3abb6ed4f065908de6fa42df5df51e4 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 11 Apr 2015 11:26:29 +1000 Subject: [PATCH] Changes as per feedback comments. --- apps/opencs/model/world/collection.hpp | 12 +-- apps/opencs/model/world/columnbase.cpp | 7 +- apps/opencs/model/world/columnbase.hpp | 1 - apps/opencs/model/world/columnimp.hpp | 81 ++++--------------- apps/opencs/model/world/columns.cpp | 6 -- apps/opencs/model/world/commands.cpp | 8 +- apps/opencs/model/world/data.cpp | 14 ++-- apps/opencs/model/world/idadapter.hpp | 2 +- apps/opencs/model/world/idadapterimp.hpp | 4 +- apps/opencs/model/world/nestedadapters.hpp | 4 +- apps/opencs/model/world/refidadapter.cpp | 2 +- apps/opencs/model/world/refidadapter.hpp | 4 +- apps/opencs/model/world/refidcollection.cpp | 7 +- apps/opencs/model/world/refidcollection.hpp | 2 +- apps/opencs/model/world/subcellcollection.hpp | 48 +++++++---- 15 files changed, 77 insertions(+), 125 deletions(-) diff --git a/apps/opencs/model/world/collection.hpp b/apps/opencs/model/world/collection.hpp index 4bc9632a8d..b0571bbed1 100644 --- a/apps/opencs/model/world/collection.hpp +++ b/apps/opencs/model/world/collection.hpp @@ -120,8 +120,6 @@ namespace CSMWorld virtual const Record& getRecord (int index) const; - virtual Record& getRecord (int index); - virtual int getAppendIndex (const std::string& id, UniversalId::Type type = UniversalId::Type_None) const; ///< \param type Will be ignored, unless the collection supports multiple record types @@ -151,7 +149,7 @@ namespace CSMWorld void setRecord (int index, const Record& record); ///< \attention This function must not change the ID. - NestableColumn *getNestableColumn (int column); + NestableColumn *getNestableColumn (int column) const; }; template @@ -294,7 +292,7 @@ namespace CSMWorld } template - NestableColumn *Collection::getNestableColumn (int column) + NestableColumn *Collection::getNestableColumn (int column) const { if (column < 0 || column >= static_cast(mColumns.size())) throw std::runtime_error("column index out of range"); @@ -435,12 +433,6 @@ namespace CSMWorld return mRecords.at (index); } - template - Record& Collection::getRecord (int index) - { - return mRecords.at (index); - } - template void Collection::insertRecord (const RecordBase& record, int index, UniversalId::Type type) diff --git a/apps/opencs/model/world/columnbase.cpp b/apps/opencs/model/world/columnbase.cpp index e4d2195bea..8d1985ff27 100644 --- a/apps/opencs/model/world/columnbase.cpp +++ b/apps/opencs/model/world/columnbase.cpp @@ -26,12 +26,11 @@ int CSMWorld::ColumnBase::getId() const void CSMWorld::NestableColumn::addColumn(CSMWorld::NestableColumn *column) { mNestedColumns.push_back(column); - mHasChildren = true; } const CSMWorld::ColumnBase& CSMWorld::NestableColumn::nestedColumn(int subColumn) const { - if (!mHasChildren) + if (mNestedColumns.empty()) throw std::logic_error("Tried to access nested column of the non-nest column"); return *mNestedColumns.at(subColumn); @@ -39,7 +38,7 @@ const CSMWorld::ColumnBase& CSMWorld::NestableColumn::nestedColumn(int subColumn CSMWorld::NestableColumn::NestableColumn(int columnId, CSMWorld::ColumnBase::Display displayType, int flag) - : mHasChildren(false), CSMWorld::ColumnBase(columnId, displayType, flag) + : CSMWorld::ColumnBase(columnId, displayType, flag) { } @@ -53,5 +52,5 @@ CSMWorld::NestableColumn::~NestableColumn() bool CSMWorld::NestableColumn::hasChildren() const { - return mHasChildren; + return !mNestedColumns.empty(); } diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index aef68fdbd1..e6799cf563 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -137,7 +137,6 @@ namespace CSMWorld class NestableColumn : public ColumnBase { std::vector mNestedColumns; - bool mHasChildren; public: diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 70c134e012..3fb9a4685f 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -2271,64 +2271,39 @@ namespace CSMWorld PathgridPointListColumn () : Column (Columns::ColumnId_PathgridPoints, ColumnBase::Display_PathgridPointList, ColumnBase::Flag_Dialogue) - { - } + {} virtual QVariant get (const Record& record) const { return true; // required by IdTree::hasChildren() } - virtual void set (Record& record, const QVariant& data) - { - } - virtual bool isEditable() const { return true; } }; - template - struct PathgridIndexColumn : public Column + struct PathgridIndexColumn : public NestableColumn { PathgridIndexColumn() - : Column (Columns::ColumnId_PathgridIndex, ColumnBase::Display_Integer) + : NestableColumn (Columns::ColumnId_PathgridIndex, + ColumnBase::Display_Integer, ColumnBase::Flag_Dialogue) {} - virtual QVariant get (const Record& record) const - { - return QVariant(); // FIXME - } - - virtual void set (Record& record, const QVariant& data) - { - } - virtual bool isEditable() const { return false; } }; - template - struct PathgridPointColumn : public Column + struct PathgridPointColumn : public NestableColumn { - int mIndex; // 0=PosX, 1=PosY, 2=PosZ - PathgridPointColumn(int index) - : Column (Columns::ColumnId_PathgridPosX+index, ColumnBase::Display_Integer), mIndex(index) + : NestableColumn (Columns::ColumnId_PathgridPosX+index, + ColumnBase::Display_Integer, ColumnBase::Flag_Dialogue) {} - virtual QVariant get (const Record& record) const - { - return QVariant(); // FIXME - } - - virtual void set (Record& record, const QVariant& data) - { - } - virtual bool isEditable() const { return true; @@ -2341,18 +2316,13 @@ namespace CSMWorld PathgridEdgeListColumn () : Column (Columns::ColumnId_PathgridEdges, ColumnBase::Display_PathgridEdgeList, ColumnBase::Flag_Dialogue) - { - } + {} virtual QVariant get (const Record& record) const { return true; // required by IdTree::hasChildren() } - virtual void set (Record& record, const QVariant& data) - { - } - virtual bool isEditable() const { return true; @@ -2360,46 +2330,25 @@ namespace CSMWorld }; - template - struct PathgridEdgeIndexColumn : public Column + struct PathgridEdgeIndexColumn : public NestableColumn { PathgridEdgeIndexColumn() - : Column (Columns::ColumnId_PathgridEdgeIndex, ColumnBase::Display_Integer) + : NestableColumn (Columns::ColumnId_PathgridEdgeIndex, + ColumnBase::Display_Integer, ColumnBase::Flag_Dialogue) {} - virtual QVariant get (const Record& record) const - { - return QVariant(); // FIXME - } - - virtual void set (Record& record, const QVariant& data) - { - } - virtual bool isEditable() const { return false; } }; - template - struct PathgridEdgeColumn : public Column + struct PathgridEdgeColumn : public NestableColumn { - int mIndex; - PathgridEdgeColumn (int index) - : Column (Columns::ColumnId_PathgridEdge0+index, ColumnBase::Display_Integer), mIndex(index) - { - } - - virtual QVariant get (const Record& record) const - { - return QVariant(); // FIXME - } - - virtual void set (Record& record, const QVariant& data) - { - } + : NestableColumn (Columns::ColumnId_PathgridEdge0+index, + ColumnBase::Display_Integer, ColumnBase::Flag_Dialogue) + {} virtual bool isEditable() const { diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index e6a27138f7..b65cf7f968 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -287,11 +287,6 @@ int CSMWorld::Columns::getId (const std::string& name) namespace { - static const char *sSkills[] = - { - "Long Blade" - }; - static const char *sSpecialisations[] = { "Combat", "Magic", "Stealth", 0 @@ -394,7 +389,6 @@ namespace switch (column) { case CSMWorld::Columns::ColumnId_Specialisation: return sSpecialisations; - case CSMWorld::Columns::ColumnId_Skill: return sSkills; case CSMWorld::Columns::ColumnId_Attribute: return sAttributes; case CSMWorld::Columns::ColumnId_SpellType: return sSpellTypes; case CSMWorld::Columns::ColumnId_ApparatusType: return sApparatusTypes; diff --git a/apps/opencs/model/world/commands.cpp b/apps/opencs/model/world/commands.cpp index 7acc6058ef..d12c5d228f 100644 --- a/apps/opencs/model/world/commands.cpp +++ b/apps/opencs/model/world/commands.cpp @@ -185,7 +185,9 @@ CSMWorld::DeleteNestedCommand::DeleteNestedCommand (IdTree& model, mNestedRow(nestedRow), NestedTableStoring(model, id, parentColumn) { - setText (("Delete nested row in " + mId).c_str()); + std::string title = + model.headerData(parentColumn, Qt::Horizontal, Qt::DisplayRole).toString().toUtf8().constData(); + setText (("Delete row in " + title + " sub-table of " + mId).c_str()); } void CSMWorld::DeleteNestedCommand::redo() @@ -211,7 +213,9 @@ CSMWorld::AddNestedCommand::AddNestedCommand(IdTree& model, const std::string& i QUndoCommand(parent), NestedTableStoring(model, id, parentColumn) { - setText (("Added nested row in " + mId).c_str()); + std::string title = + model.headerData(parentColumn, Qt::Horizontal, Qt::DisplayRole).toString().toUtf8().constData(); + setText (("Add row in " + title + " sub-table of " + mId).c_str()); } void CSMWorld::AddNestedCommand::redo() diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 76e34961fb..87d5116f16 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -263,17 +263,17 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc mPathgrids.addAdapter (std::make_pair(pointList, new PathgridPointListAdapter ())); // new objects deleted in dtor of NestableColumn // WARNING: The order of the columns below are assumed in PathgridPointListAdapter - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridIndexColumn ()); - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn (0)); - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn (1)); - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn (2)); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridIndexColumn ()); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn (0)); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn (1)); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn (2)); PathgridEdgeListColumn *edgeList = new PathgridEdgeListColumn (); mPathgrids.addColumn (edgeList); mPathgrids.addAdapter (std::make_pair(edgeList, new PathgridEdgeListAdapter ())); - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeIndexColumn ()); - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn (0)); - mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn (1)); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeIndexColumn ()); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn (0)); + mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn (1)); mStartScripts.addColumn (new StringIdColumn); mStartScripts.addColumn (new RecordStateColumn); diff --git a/apps/opencs/model/world/idadapter.hpp b/apps/opencs/model/world/idadapter.hpp index 753ac01f0d..84ef2d1f81 100644 --- a/apps/opencs/model/world/idadapter.hpp +++ b/apps/opencs/model/world/idadapter.hpp @@ -22,7 +22,7 @@ namespace CSMWorld virtual void removeNestedRow(Record& record, int rowToRemove) const = 0; - virtual void setNestedTable(Record& record, const NestedTableWrapperBase& nestedTable) = 0; + virtual void setNestedTable(Record& record, const NestedTableWrapperBase& nestedTable) const = 0; virtual NestedTableWrapperBase* nestedTable(const Record& record) const = 0; diff --git a/apps/opencs/model/world/idadapterimp.hpp b/apps/opencs/model/world/idadapterimp.hpp index 7468154141..2ce0777ac2 100644 --- a/apps/opencs/model/world/idadapterimp.hpp +++ b/apps/opencs/model/world/idadapterimp.hpp @@ -102,7 +102,7 @@ namespace CSMWorld } }; - virtual void setNestedTable(Record& record, const NestedTableWrapperBase& nestedTable) + virtual void setNestedTable(Record& record, const NestedTableWrapperBase& nestedTable) const { record.get().mPoints = static_cast(nestedTable).mRecord.mPoints; @@ -204,7 +204,7 @@ namespace CSMWorld record.setModified (pathgrid); } - virtual void setNestedTable(Record& record, const NestedTableWrapperBase& nestedTable) + virtual void setNestedTable(Record& record, const NestedTableWrapperBase& nestedTable) const { record.get().mEdges = static_cast &>(nestedTable).mNestedTable; diff --git a/apps/opencs/model/world/nestedadapters.hpp b/apps/opencs/model/world/nestedadapters.hpp index 0157653806..97046276f0 100644 --- a/apps/opencs/model/world/nestedadapters.hpp +++ b/apps/opencs/model/world/nestedadapters.hpp @@ -145,8 +145,8 @@ namespace CSMWorld { CastableHelper::getRecord(data, index).get().mSpells.mList.at(subRowIndex) = std::string(value.toString().toUtf8()); } - - throw std::logic_error("Trying to access non-existing column in the nested table!"); + else + throw std::logic_error("Trying to access non-existing column in the nested table!"); } virtual void addNestedRow (RefIdData& data, int index, int position) const diff --git a/apps/opencs/model/world/refidadapter.cpp b/apps/opencs/model/world/refidadapter.cpp index 58b775f47f..a12a95196c 100644 --- a/apps/opencs/model/world/refidadapter.cpp +++ b/apps/opencs/model/world/refidadapter.cpp @@ -57,7 +57,7 @@ void CSMWorld::NestedRefIdAdapter::addNestedRow (const RefIdColumn *column, RefI getHelper(column)->addNestedRow(data, index, position); //This code grows more boring and boring. I would love some macros. } -void CSMWorld::NestedRefIdAdapter::setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) +void CSMWorld::NestedRefIdAdapter::setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) const { getHelper(column)->setNestedTable(data, index, nestedTable); } diff --git a/apps/opencs/model/world/refidadapter.hpp b/apps/opencs/model/world/refidadapter.hpp index 91f19577bd..1a3f2700e3 100644 --- a/apps/opencs/model/world/refidadapter.hpp +++ b/apps/opencs/model/world/refidadapter.hpp @@ -69,7 +69,7 @@ namespace CSMWorld virtual void addNestedRow (const RefIdColumn *column, RefIdData& data, int index, int position) const = 0; - virtual void setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) = 0; + virtual void setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) const = 0; virtual NestedTableWrapperBase* nestedTable (const RefIdColumn* column, const RefIdData& data, int index) const = 0; }; @@ -97,7 +97,7 @@ namespace CSMWorld virtual void addNestedRow (const RefIdColumn *column, RefIdData& data, int index, int position) const; - virtual void setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable); + virtual void setNestedTable (const RefIdColumn* column, RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) const; virtual NestedTableWrapperBase* nestedTable (const RefIdColumn* column, const RefIdData& data, int index) const; diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index 41ca7e4409..b85deef4e6 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -25,8 +25,7 @@ bool CSMWorld::RefIdColumn::isUserEditable() const return mUserEditable; } -// FIXME: const problem -/*const*/ CSMWorld::RefIdAdapter& CSMWorld::RefIdCollection::findAdapter (UniversalId::Type type) const +const CSMWorld::RefIdAdapter& CSMWorld::RefIdCollection::findAdapter (UniversalId::Type type) const { std::map::const_iterator iter = mAdapters.find (type); @@ -684,10 +683,8 @@ void CSMWorld::RefIdCollection::setNestedTable(int row, int column, const CSMWor { RefIdData::LocalIndex localIndex = mData.globalToLocalIndex (row); - // FIXME: const problem - CSMWorld::NestedRefIdAdapter& adaptor = dynamic_cast(findAdapter (localIndex.second)); + const CSMWorld::NestedRefIdAdapter& adaptor = dynamic_cast(findAdapter (localIndex.second)); - // FIXME: const problem adaptor.setNestedTable(&mColumns.at(column), mData, localIndex.first, nestedTable); } diff --git a/apps/opencs/model/world/refidcollection.hpp b/apps/opencs/model/world/refidcollection.hpp index 5bf7c177e8..3315212c18 100644 --- a/apps/opencs/model/world/refidcollection.hpp +++ b/apps/opencs/model/world/refidcollection.hpp @@ -46,7 +46,7 @@ namespace CSMWorld private: - /*const*/ RefIdAdapter& findAdapter (UniversalId::Type) const; + const RefIdAdapter& findAdapter (UniversalId::Type) const; ///< Throws an exception if no adaptor for \a Type can be found. public: diff --git a/apps/opencs/model/world/subcellcollection.hpp b/apps/opencs/model/world/subcellcollection.hpp index 92091cf57e..c53c7006ad 100644 --- a/apps/opencs/model/world/subcellcollection.hpp +++ b/apps/opencs/model/world/subcellcollection.hpp @@ -32,7 +32,7 @@ namespace CSMWorld virtual void loadRecord (ESXRecordT& record, ESM::ESMReader& reader); - NestedIdAdapter* getAdapter(const ColumnBase &column) const; + const NestedIdAdapter& getAdapter(const ColumnBase &column) const; public: @@ -88,7 +88,7 @@ namespace CSMWorld } template - NestedIdAdapter* SubCellCollection::getAdapter(const ColumnBase &column) const + const NestedIdAdapter& SubCellCollection::getAdapter(const ColumnBase &column) const { typename std::map* >::const_iterator iter = mAdapters.find (&column); @@ -96,28 +96,36 @@ namespace CSMWorld if (iter==mAdapters.end()) throw std::logic_error("No such column in the nestedidadapter"); - return iter->second; + return *iter->second; } template void SubCellCollection::addNestedRow(int row, int column, int position) { - getAdapter(Collection::getColumn(column))->addNestedRow( - Collection::getRecord(row), position); + Record record; + record.assign(Collection::getRecord(row)); + + getAdapter(Collection::getColumn(column)).addNestedRow(record, position); + + Collection::setRecord(row, record); } template void SubCellCollection::removeNestedRows(int row, int column, int subRow) { - getAdapter(Collection::getColumn(column))->removeNestedRow( - Collection::getRecord(row), subRow); + Record record; + record.assign(Collection::getRecord(row)); + + getAdapter(Collection::getColumn(column)).removeNestedRow(record, subRow); + + Collection::setRecord(row, record); } template QVariant SubCellCollection::getNestedData (int row, int column, int subRow, int subColumn) const { - return getAdapter(Collection::getColumn(column))->getNestedData( + return getAdapter(Collection::getColumn(column)).getNestedData( Collection::getRecord(row), subRow, subColumn); } @@ -125,15 +133,20 @@ namespace CSMWorld void SubCellCollection::setNestedData(int row, int column, const QVariant& data, int subRow, int subColumn) { - getAdapter(Collection::getColumn(column))->setNestedData( - Collection::getRecord(row), data, subRow, subColumn); + Record record; + record.assign(Collection::getRecord(row)); + + getAdapter(Collection::getColumn(column)).setNestedData( + record, data, subRow, subColumn); + + Collection::setRecord(row, record); } template CSMWorld::NestedTableWrapperBase* SubCellCollection::nestedTable(int row, int column) const { - return getAdapter(Collection::getColumn(column))->nestedTable( + return getAdapter(Collection::getColumn(column)).nestedTable( Collection::getRecord(row)); } @@ -141,21 +154,26 @@ namespace CSMWorld void SubCellCollection::setNestedTable(int row, int column, const CSMWorld::NestedTableWrapperBase& nestedTable) { - getAdapter(Collection::getColumn(column))->setNestedTable( - Collection::getRecord(row), nestedTable); + Record record; + record.assign(Collection::getRecord(row)); + + getAdapter(Collection::getColumn(column)).setNestedTable( + record, nestedTable); + + Collection::setRecord(row, record); } template int SubCellCollection::getNestedRowsCount(int row, int column) const { - return getAdapter(Collection::getColumn(column))->getNestedRowsCount( + return getAdapter(Collection::getColumn(column)).getNestedRowsCount( Collection::getRecord(row)); } template int SubCellCollection::getNestedColumnsCount(int row, int column) const { - return getAdapter(Collection::getColumn(column))->getNestedColumnsCount( + return getAdapter(Collection::getColumn(column)).getNestedColumnsCount( Collection::getRecord(row)); }