diff --git a/apps/opencs/model/world/record.hpp b/apps/opencs/model/world/record.hpp index 853ed1559a..861fc47a3b 100644 --- a/apps/opencs/model/world/record.hpp +++ b/apps/opencs/model/world/record.hpp @@ -45,6 +45,9 @@ namespace CSMWorld const ESXRecordT& get() const; ///< Throws an exception, if the record is deleted. + ESXRecordT& get(); + ///< Throws an exception, if the record is deleted. + const ESXRecordT& getBase() const; ///< Throws an exception, if the record is deleted. Returns modified, if there is no base. @@ -76,6 +79,15 @@ namespace CSMWorld return mState==State_BaseOnly || mState==State_Deleted ? mBase : mModified; } + template + ESXRecordT& Record::get() + { + if (mState==State_Erased) + throw std::logic_error ("attempt to access a deleted record"); + + return mState==State_BaseOnly || mState==State_Deleted ? mBase : mModified; + } + template const ESXRecordT& Record::getBase() const { diff --git a/apps/opencs/model/world/refidadapterimp.hpp b/apps/opencs/model/world/refidadapterimp.hpp index 814ac9023f..55aaa536e4 100644 --- a/apps/opencs/model/world/refidadapterimp.hpp +++ b/apps/opencs/model/world/refidadapterimp.hpp @@ -17,6 +17,7 @@ namespace CSMWorld const RefIdColumn *mType; }; + /// \brief Base adapter for all refereceable record types template class BaseRefIdAdapter : public RefIdAdapter { @@ -35,6 +36,8 @@ namespace CSMWorld virtual void setData (const RefIdColumn *column, RefIdData& data, int index, const QVariant& value) const; ///< If the data type does not match an exception is thrown. + + UniversalId::Type getType() const; }; template @@ -82,6 +85,69 @@ namespace CSMWorld if (column==mBase.mModified) record.mState = static_cast (value.toInt()); } + + template + UniversalId::Type BaseRefIdAdapter::getType() const + { + return mType; + } + + + struct ModelColumns : public BaseColumns + { + const RefIdColumn *mModel; + + ModelColumns (const BaseColumns& base) : BaseColumns (base) {} + }; + + /// \brief Adapter for IDs with models (all but levelled lists) + template + class ModelRefIdAdapter : public BaseRefIdAdapter + { + ModelColumns mModel; + + public: + + ModelRefIdAdapter (UniversalId::Type type, const ModelColumns& columns); + + virtual QVariant getData (const RefIdColumn *column, const RefIdData& data, int index) + const; + + virtual void setData (const RefIdColumn *column, RefIdData& data, int index, + const QVariant& value) const; + ///< If the data type does not match an exception is thrown. + }; + + template + ModelRefIdAdapter::ModelRefIdAdapter (UniversalId::Type type, const ModelColumns& columns) + : BaseRefIdAdapter (type, columns), mModel (columns) + {} + + template + QVariant ModelRefIdAdapter::getData (const RefIdColumn *column, const RefIdData& data, + int index) const + { + const Record& record = static_cast&> ( + data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter::getType()))); + + if (column==mModel.mModel) + return QString::fromUtf8 (record.get().mModel.c_str()); + + return BaseRefIdAdapter::getData (column, data, index); + } + + template + void ModelRefIdAdapter::setData (const RefIdColumn *column, RefIdData& data, int index, + const QVariant& value) const + { + Record& record = static_cast&> ( + data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter::getType()))); + + if (column==mModel.mModel) + record.get().mModel = value.toString().toUtf8().constData(); + else + BaseRefIdAdapter::setData (column, data, index, value); + } } #endif diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index 782b080c07..9806f260f9 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -47,49 +47,52 @@ CSMWorld::RefIdCollection::RefIdCollection() baseColumns.mType = &mColumns.back(); // mColumns.push_back (RefIdColumn ("Name", ColumnBase::Display_String)); + ModelColumns modelColumns (baseColumns); + mColumns.push_back (RefIdColumn ("Model", ColumnBase::Display_String)); + modelColumns.mModel = &mColumns.back(); mAdapters.insert (std::make_pair (UniversalId::Type_Activator, - new BaseRefIdAdapter (UniversalId::Type_Activator, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Activator, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Potion, - new BaseRefIdAdapter (UniversalId::Type_Potion, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Potion, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Apparatus, - new BaseRefIdAdapter (UniversalId::Type_Apparatus, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Apparatus, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Armor, - new BaseRefIdAdapter (UniversalId::Type_Armor, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Armor, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Book, - new BaseRefIdAdapter (UniversalId::Type_Book, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Book, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Clothing, - new BaseRefIdAdapter (UniversalId::Type_Clothing, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Clothing, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Container, - new BaseRefIdAdapter (UniversalId::Type_Container, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Container, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Creature, - new BaseRefIdAdapter (UniversalId::Type_Creature, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Creature, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Door, - new BaseRefIdAdapter (UniversalId::Type_Door, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Door, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Ingredient, - new BaseRefIdAdapter (UniversalId::Type_Ingredient, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Ingredient, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_CreatureLevelledList, new BaseRefIdAdapter ( UniversalId::Type_CreatureLevelledList, baseColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_ItemLevelledList, new BaseRefIdAdapter (UniversalId::Type_ItemLevelledList, baseColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Light, - new BaseRefIdAdapter (UniversalId::Type_Light, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Light, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Lockpick, - new BaseRefIdAdapter (UniversalId::Type_Lockpick, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Lockpick, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Miscellaneous, - new BaseRefIdAdapter (UniversalId::Type_Miscellaneous, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Miscellaneous, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Npc, - new BaseRefIdAdapter (UniversalId::Type_Npc, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Npc, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Probe, - new BaseRefIdAdapter (UniversalId::Type_Probe, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Probe, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Repair, - new BaseRefIdAdapter (UniversalId::Type_Repair, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Repair, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Static, - new BaseRefIdAdapter (UniversalId::Type_Static, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Static, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Weapon, - new BaseRefIdAdapter (UniversalId::Type_Weapon, baseColumns))); + new ModelRefIdAdapter (UniversalId::Type_Weapon, modelColumns))); } CSMWorld::RefIdCollection::~RefIdCollection()