From da929213872e0e9901fd1df1dfc57f8e8fd379c2 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 11 May 2013 19:21:16 +0200 Subject: [PATCH] added columns related to items in inventories --- apps/opencs/model/world/refidadapterimp.hpp | 69 +++++++++++++++++++++ apps/opencs/model/world/refidcollection.cpp | 34 ++++++---- 2 files changed, 91 insertions(+), 12 deletions(-) diff --git a/apps/opencs/model/world/refidadapterimp.hpp b/apps/opencs/model/world/refidadapterimp.hpp index 78a363bef..4ceb01336 100644 --- a/apps/opencs/model/world/refidadapterimp.hpp +++ b/apps/opencs/model/world/refidadapterimp.hpp @@ -210,6 +210,75 @@ namespace CSMWorld else ModelRefIdAdapter::setData (column, data, index, value); } + + struct InventoryColumns : public NameColumns + { + const RefIdColumn *mIcon; + const RefIdColumn *mWeight; + const RefIdColumn *mValue; + + InventoryColumns (const NameColumns& base) : NameColumns (base) {} + }; + + /// \brief Adapter for IDs with names (all but levelled lists and statics) + template + class InventoryRefIdAdapter : public NameRefIdAdapter + { + InventoryColumns mName; + + public: + + InventoryRefIdAdapter (UniversalId::Type type, const InventoryColumns& 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 + InventoryRefIdAdapter::InventoryRefIdAdapter (UniversalId::Type type, + const InventoryColumns& columns) + : NameRefIdAdapter (type, columns), mName (columns) + {} + + template + QVariant InventoryRefIdAdapter::getData (const RefIdColumn *column, const RefIdData& data, + int index) const + { + const Record& record = static_cast&> ( + data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter::getType()))); + + if (column==mName.mIcon) + return QString::fromUtf8 (record.get().mIcon.c_str()); + + if (column==mName.mWeight) + return record.get().mData.mWeight; + + if (column==mName.mValue) + return record.get().mData.mValue; + + return NameRefIdAdapter::getData (column, data, index); + } + + template + void InventoryRefIdAdapter::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==mName.mIcon) + record.get().mIcon = value.toString().toUtf8().constData(); + else if (column==mName.mWeight) + record.get().mData.mWeight = value.toFloat(); + else if (column==mName.mValue) + record.get().mData.mValue = value.toInt(); + else + NameRefIdAdapter::setData (column, data, index, value); + } } #endif diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index 31055a439..5bfbb022d 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -58,18 +58,27 @@ CSMWorld::RefIdCollection::RefIdCollection() mColumns.push_back (RefIdColumn ("Script", ColumnBase::Display_String)); nameColumns.mScript = &mColumns.back(); + InventoryColumns inventoryColumns (nameColumns); + + mColumns.push_back (RefIdColumn ("Icon", ColumnBase::Display_String)); + inventoryColumns.mIcon = &mColumns.back(); + mColumns.push_back (RefIdColumn ("Weight", ColumnBase::Display_Float)); + inventoryColumns.mWeight = &mColumns.back(); + mColumns.push_back (RefIdColumn ("Value", ColumnBase::Display_Integer)); + inventoryColumns.mValue = &mColumns.back(); + mAdapters.insert (std::make_pair (UniversalId::Type_Activator, new NameRefIdAdapter (UniversalId::Type_Activator, nameColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Potion, - new NameRefIdAdapter (UniversalId::Type_Potion, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Potion, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Apparatus, - new NameRefIdAdapter (UniversalId::Type_Apparatus, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Apparatus, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Armor, - new NameRefIdAdapter (UniversalId::Type_Armor, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Armor, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Book, - new NameRefIdAdapter (UniversalId::Type_Book, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Book, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Clothing, - new NameRefIdAdapter (UniversalId::Type_Clothing, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Clothing, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Container, new NameRefIdAdapter (UniversalId::Type_Container, nameColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Creature, @@ -77,28 +86,29 @@ CSMWorld::RefIdCollection::RefIdCollection() mAdapters.insert (std::make_pair (UniversalId::Type_Door, new NameRefIdAdapter (UniversalId::Type_Door, nameColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Ingredient, - new NameRefIdAdapter (UniversalId::Type_Ingredient, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Ingredient, inventoryColumns))); 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 NameRefIdAdapter (UniversalId::Type_Light, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Light, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Lockpick, - new NameRefIdAdapter (UniversalId::Type_Lockpick, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Lockpick, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Miscellaneous, - new NameRefIdAdapter (UniversalId::Type_Miscellaneous, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Miscellaneous, + inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Npc, new NameRefIdAdapter (UniversalId::Type_Npc, nameColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Probe, - new NameRefIdAdapter (UniversalId::Type_Probe, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Probe, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Repair, - new NameRefIdAdapter (UniversalId::Type_Repair, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Repair, inventoryColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Static, new ModelRefIdAdapter (UniversalId::Type_Static, modelColumns))); mAdapters.insert (std::make_pair (UniversalId::Type_Weapon, - new NameRefIdAdapter (UniversalId::Type_Weapon, nameColumns))); + new InventoryRefIdAdapter (UniversalId::Type_Weapon, inventoryColumns))); } CSMWorld::RefIdCollection::~RefIdCollection()