mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 20:56:39 +00:00 
			
		
		
		
	Nest columns directly, created NestedColumn class and NestColumn.
This commit is contained in:
		
							parent
							
								
									0252d021eb
								
							
						
					
					
						commit
						f0c6ef185e
					
				
					 6 changed files with 71 additions and 41 deletions
				
			
		|  | @ -2,8 +2,6 @@ | |||
| 
 | ||||
| #include "columns.hpp" | ||||
| 
 | ||||
| #include <cassert> | ||||
| 
 | ||||
| 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<Columns::ColumnId>(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(); | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| 
 | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <exception> | ||||
| 
 | ||||
| #include <Qt> | ||||
| #include <QVariant> | ||||
|  | @ -110,9 +111,7 @@ namespace CSMWorld | |||
|         int mColumnId; | ||||
|         int mFlags; | ||||
|         Display mDisplayType; | ||||
|         std::vector<Display> mNestedDisplayType; //used only for the columns that actually nest other columns
 | ||||
|         std::vector<int> 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<NestedColumn> 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<typename ESXRecordT> | ||||
|     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<ESXRecordT>& record) const = 0; | ||||
| 
 | ||||
|  |  | |||
|  | @ -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<const NestColumn&>(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()); | ||||
| } | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| #include "refidadapterimp.hpp" | ||||
| 
 | ||||
| #include <cassert> | ||||
| #include <stdexcept> | ||||
| 
 | ||||
| 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."); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ namespace CSMWorld | |||
| { | ||||
|     class RefIdAdapter; | ||||
| 
 | ||||
|     class RefIdColumn : public ColumnBase | ||||
|     class RefIdColumn : public NestColumn  | ||||
|     { | ||||
|             bool mEditable; | ||||
|             bool mUserEditable; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue