From 1de406cb6de08e0ad37da81af4c3e34b08823134 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 29 Jun 2014 14:45:52 +0200 Subject: [PATCH 01/37] Catch exception from invalid scripts during save&load (Fixes #1590) --- apps/openmw/mwscript/locals.cpp | 91 +++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 39 deletions(-) diff --git a/apps/openmw/mwscript/locals.cpp b/apps/openmw/mwscript/locals.cpp index 177536fe9e..57584ac306 100644 --- a/apps/openmw/mwscript/locals.cpp +++ b/apps/openmw/mwscript/locals.cpp @@ -5,6 +5,7 @@ #include #include +#include #include "../mwbase/environment.hpp" #include "../mwbase/scriptmanager.hpp" @@ -75,65 +76,77 @@ namespace MWScript void Locals::write (ESM::Locals& locals, const std::string& script) const { - const Compiler::Locals& declarations = - MWBase::Environment::get().getScriptManager()->getLocals(script); - - for (int i=0; i<3; ++i) + try { - char type = 0; + const Compiler::Locals& declarations = + MWBase::Environment::get().getScriptManager()->getLocals(script); - switch (i) + for (int i=0; i<3; ++i) { - case 0: type = 's'; break; - case 1: type = 'l'; break; - case 2: type = 'f'; break; - } - - const std::vector& names = declarations.get (type); - - for (int i2=0; i2 (names.size()); ++i2) - { - ESM::Variant value; + char type = 0; switch (i) { - case 0: value.setType (ESM::VT_Int); value.setInteger (mShorts.at (i2)); break; - case 1: value.setType (ESM::VT_Int); value.setInteger (mLongs.at (i2)); break; - case 2: value.setType (ESM::VT_Float); value.setFloat (mFloats.at (i2)); break; + case 0: type = 's'; break; + case 1: type = 'l'; break; + case 2: type = 'f'; break; } - locals.mVariables.push_back (std::make_pair (names[i2], value)); + const std::vector& names = declarations.get (type); + + for (int i2=0; i2 (names.size()); ++i2) + { + ESM::Variant value; + + switch (i) + { + case 0: value.setType (ESM::VT_Int); value.setInteger (mShorts.at (i2)); break; + case 1: value.setType (ESM::VT_Int); value.setInteger (mLongs.at (i2)); break; + case 2: value.setType (ESM::VT_Float); value.setFloat (mFloats.at (i2)); break; + } + + locals.mVariables.push_back (std::make_pair (names[i2], value)); + } } } + catch (const Compiler::SourceException&) + { + } } void Locals::read (const ESM::Locals& locals, const std::string& script) { - const Compiler::Locals& declarations = - MWBase::Environment::get().getScriptManager()->getLocals(script); - - for (std::vector >::const_iterator iter - = locals.mVariables.begin(); iter!=locals.mVariables.end(); ++iter) + try { - char type = declarations.getType (iter->first); - char index = declarations.getIndex (iter->first); + const Compiler::Locals& declarations = + MWBase::Environment::get().getScriptManager()->getLocals(script); - try + for (std::vector >::const_iterator iter + = locals.mVariables.begin(); iter!=locals.mVariables.end(); ++iter) { - switch (type) - { - case 's': mShorts.at (index) = iter->second.getInteger(); break; - case 'l': mLongs.at (index) = iter->second.getInteger(); break; - case 'f': mFloats.at (index) = iter->second.getFloat(); break; + char type = declarations.getType (iter->first); + char index = declarations.getIndex (iter->first); - // silently ignore locals that don't exist anymore + try + { + switch (type) + { + case 's': mShorts.at (index) = iter->second.getInteger(); break; + case 'l': mLongs.at (index) = iter->second.getInteger(); break; + case 'f': mFloats.at (index) = iter->second.getFloat(); break; + + // silently ignore locals that don't exist anymore + } + } + catch (...) + { + // ignore type changes + /// \todo write to log } } - catch (...) - { - // ignore type changes - /// \todo write to log - } + } + catch (const Compiler::SourceException&) + { } } } From 5ec96c53943d9b6725e9719a0f950bbf1982c116 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 29 Jun 2014 15:39:11 +0200 Subject: [PATCH 02/37] Add missing visibility flags --- apps/openmw/mwrender/terraingrid.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/openmw/mwrender/terraingrid.cpp b/apps/openmw/mwrender/terraingrid.cpp index 4688fbfd9f..f2bd920610 100644 --- a/apps/openmw/mwrender/terraingrid.cpp +++ b/apps/openmw/mwrender/terraingrid.cpp @@ -64,6 +64,8 @@ void TerrainGrid::loadCell(int x, int y) element.mChunk = new Terrain::Chunk(mCache.getUVBuffer(), bounds, positions, normals, colours); element.mChunk->setIndexBuffer(mCache.getIndexBuffer(0)); + element.mChunk->setVisibilityFlags(mVisibilityFlags); + element.mChunk->setCastShadows(true); std::vector blendmaps; std::vector layerList; From 082b6125a9ee0cd62217db3a28e1202c7f09e6b9 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 29 Jun 2014 17:02:29 +0200 Subject: [PATCH 03/37] Fix crash during spell creation when an effect targeting a skill/attribute doesn't have one assigned yet (Fixes #1598) --- apps/openmw/mwgui/widgets.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwgui/widgets.cpp b/apps/openmw/mwgui/widgets.cpp index b83ca0b09c..de48a9d3e8 100644 --- a/apps/openmw/mwgui/widgets.cpp +++ b/apps/openmw/mwgui/widgets.cpp @@ -419,11 +419,11 @@ namespace MWGui std::string effectIDStr = ESM::MagicEffect::effectIdToString(mEffectParams.mEffectID); std::string spellLine = MWBase::Environment::get().getWindowManager()->getGameSettingString(effectIDStr, ""); - if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetSkill) + if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetSkill && mEffectParams.mSkill != -1) { spellLine += " " + MWBase::Environment::get().getWindowManager()->getGameSettingString(ESM::Skill::sSkillNameIds[mEffectParams.mSkill], ""); } - if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetAttribute) + if (magicEffect->mData.mFlags & ESM::MagicEffect::TargetAttribute && mEffectParams.mAttribute != -1) { spellLine += " " + MWBase::Environment::get().getWindowManager()->getGameSettingString(ESM::Attribute::sGmstAttributeIds[mEffectParams.mAttribute], ""); } From 85a1f9d37b3555b43afa1102fd7ed114f2e5cee6 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 30 Jun 2014 00:08:39 +0200 Subject: [PATCH 04/37] Fall back to resolution selected from list when switching to fullscreen (Fixes #1599) --- apps/openmw/mwgui/settingswindow.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index 7496164909..f4602b064c 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -322,6 +322,15 @@ namespace MWGui if (_sender == mFullscreenButton) { // check if this resolution is supported in fullscreen + if (mResolutionList->getIndexSelected() != MyGUI::ITEM_NONE) + { + std::string resStr = mResolutionList->getItemNameAt(mResolutionList->getIndexSelected()); + int resX, resY; + parseResolution (resX, resY, resStr); + Settings::Manager::setInt("resolution x", "Video", resX); + Settings::Manager::setInt("resolution y", "Video", resY); + } + bool supported = false; for (unsigned int i=0; igetItemCount(); ++i) { From af59106533590aee1360f708f44b72a3c2a453ba Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 Jun 2014 12:35:34 +0200 Subject: [PATCH 05/37] for regular IdCollections when loading a record make the record a copy of the existing record first (adresses some incomplete records in some content files) --- apps/opencs/model/world/idcollection.hpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/apps/opencs/model/world/idcollection.hpp b/apps/opencs/model/world/idcollection.hpp index a7b37be5bc..7e7756ff3e 100644 --- a/apps/opencs/model/world/idcollection.hpp +++ b/apps/opencs/model/world/idcollection.hpp @@ -15,7 +15,10 @@ namespace CSMWorld void load (ESM::ESMReader& reader, bool base); - void load (const ESXRecordT& record, bool base); + /// \param index Index at which the record can be found. + /// Special values: -2 index unknown, -1 record does not exist yet and therefore + /// does not have an index + void load (const ESXRecordT& record, bool base, int index = -2); bool tryDelete (const std::string& id); ///< Try deleting \a id. If the id does not exist or can't be deleted the call is ignored. @@ -56,17 +59,28 @@ namespace CSMWorld else { ESXRecordT record; - IdAccessorT().getId (record) = id; + + int index = this->searchId (id); + + if (index==-1) + IdAccessorT().getId (record) = id; + else + { + record = this->getRecord (index).get(); + } + record.load (reader); - load (record, base); + load (record, base, index); } } template - void IdCollection::load (const ESXRecordT& record, bool base) + void IdCollection::load (const ESXRecordT& record, bool base, + int index) { - int index = this->searchId (IdAccessorT().getId (record)); + if (index==-2) + index = this->searchId (IdAccessorT().getId (record)); if (index==-1) { From 5fb2e1a8774901ccc78ce954d3d0ac6a784b18c7 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 Jun 2014 17:33:03 +0200 Subject: [PATCH 06/37] do not render deleted exterior cells in scene view --- .../opencs/view/render/pagedworldspacewidget.cpp | 16 ++++++++++++---- .../opencs/view/render/pagedworldspacewidget.hpp | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/opencs/view/render/pagedworldspacewidget.cpp b/apps/opencs/view/render/pagedworldspacewidget.cpp index 20cd6abb5a..ca47621c6d 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.cpp +++ b/apps/opencs/view/render/pagedworldspacewidget.cpp @@ -15,13 +15,18 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells() bool modified = false; bool setCamera = false; + const CSMWorld::IdCollection& cells = mDocument.getData().getCells(); + { // remove std::map::iterator iter (mCells.begin()); while (iter!=mCells.end()) { - if (!mSelection.has (iter->first)) + int index = cells.searchId (iter->first.getId (mWorldspace)); + + if (!mSelection.has (iter->first) || index==-1 || + cells.getRecord (index).mState==CSMWorld::RecordBase::State_Deleted) { delete iter->second; mCells.erase (iter++); @@ -39,7 +44,10 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells() for (CSMWorld::CellSelection::Iterator iter (mSelection.begin()); iter!=mSelection.end(); ++iter) { - if (mCells.find (*iter)==mCells.end()) + int index = cells.searchId (iter->getId (mWorldspace)); + + if (index!=0 && cells.getRecord (index).mState!=CSMWorld::RecordBase::State_Deleted && + mCells.find (*iter)==mCells.end()) { if (setCamera) { @@ -49,7 +57,7 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells() mCells.insert (std::make_pair (*iter, new Cell (mDocument.getData(), getSceneManager(), - iter->getId ("std::default")))); + iter->getId (mWorldspace)))); modified = true; } @@ -124,7 +132,7 @@ void CSVRender::PagedWorldspaceWidget::referenceAdded (const QModelIndex& parent CSVRender::PagedWorldspaceWidget::PagedWorldspaceWidget (QWidget* parent, CSMDoc::Document& document) -: WorldspaceWidget (document, parent), mDocument (document) +: WorldspaceWidget (document, parent), mDocument (document), mWorldspace ("std::default") {} CSVRender::PagedWorldspaceWidget::~PagedWorldspaceWidget() diff --git a/apps/opencs/view/render/pagedworldspacewidget.hpp b/apps/opencs/view/render/pagedworldspacewidget.hpp index 7f9a66f82b..bf6d480caa 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.hpp +++ b/apps/opencs/view/render/pagedworldspacewidget.hpp @@ -17,6 +17,7 @@ namespace CSVRender CSMDoc::Document& mDocument; CSMWorld::CellSelection mSelection; std::map mCells; + std::string mWorldspace; private: From 2506c16bf5b10095a056a8b37b102100a4292871 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 30 Jun 2014 17:49:01 +0200 Subject: [PATCH 07/37] Add a dummy GetStat function returning 0 (Fixes #1589) --- apps/openmw/mwscript/docs/vmformat.txt | 4 +++- apps/openmw/mwscript/statsextensions.cpp | 13 +++++++++++++ components/compiler/extensions0.cpp | 2 ++ components/compiler/opcodes.hpp | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwscript/docs/vmformat.txt b/apps/openmw/mwscript/docs/vmformat.txt index 319feee0e0..8c9d6e480e 100644 --- a/apps/openmw/mwscript/docs/vmformat.txt +++ b/apps/openmw/mwscript/docs/vmformat.txt @@ -403,5 +403,7 @@ op 0x200024a: OnMurder, explicit op 0x200024b: ToggleMenus op 0x200024c: Face op 0x200024d: Face, explicit +op 0x200024e: GetStat (dummy function) +op 0x200024f: GetStat (dummy function), explicit -opcodes 0x200024e-0x3ffffff unused +opcodes 0x2000250-0x3ffffff unused diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index 5c47dea0f2..e54cdd09d8 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -1165,6 +1165,17 @@ namespace MWScript } }; + template + class OpGetStat : public Interpreter::Opcode0 + { + public: + virtual void execute (Interpreter::Runtime& runtime) + { + // dummy + runtime.push(0); + } + }; + void installOpcodes (Interpreter::Interpreter& interpreter) { for (int i=0; i); interpreter.installSegment5 (Compiler::Stats::opcodeSetWerewolfAcrobatics, new OpSetWerewolfAcrobatics); interpreter.installSegment5 (Compiler::Stats::opcodeSetWerewolfAcrobaticsExplicit, new OpSetWerewolfAcrobatics); + interpreter.installSegment5 (Compiler::Stats::opcodeGetStat, new OpGetStat); + interpreter.installSegment5 (Compiler::Stats::opcodeGetStatExplicit, new OpGetStat); } } } diff --git a/components/compiler/extensions0.cpp b/components/compiler/extensions0.cpp index e095958d18..ef4fe4fbda 100644 --- a/components/compiler/extensions0.cpp +++ b/components/compiler/extensions0.cpp @@ -431,6 +431,8 @@ namespace Compiler extensions.registerInstruction("setlevel", "l", opcodeSetLevel, opcodeSetLevelExplicit); extensions.registerFunction("getlevel", 'l', "", opcodeGetLevel, opcodeGetLevelExplicit); + extensions.registerFunction("getstat", 'l', "c", opcodeGetStat, opcodeGetStatExplicit); + extensions.registerFunction ("getdeadcount", 'l', "c", opcodeGetDeadCount); extensions.registerFunction ("getpcfacrep", 'l', "/c", opcodeGetPCFacRep, opcodeGetPCFacRepExplicit); diff --git a/components/compiler/opcodes.hpp b/components/compiler/opcodes.hpp index 85ac578f34..9f3ed3574e 100644 --- a/components/compiler/opcodes.hpp +++ b/components/compiler/opcodes.hpp @@ -410,6 +410,9 @@ namespace Compiler const int opcodeRemoveEffectsExplicit = 0x200022e; const int opcodeResurrect = 0x200022f; const int opcodeResurrectExplicit = 0x2000230; + + const int opcodeGetStat = 0x200024e; + const int opcodeGetStatExplicit = 0x200024f; } namespace Transformation From a25321f07ec3d005c4292976390c18ee2dda2cd3 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 Jun 2014 17:57:38 +0200 Subject: [PATCH 08/37] update paged scene view according to changes made to cell records --- .../view/render/pagedworldspacewidget.cpp | 37 +++++++++++++++++-- .../view/render/pagedworldspacewidget.hpp | 9 +++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/apps/opencs/view/render/pagedworldspacewidget.cpp b/apps/opencs/view/render/pagedworldspacewidget.cpp index ca47621c6d..1ee32fa970 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.cpp +++ b/apps/opencs/view/render/pagedworldspacewidget.cpp @@ -129,11 +129,19 @@ void CSVRender::PagedWorldspaceWidget::referenceAdded (const QModelIndex& parent flagAsModified(); } - - CSVRender::PagedWorldspaceWidget::PagedWorldspaceWidget (QWidget* parent, CSMDoc::Document& document) : WorldspaceWidget (document, parent), mDocument (document), mWorldspace ("std::default") -{} +{ + QAbstractItemModel *cells = + document.getData().getTableModel (CSMWorld::UniversalId::Type_Cells); + + connect (cells, SIGNAL (dataChanged (const QModelIndex&, const QModelIndex&)), + this, SLOT (cellDataChanged (const QModelIndex&, const QModelIndex&))); + connect (cells, SIGNAL (rowsRemoved (const QModelIndex&, int, int)), + this, SLOT (cellRemoved (const QModelIndex&, int, int))); + connect (cells, SIGNAL (rowsInserted (const QModelIndex&, int, int)), + this, SLOT (cellAdded (const QModelIndex&, int, int))); +} CSVRender::PagedWorldspaceWidget::~PagedWorldspaceWidget() { @@ -227,4 +235,27 @@ CSVRender::WorldspaceWidget::dropRequirments CSVRender::PagedWorldspaceWidget::g default: return ignored; } +} + +void CSVRender::PagedWorldspaceWidget::cellDataChanged (const QModelIndex& topLeft, + const QModelIndex& bottomRight) +{ + /// \todo check if no selected cell is affected and do not update, if that is the case + if (adjustCells()) + flagAsModified(); +} + +void CSVRender::PagedWorldspaceWidget::cellRemoved (const QModelIndex& parent, int start, + int end) +{ + if (adjustCells()) + flagAsModified(); +} + +void CSVRender::PagedWorldspaceWidget::cellAdded (const QModelIndex& index, int start, + int end) +{ + /// \todo check if no selected cell is affected and do not update, if that is the case + if (adjustCells()) + flagAsModified(); } \ No newline at end of file diff --git a/apps/opencs/view/render/pagedworldspacewidget.hpp b/apps/opencs/view/render/pagedworldspacewidget.hpp index bf6d480caa..c4fb789ee6 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.hpp +++ b/apps/opencs/view/render/pagedworldspacewidget.hpp @@ -61,6 +61,15 @@ namespace CSVRender signals: void cellSelectionChanged (const CSMWorld::CellSelection& selection); + + private slots: + + virtual void cellDataChanged (const QModelIndex& topLeft, const QModelIndex& bottomRight); + + virtual void cellRemoved (const QModelIndex& parent, int start, int end); + + virtual void cellAdded (const QModelIndex& index, int start, int end); + }; } From 205e039a39342fb27c2e95adc37a2a04961facb2 Mon Sep 17 00:00:00 2001 From: scrawl Date: Mon, 30 Jun 2014 17:58:08 +0200 Subject: [PATCH 09/37] Allow modCurrent instructions to decrease below zero (Bug #1589) --- apps/openmw/mwscript/statsextensions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index e54cdd09d8..07d137ce2a 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -260,7 +260,7 @@ namespace MWScript MWMechanics::DynamicStat stat (ptr.getClass().getCreatureStats (ptr) .getDynamic (mIndex)); - stat.setCurrent (diff + current); + stat.setCurrent (diff + current, true); ptr.getClass().getCreatureStats (ptr).setDynamic (mIndex, stat); } From 4f08efc4d7feab2e7fc0184f3758a205e6dfe3aa Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 Jun 2014 19:51:59 +0200 Subject: [PATCH 10/37] added missing combat, magic and stealth columns for creatures (Feature #1312) --- apps/opencs/model/world/columns.cpp | 3 +++ apps/opencs/model/world/columns.hpp | 3 +++ apps/opencs/model/world/refidadapterimp.cpp | 15 +++++++++++++++ apps/opencs/model/world/refidadapterimp.hpp | 7 +++++-- apps/opencs/model/world/refidcollection.cpp | 9 +++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index 7410780e08..7a2e93edfa 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -174,6 +174,9 @@ namespace CSMWorld { ColumnId_PcRank, "PC Rank" }, { ColumnId_Scope, "Scope" }, { ColumnId_ReferenceableId, "Referenceable ID" }, + { ColumnId_CombatState, "Combat" }, + { ColumnId_MagicState, "Magic" }, + { ColumnId_StealthState, "Stealth" }, { ColumnId_UseValue1, "Use value 1" }, { ColumnId_UseValue2, "Use value 2" }, diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index 1dba99b895..db31113e1d 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -167,6 +167,9 @@ namespace CSMWorld ColumnId_PcRank = 154, ColumnId_Scope = 155, ColumnId_ReferenceableId = 156, + ColumnId_CombatState = 157, + ColumnId_MagicState = 158, + ColumnId_StealthState = 159, // Allocated to a separate value range, so we don't get a collision should we ever need // to extend the number of use values. diff --git a/apps/opencs/model/world/refidadapterimp.cpp b/apps/opencs/model/world/refidadapterimp.cpp index f00e9fc77b..d9a691abdc 100644 --- a/apps/opencs/model/world/refidadapterimp.cpp +++ b/apps/opencs/model/world/refidadapterimp.cpp @@ -248,6 +248,15 @@ QVariant CSMWorld::CreatureRefIdAdapter::getData (const RefIdColumn *column, con if (column==mColumns.mOriginal) return QString::fromUtf8 (record.get().mOriginal.c_str()); + if (column==mColumns.mCombat) + return static_cast (record.get().mData.mCombat); + + if (column==mColumns.mMagic) + return static_cast (record.get().mData.mMagic); + + if (column==mColumns.mStealth) + return static_cast (record.get().mData.mStealth); + std::map::const_iterator iter = mColumns.mFlags.find (column); @@ -271,6 +280,12 @@ void CSMWorld::CreatureRefIdAdapter::setData (const RefIdColumn *column, RefIdDa record.get().mScale = value.toFloat(); else if (column==mColumns.mOriginal) record.get().mOriginal = value.toString().toUtf8().constData(); + else if (column==mColumns.mCombat) + record.get().mData.mCombat = value.toInt(); + else if (column==mColumns.mMagic) + record.get().mData.mMagic = value.toInt(); + else if (column==mColumns.mStealth) + record.get().mData.mStealth = value.toInt(); else { std::map::const_iterator iter = diff --git a/apps/opencs/model/world/refidadapterimp.hpp b/apps/opencs/model/world/refidadapterimp.hpp index bd509a86b6..034905781d 100644 --- a/apps/opencs/model/world/refidadapterimp.hpp +++ b/apps/opencs/model/world/refidadapterimp.hpp @@ -34,7 +34,7 @@ namespace CSMWorld BaseRefIdAdapter (UniversalId::Type type, const BaseColumns& base); virtual std::string getId (const RecordBase& record) const; - + virtual void setId (RecordBase& record, const std::string& id); virtual QVariant getData (const RefIdColumn *column, const RefIdData& data, int index) @@ -57,7 +57,7 @@ namespace CSMWorld { (dynamic_cast&> (record).get().mId) = id; } - + template std::string BaseRefIdAdapter::getId (const RecordBase& record) const { @@ -631,6 +631,9 @@ namespace CSMWorld const RefIdColumn *mSoul; const RefIdColumn *mScale; const RefIdColumn *mOriginal; + const RefIdColumn *mCombat; + const RefIdColumn *mMagic; + const RefIdColumn *mStealth; CreatureColumns (const ActorColumns& actorColumns); }; diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index 46a22edede..c16218a0be 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -175,6 +175,15 @@ CSMWorld::RefIdCollection::RefIdCollection() creatureColumns.mScale = &mColumns.back(); mColumns.push_back (RefIdColumn (Columns::ColumnId_OriginalCreature, ColumnBase::Display_String)); creatureColumns.mOriginal = &mColumns.back(); + mColumns.push_back ( + RefIdColumn (Columns::ColumnId_CombatState, ColumnBase::Display_Integer)); + creatureColumns.mCombat = &mColumns.back(); + mColumns.push_back ( + RefIdColumn (Columns::ColumnId_MagicState, ColumnBase::Display_Integer)); + creatureColumns.mMagic = &mColumns.back(); + mColumns.push_back ( + RefIdColumn (Columns::ColumnId_StealthState, ColumnBase::Display_Integer)); + creatureColumns.mStealth = &mColumns.back(); static const struct { From e97fd35ae6d9d50e65866182dcd84cee91452570 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 30 Jun 2014 20:40:34 +0200 Subject: [PATCH 11/37] added enchantments table --- apps/opencs/model/doc/saving.cpp | 3 +++ apps/opencs/model/world/data.cpp | 22 ++++++++++++++++++++++ apps/opencs/model/world/data.hpp | 6 ++++++ apps/opencs/model/world/universalid.cpp | 3 ++- apps/opencs/model/world/universalid.hpp | 6 ++++-- apps/opencs/view/doc/view.cpp | 9 +++++++++ apps/opencs/view/doc/view.hpp | 2 ++ apps/opencs/view/world/subviews.cpp | 1 + components/esm/loadench.cpp | 9 +++++++++ components/esm/loadench.hpp | 3 +++ 10 files changed, 61 insertions(+), 3 deletions(-) diff --git a/apps/opencs/model/doc/saving.cpp b/apps/opencs/model/doc/saving.cpp index 45b53f4fe8..ef753bb4b6 100644 --- a/apps/opencs/model/doc/saving.cpp +++ b/apps/opencs/model/doc/saving.cpp @@ -59,6 +59,9 @@ CSMDoc::Saving::Saving (Document& document, const boost::filesystem::path& proje appendStage (new WriteCollectionStage > (mDocument.getData().getSpells(), mState)); + appendStage (new WriteCollectionStage > + (mDocument.getData().getEnchantments(), mState)); + appendStage (new WriteDialogueCollectionStage (mDocument, mState, false)); appendStage (new WriteDialogueCollectionStage (mDocument, mState, true)); diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 0319d71acc..35b658ada7 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -198,6 +198,13 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) mCells.addColumn (new FlagColumn (Columns::ColumnId_InteriorSky, ESM::Cell::QuasiEx)); mCells.addColumn (new RegionColumn); + mEnchantments.addColumn (new StringIdColumn); + mEnchantments.addColumn (new RecordStateColumn); + mEnchantments.addColumn (new FixedRecordTypeColumn (UniversalId::Type_Enchantment)); + + mEnchantments.addColumn (new CostColumn); + + mRefs.addColumn (new StringIdColumn (true)); mRefs.addColumn (new RecordStateColumn); mRefs.addColumn (new FixedRecordTypeColumn (UniversalId::Type_Reference)); @@ -252,6 +259,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) addModel (new IdTable (&mTopicInfos, IdTable::Feature_ReorderWithinTopic), UniversalId::Type_TopicInfo); addModel (new IdTable (&mJournalInfos, IdTable::Feature_ReorderWithinTopic), UniversalId::Type_JournalInfo); addModel (new IdTable (&mCells, IdTable::Feature_ViewId), UniversalId::Type_Cell); + addModel (new IdTable (&mEnchantments), UniversalId::Type_Enchantment); addModel (new IdTable (&mReferenceables, IdTable::Feature_Preview), UniversalId::Type_Referenceable); addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference); @@ -457,6 +465,16 @@ CSMWorld::IdCollection& CSMWorld::Data::getFilters() return mFilters; } +const CSMWorld::IdCollection& CSMWorld::Data::getEnchantments() const +{ + return mEnchantments; +} + +CSMWorld::IdCollection& CSMWorld::Data::getEnchantments() +{ + return mEnchantments; +} + QAbstractItemModel *CSMWorld::Data::getTableModel (const CSMWorld::UniversalId& id) { std::map::iterator iter = mModelIndex.find (id.getType()); @@ -534,6 +552,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Stage::Messages& messages) case ESM::REC_REGN: mRegions.load (*mReader, mBase); break; case ESM::REC_BSGN: mBirthsigns.load (*mReader, mBase); break; case ESM::REC_SPEL: mSpells.load (*mReader, mBase); break; + case ESM::REC_ENCH: mEnchantments.load (*mReader, mBase); break; case ESM::REC_CELL: { @@ -668,6 +687,7 @@ bool CSMWorld::Data::hasId (const std::string& id) const getTopics().searchId (id)!=-1 || getJournals().searchId (id)!=-1 || getCells().searchId (id)!=-1 || + getEnchantments().searchId (id)!=-1 || getReferenceables().searchId (id)!=-1; } @@ -686,6 +706,7 @@ int CSMWorld::Data::count (RecordBase::State state) const count (state, mBirthsigns) + count (state, mSpells) + count (state, mCells) + + count (state, mEnchantments) + count (state, mReferenceables); } @@ -726,6 +747,7 @@ std::vector CSMWorld::Data::getIds (bool listDeleted) const appendIds (ids, mTopics, listDeleted); appendIds (ids, mJournals, listDeleted); appendIds (ids, mCells, listDeleted); + appendIds (ids, mEnchantments, listDeleted); appendIds (ids, mReferenceables, listDeleted); std::sort (ids.begin(), ids.end()); diff --git a/apps/opencs/model/world/data.hpp b/apps/opencs/model/world/data.hpp index edca9fdbcf..758354450d 100644 --- a/apps/opencs/model/world/data.hpp +++ b/apps/opencs/model/world/data.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -63,6 +64,7 @@ namespace CSMWorld IdCollection mSpells; IdCollection mTopics; IdCollection mJournals; + IdCollection mEnchantments; InfoCollection mTopicInfos; InfoCollection mJournalInfos; IdCollection mCells; @@ -174,6 +176,10 @@ namespace CSMWorld IdCollection& getFilters(); + const IdCollection& getEnchantments() const; + + IdCollection& getEnchantments(); + QAbstractItemModel *getTableModel (const UniversalId& id); ///< If no table model is available for \a id, an exception is thrown. /// diff --git a/apps/opencs/model/world/universalid.cpp b/apps/opencs/model/world/universalid.cpp index 88e649ace4..79273a8311 100644 --- a/apps/opencs/model/world/universalid.cpp +++ b/apps/opencs/model/world/universalid.cpp @@ -35,6 +35,7 @@ namespace { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_TopicInfos, "Topic Infos", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_JournalInfos, "Journal Infos", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Cells, "Cells", 0 }, + { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Enchantments, "Enchantments", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Referenceables, "Referenceables", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_References, @@ -92,8 +93,8 @@ namespace { CSMWorld::UniversalId::Class_SubRecord, CSMWorld::UniversalId::Type_Reference, "Reference", 0 }, { CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Filter, "Filter", ":./filter.png" }, { CSMWorld::UniversalId::Class_Collection, CSMWorld::UniversalId::Type_Scene, "Scene", 0 }, - { CSMWorld::UniversalId::Class_Collection, CSMWorld::UniversalId::Type_Preview, "Preview", 0 }, + { CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Enchantment, "Enchantment", 0 }, { CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker }; diff --git a/apps/opencs/model/world/universalid.hpp b/apps/opencs/model/world/universalid.hpp index 3bef71c75f..f92ad0bcb7 100644 --- a/apps/opencs/model/world/universalid.hpp +++ b/apps/opencs/model/world/universalid.hpp @@ -100,10 +100,12 @@ namespace CSMWorld Type_JournalInfo, Type_Scene, Type_Preview, - Type_LoadErrorLog + Type_LoadErrorLog, + Type_Enchantments, + Type_Enchantment }; - enum { NumberOfTypes = Type_LoadErrorLog+1 }; + enum { NumberOfTypes = Type_Enchantment+1 }; private: diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index e71b8435ab..a356721f60 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -146,6 +146,10 @@ void CSVDoc::View::setupMechanicsMenu() QAction *spells = new QAction (tr ("Spells"), this); connect (spells, SIGNAL (triggered()), this, SLOT (addSpellsSubView())); mechanics->addAction (spells); + + QAction *enchantments = new QAction (tr ("Enchantments"), this); + connect (enchantments, SIGNAL (triggered()), this, SLOT (addEnchantmentsSubView())); + mechanics->addAction (enchantments); } void CSVDoc::View::setupCharacterMenu() @@ -469,6 +473,11 @@ void CSVDoc::View::addJournalInfosSubView() addSubView (CSMWorld::UniversalId::Type_JournalInfos); } +void CSVDoc::View::addEnchantmentsSubView() +{ + addSubView (CSMWorld::UniversalId::Type_Enchantments); +} + void CSVDoc::View::abortOperation (int type) { mDocument->abortOperation (type); diff --git a/apps/opencs/view/doc/view.hpp b/apps/opencs/view/doc/view.hpp index 686c001dc1..1ba73c56de 100644 --- a/apps/opencs/view/doc/view.hpp +++ b/apps/opencs/view/doc/view.hpp @@ -178,6 +178,8 @@ namespace CSVDoc void addJournalInfosSubView(); + void addEnchantmentsSubView(); + void toggleShowStatusBar (bool show); void loadErrorLog(); diff --git a/apps/opencs/view/world/subviews.cpp b/apps/opencs/view/world/subviews.cpp index 022d5d02e4..8d62466968 100644 --- a/apps/opencs/view/world/subviews.cpp +++ b/apps/opencs/view/world/subviews.cpp @@ -39,6 +39,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) CSMWorld::UniversalId::Type_Regions, CSMWorld::UniversalId::Type_Birthsigns, CSMWorld::UniversalId::Type_Spells, + CSMWorld::UniversalId::Type_Enchantments, CSMWorld::UniversalId::Type_None // end marker }; diff --git a/components/esm/loadench.cpp b/components/esm/loadench.cpp index a1e885f23b..2438038337 100644 --- a/components/esm/loadench.cpp +++ b/components/esm/loadench.cpp @@ -20,4 +20,13 @@ void Enchantment::save(ESMWriter &esm) const mEffects.save(esm); } + void Enchantment::blank() + { + mData.mType = 0; + mData.mCost = 0; + mData.mCharge = 0; + mData.mAutocalc = 0; + + mEffects.mList.clear(); + } } diff --git a/components/esm/loadench.hpp b/components/esm/loadench.hpp index f6ba8c6ab3..3b7746812a 100644 --- a/components/esm/loadench.hpp +++ b/components/esm/loadench.hpp @@ -42,6 +42,9 @@ struct Enchantment void load(ESMReader &esm); void save(ESMWriter &esm) const; + + void blank(); + ///< Set record to default state (does not touch the ID). }; } #endif From ab8bee4d1a8110abef85babeaa6637431f948426 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 1 Jul 2014 09:42:56 +0200 Subject: [PATCH 12/37] added enchantment type column to enchantment table --- apps/opencs/model/world/columnbase.hpp | 1 + apps/opencs/model/world/columnimp.hpp | 27 ++++++++++++++++++++++++++ apps/opencs/model/world/columns.cpp | 7 +++++++ apps/opencs/model/world/columns.hpp | 1 + apps/opencs/model/world/data.cpp | 1 + apps/opencs/view/doc/viewmanager.cpp | 1 + 6 files changed, 38 insertions(+) diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index fe310d0aa4..3de610320c 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -89,6 +89,7 @@ namespace CSMWorld Display_RefRecordType, Display_DialogueType, Display_QuestStatusType, + Display_EnchantmentType, Display_Gender }; diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 6976b454d9..8e73cc2447 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -1682,6 +1682,33 @@ namespace CSMWorld return true; } }; + + template + struct EnchantmentTypeColumn : public Column + { + EnchantmentTypeColumn() + : Column (Columns::ColumnId_EnchantmentType, ColumnBase::Display_EnchantmentType) + {} + + virtual QVariant get (const Record& record) const + { + return static_cast (record.get().mData.mType); + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + + record2.mData.mType = data.toInt(); + + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; } #endif diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index 7a2e93edfa..0292b2c5ec 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -177,6 +177,7 @@ namespace CSMWorld { ColumnId_CombatState, "Combat" }, { ColumnId_MagicState, "Magic" }, { ColumnId_StealthState, "Stealth" }, + { ColumnId_EnchantmentType, "Enchantment Type" }, { ColumnId_UseValue1, "Use value 1" }, { ColumnId_UseValue2, "Use value 2" }, @@ -302,6 +303,11 @@ namespace "Male", "Female", 0 }; + static const char *sEnchantmentTypes[] = + { + "Cast Once", "When Strikes", "When Used", "Constant Effect", 0 + }; + const char **getEnumNames (CSMWorld::Columns::ColumnId column) { switch (column) @@ -319,6 +325,7 @@ namespace case CSMWorld::Columns::ColumnId_DialogueType: return sDialogueTypeEnums; case CSMWorld::Columns::ColumnId_QuestStatusType: return sQuestStatusTypes; case CSMWorld::Columns::ColumnId_Gender: return sGenderEnums; + case CSMWorld::Columns::ColumnId_EnchantmentType: return sEnchantmentTypes; default: return 0; } diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index db31113e1d..0b65b2932c 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -170,6 +170,7 @@ namespace CSMWorld ColumnId_CombatState = 157, ColumnId_MagicState = 158, ColumnId_StealthState = 159, + ColumnId_EnchantmentType = 160, // Allocated to a separate value range, so we don't get a collision should we ever need // to extend the number of use values. diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 35b658ada7..bc2d5287e8 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -201,6 +201,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) mEnchantments.addColumn (new StringIdColumn); mEnchantments.addColumn (new RecordStateColumn); mEnchantments.addColumn (new FixedRecordTypeColumn (UniversalId::Type_Enchantment)); + mEnchantments.addColumn (new EnchantmentTypeColumn); mEnchantments.addColumn (new CostColumn); diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index f4d6fc6cb5..14607b49ea 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -78,6 +78,7 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager) { CSMWorld::ColumnBase::Display_WeaponType, CSMWorld::Columns::ColumnId_WeaponType, false }, { CSMWorld::ColumnBase::Display_DialogueType, CSMWorld::Columns::ColumnId_DialogueType, false }, { CSMWorld::ColumnBase::Display_QuestStatusType, CSMWorld::Columns::ColumnId_QuestStatusType, false }, + { CSMWorld::ColumnBase::Display_EnchantmentType, CSMWorld::Columns::ColumnId_EnchantmentType, false }, { CSMWorld::ColumnBase::Display_Gender, CSMWorld::Columns::ColumnId_Gender, true } }; From 5649552f1805a130c9915549e9fa40e7e7e4397b Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 1 Jul 2014 09:50:43 +0200 Subject: [PATCH 13/37] added other missing columns for enchantment table; fixed dialogue subviews for enchantment records --- apps/opencs/model/world/columnimp.hpp | 49 +++++++++++++++++++++++++++ apps/opencs/model/world/columns.cpp | 1 + apps/opencs/model/world/data.cpp | 4 +-- apps/opencs/view/world/subviews.cpp | 1 + 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 8e73cc2447..d31d7cf294 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -1709,6 +1709,55 @@ namespace CSMWorld return true; } }; + + template + struct ChargesColumn2 : public Column + { + ChargesColumn2() : Column (Columns::ColumnId_Charges, ColumnBase::Display_Integer) {} + + virtual QVariant get (const Record& record) const + { + return record.get().mData.mCharge; + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + record2.mData.mCharge = data.toInt(); + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; + + template + struct AutoCalcColumn : public Column + { + AutoCalcColumn() : Column (Columns::ColumnId_AutoCalc, ColumnBase::Display_Boolean) + {} + + virtual QVariant get (const Record& record) const + { + return record.get().mData.mAutocalc!=0; + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + + record2.mData.mAutocalc = data.toInt(); + + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; } #endif diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index 0292b2c5ec..4f88e7b1b9 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -178,6 +178,7 @@ namespace CSMWorld { ColumnId_MagicState, "Magic" }, { ColumnId_StealthState, "Stealth" }, { ColumnId_EnchantmentType, "Enchantment Type" }, + { ColumnId_AutoCalc, "Auto Calc" }, { ColumnId_UseValue1, "Use value 1" }, { ColumnId_UseValue2, "Use value 2" }, diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index bc2d5287e8..12de19a828 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -202,9 +202,9 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) mEnchantments.addColumn (new RecordStateColumn); mEnchantments.addColumn (new FixedRecordTypeColumn (UniversalId::Type_Enchantment)); mEnchantments.addColumn (new EnchantmentTypeColumn); - mEnchantments.addColumn (new CostColumn); - + mEnchantments.addColumn (new ChargesColumn2); + mEnchantments.addColumn (new AutoCalcColumn); mRefs.addColumn (new StringIdColumn (true)); mRefs.addColumn (new RecordStateColumn); diff --git a/apps/opencs/view/world/subviews.cpp b/apps/opencs/view/world/subviews.cpp index 8d62466968..c1b5393d30 100644 --- a/apps/opencs/view/world/subviews.cpp +++ b/apps/opencs/view/world/subviews.cpp @@ -93,6 +93,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) CSMWorld::UniversalId::Type_Filter, CSMWorld::UniversalId::Type_Sound, CSMWorld::UniversalId::Type_Faction, + CSMWorld::UniversalId::Type_Enchantment, CSMWorld::UniversalId::Type_None // end marker }; From d96ed38d498a7b03be4d6725ed23bf52c4af3184 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 1 Jul 2014 12:37:22 +0200 Subject: [PATCH 14/37] added body part table --- apps/opencs/model/doc/saving.cpp | 3 ++ apps/opencs/model/world/columnimp.hpp | 67 +++++++++++++++++++++++-- apps/opencs/model/world/columns.cpp | 2 +- apps/opencs/model/world/columns.hpp | 1 + apps/opencs/model/world/data.cpp | 24 +++++++++ apps/opencs/model/world/data.hpp | 6 +++ apps/opencs/model/world/universalid.cpp | 2 + apps/opencs/model/world/universalid.hpp | 6 ++- apps/opencs/view/doc/view.cpp | 9 ++++ apps/opencs/view/doc/view.hpp | 2 + apps/opencs/view/world/subviews.cpp | 2 + components/esm/loadbody.cpp | 10 ++++ components/esm/loadbody.hpp | 3 ++ 13 files changed, 130 insertions(+), 7 deletions(-) diff --git a/apps/opencs/model/doc/saving.cpp b/apps/opencs/model/doc/saving.cpp index ef753bb4b6..95631eea9c 100644 --- a/apps/opencs/model/doc/saving.cpp +++ b/apps/opencs/model/doc/saving.cpp @@ -62,6 +62,9 @@ CSMDoc::Saving::Saving (Document& document, const boost::filesystem::path& proje appendStage (new WriteCollectionStage > (mDocument.getData().getEnchantments(), mState)); + appendStage (new WriteCollectionStage > + (mDocument.getData().getBodyParts(), mState)); + appendStage (new WriteDialogueCollectionStage (mDocument, mState, false)); appendStage (new WriteDialogueCollectionStage (mDocument, mState, true)); diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index d31d7cf294..5844e97a7b 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -463,14 +463,21 @@ namespace CSMWorld struct FlagColumn : public Column { int mMask; + bool mInverted; - FlagColumn (int columnId, int mask) - : Column (columnId, ColumnBase::Display_Boolean), mMask (mask) + FlagColumn (int columnId, int mask, bool inverted = false) + : Column (columnId, ColumnBase::Display_Boolean), mMask (mask), + mInverted (inverted) {} virtual QVariant get (const Record& record) const { - return (record.get().mData.mFlags & mMask)!=0; + bool flag = (record.get().mData.mFlags & mMask)!=0; + + if (mInverted) + flag = !flag; + + return flag; } virtual void set (Record& record, const QVariant& data) @@ -479,7 +486,7 @@ namespace CSMWorld int flags = record2.mData.mFlags & ~mMask; - if (data.toInt()) + if ((data.toInt()!=0)!=mInverted) flags |= mMask; record2.mData.mFlags = flags; @@ -1758,6 +1765,58 @@ namespace CSMWorld return true; } }; + + template + struct ModelColumn : public Column + { + ModelColumn() : Column (Columns::ColumnId_Model, ColumnBase::Display_String) {} + + virtual QVariant get (const Record& record) const + { + return QString::fromUtf8 (record.get().mModel.c_str()); + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + + record2.mModel = data.toString().toUtf8().constData(); + + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; + + template + struct VampireColumn : public Column + { + VampireColumn() : Column (Columns::ColumnId_Vampire, ColumnBase::Display_Boolean) + {} + + virtual QVariant get (const Record& record) const + { + return record.get().mData.mVampire!=0; + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + + record2.mData.mVampire = data.toInt(); + + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; + } #endif diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index 4f88e7b1b9..3d363aac4b 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -178,7 +178,7 @@ namespace CSMWorld { ColumnId_MagicState, "Magic" }, { ColumnId_StealthState, "Stealth" }, { ColumnId_EnchantmentType, "Enchantment Type" }, - { ColumnId_AutoCalc, "Auto Calc" }, + { ColumnId_Vampire, "Vampire" }, { ColumnId_UseValue1, "Use value 1" }, { ColumnId_UseValue2, "Use value 2" }, diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index 0b65b2932c..bb6c0e4531 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -171,6 +171,7 @@ namespace CSMWorld ColumnId_MagicState = 158, ColumnId_StealthState = 159, ColumnId_EnchantmentType = 160, + ColumnId_Vampire = 161, // Allocated to a separate value range, so we don't get a collision should we ever need // to extend the number of use values. diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 12de19a828..0353d21426 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -206,6 +206,18 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) mEnchantments.addColumn (new ChargesColumn2); mEnchantments.addColumn (new AutoCalcColumn); + mBodyParts.addColumn (new StringIdColumn); + mBodyParts.addColumn (new RecordStateColumn); + mBodyParts.addColumn (new FixedRecordTypeColumn (UniversalId::Type_BodyPart)); + + mBodyParts.addColumn (new VampireColumn); + mBodyParts.addColumn (new FlagColumn (Columns::ColumnId_Female, ESM::BodyPart::BPF_Female)); + mBodyParts.addColumn (new FlagColumn (Columns::ColumnId_Playable, ESM::BodyPart::BPF_NotPlayable, true)); + + mBodyParts.addColumn (new ModelColumn); + mBodyParts.addColumn (new RaceColumn); + + mRefs.addColumn (new StringIdColumn (true)); mRefs.addColumn (new RecordStateColumn); mRefs.addColumn (new FixedRecordTypeColumn (UniversalId::Type_Reference)); @@ -261,6 +273,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) addModel (new IdTable (&mJournalInfos, IdTable::Feature_ReorderWithinTopic), UniversalId::Type_JournalInfo); addModel (new IdTable (&mCells, IdTable::Feature_ViewId), UniversalId::Type_Cell); addModel (new IdTable (&mEnchantments), UniversalId::Type_Enchantment); + addModel (new IdTable (&mBodyParts), UniversalId::Type_BodyPart); addModel (new IdTable (&mReferenceables, IdTable::Feature_Preview), UniversalId::Type_Referenceable); addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference); @@ -476,6 +489,16 @@ CSMWorld::IdCollection& CSMWorld::Data::getEnchantments() return mEnchantments; } +const CSMWorld::IdCollection& CSMWorld::Data::getBodyParts() const +{ + return mBodyParts; +} + +CSMWorld::IdCollection& CSMWorld::Data::getBodyParts() +{ + return mBodyParts; +} + QAbstractItemModel *CSMWorld::Data::getTableModel (const CSMWorld::UniversalId& id) { std::map::iterator iter = mModelIndex.find (id.getType()); @@ -554,6 +577,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Stage::Messages& messages) case ESM::REC_BSGN: mBirthsigns.load (*mReader, mBase); break; case ESM::REC_SPEL: mSpells.load (*mReader, mBase); break; case ESM::REC_ENCH: mEnchantments.load (*mReader, mBase); break; + case ESM::REC_BODY: mBodyParts.load (*mReader, mBase); break; case ESM::REC_CELL: { diff --git a/apps/opencs/model/world/data.hpp b/apps/opencs/model/world/data.hpp index 758354450d..9bdb449e0a 100644 --- a/apps/opencs/model/world/data.hpp +++ b/apps/opencs/model/world/data.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -65,6 +66,7 @@ namespace CSMWorld IdCollection mTopics; IdCollection mJournals; IdCollection mEnchantments; + IdCollection mBodyParts; InfoCollection mTopicInfos; InfoCollection mJournalInfos; IdCollection mCells; @@ -180,6 +182,10 @@ namespace CSMWorld IdCollection& getEnchantments(); + const IdCollection& getBodyParts() const; + + IdCollection& getBodyParts(); + QAbstractItemModel *getTableModel (const UniversalId& id); ///< If no table model is available for \a id, an exception is thrown. /// diff --git a/apps/opencs/model/world/universalid.cpp b/apps/opencs/model/world/universalid.cpp index 79273a8311..3a5f3f0439 100644 --- a/apps/opencs/model/world/universalid.cpp +++ b/apps/opencs/model/world/universalid.cpp @@ -36,6 +36,7 @@ namespace { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_JournalInfos, "Journal Infos", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Cells, "Cells", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Enchantments, "Enchantments", 0 }, + { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_BodyParts, "Body Parts", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Referenceables, "Referenceables", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_References, @@ -95,6 +96,7 @@ namespace { CSMWorld::UniversalId::Class_Collection, CSMWorld::UniversalId::Type_Scene, "Scene", 0 }, { CSMWorld::UniversalId::Class_Collection, CSMWorld::UniversalId::Type_Preview, "Preview", 0 }, { CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Enchantment, "Enchantment", 0 }, + { CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_BodyPart, "Body Part", 0 }, { CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker }; diff --git a/apps/opencs/model/world/universalid.hpp b/apps/opencs/model/world/universalid.hpp index f92ad0bcb7..c7514336f1 100644 --- a/apps/opencs/model/world/universalid.hpp +++ b/apps/opencs/model/world/universalid.hpp @@ -102,10 +102,12 @@ namespace CSMWorld Type_Preview, Type_LoadErrorLog, Type_Enchantments, - Type_Enchantment + Type_Enchantment, + Type_BodyParts, + Type_BodyPart }; - enum { NumberOfTypes = Type_Enchantment+1 }; + enum { NumberOfTypes = Type_BodyPart+1 }; private: diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index a356721f60..6a807f086a 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -191,6 +191,10 @@ void CSVDoc::View::setupCharacterMenu() QAction *journalInfos = new QAction (tr ("Journal Infos"), this); connect (journalInfos, SIGNAL (triggered()), this, SLOT (addJournalInfosSubView())); characters->addAction (journalInfos); + + QAction *bodyParts = new QAction (tr ("Body Parts"), this); + connect (bodyParts, SIGNAL (triggered()), this, SLOT (addBodyPartsSubView())); + characters->addAction (bodyParts); } void CSVDoc::View::setupAssetsMenu() @@ -478,6 +482,11 @@ void CSVDoc::View::addEnchantmentsSubView() addSubView (CSMWorld::UniversalId::Type_Enchantments); } +void CSVDoc::View::addBodyPartsSubView() +{ + addSubView (CSMWorld::UniversalId::Type_BodyParts); +} + void CSVDoc::View::abortOperation (int type) { mDocument->abortOperation (type); diff --git a/apps/opencs/view/doc/view.hpp b/apps/opencs/view/doc/view.hpp index 1ba73c56de..a227997c21 100644 --- a/apps/opencs/view/doc/view.hpp +++ b/apps/opencs/view/doc/view.hpp @@ -180,6 +180,8 @@ namespace CSVDoc void addEnchantmentsSubView(); + void addBodyPartsSubView(); + void toggleShowStatusBar (bool show); void loadErrorLog(); diff --git a/apps/opencs/view/world/subviews.cpp b/apps/opencs/view/world/subviews.cpp index c1b5393d30..8c666c1fed 100644 --- a/apps/opencs/view/world/subviews.cpp +++ b/apps/opencs/view/world/subviews.cpp @@ -40,6 +40,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) CSMWorld::UniversalId::Type_Birthsigns, CSMWorld::UniversalId::Type_Spells, CSMWorld::UniversalId::Type_Enchantments, + CSMWorld::UniversalId::Type_BodyParts, CSMWorld::UniversalId::Type_None // end marker }; @@ -94,6 +95,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) CSMWorld::UniversalId::Type_Sound, CSMWorld::UniversalId::Type_Faction, CSMWorld::UniversalId::Type_Enchantment, + CSMWorld::UniversalId::Type_BodyPart, CSMWorld::UniversalId::Type_None // end marker }; diff --git a/components/esm/loadbody.cpp b/components/esm/loadbody.cpp index c45f8d252d..9a1164d041 100644 --- a/components/esm/loadbody.cpp +++ b/components/esm/loadbody.cpp @@ -22,4 +22,14 @@ void BodyPart::save(ESMWriter &esm) const esm.writeHNT("BYDT", mData, 4); } + void BodyPart::blank() + { + mData.mPart = 0; + mData.mVampire = 0; + mData.mFlags = 0; + mData.mType = 0; + + mModel.clear(); + mRace.clear(); + } } diff --git a/components/esm/loadbody.hpp b/components/esm/loadbody.hpp index 9623caa31e..286e3f96e3 100644 --- a/components/esm/loadbody.hpp +++ b/components/esm/loadbody.hpp @@ -60,6 +60,9 @@ struct BodyPart void load(ESMReader &esm); void save(ESMWriter &esm) const; + + void blank(); + ///< Set record to default state (does not touch the ID). }; } #endif From 37a2b48fa285eea3b0060a4b4afb2b67e004f474 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 1 Jul 2014 14:28:12 +0200 Subject: [PATCH 15/37] added missing type columns to body part table --- apps/opencs/model/world/columnbase.hpp | 2 + apps/opencs/model/world/columnimp.hpp | 53 ++++++++++++++++++++++++++ apps/opencs/model/world/columns.cpp | 15 ++++++++ apps/opencs/model/world/columns.hpp | 2 + apps/opencs/model/world/data.cpp | 5 +-- apps/opencs/view/doc/viewmanager.cpp | 2 + 6 files changed, 76 insertions(+), 3 deletions(-) diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index 3de610320c..39c700fa14 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -90,6 +90,8 @@ namespace CSMWorld Display_DialogueType, Display_QuestStatusType, Display_EnchantmentType, + Display_BodyPartType, + Display_MeshType, Display_Gender }; diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 5844e97a7b..72f2099fae 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -1817,6 +1817,59 @@ namespace CSMWorld } }; + template + struct BodyPartTypeColumn : public Column + { + BodyPartTypeColumn() + : Column (Columns::ColumnId_BodyPartType, ColumnBase::Display_BodyPartType) + {} + + virtual QVariant get (const Record& record) const + { + return static_cast (record.get().mData.mPart); + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + + record2.mData.mPart = data.toInt(); + + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; + + template + struct MeshTypeColumn : public Column + { + MeshTypeColumn() + : Column (Columns::ColumnId_MeshType, ColumnBase::Display_MeshType) + {} + + virtual QVariant get (const Record& record) const + { + return static_cast (record.get().mData.mType); + } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT record2 = record.get(); + + record2.mData.mType = data.toInt(); + + record.setModified (record2); + } + + virtual bool isEditable() const + { + return true; + } + }; } #endif diff --git a/apps/opencs/model/world/columns.cpp b/apps/opencs/model/world/columns.cpp index 3d363aac4b..05df0b7358 100644 --- a/apps/opencs/model/world/columns.cpp +++ b/apps/opencs/model/world/columns.cpp @@ -179,6 +179,8 @@ namespace CSMWorld { ColumnId_StealthState, "Stealth" }, { ColumnId_EnchantmentType, "Enchantment Type" }, { ColumnId_Vampire, "Vampire" }, + { ColumnId_BodyPartType, "Bodypart Type" }, + { ColumnId_MeshType, "Mesh Type" }, { ColumnId_UseValue1, "Use value 1" }, { ColumnId_UseValue2, "Use value 2" }, @@ -309,6 +311,17 @@ namespace "Cast Once", "When Strikes", "When Used", "Constant Effect", 0 }; + static const char *sBodyPartTypes[] = + { + "Head", "Hair", "Neck", "Chest", "Groin", "Hand", "Wrist", "Forearm", "Upper Arm", + "Foot", "Ankle", "Knee", "Upper Leg", "Clavicle", "Tail", 0 + }; + + static const char *sMeshTypes[] = + { + "Skin", "Clothing", "Armour", 0 + }; + const char **getEnumNames (CSMWorld::Columns::ColumnId column) { switch (column) @@ -327,6 +340,8 @@ namespace case CSMWorld::Columns::ColumnId_QuestStatusType: return sQuestStatusTypes; case CSMWorld::Columns::ColumnId_Gender: return sGenderEnums; case CSMWorld::Columns::ColumnId_EnchantmentType: return sEnchantmentTypes; + case CSMWorld::Columns::ColumnId_BodyPartType: return sBodyPartTypes; + case CSMWorld::Columns::ColumnId_MeshType: return sMeshTypes; default: return 0; } diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index bb6c0e4531..326a025965 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -172,6 +172,8 @@ namespace CSMWorld ColumnId_StealthState = 159, ColumnId_EnchantmentType = 160, ColumnId_Vampire = 161, + ColumnId_BodyPartType = 162, + ColumnId_MeshType = 163, // Allocated to a separate value range, so we don't get a collision should we ever need // to extend the number of use values. diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 0353d21426..aad5d3fa2e 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -209,15 +209,14 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding) mBodyParts.addColumn (new StringIdColumn); mBodyParts.addColumn (new RecordStateColumn); mBodyParts.addColumn (new FixedRecordTypeColumn (UniversalId::Type_BodyPart)); - + mBodyParts.addColumn (new BodyPartTypeColumn); mBodyParts.addColumn (new VampireColumn); mBodyParts.addColumn (new FlagColumn (Columns::ColumnId_Female, ESM::BodyPart::BPF_Female)); mBodyParts.addColumn (new FlagColumn (Columns::ColumnId_Playable, ESM::BodyPart::BPF_NotPlayable, true)); - + mBodyParts.addColumn (new MeshTypeColumn); mBodyParts.addColumn (new ModelColumn); mBodyParts.addColumn (new RaceColumn); - mRefs.addColumn (new StringIdColumn (true)); mRefs.addColumn (new RecordStateColumn); mRefs.addColumn (new FixedRecordTypeColumn (UniversalId::Type_Reference)); diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 14607b49ea..6f4217aa8c 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -79,6 +79,8 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager) { CSMWorld::ColumnBase::Display_DialogueType, CSMWorld::Columns::ColumnId_DialogueType, false }, { CSMWorld::ColumnBase::Display_QuestStatusType, CSMWorld::Columns::ColumnId_QuestStatusType, false }, { CSMWorld::ColumnBase::Display_EnchantmentType, CSMWorld::Columns::ColumnId_EnchantmentType, false }, + { CSMWorld::ColumnBase::Display_BodyPartType, CSMWorld::Columns::ColumnId_BodyPartType, false }, + { CSMWorld::ColumnBase::Display_MeshType, CSMWorld::Columns::ColumnId_MeshType, false }, { CSMWorld::ColumnBase::Display_Gender, CSMWorld::Columns::ColumnId_Gender, true } }; From df62c06acf05af006e8599ea5aec4d366c78043b Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 1 Jul 2014 21:41:23 +0200 Subject: [PATCH 16/37] Print exterior grid position in betaComment --- apps/openmw/mwscript/miscextensions.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwscript/miscextensions.cpp b/apps/openmw/mwscript/miscextensions.cpp index 76b99d04ab..a4c74be6b2 100644 --- a/apps/openmw/mwscript/miscextensions.cpp +++ b/apps/openmw/mwscript/miscextensions.cpp @@ -24,6 +24,7 @@ #include "../mwworld/player.hpp" #include "../mwworld/containerstore.hpp" #include "../mwworld/esmstore.hpp" +#include "../mwworld/cellstore.hpp" #include "../mwmechanics/npcstats.hpp" #include "../mwmechanics/creaturestats.hpp" @@ -886,7 +887,8 @@ namespace MWScript { MWWorld::CellStore* cell = ptr.getCell(); msg << "Cell: " << MWBase::Environment::get().getWorld()->getCellName(cell) << std::endl; - + if (cell->getCell()->isExterior()) + msg << "Grid: " << cell->getCell()->getGridX() << " " << cell->getCell()->getGridY() << std::endl; Ogre::Vector3 pos (ptr.getRefData().getPosition().pos); msg << "Coordinates: " << pos << std::endl; } From e666ddfe189bc1ce6da631dbc609cfab1d9d04f5 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 1 Jul 2014 21:42:11 +0200 Subject: [PATCH 17/37] Fix list of moved references being discarded (Fixes #1613) --- apps/openmw/mwworld/store.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/openmw/mwworld/store.cpp b/apps/openmw/mwworld/store.cpp index fdeb290e5f..e2a3b5436e 100644 --- a/apps/openmw/mwworld/store.cpp +++ b/apps/openmw/mwworld/store.cpp @@ -90,6 +90,8 @@ void Store::load(ESM::ESMReader &esm, const std::string &id) wipecell->mLeasedRefs.erase(it_lease); *itold = *it; } + else + oldcell->mMovedRefs.push_back(*it); } // We don't need to merge mLeasedRefs of cell / oldcell. This list is filled when another cell moves a From 6cd6578a88ed613c395c54eeffb5a7f680a69293 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 1 Jul 2014 21:44:16 +0200 Subject: [PATCH 18/37] Handle Deleted moved references (Bug #1613) --- apps/openmw/mwworld/store.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwworld/store.cpp b/apps/openmw/mwworld/store.cpp index e2a3b5436e..7ef06e841a 100644 --- a/apps/openmw/mwworld/store.cpp +++ b/apps/openmw/mwworld/store.cpp @@ -23,11 +23,14 @@ void Store::handleMovedCellRefs(ESM::ESMReader& esm, ESM::Cell* cell) // We should not need to test for duplicates, as this part of the code is pre-cell merge. cell->mMovedRefs.push_back(cMRef); // But there may be duplicates here! - ESM::CellRefTracker::iterator iter = std::find(cellAlt->mLeasedRefs.begin(), cellAlt->mLeasedRefs.end(), ref.mRefNum); - if (iter == cellAlt->mLeasedRefs.end()) - cellAlt->mLeasedRefs.push_back(ref); - else - *iter = ref; + if (!deleted) + { + ESM::CellRefTracker::iterator iter = std::find(cellAlt->mLeasedRefs.begin(), cellAlt->mLeasedRefs.end(), ref.mRefNum); + if (iter == cellAlt->mLeasedRefs.end()) + cellAlt->mLeasedRefs.push_back(ref); + else + *iter = ref; + } } } From 9ce92302d72daa87040fa00004c15eec5ff17fdb Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Thu, 3 Jul 2014 10:22:39 +0200 Subject: [PATCH 19/37] interpret empty filter strings as no filter instead of a broken filter (Fixes #1311) --- apps/opencs/model/filter/parser.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/opencs/model/filter/parser.cpp b/apps/opencs/model/filter/parser.cpp index 6e286d943b..bec445cbc4 100644 --- a/apps/opencs/model/filter/parser.cpp +++ b/apps/opencs/model/filter/parser.cpp @@ -550,7 +550,12 @@ bool CSMFilter::Parser::parse (const std::string& filter, bool allowPredefined) if (allowPredefined) token = getNextToken(); - if (!allowPredefined || token==Token (Token::Type_OneShot)) + if (allowPredefined && token==Token (Token::Type_EOS)) + { + mFilter.reset(); + return true; + } + else if (!allowPredefined || token==Token (Token::Type_OneShot)) { boost::shared_ptr node = parseImp (true, token!=Token (Token::Type_OneShot)); From 174533598214019a61406bdf568d9d4710145ea6 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Thu, 3 Jul 2014 10:56:05 +0200 Subject: [PATCH 20/37] body part table fix: forgot to include body parts in ID listings --- apps/opencs/model/world/data.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index aad5d3fa2e..d07e8784e3 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -712,6 +712,7 @@ bool CSMWorld::Data::hasId (const std::string& id) const getJournals().searchId (id)!=-1 || getCells().searchId (id)!=-1 || getEnchantments().searchId (id)!=-1 || + getBodyParts().searchId (id)!=-1 || getReferenceables().searchId (id)!=-1; } @@ -731,6 +732,7 @@ int CSMWorld::Data::count (RecordBase::State state) const count (state, mSpells) + count (state, mCells) + count (state, mEnchantments) + + count (state, mBodyParts) + count (state, mReferenceables); } @@ -772,6 +774,7 @@ std::vector CSMWorld::Data::getIds (bool listDeleted) const appendIds (ids, mJournals, listDeleted); appendIds (ids, mCells, listDeleted); appendIds (ids, mEnchantments, listDeleted); + appendIds (ids, mBodyParts, listDeleted); appendIds (ids, mReferenceables, listDeleted); std::sort (ids.begin(), ids.end()); From 879ab49e9ccd973400cc37a24b9b7511c245dba0 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Fri, 4 Jul 2014 12:46:57 +0200 Subject: [PATCH 21/37] added resources manager --- apps/opencs/CMakeLists.txt | 2 +- apps/opencs/editor.cpp | 2 + apps/opencs/model/doc/document.cpp | 6 +- apps/opencs/model/doc/document.hpp | 7 +- apps/opencs/model/doc/documentmanager.cpp | 7 +- apps/opencs/model/doc/documentmanager.hpp | 6 ++ apps/opencs/model/world/data.cpp | 11 ++- apps/opencs/model/world/data.hpp | 9 ++- apps/opencs/model/world/resources.cpp | 78 ++++++++++++++++++++ apps/opencs/model/world/resources.hpp | 30 ++++++++ apps/opencs/model/world/resourcesmanager.cpp | 24 ++++++ apps/opencs/model/world/resourcesmanager.hpp | 24 ++++++ apps/opencs/model/world/universalid.cpp | 15 +++- apps/opencs/model/world/universalid.hpp | 19 ++++- 14 files changed, 228 insertions(+), 12 deletions(-) create mode 100644 apps/opencs/model/world/resources.cpp create mode 100644 apps/opencs/model/world/resources.hpp create mode 100644 apps/opencs/model/world/resourcesmanager.cpp create mode 100644 apps/opencs/model/world/resourcesmanager.hpp diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index c52f9d9bca..0addaab524 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -24,7 +24,7 @@ opencs_units (model/world opencs_units_noqt (model/world universalid record commands columnbase scriptcontext cell refidcollection - refidadapter refiddata refidadapterimp ref collectionbase refcollection columns infocollection tablemimedata cellcoordinates cellselection + refidadapter refiddata refidadapterimp ref collectionbase refcollection columns infocollection tablemimedata cellcoordinates cellselection resources resourcesmanager ) opencs_hdrs_noqt (model/world diff --git a/apps/opencs/editor.cpp b/apps/opencs/editor.cpp index b003735874..b3513a7f15 100644 --- a/apps/opencs/editor.cpp +++ b/apps/opencs/editor.cpp @@ -35,6 +35,8 @@ CS::Editor::Editor (OgreInit::OgreInit& ogreInit) Bsa::registerResources (Files::Collections (config.first, !mFsStrict), config.second, true, mFsStrict); + mDocumentManager.listResources(); + mNewGame.setLocalData (mLocal); mFileDialog.setLocalData (mLocal); diff --git a/apps/opencs/model/doc/document.cpp b/apps/opencs/model/doc/document.cpp index f452008ac9..23a47b3130 100644 --- a/apps/opencs/model/doc/document.cpp +++ b/apps/opencs/model/doc/document.cpp @@ -2205,9 +2205,9 @@ void CSMDoc::Document::createBase() CSMDoc::Document::Document (const Files::ConfigurationManager& configuration, const std::vector< boost::filesystem::path >& files, bool new_, const boost::filesystem::path& savePath, const boost::filesystem::path& resDir, - ToUTF8::FromType encoding) -: mSavePath (savePath), mContentFiles (files), mNew (new_), mData (encoding), mTools (mData), - mResDir(resDir), + ToUTF8::FromType encoding, const CSMWorld::ResourcesManager& resourcesManager) +: mSavePath (savePath), mContentFiles (files), mNew (new_), mData (encoding, resourcesManager), + mTools (mData), mResDir(resDir), mProjectPath ((configuration.getUserDataPath() / "projects") / (savePath.filename().string() + ".project")), mSaving (*this, mProjectPath, encoding) diff --git a/apps/opencs/model/doc/document.hpp b/apps/opencs/model/doc/document.hpp index a6f8aaae28..d092b47c8a 100644 --- a/apps/opencs/model/doc/document.hpp +++ b/apps/opencs/model/doc/document.hpp @@ -31,6 +31,11 @@ namespace Files class ConfigurationManager; } +namespace CSMWorld +{ + class ResourcesManager; +} + namespace CSMDoc { class Document : public QObject @@ -73,7 +78,7 @@ namespace CSMDoc Document (const Files::ConfigurationManager& configuration, const std::vector< boost::filesystem::path >& files, bool new_, const boost::filesystem::path& savePath, const boost::filesystem::path& resDir, - ToUTF8::FromType encoding); + ToUTF8::FromType encoding, const CSMWorld::ResourcesManager& resourcesManager); ~Document(); diff --git a/apps/opencs/model/doc/documentmanager.cpp b/apps/opencs/model/doc/documentmanager.cpp index 4020a8f72c..6953db0edb 100644 --- a/apps/opencs/model/doc/documentmanager.cpp +++ b/apps/opencs/model/doc/documentmanager.cpp @@ -52,7 +52,7 @@ CSMDoc::DocumentManager::~DocumentManager() void CSMDoc::DocumentManager::addDocument (const std::vector& files, const boost::filesystem::path& savePath, bool new_) { - Document *document = new Document (mConfiguration, files, new_, savePath, mResDir, mEncoding); + Document *document = new Document (mConfiguration, files, new_, savePath, mResDir, mEncoding, mResourcesManager); mDocuments.push_back (document); @@ -85,6 +85,11 @@ void CSMDoc::DocumentManager::setEncoding (ToUTF8::FromType encoding) mEncoding = encoding; } +void CSMDoc::DocumentManager::listResources() +{ + mResourcesManager.listResources(); +} + void CSMDoc::DocumentManager::documentLoaded (Document *document) { emit documentAdded (document); diff --git a/apps/opencs/model/doc/documentmanager.hpp b/apps/opencs/model/doc/documentmanager.hpp index d6824112bb..cebae6f6d4 100644 --- a/apps/opencs/model/doc/documentmanager.hpp +++ b/apps/opencs/model/doc/documentmanager.hpp @@ -11,6 +11,8 @@ #include +#include "../world/resourcesmanager.hpp" + #include "loader.hpp" namespace Files @@ -31,6 +33,7 @@ namespace CSMDoc QThread mLoaderThread; Loader mLoader; ToUTF8::FromType mEncoding; + CSMWorld::ResourcesManager mResourcesManager; DocumentManager (const DocumentManager&); DocumentManager& operator= (const DocumentManager&); @@ -50,6 +53,9 @@ namespace CSMDoc void setEncoding (ToUTF8::FromType encoding); + /// Ask OGRE for a list of available resources. + void listResources(); + private: boost::filesystem::path mResDir; diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index d07e8784e3..823a14395f 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -15,6 +15,7 @@ #include "columnimp.hpp" #include "regionmap.hpp" #include "columns.hpp" +#include "resourcesmanager.hpp" void CSMWorld::Data::addModel (QAbstractItemModel *model, UniversalId::Type type, bool update) { @@ -56,8 +57,9 @@ int CSMWorld::Data::count (RecordBase::State state, const CollectionBase& collec return number; } -CSMWorld::Data::Data (ToUTF8::FromType encoding) -: mEncoder (encoding), mRefs (mCells), mReader (0), mDialogue (0) +CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourcesManager) +: mEncoder (encoding), mRefs (mCells), mResourcesManager (resourcesManager), mReader (0), + mDialogue (0) { mGlobals.addColumn (new StringIdColumn); mGlobals.addColumn (new RecordStateColumn); @@ -498,6 +500,11 @@ CSMWorld::IdCollection& CSMWorld::Data::getBodyParts() return mBodyParts; } +const CSMWorld::Resources& CSMWorld::Data::getResources (const UniversalId& id) const +{ + return mResourcesManager.get (UniversalId::getParentType (id.getType())); +} + QAbstractItemModel *CSMWorld::Data::getTableModel (const CSMWorld::UniversalId& id) { std::map::iterator iter = mModelIndex.find (id.getType()); diff --git a/apps/opencs/model/world/data.hpp b/apps/opencs/model/world/data.hpp index 9bdb449e0a..cbf13d8b1b 100644 --- a/apps/opencs/model/world/data.hpp +++ b/apps/opencs/model/world/data.hpp @@ -47,6 +47,9 @@ namespace ESM namespace CSMWorld { + class ResourcesManager; + class Resources; + class Data : public QObject { Q_OBJECT @@ -73,6 +76,7 @@ namespace CSMWorld RefIdCollection mReferenceables; RefCollection mRefs; IdCollection mFilters; + const ResourcesManager& mResourcesManager; std::vector mModels; std::map mModelIndex; std::string mAuthor; @@ -98,7 +102,7 @@ namespace CSMWorld public: - Data (ToUTF8::FromType encoding); + Data (ToUTF8::FromType encoding, const ResourcesManager& resourcesManager); virtual ~Data(); @@ -186,6 +190,9 @@ namespace CSMWorld IdCollection& getBodyParts(); + /// Throws an exception, if \a id does not match a resources list. + const Resources& getResources (const UniversalId& id) const; + QAbstractItemModel *getTableModel (const UniversalId& id); ///< If no table model is available for \a id, an exception is thrown. /// diff --git a/apps/opencs/model/world/resources.cpp b/apps/opencs/model/world/resources.cpp new file mode 100644 index 0000000000..c819283e18 --- /dev/null +++ b/apps/opencs/model/world/resources.cpp @@ -0,0 +1,78 @@ + +#include "resources.hpp" + +#include +#include + +#include + +#include + +CSMWorld::Resources::Resources (const std::string& baseDirectory) +: mBaseDirectory (baseDirectory) +{ + int baseSize = mBaseDirectory.size(); + + Ogre::StringVector resourcesGroups = + Ogre::ResourceGroupManager::getSingleton().getResourceGroups(); + + for (Ogre::StringVector::iterator iter (resourcesGroups.begin()); + iter!=resourcesGroups.end(); ++iter) + { + if (*iter=="General" || *iter=="Internal" || *iter=="Autodetect") + continue; + + Ogre::StringVectorPtr resources = + Ogre::ResourceGroupManager::getSingleton().listResourceNames (*iter); + + for (Ogre::StringVector::const_iterator iter (resources->begin()); + iter!=resources->end(); ++iter) + { + if (static_cast (iter->size())>=baseSize+1 && + iter->substr (0, baseSize)==mBaseDirectory && + ((*iter)[baseSize]=='/' || (*iter)[baseSize]=='\\')) + { + std::string file = iter->substr (baseSize+1); + mFiles.push_back (file); + mIndex.insert (std::make_pair (file, static_cast (mFiles.size())-1)); + } + } + } +} + +int CSMWorld::Resources::getSize() const +{ + return mFiles.size(); +} + +std::string CSMWorld::Resources::getId (int index) const +{ + return mFiles.at (index); +} + +int CSMWorld::Resources::getIndex (const std::string& id) const +{ + int index = searchId (id); + + if (index==-1) + { + std::ostringstream stream; + stream << "Invalid resource: " << mBaseDirectory << '/' << id; + + throw std::runtime_error (stream.str().c_str()); + } + + return index; +} + +int CSMWorld::Resources::searchId (const std::string& id) const +{ + std::string id2 = Misc::StringUtils::lowerCase (id); + + std::map::const_iterator iter = mIndex.find (id2); + + if (iter==mIndex.end()) + return -1; + + return iter->second; +} \ No newline at end of file diff --git a/apps/opencs/model/world/resources.hpp b/apps/opencs/model/world/resources.hpp new file mode 100644 index 0000000000..54c4fa8214 --- /dev/null +++ b/apps/opencs/model/world/resources.hpp @@ -0,0 +1,30 @@ +#ifndef CSM_WOLRD_RESOURCES_H +#define CSM_WOLRD_RESOURCES_H + +#include +#include +#include + +namespace CSMWorld +{ + class Resources + { + std::map mIndex; + std::vector mFiles; + std::string mBaseDirectory; + + public: + + Resources (const std::string& baseDirectory); + + int getSize() const; + + std::string getId (int index) const; + + int getIndex (const std::string& id) const; + + int searchId (const std::string& id) const; + }; +} + +#endif diff --git a/apps/opencs/model/world/resourcesmanager.cpp b/apps/opencs/model/world/resourcesmanager.cpp new file mode 100644 index 0000000000..980e099f4b --- /dev/null +++ b/apps/opencs/model/world/resourcesmanager.cpp @@ -0,0 +1,24 @@ + +#include "resourcesmanager.hpp" + +#include + +void CSMWorld::ResourcesManager::listResources() +{ + mResources.insert (std::make_pair (UniversalId::Type_Mesh, "meshes")); + mResources.insert (std::make_pair (UniversalId::Type_Icon, "icons")); + mResources.insert (std::make_pair (UniversalId::Type_Music, "music")); + mResources.insert (std::make_pair (UniversalId::Type_SoundRes, "sound")); + mResources.insert (std::make_pair (UniversalId::Type_Texture, "textures")); + mResources.insert (std::make_pair (UniversalId::Type_Video, "videos")); +} + +const CSMWorld::Resources& CSMWorld::ResourcesManager::get (UniversalId::Type type) const +{ + std::map::const_iterator iter = mResources.find (type); + + if (iter==mResources.end()) + throw std::logic_error ("Unknown resource type"); + + return iter->second; +} \ No newline at end of file diff --git a/apps/opencs/model/world/resourcesmanager.hpp b/apps/opencs/model/world/resourcesmanager.hpp new file mode 100644 index 0000000000..e3bbd8a2a3 --- /dev/null +++ b/apps/opencs/model/world/resourcesmanager.hpp @@ -0,0 +1,24 @@ +#ifndef CSM_WOLRD_RESOURCESMANAGER_H +#define CSM_WOLRD_RESOURCESMANAGER_H + +#include + +#include "universalid.hpp" +#include "resources.hpp" + +namespace CSMWorld +{ + class ResourcesManager + { + std::map mResources; + + public: + + /// Ask OGRE for a list of available resources. + void listResources(); + + const Resources& get (UniversalId::Type type) const; + }; +} + +#endif \ No newline at end of file diff --git a/apps/opencs/model/world/universalid.cpp b/apps/opencs/model/world/universalid.cpp index 3a5f3f0439..2056b0c4c0 100644 --- a/apps/opencs/model/world/universalid.cpp +++ b/apps/opencs/model/world/universalid.cpp @@ -44,6 +44,12 @@ namespace { CSMWorld::UniversalId::Class_NonRecord, CSMWorld::UniversalId::Type_RegionMap, "Region Map", 0 }, { CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Filters, "Filters", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Meshes, "Meshes", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Icons, "Icons", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Musics, "Musics", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_SoundsRes, "Sounds", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Textures, "Textures", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Videos, "Videos", 0 }, { CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker }; @@ -97,6 +103,12 @@ namespace { CSMWorld::UniversalId::Class_Collection, CSMWorld::UniversalId::Type_Preview, "Preview", 0 }, { CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Enchantment, "Enchantment", 0 }, { CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_BodyPart, "Body Part", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Mesh, "Mesh", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Icon, "Icon", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Music, "Music", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_SoundRes, "Sound", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Texture, "Texture", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Video, "Video", 0 }, { CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker }; @@ -331,7 +343,8 @@ CSMWorld::UniversalId::Type CSMWorld::UniversalId::getParentType (Type type) if (sIdArg[i].mClass==Class_RefRecord) return Type_Referenceables; - if (sIdArg[i].mClass==Class_SubRecord || sIdArg[i].mClass==Class_Record) + if (sIdArg[i].mClass==Class_SubRecord || sIdArg[i].mClass==Class_Record || + sIdArg[i].mClass==Class_Resource) { if (type==Type_Cell_Missing) return Type_Cells; diff --git a/apps/opencs/model/world/universalid.hpp b/apps/opencs/model/world/universalid.hpp index c7514336f1..3d3f215d65 100644 --- a/apps/opencs/model/world/universalid.hpp +++ b/apps/opencs/model/world/universalid.hpp @@ -22,7 +22,10 @@ namespace CSMWorld Class_RecordList, Class_Collection, // multiple types of records combined Class_Transient, // not part of the world data or the project data - Class_NonRecord // record like data that is not part of the world + Class_NonRecord, // record like data that is not part of the world + Class_Resource, ///< \attention Resource IDs are unique only within the + /// respective collection + Class_ResourceList }; enum ArgumentType @@ -104,7 +107,19 @@ namespace CSMWorld Type_Enchantments, Type_Enchantment, Type_BodyParts, - Type_BodyPart + Type_BodyPart, + Type_Meshes, + Type_Mesh, + Type_Icons, + Type_Icon, + Type_Musics, + Type_Music, + Type_SoundsRes, + Type_SoundRes, + Type_Textures, + Type_Texture, + Type_Videos, + Type_Video }; enum { NumberOfTypes = Type_BodyPart+1 }; From 63d0fdee7fde1fef654655962a1efa6f610fbd5d Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Fri, 4 Jul 2014 12:48:18 +0200 Subject: [PATCH 22/37] removed leftover data member --- apps/opencs/model/world/idtable.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/opencs/model/world/idtable.hpp b/apps/opencs/model/world/idtable.hpp index 5500d40b8a..de3adef7c4 100644 --- a/apps/opencs/model/world/idtable.hpp +++ b/apps/opencs/model/world/idtable.hpp @@ -40,7 +40,6 @@ namespace CSMWorld CollectionBase *mIdCollection; unsigned int mFeatures; - bool mPreview; // not implemented IdTable (const IdTable&); From 1b1f1bade346ad37e460bc624ebcd53f5e8b808d Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Fri, 4 Jul 2014 13:24:35 +0200 Subject: [PATCH 23/37] injected new class IdTableBase between QAbstractItemModel and IdTable --- apps/opencs/CMakeLists.txt | 2 +- apps/opencs/model/filter/andnode.cpp | 2 +- apps/opencs/model/filter/andnode.hpp | 2 +- apps/opencs/model/filter/booleannode.cpp | 2 +- apps/opencs/model/filter/booleannode.hpp | 2 +- apps/opencs/model/filter/node.hpp | 4 +- apps/opencs/model/filter/notnode.cpp | 2 +- apps/opencs/model/filter/notnode.hpp | 2 +- apps/opencs/model/filter/ornode.cpp | 2 +- apps/opencs/model/filter/ornode.hpp | 2 +- apps/opencs/model/filter/textnode.cpp | 4 +- apps/opencs/model/filter/textnode.hpp | 2 +- apps/opencs/model/filter/valuenode.cpp | 4 +- apps/opencs/model/filter/valuenode.hpp | 2 +- apps/opencs/model/world/commands.hpp | 2 +- apps/opencs/model/world/idtable.cpp | 16 ++--- apps/opencs/model/world/idtable.hpp | 38 +++-------- apps/opencs/model/world/idtablebase.cpp | 9 +++ apps/opencs/model/world/idtablebase.hpp | 64 +++++++++++++++++++ apps/opencs/model/world/idtableproxymodel.cpp | 8 +-- apps/opencs/view/world/table.cpp | 17 +++-- apps/opencs/view/world/table.hpp | 4 +- 22 files changed, 124 insertions(+), 68 deletions(-) create mode 100644 apps/opencs/model/world/idtablebase.cpp create mode 100644 apps/opencs/model/world/idtablebase.hpp diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index 0addaab524..f6349aa7d0 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -18,7 +18,7 @@ opencs_hdrs_noqt (model/doc opencs_units (model/world - idtable idtableproxymodel regionmap data commanddispatcher + idtable idtableproxymodel regionmap data commanddispatcher idtablebase ) diff --git a/apps/opencs/model/filter/andnode.cpp b/apps/opencs/model/filter/andnode.cpp index dfaa56e782..4249fc228e 100644 --- a/apps/opencs/model/filter/andnode.cpp +++ b/apps/opencs/model/filter/andnode.cpp @@ -7,7 +7,7 @@ CSMFilter::AndNode::AndNode (const std::vector >& nodes) : NAryNode (nodes, "and") {} -bool CSMFilter::AndNode::test (const CSMWorld::IdTable& table, int row, +bool CSMFilter::AndNode::test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const { int size = getSize(); diff --git a/apps/opencs/model/filter/andnode.hpp b/apps/opencs/model/filter/andnode.hpp index 8871757008..3838b451d4 100644 --- a/apps/opencs/model/filter/andnode.hpp +++ b/apps/opencs/model/filter/andnode.hpp @@ -11,7 +11,7 @@ namespace CSMFilter AndNode (const std::vector >& nodes); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/filter/booleannode.cpp b/apps/opencs/model/filter/booleannode.cpp index 267e06a64a..2daa1b6d81 100644 --- a/apps/opencs/model/filter/booleannode.cpp +++ b/apps/opencs/model/filter/booleannode.cpp @@ -3,7 +3,7 @@ CSMFilter::BooleanNode::BooleanNode (bool true_) : mTrue (true_) {} -bool CSMFilter::BooleanNode::test (const CSMWorld::IdTable& table, int row, +bool CSMFilter::BooleanNode::test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const { return mTrue; diff --git a/apps/opencs/model/filter/booleannode.hpp b/apps/opencs/model/filter/booleannode.hpp index d19219e352..d9635746c0 100644 --- a/apps/opencs/model/filter/booleannode.hpp +++ b/apps/opencs/model/filter/booleannode.hpp @@ -13,7 +13,7 @@ namespace CSMFilter BooleanNode (bool true_); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/filter/node.hpp b/apps/opencs/model/filter/node.hpp index ef18353a48..58588bdc52 100644 --- a/apps/opencs/model/filter/node.hpp +++ b/apps/opencs/model/filter/node.hpp @@ -11,7 +11,7 @@ namespace CSMWorld { - class IdTable; + class IdTableBase; } namespace CSMFilter @@ -32,7 +32,7 @@ namespace CSMFilter virtual ~Node(); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const = 0; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/filter/notnode.cpp b/apps/opencs/model/filter/notnode.cpp index 1b22ea7a6a..2317730753 100644 --- a/apps/opencs/model/filter/notnode.cpp +++ b/apps/opencs/model/filter/notnode.cpp @@ -3,7 +3,7 @@ CSMFilter::NotNode::NotNode (boost::shared_ptr child) : UnaryNode (child, "not") {} -bool CSMFilter::NotNode::test (const CSMWorld::IdTable& table, int row, +bool CSMFilter::NotNode::test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const { return !getChild().test (table, row, columns); diff --git a/apps/opencs/model/filter/notnode.hpp b/apps/opencs/model/filter/notnode.hpp index b9e80b8c6d..0281d99dac 100644 --- a/apps/opencs/model/filter/notnode.hpp +++ b/apps/opencs/model/filter/notnode.hpp @@ -11,7 +11,7 @@ namespace CSMFilter NotNode (boost::shared_ptr child); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/filter/ornode.cpp b/apps/opencs/model/filter/ornode.cpp index 4fc34e1d5a..c5d15a3846 100644 --- a/apps/opencs/model/filter/ornode.cpp +++ b/apps/opencs/model/filter/ornode.cpp @@ -7,7 +7,7 @@ CSMFilter::OrNode::OrNode (const std::vector >& nodes) : NAryNode (nodes, "or") {} -bool CSMFilter::OrNode::test (const CSMWorld::IdTable& table, int row, +bool CSMFilter::OrNode::test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const { int size = getSize(); diff --git a/apps/opencs/model/filter/ornode.hpp b/apps/opencs/model/filter/ornode.hpp index c39e350956..07ab51a6a9 100644 --- a/apps/opencs/model/filter/ornode.hpp +++ b/apps/opencs/model/filter/ornode.hpp @@ -11,7 +11,7 @@ namespace CSMFilter OrNode (const std::vector >& nodes); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/filter/textnode.cpp b/apps/opencs/model/filter/textnode.cpp index 7d1a4845f6..24cdce4f5f 100644 --- a/apps/opencs/model/filter/textnode.cpp +++ b/apps/opencs/model/filter/textnode.cpp @@ -7,13 +7,13 @@ #include #include "../world/columns.hpp" -#include "../world/idtable.hpp" +#include "../world/idtablebase.hpp" CSMFilter::TextNode::TextNode (int columnId, const std::string& text) : mColumnId (columnId), mText (text) {} -bool CSMFilter::TextNode::test (const CSMWorld::IdTable& table, int row, +bool CSMFilter::TextNode::test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const { const std::map::const_iterator iter = columns.find (mColumnId); diff --git a/apps/opencs/model/filter/textnode.hpp b/apps/opencs/model/filter/textnode.hpp index 663fa7382a..60ead85def 100644 --- a/apps/opencs/model/filter/textnode.hpp +++ b/apps/opencs/model/filter/textnode.hpp @@ -14,7 +14,7 @@ namespace CSMFilter TextNode (int columnId, const std::string& text); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/filter/valuenode.cpp b/apps/opencs/model/filter/valuenode.cpp index fdcce00ab3..66b6282d77 100644 --- a/apps/opencs/model/filter/valuenode.cpp +++ b/apps/opencs/model/filter/valuenode.cpp @@ -5,13 +5,13 @@ #include #include "../world/columns.hpp" -#include "../world/idtable.hpp" +#include "../world/idtablebase.hpp" CSMFilter::ValueNode::ValueNode (int columnId, Type lowerType, Type upperType, double lower, double upper) : mColumnId (columnId), mLowerType (lowerType), mUpperType (upperType), mLower (lower), mUpper (upper){} -bool CSMFilter::ValueNode::test (const CSMWorld::IdTable& table, int row, +bool CSMFilter::ValueNode::test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const { const std::map::const_iterator iter = columns.find (mColumnId); diff --git a/apps/opencs/model/filter/valuenode.hpp b/apps/opencs/model/filter/valuenode.hpp index b1050709d0..5b7ffec4ef 100644 --- a/apps/opencs/model/filter/valuenode.hpp +++ b/apps/opencs/model/filter/valuenode.hpp @@ -27,7 +27,7 @@ namespace CSMFilter ValueNode (int columnId, Type lowerType, Type upperType, double lower, double upper); - virtual bool test (const CSMWorld::IdTable& table, int row, + virtual bool test (const CSMWorld::IdTableBase& table, int row, const std::map& columns) const; ///< \return Can the specified table row pass through to filter? /// \param columns column ID to column index mapping diff --git a/apps/opencs/model/world/commands.hpp b/apps/opencs/model/world/commands.hpp index ec6350658f..947be68fd4 100644 --- a/apps/opencs/model/world/commands.hpp +++ b/apps/opencs/model/world/commands.hpp @@ -49,7 +49,7 @@ namespace CSMWorld public: - CloneCommand (IdTable& model, const std::string& idOrigin, + CloneCommand (IdTable& model, const std::string& idOrigin, const std::string& IdDestination, const UniversalId::Type type, QUndoCommand* parent = 0); diff --git a/apps/opencs/model/world/idtable.cpp b/apps/opencs/model/world/idtable.cpp index a481ce143a..3a48317eff 100644 --- a/apps/opencs/model/world/idtable.cpp +++ b/apps/opencs/model/world/idtable.cpp @@ -5,7 +5,7 @@ #include "columnbase.hpp" CSMWorld::IdTable::IdTable (CollectionBase *idCollection, unsigned int features) -: mIdCollection (idCollection), mFeatures (features) +: IdTableBase (features), mIdCollection (idCollection) {} CSMWorld::IdTable::~IdTable() @@ -185,17 +185,12 @@ void CSMWorld::IdTable::reorderRows (int baseIndex, const std::vector& newO index (baseIndex+newOrder.size()-1, mIdCollection->getColumns()-1)); } -unsigned int CSMWorld::IdTable::getFeatures() const -{ - return mFeatures; -} - std::pair CSMWorld::IdTable::view (int row) const { std::string id; std::string hint; - if (mFeatures & Feature_ViewCell) + if (getFeatures() & Feature_ViewCell) { int cellColumn = mIdCollection->searchColumnIndex (Columns::ColumnId_Cell); int idColumn = mIdCollection->searchColumnIndex (Columns::ColumnId_Id); @@ -206,7 +201,7 @@ std::pair CSMWorld::IdTable::view (int row) hint = "r:" + std::string (mIdCollection->getData (row, idColumn).toString().toUtf8().constData()); } } - else if (mFeatures & Feature_ViewId) + else if (getFeatures() & Feature_ViewId) { int column = mIdCollection->searchColumnIndex (Columns::ColumnId_Id); @@ -226,6 +221,11 @@ std::pair CSMWorld::IdTable::view (int row) return std::make_pair (UniversalId (UniversalId::Type_Scene, id), hint); } +bool CSMWorld::IdTable::isDeleted (const std::string& id) const +{ + return getRecord (id).isDeleted(); +} + int CSMWorld::IdTable::getColumnId(int column) const { return mIdCollection->getColumn(column).getId(); diff --git a/apps/opencs/model/world/idtable.hpp b/apps/opencs/model/world/idtable.hpp index de3adef7c4..707d7133b8 100644 --- a/apps/opencs/model/world/idtable.hpp +++ b/apps/opencs/model/world/idtable.hpp @@ -3,8 +3,7 @@ #include -#include - +#include "idtablebase.hpp" #include "universalid.hpp" #include "columns.hpp" @@ -13,33 +12,13 @@ namespace CSMWorld class CollectionBase; class RecordBase; - class IdTable : public QAbstractItemModel + class IdTable : public IdTableBase { Q_OBJECT - public: - - enum Features - { - Feature_ReorderWithinTopic = 1, - - /// Use ID column to generate view request (ID is transformed into - /// worldspace and original ID is passed as hint with c: prefix). - Feature_ViewId = 2, - - /// Use cell column to generate view request (cell ID is transformed - /// into worldspace and record ID is passed as hint with r: prefix). - Feature_ViewCell = 4, - - Feature_View = Feature_ViewId | Feature_ViewCell, - - Feature_Preview = 8 - }; - private: CollectionBase *mIdCollection; - unsigned int mFeatures; // not implemented IdTable (const IdTable&); @@ -78,17 +57,17 @@ namespace CSMWorld const std::string& destination, UniversalId::Type type = UniversalId::Type_None); - QModelIndex getModelIndex (const std::string& id, int column) const; + virtual QModelIndex getModelIndex (const std::string& id, int column) const; void setRecord (const std::string& id, const RecordBase& record); ///< Add record or overwrite existing recrod. const RecordBase& getRecord (const std::string& id) const; - int searchColumnIndex (Columns::ColumnId id) const; + virtual int searchColumnIndex (Columns::ColumnId id) const; ///< Return index of column with the given \a id. If no such column exists, -1 is returned. - int findColumnIndex (Columns::ColumnId id) const; + virtual int findColumnIndex (Columns::ColumnId id) const; ///< Return index of column with the given \a id. If no such column exists, an exception is /// thrown. @@ -96,12 +75,13 @@ namespace CSMWorld ///< Reorder the rows [baseIndex, baseIndex+newOrder.size()) according to the indices /// given in \a newOrder (baseIndex+newOrder[0] specifies the new index of row baseIndex). - unsigned int getFeatures() const; - - std::pair view (int row) const; + virtual std::pair view (int row) const; ///< Return the UniversalId and the hint for viewing \a row. If viewing is not /// supported by this table, return (UniversalId::Type_None, ""). + /// Is \a id flagged as deleted? + virtual bool isDeleted (const std::string& id) const; + int getColumnId(int column) const; }; } diff --git a/apps/opencs/model/world/idtablebase.cpp b/apps/opencs/model/world/idtablebase.cpp new file mode 100644 index 0000000000..31d8d461e1 --- /dev/null +++ b/apps/opencs/model/world/idtablebase.cpp @@ -0,0 +1,9 @@ + +#include "idtablebase.hpp" + +CSMWorld::IdTableBase::IdTableBase (unsigned int features) : mFeatures (features) {} + +unsigned int CSMWorld::IdTableBase::getFeatures() const +{ + return mFeatures; +} \ No newline at end of file diff --git a/apps/opencs/model/world/idtablebase.hpp b/apps/opencs/model/world/idtablebase.hpp new file mode 100644 index 0000000000..e6aaea1d63 --- /dev/null +++ b/apps/opencs/model/world/idtablebase.hpp @@ -0,0 +1,64 @@ +#ifndef CSM_WOLRD_IDTABLEBASE_H +#define CSM_WOLRD_IDTABLEBASE_H + +#include + +#include "columns.hpp" + +namespace CSMWorld +{ + class UniversalId; + + class IdTableBase : public QAbstractItemModel + { + Q_OBJECT + + public: + + enum Features + { + Feature_ReorderWithinTopic = 1, + + /// Use ID column to generate view request (ID is transformed into + /// worldspace and original ID is passed as hint with c: prefix). + Feature_ViewId = 2, + + /// Use cell column to generate view request (cell ID is transformed + /// into worldspace and record ID is passed as hint with r: prefix). + Feature_ViewCell = 4, + + Feature_View = Feature_ViewId | Feature_ViewCell, + + Feature_Preview = 8 + }; + + private: + + unsigned int mFeatures; + + public: + + IdTableBase (unsigned int features); + + virtual QModelIndex getModelIndex (const std::string& id, int column) const = 0; + + /// Return index of column with the given \a id. If no such column exists, -1 is + /// returned. + virtual int searchColumnIndex (Columns::ColumnId id) const = 0; + + /// Return index of column with the given \a id. If no such column exists, an + /// exception is thrown. + virtual int findColumnIndex (Columns::ColumnId id) const = 0; + + /// Return the UniversalId and the hint for viewing \a row. If viewing is not + /// supported by this table, return (UniversalId::Type_None, ""). + virtual std::pair view (int row) const = 0; + + /// Is \a id flagged as deleted? + virtual bool isDeleted (const std::string& id) const = 0; + + unsigned int getFeatures() const; + }; +} + +#endif diff --git a/apps/opencs/model/world/idtableproxymodel.cpp b/apps/opencs/model/world/idtableproxymodel.cpp index f51b7f818f..a5e9d354af 100644 --- a/apps/opencs/model/world/idtableproxymodel.cpp +++ b/apps/opencs/model/world/idtableproxymodel.cpp @@ -3,7 +3,7 @@ #include -#include "idtable.hpp" +#include "idtablebase.hpp" void CSMWorld::IdTableProxyModel::updateColumnMap() { @@ -13,7 +13,7 @@ void CSMWorld::IdTableProxyModel::updateColumnMap() { std::vector columns = mFilter->getReferencedColumns(); - const IdTable& table = dynamic_cast (*sourceModel()); + const IdTableBase& table = dynamic_cast (*sourceModel()); for (std::vector::const_iterator iter (columns.begin()); iter!=columns.end(); ++iter) mColumnMap.insert (std::make_pair (*iter, @@ -28,7 +28,7 @@ bool CSMWorld::IdTableProxyModel::filterAcceptsRow (int sourceRow, const QModelI return true; return mFilter->test ( - dynamic_cast (*sourceModel()), sourceRow, mColumnMap); + dynamic_cast (*sourceModel()), sourceRow, mColumnMap); } CSMWorld::IdTableProxyModel::IdTableProxyModel (QObject *parent) @@ -39,7 +39,7 @@ CSMWorld::IdTableProxyModel::IdTableProxyModel (QObject *parent) QModelIndex CSMWorld::IdTableProxyModel::getModelIndex (const std::string& id, int column) const { - return mapFromSource (dynamic_cast (*sourceModel()).getModelIndex (id, column)); + return mapFromSource (dynamic_cast (*sourceModel()).getModelIndex (id, column)); } void CSMWorld::IdTableProxyModel::setFilter (const boost::shared_ptr& filter) diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index 6377b03539..bbac2b1ca7 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -14,6 +14,7 @@ #include "../../model/world/data.hpp" #include "../../model/world/commands.hpp" #include "../../model/world/idtableproxymodel.hpp" +#include "../../model/world/idtablebase.hpp" #include "../../model/world/idtable.hpp" #include "../../model/world/record.hpp" #include "../../model/world/columns.hpp" @@ -82,7 +83,7 @@ void CSVWorld::Table::contextMenuEvent (QContextMenuEvent *event) menu.addAction (mExtendedDeleteAction); } - if (mModel->getFeatures() & CSMWorld::IdTable::Feature_ReorderWithinTopic) + if (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_ReorderWithinTopic) { /// \todo allow reordering of multiple rows if (selectedRows.size()==1) @@ -119,7 +120,7 @@ void CSVWorld::Table::contextMenuEvent (QContextMenuEvent *event) row = mProxyModel->mapToSource (mProxyModel->index (row, 0)).row(); - if (mModel->getFeatures() & CSMWorld::IdTable::Feature_View) + if (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_View) { CSMWorld::UniversalId id = mModel->view (row).first; @@ -131,7 +132,7 @@ void CSVWorld::Table::contextMenuEvent (QContextMenuEvent *event) menu.addAction (mViewAction); } - if (mModel->getFeatures() & CSMWorld::IdTable::Feature_Preview) + if (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Preview) { QModelIndex index = mModel->index (row, mModel->findColumnIndex (CSMWorld::Columns::ColumnId_Modification)); @@ -152,7 +153,7 @@ CSVWorld::Table::Table (const CSMWorld::UniversalId& id, : mCreateAction (0), mCloneAction(0), mRecordStatusDisplay (0), DragRecordTable(document) { - mModel = &dynamic_cast (*mDocument.getData().getTableModel (id)); + mModel = &dynamic_cast (*mDocument.getData().getTableModel (id)); mProxyModel = new CSMWorld::IdTableProxyModel (this); mProxyModel->setSourceModel (mModel); @@ -290,7 +291,7 @@ void CSVWorld::Table::cloneRecord() { QModelIndexList selectedRows = selectionModel()->selectedRows(); const CSMWorld::UniversalId& toClone = getUniversalId(selectedRows.begin()->row()); - if (selectedRows.size()==1 && !mModel->getRecord(toClone.getId()).isDeleted()) + if (selectedRows.size()==1 && !mModel->isDeleted (toClone.getId())) { emit cloneRequest (toClone); } @@ -324,7 +325,8 @@ void CSVWorld::Table::moveUpRecord() for (int i=1; i (*mModel), row, newOrder)); } } } @@ -356,7 +358,8 @@ void CSVWorld::Table::moveDownRecord() for (int i=1; i (*mModel), row, newOrder)); } } } diff --git a/apps/opencs/view/world/table.hpp b/apps/opencs/view/world/table.hpp index 255c430ea5..883834b602 100644 --- a/apps/opencs/view/world/table.hpp +++ b/apps/opencs/view/world/table.hpp @@ -23,7 +23,7 @@ namespace CSMWorld class Data; class UniversalId; class IdTableProxyModel; - class IdTable; + class IdTableBase; class CommandDispatcher; } @@ -49,7 +49,7 @@ namespace CSVWorld QAction *mExtendedDeleteAction; QAction *mExtendedRevertAction; CSMWorld::IdTableProxyModel *mProxyModel; - CSMWorld::IdTable *mModel; + CSMWorld::IdTableBase *mModel; int mRecordStatusDisplay; CSMWorld::CommandDispatcher *mDispatcher; From 97138735381c808307122cd73ffc1047cd2c4340 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Sat, 5 Jul 2014 15:41:40 +1000 Subject: [PATCH 24/37] Minor change to improve generated STL code (only tested with MSVC 2012). More details in forum post https://forum.openmw.org/viewtopic.php?f=6&t=2153#p24065 --- extern/shiny/Main/Factory.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/extern/shiny/Main/Factory.cpp b/extern/shiny/Main/Factory.cpp index 6254edbafb..72af07d58f 100644 --- a/extern/shiny/Main/Factory.cpp +++ b/extern/shiny/Main/Factory.cpp @@ -267,10 +267,11 @@ namespace sh MaterialInstance* Factory::searchInstance (const std::string& name) { - if (mMaterials.find(name) != mMaterials.end()) - return &mMaterials.find(name)->second; - - return NULL; + MaterialMap::iterator it = mMaterials.find(name); + if (it != mMaterials.end()) + return &(it->second); + else + return NULL; } MaterialInstance* Factory::findInstance (const std::string& name) @@ -434,8 +435,9 @@ namespace sh std::string Factory::retrieveTextureAlias (const std::string& name) { - if (mTextureAliases.find(name) != mTextureAliases.end()) - return mTextureAliases[name]; + TextureAliasMap::iterator it = mTextureAliases.find(name); + if (it != mTextureAliases.end()) + return it->second; else return ""; } From e171babd2fd6f0698b0126ea3e001bee1eab00f7 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 5 Jul 2014 12:44:11 +0200 Subject: [PATCH 25/37] added Feature_Constant to IdTable --- apps/opencs/model/world/idtablebase.hpp | 5 ++++- apps/opencs/view/world/table.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/opencs/model/world/idtablebase.hpp b/apps/opencs/model/world/idtablebase.hpp index e6aaea1d63..ef5a9c42ed 100644 --- a/apps/opencs/model/world/idtablebase.hpp +++ b/apps/opencs/model/world/idtablebase.hpp @@ -29,7 +29,10 @@ namespace CSMWorld Feature_View = Feature_ViewId | Feature_ViewCell, - Feature_Preview = 8 + Feature_Preview = 8, + + /// Table can not be modified through ordinary means. + Feature_Constant = 16 }; private: diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index bbac2b1ca7..42874d6674 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -54,7 +54,7 @@ void CSVWorld::Table::contextMenuEvent (QContextMenuEvent *event) /// \todo add menu items for select all and clear selection - if (!mEditLock) + if (!mEditLock && !(mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Constant)) { if (selectedRows.size()==1) { @@ -276,7 +276,7 @@ CSMWorld::UniversalId CSVWorld::Table::getUniversalId (int row) const void CSVWorld::Table::editRecord() { - if (!mEditLock) + if (!mEditLock || (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Constant)) { QModelIndexList selectedRows = selectionModel()->selectedRows(); @@ -287,7 +287,7 @@ void CSVWorld::Table::editRecord() void CSVWorld::Table::cloneRecord() { - if (!mEditLock) + if (!mEditLock || (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Constant)) { QModelIndexList selectedRows = selectionModel()->selectedRows(); const CSMWorld::UniversalId& toClone = getUniversalId(selectedRows.begin()->row()); @@ -300,7 +300,7 @@ void CSVWorld::Table::cloneRecord() void CSVWorld::Table::moveUpRecord() { - if (mEditLock) + if (mEditLock || (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Constant)) return; QModelIndexList selectedRows = selectionModel()->selectedRows(); @@ -333,7 +333,7 @@ void CSVWorld::Table::moveUpRecord() void CSVWorld::Table::moveDownRecord() { - if (mEditLock) + if (mEditLock || (mModel->getFeatures() & CSMWorld::IdTableBase::Feature_Constant)) return; QModelIndexList selectedRows = selectionModel()->selectedRows(); From 4f6c7b0e843d8de14fa0e92d25ce319d5d9978d4 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 5 Jul 2014 15:07:17 +0200 Subject: [PATCH 26/37] resolved UniversalId naming ambiguity --- apps/opencs/model/world/universalid.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/opencs/model/world/universalid.cpp b/apps/opencs/model/world/universalid.cpp index 2056b0c4c0..7ee7673545 100644 --- a/apps/opencs/model/world/universalid.cpp +++ b/apps/opencs/model/world/universalid.cpp @@ -47,7 +47,7 @@ namespace { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Meshes, "Meshes", 0 }, { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Icons, "Icons", 0 }, { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Musics, "Musics", 0 }, - { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_SoundsRes, "Sounds", 0 }, + { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_SoundsRes, "Sound Files", 0 }, { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Textures, "Textures", 0 }, { CSMWorld::UniversalId::Class_ResourceList, CSMWorld::UniversalId::Type_Videos, "Videos", 0 }, @@ -106,7 +106,7 @@ namespace { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Mesh, "Mesh", 0 }, { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Icon, "Icon", 0 }, { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Music, "Music", 0 }, - { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_SoundRes, "Sound", 0 }, + { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_SoundRes, "Sound File", 0 }, { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Texture, "Texture", 0 }, { CSMWorld::UniversalId::Class_Resource, CSMWorld::UniversalId::Type_Video, "Video", 0 }, From 42db9a5091552d5d32ef205bb0c4dc90455e81c3 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 5 Jul 2014 15:50:17 +0200 Subject: [PATCH 27/37] make modification column optional in table views --- apps/opencs/view/world/table.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/opencs/view/world/table.cpp b/apps/opencs/view/world/table.cpp index 42874d6674..43a34e41da 100644 --- a/apps/opencs/view/world/table.cpp +++ b/apps/opencs/view/world/table.cpp @@ -425,21 +425,27 @@ void CSVWorld::Table::tableSizeUpdate() { int rows = mProxyModel->rowCount(); - for (int i=0; isearchColumnIndex (CSMWorld::Columns::ColumnId_Modification); + + if (columnIndex!=-1) { - QModelIndex index = mProxyModel->mapToSource (mProxyModel->index (i, 0)); - - int columnIndex = mModel->findColumnIndex (CSMWorld::Columns::ColumnId_Modification); - int state = mModel->data (mModel->index (index.row(), columnIndex)).toInt(); - - switch (state) + for (int i=0; imapToSource (mProxyModel->index (i, 0)); + + int state = mModel->data (mModel->index (index.row(), columnIndex)).toInt(); + + switch (state) + { + case CSMWorld::RecordBase::State_BaseOnly: ++size; break; + case CSMWorld::RecordBase::State_Modified: ++size; ++modified; break; + case CSMWorld::RecordBase::State_ModifiedOnly: ++size; ++modified; break; + case CSMWorld::RecordBase:: State_Deleted: ++deleted; ++modified; break; + } } } + else + size = rows; } tableSizeChanged (size, deleted, modified); From b2c957a56fd810759d71641041477a8a0e185d57 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 5 Jul 2014 15:50:47 +0200 Subject: [PATCH 28/37] added resources tables --- apps/opencs/CMakeLists.txt | 2 +- apps/opencs/model/world/data.cpp | 13 +++ apps/opencs/model/world/resourcetable.cpp | 123 ++++++++++++++++++++++ apps/opencs/model/world/resourcetable.hpp | 57 ++++++++++ 4 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 apps/opencs/model/world/resourcetable.cpp create mode 100644 apps/opencs/model/world/resourcetable.hpp diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index f6349aa7d0..288e0394c8 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -18,7 +18,7 @@ opencs_hdrs_noqt (model/doc opencs_units (model/world - idtable idtableproxymodel regionmap data commanddispatcher idtablebase + idtable idtableproxymodel regionmap data commanddispatcher idtablebase resourcetable ) diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 823a14395f..b9f6c6cf96 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -16,6 +16,7 @@ #include "regionmap.hpp" #include "columns.hpp" #include "resourcesmanager.hpp" +#include "resourcetable.hpp" void CSMWorld::Data::addModel (QAbstractItemModel *model, UniversalId::Type type, bool update) { @@ -279,6 +280,18 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc UniversalId::Type_Referenceable); addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference); addModel (new IdTable (&mFilters), UniversalId::Type_Filter); + addModel (new ResourceTable (&mResourcesManager.get (UniversalId::Type_Mesh)), + UniversalId::Type_Mesh); + addModel (new ResourceTable (&mResourcesManager.get (UniversalId::Type_Icon)), + UniversalId::Type_Icon); + addModel (new ResourceTable (&mResourcesManager.get (UniversalId::Type_Music)), + UniversalId::Type_Music); + addModel (new ResourceTable (&mResourcesManager.get (UniversalId::Type_SoundRes)), + UniversalId::Type_SoundRes); + addModel (new ResourceTable (&mResourcesManager.get (UniversalId::Type_Texture)), + UniversalId::Type_Texture); + addModel (new ResourceTable (&mResourcesManager.get (UniversalId::Type_Video)), + UniversalId::Type_Video); } CSMWorld::Data::~Data() diff --git a/apps/opencs/model/world/resourcetable.cpp b/apps/opencs/model/world/resourcetable.cpp new file mode 100644 index 0000000000..f46ac1dc9a --- /dev/null +++ b/apps/opencs/model/world/resourcetable.cpp @@ -0,0 +1,123 @@ + +#include "resourcetable.hpp" + +#include + +#include "resources.hpp" +#include "columnbase.hpp" +#include "universalid.hpp" + +CSMWorld::ResourceTable::ResourceTable (const Resources *resources, unsigned int features) +: IdTableBase (features | Feature_Constant), mResources (resources) +{} + +CSMWorld::ResourceTable::~ResourceTable() {} + +int CSMWorld::ResourceTable::rowCount (const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + + return mResources->getSize(); +} + +int CSMWorld::ResourceTable::columnCount (const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + + return 1; +} + +QVariant CSMWorld::ResourceTable::data (const QModelIndex & index, int role) const +{ + if (role!=Qt::DisplayRole) + return QVariant(); + + if (index.column()!=0) + throw std::logic_error ("Invalid column in resource table"); + + return QString::fromUtf8 (mResources->getId (index.row()).c_str()); +} + +QVariant CSMWorld::ResourceTable::headerData (int section, Qt::Orientation orientation, + int role ) const +{ + if (orientation==Qt::Vertical) + return QVariant(); + + if (role==Qt::DisplayRole) + return "ID"; + + if (role==ColumnBase::Role_Flags) + return ColumnBase::Flag_Table; + + if (role==ColumnBase::Role_Display) + return ColumnBase::Display_String; + + return QVariant(); +} + +bool CSMWorld::ResourceTable::setData ( const QModelIndex &index, const QVariant &value, + int role) +{ + return false; +} + +Qt::ItemFlags CSMWorld::ResourceTable::flags (const QModelIndex & index) const +{ + return Qt::ItemIsSelectable | Qt::ItemIsEnabled;; +} + +QModelIndex CSMWorld::ResourceTable::index (int row, int column, const QModelIndex& parent) + const +{ + if (parent.isValid()) + return QModelIndex(); + + if (row<0 || row>=mResources->getSize()) + return QModelIndex(); + + if (column!=0) + return QModelIndex(); + + return createIndex (row, column); +} + +QModelIndex CSMWorld::ResourceTable::parent (const QModelIndex& index) const +{ + return QModelIndex(); +} + +QModelIndex CSMWorld::ResourceTable::getModelIndex (const std::string& id, int column) const +{ + return index (mResources->getIndex (id), column); +} + +int CSMWorld::ResourceTable::searchColumnIndex (Columns::ColumnId id) const +{ + if (id==Columns::ColumnId_Id) + return 0; + + return -1; +} + +int CSMWorld::ResourceTable::findColumnIndex (Columns::ColumnId id) const +{ + int index = searchColumnIndex (id); + + if (index==-1) + throw std::logic_error ("invalid column index"); + + return index; +} + +std::pair CSMWorld::ResourceTable::view (int row) const +{ + return std::make_pair (UniversalId::Type_None, ""); +} + +bool CSMWorld::ResourceTable::isDeleted (const std::string& id) const +{ + return false; +} \ No newline at end of file diff --git a/apps/opencs/model/world/resourcetable.hpp b/apps/opencs/model/world/resourcetable.hpp new file mode 100644 index 0000000000..f5011ab2bd --- /dev/null +++ b/apps/opencs/model/world/resourcetable.hpp @@ -0,0 +1,57 @@ +#ifndef CSM_WOLRD_RESOURCETABLE_H +#define CSM_WOLRD_RESOURCETABLE_H + +#include "idtablebase.hpp" + +namespace CSMWorld +{ + class Resources; + + class ResourceTable : public IdTableBase + { + const Resources *mResources; + + public: + + /// \note The feature Feature_Constant will be added implicitly. + ResourceTable (const Resources *resources, unsigned int features = 0); + + virtual ~ResourceTable(); + + virtual int rowCount (const QModelIndex & parent = QModelIndex()) const; + + virtual int columnCount (const QModelIndex & parent = QModelIndex()) const; + + virtual QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const; + + virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + + virtual bool setData ( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + + virtual Qt::ItemFlags flags (const QModelIndex & index) const; + + virtual QModelIndex index (int row, int column, const QModelIndex& parent = QModelIndex()) + const; + + virtual QModelIndex parent (const QModelIndex& index) const; + + virtual QModelIndex getModelIndex (const std::string& id, int column) const; + + /// Return index of column with the given \a id. If no such column exists, -1 is + /// returned. + virtual int searchColumnIndex (Columns::ColumnId id) const; + + /// Return index of column with the given \a id. If no such column exists, an + /// exception is thrown. + virtual int findColumnIndex (Columns::ColumnId id) const; + + /// Return the UniversalId and the hint for viewing \a row. If viewing is not + /// supported by this table, return (UniversalId::Type_None, ""). + virtual std::pair view (int row) const; + + /// Is \a id flagged as deleted? + virtual bool isDeleted (const std::string& id) const; + }; +} + +#endif From 19828df7997a023010da172ca87aa14f698d223b Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 5 Jul 2014 15:51:17 +0200 Subject: [PATCH 29/37] added subviews for resources tables --- apps/opencs/view/doc/view.cpp | 56 +++++++++++++++++++++++++++++ apps/opencs/view/doc/view.hpp | 12 +++++++ apps/opencs/view/world/subviews.cpp | 15 ++++++++ 3 files changed, 83 insertions(+) diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 6a807f086a..4868f20ff1 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -204,6 +204,32 @@ void CSVDoc::View::setupAssetsMenu() QAction *sounds = new QAction (tr ("Sounds"), this); connect (sounds, SIGNAL (triggered()), this, SLOT (addSoundsSubView())); assets->addAction (sounds); + + assets->addSeparator(); // resources follow here + + QAction *meshes = new QAction (tr ("Meshes"), this); + connect (meshes, SIGNAL (triggered()), this, SLOT (addMeshesSubView())); + assets->addAction (meshes); + + QAction *icons = new QAction (tr ("Icons"), this); + connect (icons, SIGNAL (triggered()), this, SLOT (addIconsSubView())); + assets->addAction (icons); + + QAction *musics = new QAction (tr ("Music"), this); + connect (musics, SIGNAL (triggered()), this, SLOT (addMusicsSubView())); + assets->addAction (musics); + + QAction *soundsRes = new QAction (tr ("Sound Files"), this); + connect (soundsRes, SIGNAL (triggered()), this, SLOT (addSoundsResSubView())); + assets->addAction (soundsRes); + + QAction *textures = new QAction (tr ("Textures"), this); + connect (textures, SIGNAL (triggered()), this, SLOT (addTexturesSubView())); + assets->addAction (textures); + + QAction *videos = new QAction (tr ("Videos"), this); + connect (videos, SIGNAL (triggered()), this, SLOT (addVideosSubView())); + assets->addAction (videos); } void CSVDoc::View::setupUi() @@ -487,6 +513,36 @@ void CSVDoc::View::addBodyPartsSubView() addSubView (CSMWorld::UniversalId::Type_BodyParts); } +void CSVDoc::View::addMeshesSubView() +{ + addSubView (CSMWorld::UniversalId::Type_Meshes); +} + +void CSVDoc::View::addIconsSubView() +{ + addSubView (CSMWorld::UniversalId::Type_Icons); +} + +void CSVDoc::View::addMusicsSubView() +{ + addSubView (CSMWorld::UniversalId::Type_Musics); +} + +void CSVDoc::View::addSoundsResSubView() +{ + addSubView (CSMWorld::UniversalId::Type_SoundsRes); +} + +void CSVDoc::View::addTexturesSubView() +{ + addSubView (CSMWorld::UniversalId::Type_Textures); +} + +void CSVDoc::View::addVideosSubView() +{ + addSubView (CSMWorld::UniversalId::Type_Videos); +} + void CSVDoc::View::abortOperation (int type) { mDocument->abortOperation (type); diff --git a/apps/opencs/view/doc/view.hpp b/apps/opencs/view/doc/view.hpp index a227997c21..19171ff425 100644 --- a/apps/opencs/view/doc/view.hpp +++ b/apps/opencs/view/doc/view.hpp @@ -182,6 +182,18 @@ namespace CSVDoc void addBodyPartsSubView(); + void addMeshesSubView(); + + void addIconsSubView(); + + void addMusicsSubView(); + + void addSoundsResSubView(); + + void addTexturesSubView(); + + void addVideosSubView(); + void toggleShowStatusBar (bool show); void loadErrorLog(); diff --git a/apps/opencs/view/world/subviews.cpp b/apps/opencs/view/world/subviews.cpp index 8c666c1fed..200a26a852 100644 --- a/apps/opencs/view/world/subviews.cpp +++ b/apps/opencs/view/world/subviews.cpp @@ -70,6 +70,21 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) manager.add (CSMWorld::UniversalId::Type_JournalInfos, new CSVDoc::SubViewFactoryWithCreator > (false)); + // Subviews for resources tables + manager.add (CSMWorld::UniversalId::Type_Meshes, + new CSVDoc::SubViewFactoryWithCreator); + manager.add (CSMWorld::UniversalId::Type_Icons, + new CSVDoc::SubViewFactoryWithCreator); + manager.add (CSMWorld::UniversalId::Type_Musics, + new CSVDoc::SubViewFactoryWithCreator); + manager.add (CSMWorld::UniversalId::Type_SoundsRes, + new CSVDoc::SubViewFactoryWithCreator); + manager.add (CSMWorld::UniversalId::Type_Textures, + new CSVDoc::SubViewFactoryWithCreator); + manager.add (CSMWorld::UniversalId::Type_Videos, + new CSVDoc::SubViewFactoryWithCreator); + + // Subviews for editing/viewing individual records manager.add (CSMWorld::UniversalId::Type_Script, new CSVDoc::SubViewFactory); From df6996d4aecab50e6c57c0fd7756584f470d4f9e Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 7 Jul 2014 11:34:24 +0200 Subject: [PATCH 30/37] filter resources files based on extension --- apps/opencs/model/world/resources.cpp | 34 ++++++++++++++++---- apps/opencs/model/world/resources.hpp | 2 +- apps/opencs/model/world/resourcesmanager.cpp | 5 ++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/apps/opencs/model/world/resources.cpp b/apps/opencs/model/world/resources.cpp index c819283e18..357661ac39 100644 --- a/apps/opencs/model/world/resources.cpp +++ b/apps/opencs/model/world/resources.cpp @@ -8,7 +8,8 @@ #include -CSMWorld::Resources::Resources (const std::string& baseDirectory) +CSMWorld::Resources::Resources (const std::string& baseDirectory, + const char * const *extensions) : mBaseDirectory (baseDirectory) { int baseSize = mBaseDirectory.size(); @@ -28,14 +29,33 @@ CSMWorld::Resources::Resources (const std::string& baseDirectory) for (Ogre::StringVector::const_iterator iter (resources->begin()); iter!=resources->end(); ++iter) { - if (static_cast (iter->size())>=baseSize+1 && - iter->substr (0, baseSize)==mBaseDirectory && - ((*iter)[baseSize]=='/' || (*iter)[baseSize]=='\\')) + if (static_cast (iter->size())substr (0, baseSize)!=mBaseDirectory || + ((*iter)[baseSize]!='/' && (*iter)[baseSize]!='\\')) + continue; + + if (extensions) { - std::string file = iter->substr (baseSize+1); - mFiles.push_back (file); - mIndex.insert (std::make_pair (file, static_cast (mFiles.size())-1)); + std::string::size_type index = iter->find_last_of ('.'); + + if (index==std::string::npos) + continue; + + std::string extension = iter->substr (index+1); + + int i = 0; + + for (; extensions[i]; ++i) + if (extensions[i]==extension) + break; + + if (!extensions[i]) + continue; } + + std::string file = iter->substr (baseSize+1); + mFiles.push_back (file); + mIndex.insert (std::make_pair (file, static_cast (mFiles.size())-1)); } } } diff --git a/apps/opencs/model/world/resources.hpp b/apps/opencs/model/world/resources.hpp index 54c4fa8214..599f9a35b4 100644 --- a/apps/opencs/model/world/resources.hpp +++ b/apps/opencs/model/world/resources.hpp @@ -15,7 +15,7 @@ namespace CSMWorld public: - Resources (const std::string& baseDirectory); + Resources (const std::string& baseDirectory, const char * const *extensions = 0); int getSize() const; diff --git a/apps/opencs/model/world/resourcesmanager.cpp b/apps/opencs/model/world/resourcesmanager.cpp index 980e099f4b..7c782e7c59 100644 --- a/apps/opencs/model/world/resourcesmanager.cpp +++ b/apps/opencs/model/world/resourcesmanager.cpp @@ -5,7 +5,10 @@ void CSMWorld::ResourcesManager::listResources() { - mResources.insert (std::make_pair (UniversalId::Type_Mesh, "meshes")); + static const char * const sMeshTypes[] = { "nif", 0 }; + + mResources.insert ( + std::make_pair (UniversalId::Type_Mesh, Resources ("meshes", sMeshTypes))); mResources.insert (std::make_pair (UniversalId::Type_Icon, "icons")); mResources.insert (std::make_pair (UniversalId::Type_Music, "music")); mResources.insert (std::make_pair (UniversalId::Type_SoundRes, "sound")); From c1bbefb8400dca56544a0731a6d74ef49278482a Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Mon, 7 Jul 2014 15:20:05 +0200 Subject: [PATCH 31/37] enable dragging from resources tables --- apps/opencs/model/world/resources.cpp | 9 +++- apps/opencs/model/world/resources.hpp | 9 +++- apps/opencs/model/world/resourcesmanager.cpp | 18 +++++--- apps/opencs/model/world/resourcesmanager.hpp | 4 ++ apps/opencs/model/world/resourcetable.cpp | 45 +++++++++++++++----- 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/apps/opencs/model/world/resources.cpp b/apps/opencs/model/world/resources.cpp index 357661ac39..8e255bc964 100644 --- a/apps/opencs/model/world/resources.cpp +++ b/apps/opencs/model/world/resources.cpp @@ -8,9 +8,9 @@ #include -CSMWorld::Resources::Resources (const std::string& baseDirectory, +CSMWorld::Resources::Resources (const std::string& baseDirectory, UniversalId::Type type, const char * const *extensions) -: mBaseDirectory (baseDirectory) +: mBaseDirectory (baseDirectory), mType (type) { int baseSize = mBaseDirectory.size(); @@ -95,4 +95,9 @@ int CSMWorld::Resources::searchId (const std::string& id) const return -1; return iter->second; +} + +CSMWorld::UniversalId::Type CSMWorld::Resources::getType() const +{ + return mType; } \ No newline at end of file diff --git a/apps/opencs/model/world/resources.hpp b/apps/opencs/model/world/resources.hpp index 599f9a35b4..9c1c76b6f2 100644 --- a/apps/opencs/model/world/resources.hpp +++ b/apps/opencs/model/world/resources.hpp @@ -5,6 +5,8 @@ #include #include +#include "universalid.hpp" + namespace CSMWorld { class Resources @@ -12,10 +14,13 @@ namespace CSMWorld std::map mIndex; std::vector mFiles; std::string mBaseDirectory; + UniversalId::Type mType; public: - Resources (const std::string& baseDirectory, const char * const *extensions = 0); + /// \param type Type of resources in this table. + Resources (const std::string& baseDirectory, UniversalId::Type type, + const char * const *extensions = 0); int getSize() const; @@ -24,6 +29,8 @@ namespace CSMWorld int getIndex (const std::string& id) const; int searchId (const std::string& id) const; + + UniversalId::Type getType() const; }; } diff --git a/apps/opencs/model/world/resourcesmanager.cpp b/apps/opencs/model/world/resourcesmanager.cpp index 7c782e7c59..5692d30ac3 100644 --- a/apps/opencs/model/world/resourcesmanager.cpp +++ b/apps/opencs/model/world/resourcesmanager.cpp @@ -3,17 +3,21 @@ #include +void CSMWorld::ResourcesManager::addResources (const Resources& resources) +{ + mResources.insert (std::make_pair (resources.getType(), resources)); +} + void CSMWorld::ResourcesManager::listResources() { static const char * const sMeshTypes[] = { "nif", 0 }; - mResources.insert ( - std::make_pair (UniversalId::Type_Mesh, Resources ("meshes", sMeshTypes))); - mResources.insert (std::make_pair (UniversalId::Type_Icon, "icons")); - mResources.insert (std::make_pair (UniversalId::Type_Music, "music")); - mResources.insert (std::make_pair (UniversalId::Type_SoundRes, "sound")); - mResources.insert (std::make_pair (UniversalId::Type_Texture, "textures")); - mResources.insert (std::make_pair (UniversalId::Type_Video, "videos")); + addResources (Resources ("meshes", UniversalId::Type_Mesh, sMeshTypes)); + addResources (Resources ("icons", UniversalId::Type_Icon)); + addResources (Resources ("music", UniversalId::Type_Music)); + addResources (Resources ("sound", UniversalId::Type_SoundRes)); + addResources (Resources ("textures", UniversalId::Type_Texture)); + addResources (Resources ("videos", UniversalId::Type_Video)); } const CSMWorld::Resources& CSMWorld::ResourcesManager::get (UniversalId::Type type) const diff --git a/apps/opencs/model/world/resourcesmanager.hpp b/apps/opencs/model/world/resourcesmanager.hpp index e3bbd8a2a3..77f210c478 100644 --- a/apps/opencs/model/world/resourcesmanager.hpp +++ b/apps/opencs/model/world/resourcesmanager.hpp @@ -12,6 +12,10 @@ namespace CSMWorld { std::map mResources; + private: + + void addResources (const Resources& resources); + public: /// Ask OGRE for a list of available resources. diff --git a/apps/opencs/model/world/resourcetable.cpp b/apps/opencs/model/world/resourcetable.cpp index f46ac1dc9a..167b48436e 100644 --- a/apps/opencs/model/world/resourcetable.cpp +++ b/apps/opencs/model/world/resourcetable.cpp @@ -26,7 +26,7 @@ int CSMWorld::ResourceTable::columnCount (const QModelIndex & parent) const if (parent.isValid()) return 0; - return 1; + return 2; // ID, type } QVariant CSMWorld::ResourceTable::data (const QModelIndex & index, int role) const @@ -34,10 +34,13 @@ QVariant CSMWorld::ResourceTable::data (const QModelIndex & index, int role) co if (role!=Qt::DisplayRole) return QVariant(); - if (index.column()!=0) - throw std::logic_error ("Invalid column in resource table"); + if (index.column()==0) + return QString::fromUtf8 (mResources->getId (index.row()).c_str()); - return QString::fromUtf8 (mResources->getId (index.row()).c_str()); + if (index.column()==1) + return static_cast (mResources->getType()); + + throw std::logic_error ("Invalid column in resource table"); } QVariant CSMWorld::ResourceTable::headerData (int section, Qt::Orientation orientation, @@ -46,14 +49,33 @@ QVariant CSMWorld::ResourceTable::headerData (int section, Qt::Orientation orien if (orientation==Qt::Vertical) return QVariant(); - if (role==Qt::DisplayRole) - return "ID"; - if (role==ColumnBase::Role_Flags) return ColumnBase::Flag_Table; - if (role==ColumnBase::Role_Display) - return ColumnBase::Display_String; + switch (section) + { + case 0: + + if (role==Qt::DisplayRole) + return Columns::getName (Columns::ColumnId_Id).c_str(); + + if (role==ColumnBase::Role_Display) + return ColumnBase::Display_String; + + break; + + case 1: + + if (role==Qt::DisplayRole) + return Columns::getName (Columns::ColumnId_RecordType).c_str(); + + if (role==ColumnBase::Role_Display) + return ColumnBase::Display_Integer; + + break; + } + + // xxx return QVariant(); } @@ -78,7 +100,7 @@ QModelIndex CSMWorld::ResourceTable::index (int row, int column, const QModelInd if (row<0 || row>=mResources->getSize()) return QModelIndex(); - if (column!=0) + if (column<0 || column>1) return QModelIndex(); return createIndex (row, column); @@ -99,6 +121,9 @@ int CSMWorld::ResourceTable::searchColumnIndex (Columns::ColumnId id) const if (id==Columns::ColumnId_Id) return 0; + if (id==Columns::ColumnId_RecordType) + return 1; + return -1; } From b2c2342988243ef0b218cdd0f9da3c4392a8b054 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 8 Jul 2014 08:53:39 +0200 Subject: [PATCH 32/37] some refactoring (removing redundant code) --- apps/opencs/model/world/tablemimedata.cpp | 227 +++++++--------------- 1 file changed, 68 insertions(+), 159 deletions(-) diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index 6d65d0ff80..fd5fab960b 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -209,170 +209,79 @@ bool CSMWorld::TableMimeData::fromDocument (const CSMDoc::Document& document) co return &document == &mDocument; } -CSMWorld::UniversalId::Type CSMWorld::TableMimeData::convertEnums (CSMWorld::ColumnBase::Display type) +namespace { - switch (type) + struct Mapping { - case CSMWorld::ColumnBase::Display_Race: - return CSMWorld::UniversalId::Type_Race; - - - case CSMWorld::ColumnBase::Display_Skill: - return CSMWorld::UniversalId::Type_Skill; - - - case CSMWorld::ColumnBase::Display_Class: - return CSMWorld::UniversalId::Type_Class; - - - case CSMWorld::ColumnBase::Display_Faction: - return CSMWorld::UniversalId::Type_Faction; - - - case CSMWorld::ColumnBase::Display_Sound: - return CSMWorld::UniversalId::Type_Sound; - - - case CSMWorld::ColumnBase::Display_Region: - return CSMWorld::UniversalId::Type_Region; - - - case CSMWorld::ColumnBase::Display_Birthsign: - return CSMWorld::UniversalId::Type_Birthsign; - - - case CSMWorld::ColumnBase::Display_Spell: - return CSMWorld::UniversalId::Type_Spell; - - - case CSMWorld::ColumnBase::Display_Cell: - return CSMWorld::UniversalId::Type_Cell; - - - case CSMWorld::ColumnBase::Display_Referenceable: - return CSMWorld::UniversalId::Type_Referenceable; - - - case CSMWorld::ColumnBase::Display_Activator: - return CSMWorld::UniversalId::Type_Activator; - - - case CSMWorld::ColumnBase::Display_Potion: - return CSMWorld::UniversalId::Type_Potion; - - - case CSMWorld::ColumnBase::Display_Apparatus: - return CSMWorld::UniversalId::Type_Apparatus; - - - case CSMWorld::ColumnBase::Display_Armor: - return CSMWorld::UniversalId::Type_Armor; - - - case CSMWorld::ColumnBase::Display_Book: - return CSMWorld::UniversalId::Type_Book; - - - case CSMWorld::ColumnBase::Display_Clothing: - return CSMWorld::UniversalId::Type_Clothing; - - - case CSMWorld::ColumnBase::Display_Container: - return CSMWorld::UniversalId::Type_Container; - - - case CSMWorld::ColumnBase::Display_Creature: - return CSMWorld::UniversalId::Type_Creature; - - - case CSMWorld::ColumnBase::Display_Door: - return CSMWorld::UniversalId::Type_Door; - - - case CSMWorld::ColumnBase::Display_Ingredient: - return CSMWorld::UniversalId::Type_Ingredient; - - - case CSMWorld::ColumnBase::Display_CreatureLevelledList: - return CSMWorld::UniversalId::Type_CreatureLevelledList; - - - case CSMWorld::ColumnBase::Display_ItemLevelledList: - return CSMWorld::UniversalId::Type_ItemLevelledList; - - - case CSMWorld::ColumnBase::Display_Light: - return CSMWorld::UniversalId::Type_Light; - - - case CSMWorld::ColumnBase::Display_Lockpick: - return CSMWorld::UniversalId::Type_Lockpick; - - - case CSMWorld::ColumnBase::Display_Miscellaneous: - return CSMWorld::UniversalId::Type_Miscellaneous; - - - case CSMWorld::ColumnBase::Display_Npc: - return CSMWorld::UniversalId::Type_Npc; - - - case CSMWorld::ColumnBase::Display_Probe: - return CSMWorld::UniversalId::Type_Probe; - - - case CSMWorld::ColumnBase::Display_Repair: - return CSMWorld::UniversalId::Type_Repair; - - - case CSMWorld::ColumnBase::Display_Static: - return CSMWorld::UniversalId::Type_Static; - - - case CSMWorld::ColumnBase::Display_Weapon: - return CSMWorld::UniversalId::Type_Weapon; - - - case CSMWorld::ColumnBase::Display_Reference: - return CSMWorld::UniversalId::Type_Reference; - - - case CSMWorld::ColumnBase::Display_Filter: - return CSMWorld::UniversalId::Type_Filter; - - - case CSMWorld::ColumnBase::Display_Topic: - return CSMWorld::UniversalId::Type_Topic; - - - case CSMWorld::ColumnBase::Display_Journal: - return CSMWorld::UniversalId::Type_Journal; - - - case CSMWorld::ColumnBase::Display_TopicInfo: - return CSMWorld::UniversalId::Type_TopicInfo; - - - case CSMWorld::ColumnBase::Display_JournalInfo: - return CSMWorld::UniversalId::Type_JournalInfo; - - - case CSMWorld::ColumnBase::Display_Scene: - return CSMWorld::UniversalId::Type_Scene; - - - case CSMWorld::ColumnBase::Display_Script: - return CSMWorld::UniversalId::Type_Script; - - - default: - return CSMWorld::UniversalId::Type_None; - - } + CSMWorld::UniversalId::Type mUniversalIdType; + CSMWorld::ColumnBase::Display mDisplayType; + }; + + const Mapping mapping[] = + { + { CSMWorld::UniversalId::Type_Race, CSMWorld::ColumnBase::Display_Race }, + { CSMWorld::UniversalId::Type_Skill, CSMWorld::ColumnBase::Display_Skill }, + { CSMWorld::UniversalId::Type_Class, CSMWorld::ColumnBase::Display_Class }, + { CSMWorld::UniversalId::Type_Class, CSMWorld::ColumnBase::Display_Class }, + { CSMWorld::UniversalId::Type_Faction, CSMWorld::ColumnBase::Display_Faction }, + { CSMWorld::UniversalId::Type_Sound, CSMWorld::ColumnBase::Display_Sound }, + { CSMWorld::UniversalId::Type_Region, CSMWorld::ColumnBase::Display_Region }, + { CSMWorld::UniversalId::Type_Birthsign, CSMWorld::ColumnBase::Display_Birthsign }, + { CSMWorld::UniversalId::Type_Spell, CSMWorld::ColumnBase::Display_Spell }, + { CSMWorld::UniversalId::Type_Cell, CSMWorld::ColumnBase::Display_Cell }, + { CSMWorld::UniversalId::Type_Referenceable, CSMWorld::ColumnBase::Display_Referenceable }, + { CSMWorld::UniversalId::Type_Activator, CSMWorld::ColumnBase::Display_Activator }, + { CSMWorld::UniversalId::Type_Potion, CSMWorld::ColumnBase::Display_Potion }, + { CSMWorld::UniversalId::Type_Apparatus, CSMWorld::ColumnBase::Display_Apparatus }, + { CSMWorld::UniversalId::Type_Armor, CSMWorld::ColumnBase::Display_Armor }, + { CSMWorld::UniversalId::Type_Book, CSMWorld::ColumnBase::Display_Book }, + { CSMWorld::UniversalId::Type_Clothing, CSMWorld::ColumnBase::Display_Clothing }, + { CSMWorld::UniversalId::Type_Container, CSMWorld::ColumnBase::Display_Container }, + { CSMWorld::UniversalId::Type_Creature, CSMWorld::ColumnBase::Display_Creature }, + { CSMWorld::UniversalId::Type_Door, CSMWorld::ColumnBase::Display_Door }, + { CSMWorld::UniversalId::Type_Ingredient, CSMWorld::ColumnBase::Display_Ingredient }, + { CSMWorld::UniversalId::Type_CreatureLevelledList, CSMWorld::ColumnBase::Display_CreatureLevelledList }, + { CSMWorld::UniversalId::Type_ItemLevelledList, CSMWorld::ColumnBase::Display_ItemLevelledList }, + { CSMWorld::UniversalId::Type_Light, CSMWorld::ColumnBase::Display_Light }, + { CSMWorld::UniversalId::Type_Lockpick, CSMWorld::ColumnBase::Display_Lockpick }, + { CSMWorld::UniversalId::Type_Miscellaneous, CSMWorld::ColumnBase::Display_Miscellaneous }, + { CSMWorld::UniversalId::Type_Npc, CSMWorld::ColumnBase::Display_Npc }, + { CSMWorld::UniversalId::Type_Probe, CSMWorld::ColumnBase::Display_Probe }, + { CSMWorld::UniversalId::Type_Repair, CSMWorld::ColumnBase::Display_Repair }, + { CSMWorld::UniversalId::Type_Static, CSMWorld::ColumnBase::Display_Static }, + { CSMWorld::UniversalId::Type_Weapon, CSMWorld::ColumnBase::Display_Weapon }, + { CSMWorld::UniversalId::Type_Reference, CSMWorld::ColumnBase::Display_Reference }, + { CSMWorld::UniversalId::Type_Filter, CSMWorld::ColumnBase::Display_Filter }, + { CSMWorld::UniversalId::Type_Topic, CSMWorld::ColumnBase::Display_Topic }, + { CSMWorld::UniversalId::Type_Journal, CSMWorld::ColumnBase::Display_Journal }, + { CSMWorld::UniversalId::Type_TopicInfo, CSMWorld::ColumnBase::Display_TopicInfo }, + { CSMWorld::UniversalId::Type_JournalInfo, CSMWorld::ColumnBase::Display_JournalInfo }, + { CSMWorld::UniversalId::Type_Scene, CSMWorld::ColumnBase::Display_Scene }, + { CSMWorld::UniversalId::Type_Script, CSMWorld::ColumnBase::Display_Script }, + + + { CSMWorld::UniversalId::Type_None, CSMWorld::ColumnBase::Display_None } // end marker + }; } -CSMWorld::ColumnBase::Display CSMWorld::TableMimeData::convertEnums (CSMWorld::UniversalId::Type type) +CSMWorld::UniversalId::Type CSMWorld::TableMimeData::convertEnums (ColumnBase::Display type) { + for (int i=0; mapping[i].mUniversalIdType!=CSMWorld::UniversalId::Type_None; ++i) + if (mapping[i].mDisplayType==type) + return mapping[i].mUniversalIdType; + + return CSMWorld::UniversalId::Type_None; +} + +CSMWorld::ColumnBase::Display CSMWorld::TableMimeData::convertEnums (UniversalId::Type type) +{ + for (int i=0; mapping[i].mUniversalIdType!=CSMWorld::UniversalId::Type_None; ++i) + if (mapping[i].mUniversalIdType==type) + return mapping[i].mDisplayType; + + return CSMWorld::ColumnBase::Display_None; + + switch (type) { case CSMWorld::UniversalId::Type_Race: From b2ce94f28addd5dac262b2f1448e56cb5d704c30 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 8 Jul 2014 08:56:28 +0200 Subject: [PATCH 33/37] fixed exceptions --- apps/opencs/model/world/tablemimedata.cpp | 165 +--------------------- 1 file changed, 3 insertions(+), 162 deletions(-) diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index fd5fab960b..18c1ee4ce4 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -37,7 +37,7 @@ std::string CSMWorld::TableMimeData::getIcon() const if (mUniversalId.empty()) { qDebug()<<"TableMimeData object does not hold any records!"; //because throwing in the event loop tends to be problematic - throw("TableMimeData object does not hold any records!"); + throw std::runtime_error ("TableMimeData object does not hold any records!"); } std::string tmpIcon; @@ -179,7 +179,7 @@ CSMWorld::UniversalId CSMWorld::TableMimeData::returnMatching (CSMWorld::Univers } } - throw ("TableMimeData object does not hold object of the seeked type"); + throw std::runtime_error ("TableMimeData object does not hold object of the seeked type"); } CSMWorld::UniversalId CSMWorld::TableMimeData::returnMatching (CSMWorld::ColumnBase::Display type) const @@ -201,7 +201,7 @@ CSMWorld::UniversalId CSMWorld::TableMimeData::returnMatching (CSMWorld::ColumnB } } - throw ("TableMimeData object does not hold object of the seeked type"); + throw std::runtime_error ("TableMimeData object does not hold object of the seeked type"); } bool CSMWorld::TableMimeData::fromDocument (const CSMDoc::Document& document) const @@ -280,165 +280,6 @@ CSMWorld::ColumnBase::Display CSMWorld::TableMimeData::convertEnums (UniversalId return mapping[i].mDisplayType; return CSMWorld::ColumnBase::Display_None; - - - switch (type) - { - case CSMWorld::UniversalId::Type_Race: - return CSMWorld::ColumnBase::Display_Race; - - - case CSMWorld::UniversalId::Type_Skill: - return CSMWorld::ColumnBase::Display_Skill; - - - case CSMWorld::UniversalId::Type_Class: - return CSMWorld::ColumnBase::Display_Class; - - - case CSMWorld::UniversalId::Type_Faction: - return CSMWorld::ColumnBase::Display_Faction; - - - case CSMWorld::UniversalId::Type_Sound: - return CSMWorld::ColumnBase::Display_Sound; - - - case CSMWorld::UniversalId::Type_Region: - return CSMWorld::ColumnBase::Display_Region; - - - case CSMWorld::UniversalId::Type_Birthsign: - return CSMWorld::ColumnBase::Display_Birthsign; - - - case CSMWorld::UniversalId::Type_Spell: - return CSMWorld::ColumnBase::Display_Spell; - - - case CSMWorld::UniversalId::Type_Cell: - return CSMWorld::ColumnBase::Display_Cell; - - - case CSMWorld::UniversalId::Type_Referenceable: - return CSMWorld::ColumnBase::Display_Referenceable; - - - case CSMWorld::UniversalId::Type_Activator: - return CSMWorld::ColumnBase::Display_Activator; - - - case CSMWorld::UniversalId::Type_Potion: - return CSMWorld::ColumnBase::Display_Potion; - - - case CSMWorld::UniversalId::Type_Apparatus: - return CSMWorld::ColumnBase::Display_Apparatus; - - - case CSMWorld::UniversalId::Type_Armor: - return CSMWorld::ColumnBase::Display_Armor; - - - case CSMWorld::UniversalId::Type_Book: - return CSMWorld::ColumnBase::Display_Book; - - - case CSMWorld::UniversalId::Type_Clothing: - return CSMWorld::ColumnBase::Display_Clothing; - - - case CSMWorld::UniversalId::Type_Container: - return CSMWorld::ColumnBase::Display_Container; - - - case CSMWorld::UniversalId::Type_Creature: - return CSMWorld::ColumnBase::Display_Creature; - - - case CSMWorld::UniversalId::Type_Door: - return CSMWorld::ColumnBase::Display_Door; - - - case CSMWorld::UniversalId::Type_Ingredient: - return CSMWorld::ColumnBase::Display_Ingredient; - - - case CSMWorld::UniversalId::Type_CreatureLevelledList: - return CSMWorld::ColumnBase::Display_CreatureLevelledList; - - - case CSMWorld::UniversalId::Type_ItemLevelledList: - return CSMWorld::ColumnBase::Display_ItemLevelledList; - - - case CSMWorld::UniversalId::Type_Light: - return CSMWorld::ColumnBase::Display_Light; - - - case CSMWorld::UniversalId::Type_Lockpick: - return CSMWorld::ColumnBase::Display_Lockpick; - - - case CSMWorld::UniversalId::Type_Miscellaneous: - return CSMWorld::ColumnBase::Display_Miscellaneous; - - - case CSMWorld::UniversalId::Type_Npc: - return CSMWorld::ColumnBase::Display_Npc; - - - case CSMWorld::UniversalId::Type_Probe: - return CSMWorld::ColumnBase::Display_Probe; - - - case CSMWorld::UniversalId::Type_Repair: - return CSMWorld::ColumnBase::Display_Repair; - - - case CSMWorld::UniversalId::Type_Static: - return CSMWorld::ColumnBase::Display_Static; - - - case CSMWorld::UniversalId::Type_Weapon: - return CSMWorld::ColumnBase::Display_Weapon; - - - case CSMWorld::UniversalId::Type_Reference: - return CSMWorld::ColumnBase::Display_Reference; - - - case CSMWorld::UniversalId::Type_Filter: - return CSMWorld::ColumnBase::Display_Filter; - - - case CSMWorld::UniversalId::Type_Topic: - return CSMWorld::ColumnBase::Display_Topic; - - - case CSMWorld::UniversalId::Type_Journal: - return CSMWorld::ColumnBase::Display_Journal; - - - case CSMWorld::UniversalId::Type_TopicInfo: - return CSMWorld::ColumnBase::Display_TopicInfo; - - - case CSMWorld::UniversalId::Type_JournalInfo: - return CSMWorld::ColumnBase::Display_JournalInfo; - - - case CSMWorld::UniversalId::Type_Scene: - return CSMWorld::ColumnBase::Display_Scene; - - - case CSMWorld::UniversalId::Type_Script: - return CSMWorld::ColumnBase::Display_Script; - - - default: - return CSMWorld::ColumnBase::Display_None; - } } const CSMDoc::Document* CSMWorld::TableMimeData::getDocumentPtr() const From 9d5956585c40bca6813f85d112ae50fe83c97ecd Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 8 Jul 2014 09:08:01 +0200 Subject: [PATCH 34/37] added separate display type for colours --- apps/opencs/model/world/columnbase.hpp | 3 ++- apps/opencs/model/world/columnimp.hpp | 2 +- apps/opencs/view/world/util.cpp | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index 39c700fa14..149a71d42b 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -92,7 +92,8 @@ namespace CSMWorld Display_EnchantmentType, Display_BodyPartType, Display_MeshType, - Display_Gender + Display_Gender, + Display_Colour }; int mColumnId; diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index 72f2099fae..ebd5756d07 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -634,7 +634,7 @@ namespace CSMWorld { /// \todo Replace Display_Integer with something that displays the colour value more directly. MapColourColumn() - : Column (Columns::ColumnId_MapColour, ColumnBase::Display_Integer) + : Column (Columns::ColumnId_MapColour, ColumnBase::Display_Colour) {} virtual QVariant get (const Record& record) const diff --git a/apps/opencs/view/world/util.cpp b/apps/opencs/view/world/util.cpp index 6f3999363e..5d26b75c4f 100644 --- a/apps/opencs/view/world/util.cpp +++ b/apps/opencs/view/world/util.cpp @@ -145,10 +145,11 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO if (display != CSMWorld::ColumnBase::Display_None) { - if (variant.type() == QVariant::Color) + if (display == CSMWorld::ColumnBase::Display_Colour) { return new QLineEdit(parent); } + if (display == CSMWorld::ColumnBase::Display_Integer) { return new QSpinBox(parent); From b6c5ee125d8d334c3265da0cf01e55950ec349da Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 8 Jul 2014 09:24:05 +0200 Subject: [PATCH 35/37] more refactoring --- apps/opencs/view/world/util.cpp | 63 ++++++++++++++++----------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/apps/opencs/view/world/util.cpp b/apps/opencs/view/world/util.cpp index 5d26b75c4f..0b06cfb362 100644 --- a/apps/opencs/view/world/util.cpp +++ b/apps/opencs/view/world/util.cpp @@ -143,50 +143,47 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO } } - if (display != CSMWorld::ColumnBase::Display_None) + switch (display) { - if (display == CSMWorld::ColumnBase::Display_Colour) - { - return new QLineEdit(parent); - } + case CSMWorld::ColumnBase::Display_Colour: - if (display == CSMWorld::ColumnBase::Display_Integer) - { - return new QSpinBox(parent); - } - if (display == CSMWorld::ColumnBase::Display_Var) - { return new QLineEdit(parent); - } - if (display == CSMWorld::ColumnBase::Display_Float) - { + + case CSMWorld::ColumnBase::Display_Integer: + + return new QSpinBox(parent); + + case CSMWorld::ColumnBase::Display_Var: + + return new QLineEdit(parent); + + case CSMWorld::ColumnBase::Display_Float: + return new QDoubleSpinBox(parent); - } - if (display == CSMWorld::ColumnBase::Display_LongString) - { + + case CSMWorld::ColumnBase::Display_LongString: + return new QTextEdit(parent); - } - if (display == CSMWorld::ColumnBase::Display_String || - display == CSMWorld::ColumnBase::Display_Skill || - display == CSMWorld::ColumnBase::Display_Script || - display == CSMWorld::ColumnBase::Display_Race || - display == CSMWorld::ColumnBase::Display_Class || - display == CSMWorld::ColumnBase::Display_Faction || - display == CSMWorld::ColumnBase::Display_Miscellaneous || - display == CSMWorld::ColumnBase::Display_Sound) - { - return new DropLineEdit(parent); - } - if (display == CSMWorld::ColumnBase::Display_Boolean) - { + + case CSMWorld::ColumnBase::Display_Boolean: + return new QCheckBox(parent); - } + + case CSMWorld::ColumnBase::Display_String: + case CSMWorld::ColumnBase::Display_Skill: + case CSMWorld::ColumnBase::Display_Script: + case CSMWorld::ColumnBase::Display_Race: + case CSMWorld::ColumnBase::Display_Class: + case CSMWorld::ColumnBase::Display_Faction: + case CSMWorld::ColumnBase::Display_Miscellaneous: + case CSMWorld::ColumnBase::Display_Sound: + + return new DropLineEdit(parent); } return QStyledItemDelegate::createEditor (parent, option, index); } - void CSVWorld::CommandDelegate::setEditLock (bool locked) { mEditLock = locked; From 1548f4670a8bf51fd1f266cfb8571d006213f8b0 Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 8 Jul 2014 09:51:17 +0200 Subject: [PATCH 36/37] drop part of resources drag and drop --- apps/opencs/model/world/columnbase.hpp | 6 ++++++ apps/opencs/model/world/columnimp.hpp | 2 +- apps/opencs/model/world/refidcollection.cpp | 4 ++-- apps/opencs/model/world/tablemimedata.cpp | 7 ++++++- apps/opencs/view/world/util.cpp | 12 ++++++++++-- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index 149a71d42b..1444f70f1d 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -93,6 +93,12 @@ namespace CSMWorld Display_BodyPartType, Display_MeshType, Display_Gender, + Display_Mesh, + Display_Icon, + Display_Music, + Display_SoundRes, + Display_Texture, + Display_Video, Display_Colour }; diff --git a/apps/opencs/model/world/columnimp.hpp b/apps/opencs/model/world/columnimp.hpp index ebd5756d07..0c033593c8 100644 --- a/apps/opencs/model/world/columnimp.hpp +++ b/apps/opencs/model/world/columnimp.hpp @@ -604,7 +604,7 @@ namespace CSMWorld struct SoundFileColumn : public Column { SoundFileColumn() - : Column (Columns::ColumnId_SoundFile, ColumnBase::Display_Sound) + : Column (Columns::ColumnId_SoundFile, ColumnBase::Display_SoundRes) {} virtual QVariant get (const Record& record) const diff --git a/apps/opencs/model/world/refidcollection.cpp b/apps/opencs/model/world/refidcollection.cpp index c16218a0be..779d5a40cd 100644 --- a/apps/opencs/model/world/refidcollection.cpp +++ b/apps/opencs/model/world/refidcollection.cpp @@ -52,7 +52,7 @@ CSMWorld::RefIdCollection::RefIdCollection() ModelColumns modelColumns (baseColumns); - mColumns.push_back (RefIdColumn (Columns::ColumnId_Model, ColumnBase::Display_String)); + mColumns.push_back (RefIdColumn (Columns::ColumnId_Model, ColumnBase::Display_Mesh)); modelColumns.mModel = &mColumns.back(); NameColumns nameColumns (modelColumns); @@ -64,7 +64,7 @@ CSMWorld::RefIdCollection::RefIdCollection() InventoryColumns inventoryColumns (nameColumns); - mColumns.push_back (RefIdColumn (Columns::ColumnId_Icon, ColumnBase::Display_String)); + mColumns.push_back (RefIdColumn (Columns::ColumnId_Icon, ColumnBase::Display_Icon)); inventoryColumns.mIcon = &mColumns.back(); mColumns.push_back (RefIdColumn (Columns::ColumnId_Weight, ColumnBase::Display_Float)); inventoryColumns.mWeight = &mColumns.back(); diff --git a/apps/opencs/model/world/tablemimedata.cpp b/apps/opencs/model/world/tablemimedata.cpp index 18c1ee4ce4..9b80650ab9 100644 --- a/apps/opencs/model/world/tablemimedata.cpp +++ b/apps/opencs/model/world/tablemimedata.cpp @@ -258,7 +258,12 @@ namespace { CSMWorld::UniversalId::Type_JournalInfo, CSMWorld::ColumnBase::Display_JournalInfo }, { CSMWorld::UniversalId::Type_Scene, CSMWorld::ColumnBase::Display_Scene }, { CSMWorld::UniversalId::Type_Script, CSMWorld::ColumnBase::Display_Script }, - + { CSMWorld::UniversalId::Type_Mesh, CSMWorld::ColumnBase::Display_Mesh }, + { CSMWorld::UniversalId::Type_Icon, CSMWorld::ColumnBase::Display_Icon }, + { CSMWorld::UniversalId::Type_Music, CSMWorld::ColumnBase::Display_Music }, + { CSMWorld::UniversalId::Type_SoundRes, CSMWorld::ColumnBase::Display_SoundRes }, + { CSMWorld::UniversalId::Type_Texture, CSMWorld::ColumnBase::Display_Texture }, + { CSMWorld::UniversalId::Type_Video, CSMWorld::ColumnBase::Display_Video }, { CSMWorld::UniversalId::Type_None, CSMWorld::ColumnBase::Display_None } // end marker }; diff --git a/apps/opencs/view/world/util.cpp b/apps/opencs/view/world/util.cpp index 0b06cfb362..ca66087fad 100644 --- a/apps/opencs/view/world/util.cpp +++ b/apps/opencs/view/world/util.cpp @@ -177,11 +177,19 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO case CSMWorld::ColumnBase::Display_Faction: case CSMWorld::ColumnBase::Display_Miscellaneous: case CSMWorld::ColumnBase::Display_Sound: + case CSMWorld::ColumnBase::Display_Mesh: + case CSMWorld::ColumnBase::Display_Icon: + case CSMWorld::ColumnBase::Display_Music: + case CSMWorld::ColumnBase::Display_SoundRes: + case CSMWorld::ColumnBase::Display_Texture: + case CSMWorld::ColumnBase::Display_Video: return new DropLineEdit(parent); - } - return QStyledItemDelegate::createEditor (parent, option, index); + default: + + return QStyledItemDelegate::createEditor (parent, option, index); + } } void CSVWorld::CommandDelegate::setEditLock (bool locked) From 3333f67830c0a150c27662f5455b1e72402ed2aa Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Tue, 8 Jul 2014 12:53:25 +0200 Subject: [PATCH 37/37] removed a left-over marker --- apps/opencs/model/world/resourcetable.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/opencs/model/world/resourcetable.cpp b/apps/opencs/model/world/resourcetable.cpp index 167b48436e..86de0a6a63 100644 --- a/apps/opencs/model/world/resourcetable.cpp +++ b/apps/opencs/model/world/resourcetable.cpp @@ -75,8 +75,6 @@ QVariant CSMWorld::ResourceTable::headerData (int section, Qt::Orientation orien break; } - // xxx - return QVariant(); }