diff --git a/apps/opencs/model/world/columnbase.cpp b/apps/opencs/model/world/columnbase.cpp index 59ee39126..60e201ba4 100644 --- a/apps/opencs/model/world/columnbase.cpp +++ b/apps/opencs/model/world/columnbase.cpp @@ -2,8 +2,6 @@ #include "columns.hpp" -#include - CSMWorld::ColumnBase::ColumnBase (int columnId, Display displayType, int flags, bool canNest) : mColumnId (columnId), mDisplayType (displayType), mFlags (flags), mCanNest(canNest) {} @@ -25,28 +23,42 @@ int CSMWorld::ColumnBase::getId() const return mColumnId; } -bool CSMWorld::ColumnBase::canHaveNestedColumns() const +bool CSMWorld::NestColumn::canHaveNestedColumns() const { return mCanNest; } -std::string CSMWorld::ColumnBase::getNestedColumnTitle(int columnNumber) const +void CSMWorld::NestColumn::addNestedColumn(int columnId, Display displayType) { - assert (mCanNest); - - return Columns::getName(static_cast(mNestedColumnId[columnNumber])); + if (!mCanNest) + throw std::logic_error("Tried to nest inside of the non-nest column"); + + mNestedColumns.push_back(CSMWorld::NestedColumn(columnId, displayType, mFlags, this)); } -void CSMWorld::ColumnBase::addNestedColumnDisplay(CSMWorld::ColumnBase::Display displayDefinition) +const CSMWorld::ColumnBase& CSMWorld::NestColumn::nestedColumn(int subColumn) const { - assert (mCanNest); - - mNestedDisplayType.push_back(displayDefinition); + if (!mCanNest) + throw std::logic_error("Tried to access nested column of the non-nest column"); + + return mNestedColumns.at(subColumn); } -void CSMWorld::ColumnBase::addNestedColumnId(int columnId) +int CSMWorld::NestColumn::nestedColumnCount() const { - assert (mCanNest); - - mNestedColumnId.push_back(columnId); + if (!mCanNest) + throw std::logic_error("Tried to access number of the subcolumns in the non-nest column"); + + return mNestedColumns.size(); +} + +CSMWorld::NestColumn::NestColumn(int columnId, Display displayType, int flags, bool canNest) + : CSMWorld::ColumnBase(columnId, displayType, flags, canNest) {} + +CSMWorld::NestedColumn::NestedColumn(int columnId, Display displayType, int flag, const CSMWorld::NestColumn* parent) + : mParent(parent), CSMWorld::ColumnBase(columnId, displayType, flag) {} + +bool CSMWorld::NestedColumn::isEditable() const +{ + return mParent->isEditable(); } diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index bf03ab563..096491f1e 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -110,9 +111,7 @@ namespace CSMWorld int mColumnId; int mFlags; Display mDisplayType; - std::vector mNestedDisplayType; //used only for the columns that actually nest other columns - std::vector mNestedColumnId; //used only for the columns that actually nest other columns - const bool mCanNest; + bool mCanNest; ColumnBase (int columnId, Display displayType, int flag, bool canNest = false); @@ -125,22 +124,42 @@ namespace CSMWorld virtual std::string getTitle() const; - std::string getNestedColumnTitle(int columnNumber) const; - - void addNestedColumnDisplay(Display displayDefinition); - - void addNestedColumnId(int columnId); - virtual int getId() const; - - bool canHaveNestedColumns() const; }; + class NestedColumn; + + class NestColumn : public ColumnBase + { + std::vector mNestedColumns; + + public: + NestColumn(int columnId, Display displayType, int flags, bool canNest); + + void addNestedColumn(int columnId, Display displayType); + + bool canHaveNestedColumns() const; + + const ColumnBase& nestedColumn(int subColumn) const; + + int nestedColumnCount() const; + }; + + class NestedColumn : public ColumnBase + { + const ColumnBase* mParent; + + public: + NestedColumn(int columnId, Display displayType, int flag, const NestColumn* parent); + + virtual bool isEditable() const; + }; + template - struct Column : public ColumnBase + struct Column : public NestColumn { Column (int columnId, Display displayType, int flags = Flag_Table | Flag_Dialogue, bool canNest = false) - : ColumnBase (columnId, displayType, flags, canNest) {} + : NestColumn (columnId, displayType, canNest, flags) {} virtual QVariant get (const Record& record) const = 0; diff --git a/apps/opencs/model/world/idtable.cpp b/apps/opencs/model/world/idtable.cpp index 00cfbd145..a3435180c 100644 --- a/apps/opencs/model/world/idtable.cpp +++ b/apps/opencs/model/world/idtable.cpp @@ -75,19 +75,19 @@ QVariant CSMWorld::IdTable::headerData (int section, QVariant CSMWorld::IdTable::nestedHeaderData(int section, int subSection, Qt::Orientation orientation, int role) const { - assert(mIdCollection->getColumn(section).canHaveNestedColumns()); + const NestColumn& parentColumn = dynamic_cast(mIdCollection->getColumn(section)); if (orientation==Qt::Vertical) return QVariant(); if (role==Qt::DisplayRole) - return tr (mIdCollection->getColumn(section).getNestedColumnTitle(subSection).c_str()); + return tr(parentColumn.nestedColumn(subSection).getTitle().c_str()); if (role==ColumnBase::Role_Flags) return mIdCollection->getColumn (section).mFlags; if (role==ColumnBase::Role_Display) - return mIdCollection->getColumn (section).mNestedDisplayType.at(subSection); + return parentColumn.nestedColumn(subSection).mDisplayType; return QVariant(); } @@ -354,6 +354,6 @@ bool CSMWorld::IdTable::hasChildren(const QModelIndex& index) const { return (index.isValid() && index.internalId() == 0 && - mIdCollection->getColumn (index.column()).canHaveNestedColumns() && + mIdCollection->getColumn(index.column()).mCanNest && index.data().isValid()); } diff --git a/apps/opencs/model/world/refidadapterimp.cpp b/apps/opencs/model/world/refidadapterimp.cpp index 7033140ca..8d6ab838d 100644 --- a/apps/opencs/model/world/refidadapterimp.cpp +++ b/apps/opencs/model/world/refidadapterimp.cpp @@ -1,6 +1,7 @@ #include "refidadapterimp.hpp" #include +#include CSMWorld::PotionRefIdAdapter::PotionRefIdAdapter (const InventoryColumns& columns, const RefIdColumn *autoCalc) @@ -296,7 +297,7 @@ void CSMWorld::ContainerRefIdAdapter::setNestedData(const RefIdColumn *column, break; default: - throw "Trying to access non-existing column in the nested table!"; + throw std::logic_error("Trying to access non-existing column in the nested table!"); } } else { @@ -326,11 +327,11 @@ QVariant CSMWorld::ContainerRefIdAdapter::getNestedData (const CSMWorld::RefIdCo return content.mCount; default: - throw "Trying to access non-existing column in the nested table!"; + throw std::logic_error("Trying to access non-existing column in the nested table!"); } } else { - throw "This column does not hold multiple values."; + throw std::logic_error("This column does not hold multiple values."); } } diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index 7aa1d7753..62daef903 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -13,7 +13,7 @@ CSMWorld::RefIdColumn::RefIdColumn (int columnId, Display displayType, int flag, bool editable, bool userEditable, bool canNest) - : ColumnBase (columnId, displayType, flag, canNest), mEditable (editable), mUserEditable (userEditable) + : NestColumn (columnId, displayType, flag, canNest), mEditable (editable), mUserEditable (userEditable) {} bool CSMWorld::RefIdColumn::isEditable() const @@ -168,10 +168,8 @@ CSMWorld::RefIdCollection::RefIdCollection() mColumns.push_back(RefIdColumn (Columns::ColumnId_ContainerContent, ColumnBase::Display_NestedItemList, ColumnBase::Flag_Dialogue, true, true, true)); const RefIdColumn *content = &mColumns.back(); - (&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_String); - (&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_Integer); - (&mColumns.back())->addNestedColumnId(Columns::ColumnId_InventoryItemId); - (&mColumns.back())->addNestedColumnId(Columns::ColumnId_ItemCount); + (&mColumns.back())->addNestedColumn(Columns::ColumnId_InventoryItemId, CSMWorld::ColumnBase::Display_String); + (&mColumns.back())->addNestedColumn(Columns::ColumnId_ItemCount, CSMWorld::ColumnBase::Display_Integer); CreatureColumns creatureColumns (actorsColumns); diff --git a/apps/opencs/model/world/refidcollection.hpp b/apps/opencs/model/world/refidcollection.hpp index 7801811ff..d1bb197e8 100644 --- a/apps/opencs/model/world/refidcollection.hpp +++ b/apps/opencs/model/world/refidcollection.hpp @@ -18,7 +18,7 @@ namespace CSMWorld { class RefIdAdapter; - class RefIdColumn : public ColumnBase + class RefIdColumn : public NestColumn { bool mEditable; bool mUserEditable;