mirror of
				https://github.com/TES3MP/openmw-tes3mp.git
				synced 2025-10-31 21:56:45 +00:00 
			
		
		
		
	Merge remote-tracking branch 'smbas/fix-opencs-bugs'
This commit is contained in:
		
						commit
						e76401d5ea
					
				
					 12 changed files with 80 additions and 27 deletions
				
			
		|  | @ -23,7 +23,7 @@ opencs_units (model/world | |||
| 
 | ||||
| 
 | ||||
| opencs_units_noqt (model/world | ||||
|     universalid record commands columnbase scriptcontext cell refidcollection | ||||
|     universalid record commands columnbase columnimp scriptcontext cell refidcollection | ||||
|     refidadapter refiddata refidadapterimp ref collectionbase refcollection columns infocollection tablemimedata cellcoordinates cellselection resources resourcesmanager scope | ||||
|     pathgrid landtexture land nestedtablewrapper nestedcollection nestedcoladapterimp nestedinfocollection | ||||
|     idcompletionmanager metadata | ||||
|  |  | |||
							
								
								
									
										28
									
								
								apps/opencs/model/world/columnimp.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								apps/opencs/model/world/columnimp.cpp
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| #include "columnimp.hpp" | ||||
| 
 | ||||
| CSMWorld::BodyPartRaceColumn::BodyPartRaceColumn(const MeshTypeColumn<ESM::BodyPart> *meshType) | ||||
|     : mMeshType(meshType) | ||||
| {} | ||||
| 
 | ||||
| QVariant CSMWorld::BodyPartRaceColumn::get(const Record<ESM::BodyPart> &record) const | ||||
| { | ||||
|     if (mMeshType != NULL && mMeshType->get(record) == ESM::BodyPart::MT_Skin) | ||||
|     { | ||||
|         return QString::fromUtf8(record.get().mRace.c_str()); | ||||
|     } | ||||
|     return QVariant(QVariant::UserType); | ||||
| } | ||||
| 
 | ||||
| void CSMWorld::BodyPartRaceColumn::set(Record<ESM::BodyPart> &record, const QVariant &data) | ||||
| { | ||||
|     ESM::BodyPart record2 = record.get(); | ||||
| 
 | ||||
|     record2.mRace = data.toString().toUtf8().constData(); | ||||
| 
 | ||||
|     record.setModified(record2); | ||||
| } | ||||
| 
 | ||||
| bool CSMWorld::BodyPartRaceColumn::isEditable() const | ||||
| { | ||||
|     return true; | ||||
| } | ||||
|  | @ -9,6 +9,10 @@ | |||
| 
 | ||||
| #include <QColor> | ||||
| 
 | ||||
| #include <components/esm/loadbody.hpp> | ||||
| #include <components/esm/loadskil.hpp> | ||||
| #include <components/esm/loadrace.hpp> | ||||
| 
 | ||||
| #include "columnbase.hpp" | ||||
| #include "columns.hpp" | ||||
| #include "info.hpp" | ||||
|  | @ -1911,8 +1915,8 @@ namespace CSMWorld | |||
|     template<typename ESXRecordT> | ||||
|     struct MeshTypeColumn : public Column<ESXRecordT> | ||||
|     { | ||||
|         MeshTypeColumn() | ||||
|         : Column<ESXRecordT> (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType) | ||||
|         MeshTypeColumn(int flags = ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue) | ||||
|         : Column<ESXRecordT> (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType, flags) | ||||
|         {} | ||||
| 
 | ||||
|         virtual QVariant get (const Record<ESXRecordT>& record) const | ||||
|  | @ -2379,7 +2383,18 @@ namespace CSMWorld | |||
|         { | ||||
|             return true; | ||||
|         } | ||||
|     };         | ||||
|     }; | ||||
|      | ||||
|     struct BodyPartRaceColumn : public RaceColumn<ESM::BodyPart> | ||||
|     { | ||||
|         const MeshTypeColumn<ESM::BodyPart> *mMeshType; | ||||
| 
 | ||||
|         BodyPartRaceColumn(const MeshTypeColumn<ESM::BodyPart> *meshType); | ||||
| 
 | ||||
|         virtual QVariant get(const Record<ESM::BodyPart> &record) const; | ||||
|         virtual void set(Record<ESM::BodyPart> &record, const QVariant &data); | ||||
|         virtual bool isEditable() const; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -536,11 +536,6 @@ namespace | |||
|         "AI Wander", "AI Travel", "AI Follow", "AI Escort", "AI Activate", 0 | ||||
|     }; | ||||
| 
 | ||||
|     static const char *sAiWanderRepeat[] = | ||||
|     { | ||||
|         "No", "Yes", 0 | ||||
|     }; | ||||
| 
 | ||||
|     static const char *sInfoCondFunc[] = | ||||
|     { | ||||
|         " ", "Function", "Global", "Local", "Journal", | ||||
|  | @ -580,7 +575,6 @@ namespace | |||
|             case CSMWorld::Columns::ColumnId_EffectId: return sEffectId; | ||||
|             case CSMWorld::Columns::ColumnId_PartRefType: return sPartRefType; | ||||
|             case CSMWorld::Columns::ColumnId_AiPackageType: return sAiPackageType; | ||||
|             case CSMWorld::Columns::ColumnId_AiWanderRepeat: return sAiWanderRepeat; | ||||
|             case CSMWorld::Columns::ColumnId_InfoCondFunc: return sInfoCondFunc; | ||||
|             // FIXME: don't have dynamic value enum delegate, use Display_String for now
 | ||||
|             //case CSMWorld::Columns::ColumnId_InfoCond: return sInfoCond;
 | ||||
|  |  | |||
|  | @ -21,12 +21,17 @@ CSMWorld::ModifyCommand::ModifyCommand (QAbstractItemModel& model, const QModelI | |||
|         // Replace proxy with actual model
 | ||||
|         mIndex = proxy->mapToSource (index); | ||||
|         mModel = proxy->sourceModel(); | ||||
|     } | ||||
| 
 | ||||
|     if (mIndex.parent().isValid()) | ||||
|     { | ||||
|         setText ("Modify " + dynamic_cast<CSMWorld::IdTree*>(mModel)->nestedHeaderData ( | ||||
|                     mIndex.parent().column(), mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString()); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         setText ("Modify " + mModel->headerData (mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString()); | ||||
|     } | ||||
| 
 | ||||
|     // Remember record state before the modification
 | ||||
|     if (CSMWorld::IdTable *table = dynamic_cast<IdTable *>(mModel)) | ||||
|  |  | |||
|  | @ -351,9 +351,12 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc | |||
|     mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Female, ESM::BodyPart::BPF_Female)); | ||||
|     mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Playable, | ||||
|         ESM::BodyPart::BPF_NotPlayable, ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue, true)); | ||||
|     mBodyParts.addColumn (new MeshTypeColumn<ESM::BodyPart>); | ||||
| 
 | ||||
|     int meshTypeFlags = ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_Refresh; | ||||
|     MeshTypeColumn<ESM::BodyPart> *meshTypeColumn = new MeshTypeColumn<ESM::BodyPart>(meshTypeFlags); | ||||
|     mBodyParts.addColumn (meshTypeColumn); | ||||
|     mBodyParts.addColumn (new ModelColumn<ESM::BodyPart>); | ||||
|     mBodyParts.addColumn (new RaceColumn<ESM::BodyPart>); | ||||
|     mBodyParts.addColumn (new BodyPartRaceColumn(meshTypeColumn)); | ||||
| 
 | ||||
|     mSoundGens.addColumn (new StringIdColumn<ESM::SoundGenerator>); | ||||
|     mSoundGens.addColumn (new RecordStateColumn<ESM::SoundGenerator>); | ||||
|  |  | |||
|  | @ -76,12 +76,15 @@ bool CSMWorld::IdTable::setData (const QModelIndex &index, const QVariant &value | |||
|     if (mIdCollection->getColumn (index.column()).isEditable() && role==Qt::EditRole) | ||||
|     { | ||||
|         mIdCollection->setData (index.row(), index.column(), value); | ||||
|         emit dataChanged(index, index); | ||||
| 
 | ||||
|         // Modifying a value can also change the Modified status of a record.
 | ||||
|         // To track this, we inform about the change of a whole row.
 | ||||
|         QModelIndex rowStart = this->index(index.row(), 0); | ||||
|         QModelIndex rowEnd = this->index(index.row(), columnCount(index.parent()) - 1); | ||||
|         emit dataChanged(rowStart, rowEnd); | ||||
|         int stateColumn = searchColumnIndex(Columns::ColumnId_Modification); | ||||
|         if (stateColumn != -1) | ||||
|         { | ||||
|             QModelIndex stateIndex = this->index(index.row(), stateColumn); | ||||
|             emit dataChanged(stateIndex, stateIndex); | ||||
|         } | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
|  |  | |||
|  | @ -95,14 +95,15 @@ bool CSMWorld::IdTree::setData (const QModelIndex &index, const QVariant &value, | |||
|             const std::pair<int, int>& parentAddress(unfoldIndexAddress(index.internalId())); | ||||
| 
 | ||||
|             mNestedCollection->setNestedData(parentAddress.first, parentAddress.second, value, index.row(), index.column()); | ||||
| 
 | ||||
|             emit dataChanged(index, index); | ||||
| 
 | ||||
|             // Modifying a value can also change the Modified status of a record (located in the parent row).
 | ||||
|             // To track this, we inform about the change of a whole parent row.
 | ||||
|             QModelIndex parentRowStart = this->index(index.parent().row(), 0); | ||||
|             QModelIndex parentRowEnd = this->index(index.parent().row(), columnCount(index.parent()) - 1); | ||||
|             emit dataChanged(parentRowStart, parentRowEnd); | ||||
|             // Modifying a value can also change the Modified status of a record.
 | ||||
|             int stateColumn = searchColumnIndex(Columns::ColumnId_Modification); | ||||
|             if (stateColumn != -1) | ||||
|             { | ||||
|                 QModelIndex stateIndex = this->index(index.parent().row(), stateColumn); | ||||
|                 emit dataChanged(stateIndex, stateIndex); | ||||
|             } | ||||
| 
 | ||||
|             return true; | ||||
|         } | ||||
|  |  | |||
|  | @ -1566,7 +1566,7 @@ namespace CSMWorld | |||
|                         return QVariant(); | ||||
|                 case 5: // wander repeat
 | ||||
|                     if (content.mType == ESM::AI_Wander) | ||||
|                         return content.mWander.mShouldRepeat; | ||||
|                         return content.mWander.mShouldRepeat != 0; | ||||
|                     else | ||||
|                         return QVariant(); | ||||
|                 case 6: // activate name
 | ||||
|  |  | |||
|  | @ -102,7 +102,6 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager) | |||
|         { CSMWorld::ColumnBase::Display_EffectId, CSMWorld::Columns::ColumnId_EffectId, false }, | ||||
|         { CSMWorld::ColumnBase::Display_PartRefType, CSMWorld::Columns::ColumnId_PartRefType, false }, | ||||
|         { CSMWorld::ColumnBase::Display_AiPackageType, CSMWorld::Columns::ColumnId_AiPackageType, false }, | ||||
|         { CSMWorld::ColumnBase::Display_Boolean, CSMWorld::Columns::ColumnId_AiWanderRepeat, false }, | ||||
|         { CSMWorld::ColumnBase::Display_InfoCondFunc, CSMWorld::Columns::ColumnId_InfoCondFunc, false }, | ||||
|         { CSMWorld::ColumnBase::Display_InfoCondComp, CSMWorld::Columns::ColumnId_InfoCondComp, false }, | ||||
|         { CSMWorld::ColumnBase::Display_RaceSkill, CSMWorld::Columns::ColumnId_RaceSkill, true }, | ||||
|  |  | |||
|  | @ -273,12 +273,16 @@ CSVWorld::Table::Table (const CSMWorld::UniversalId& id, | |||
|     horizontalHeader()->setResizeMode (QHeaderView::Interactive); | ||||
| #endif | ||||
|     verticalHeader()->hide(); | ||||
|     setSortingEnabled (sorting); | ||||
|     setSelectionBehavior (QAbstractItemView::SelectRows); | ||||
|     setSelectionMode (QAbstractItemView::ExtendedSelection); | ||||
| 
 | ||||
|     int columns = mModel->columnCount(); | ||||
|     setSortingEnabled (sorting); | ||||
|     if (sorting) | ||||
|     { | ||||
|         sortByColumn (mModel->findColumnIndex(CSMWorld::Columns::ColumnId_Id), Qt::AscendingOrder); | ||||
|     } | ||||
| 
 | ||||
|     int columns = mModel->columnCount(); | ||||
|     for (int i=0; i<columns; ++i) | ||||
|     { | ||||
|         int flags = mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Flags).toInt(); | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
| #include <QCheckBox> | ||||
| #include <QPlainTextEdit> | ||||
| #include <QEvent> | ||||
| #include <QItemEditorFactory> | ||||
| 
 | ||||
| #include "../../model/world/commands.hpp" | ||||
| #include "../../model/world/tablemimedata.hpp" | ||||
|  | @ -172,7 +173,7 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO | |||
|     // TODO: Find a better solution?
 | ||||
|     if (display == CSMWorld::ColumnBase::Display_Boolean) | ||||
|     { | ||||
|         return QStyledItemDelegate::createEditor(parent, option, index); | ||||
|         return QItemEditorFactory::defaultFactory()->createEditor(QVariant::Bool, parent); | ||||
|     } | ||||
|     // For tables the pop-up of the color editor should appear immediately after the editor creation
 | ||||
|     // (the third parameter of ColorEditor's constructor)
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue