mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-19 00:06:45 +00:00
Feat(CS): Implement selection groups into data model
This commit is contained in:
parent
5c10727380
commit
24443e00bf
9 changed files with 85 additions and 0 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include <components/esm3/loadsoun.hpp>
|
#include <components/esm3/loadsoun.hpp>
|
||||||
#include <components/esm3/loadspel.hpp>
|
#include <components/esm3/loadspel.hpp>
|
||||||
#include <components/esm3/loadsscr.hpp>
|
#include <components/esm3/loadsscr.hpp>
|
||||||
|
#include <components/esm3/selectiongroup.hpp>
|
||||||
|
|
||||||
#include "../world/data.hpp"
|
#include "../world/data.hpp"
|
||||||
#include "../world/idcollection.hpp"
|
#include "../world/idcollection.hpp"
|
||||||
|
@ -52,6 +53,9 @@ CSMDoc::Saving::Saving(Document& document, const std::filesystem::path& projectP
|
||||||
appendStage(new WriteCollectionStage<CSMWorld::IdCollection<ESM::Script>>(
|
appendStage(new WriteCollectionStage<CSMWorld::IdCollection<ESM::Script>>(
|
||||||
mDocument.getData().getScripts(), mState, CSMWorld::Scope_Project));
|
mDocument.getData().getScripts(), mState, CSMWorld::Scope_Project));
|
||||||
|
|
||||||
|
appendStage(new WriteCollectionStage<CSMWorld::IdCollection<ESM::SelectionGroup>>(
|
||||||
|
mDocument.getData().getSelectionGroups(), mState, CSMWorld::Scope_Project));
|
||||||
|
|
||||||
appendStage(new CloseSaveStage(mState));
|
appendStage(new CloseSaveStage(mState));
|
||||||
|
|
||||||
// save content file
|
// save content file
|
||||||
|
|
|
@ -333,6 +333,37 @@ namespace CSMWorld
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SelectionGroupColumn::SelectionGroupColumn()
|
||||||
|
: Column<ESM::SelectionGroup>(Columns::ColumnId_SelectionGroupObjects, ColumnBase::Display_None)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant SelectionGroupColumn::get(const Record<ESM::SelectionGroup>& record) const
|
||||||
|
{
|
||||||
|
QVariant data;
|
||||||
|
QStringList selectionInfo;
|
||||||
|
const std::vector<std::string>& instances = record.get().selectedInstances;
|
||||||
|
|
||||||
|
for (std::string instance : instances)
|
||||||
|
selectionInfo << QString::fromStdString(instance);
|
||||||
|
data.setValue(selectionInfo);
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectionGroupColumn::set(Record<ESM::SelectionGroup>& record, const QVariant& data)
|
||||||
|
{
|
||||||
|
ESM::SelectionGroup record2 = record.get();
|
||||||
|
for (const auto& item : data.toStringList())
|
||||||
|
record2.selectedInstances.push_back(item.toStdString());
|
||||||
|
record.setModified(record2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SelectionGroupColumn::isEditable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<std::uint32_t> getSkillIndex(std::string_view value)
|
std::optional<std::uint32_t> getSkillIndex(std::string_view value)
|
||||||
{
|
{
|
||||||
int index = ESM::Skill::refIdToIndex(ESM::RefId::stringRefId(value));
|
int index = ESM::Skill::refIdToIndex(ESM::RefId::stringRefId(value));
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <components/esm3/loadinfo.hpp>
|
#include <components/esm3/loadinfo.hpp>
|
||||||
#include <components/esm3/loadrace.hpp>
|
#include <components/esm3/loadrace.hpp>
|
||||||
#include <components/esm3/loadskil.hpp>
|
#include <components/esm3/loadskil.hpp>
|
||||||
|
#include <components/esm3/selectiongroup.hpp>
|
||||||
#include <components/esm3/variant.hpp>
|
#include <components/esm3/variant.hpp>
|
||||||
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
@ -2391,6 +2392,17 @@ namespace CSMWorld
|
||||||
void set(Record<ESM::BodyPart>& record, const QVariant& data) override;
|
void set(Record<ESM::BodyPart>& record, const QVariant& data) override;
|
||||||
bool isEditable() const override;
|
bool isEditable() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SelectionGroupColumn : public Column<ESM::SelectionGroup>
|
||||||
|
{
|
||||||
|
SelectionGroupColumn();
|
||||||
|
|
||||||
|
QVariant get(const Record<ESM::SelectionGroup>& record) const override;
|
||||||
|
|
||||||
|
void set(Record<ESM::SelectionGroup>& record, const QVariant& data) override;
|
||||||
|
|
||||||
|
bool isEditable() const override;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is required to access the type as a QVariant.
|
// This is required to access the type as a QVariant.
|
||||||
|
|
|
@ -347,6 +347,8 @@ namespace CSMWorld
|
||||||
|
|
||||||
ColumnId_LevelledCreatureId = 315,
|
ColumnId_LevelledCreatureId = 315,
|
||||||
|
|
||||||
|
ColumnId_SelectionGroupObjects = 316,
|
||||||
|
|
||||||
// Allocated to a separate value range, so we don't get a collision should we ever need
|
// Allocated to a separate value range, so we don't get a collision should we ever need
|
||||||
// to extend the number of use values.
|
// to extend the number of use values.
|
||||||
ColumnId_UseValue1 = 0x10000,
|
ColumnId_UseValue1 = 0x10000,
|
||||||
|
|
|
@ -620,6 +620,10 @@ CSMWorld::Data::Data(ToUTF8::FromType encoding, const Files::PathContainer& data
|
||||||
mDebugProfiles.addColumn(new DescriptionColumn<ESM::DebugProfile>);
|
mDebugProfiles.addColumn(new DescriptionColumn<ESM::DebugProfile>);
|
||||||
mDebugProfiles.addColumn(new ScriptColumn<ESM::DebugProfile>(ScriptColumn<ESM::DebugProfile>::Type_Lines));
|
mDebugProfiles.addColumn(new ScriptColumn<ESM::DebugProfile>(ScriptColumn<ESM::DebugProfile>::Type_Lines));
|
||||||
|
|
||||||
|
mSelectionGroups.addColumn(new StringIdColumn<ESM::SelectionGroup>);
|
||||||
|
mSelectionGroups.addColumn(new RecordStateColumn<ESM::SelectionGroup>);
|
||||||
|
mSelectionGroups.addColumn(new SelectionGroupColumn);
|
||||||
|
|
||||||
mMetaData.appendBlankRecord(ESM::RefId::stringRefId("sys::meta"));
|
mMetaData.appendBlankRecord(ESM::RefId::stringRefId("sys::meta"));
|
||||||
|
|
||||||
mMetaData.addColumn(new StringIdColumn<MetaData>(true));
|
mMetaData.addColumn(new StringIdColumn<MetaData>(true));
|
||||||
|
@ -664,6 +668,7 @@ CSMWorld::Data::Data(ToUTF8::FromType encoding, const Files::PathContainer& data
|
||||||
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Textures)), UniversalId::Type_Texture);
|
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Textures)), UniversalId::Type_Texture);
|
||||||
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Videos)), UniversalId::Type_Video);
|
addModel(new ResourceTable(&mResourcesManager.get(UniversalId::Type_Videos)), UniversalId::Type_Video);
|
||||||
addModel(new IdTable(&mMetaData), UniversalId::Type_MetaData);
|
addModel(new IdTable(&mMetaData), UniversalId::Type_MetaData);
|
||||||
|
addModel(new IdTable(&mSelectionGroups), UniversalId::Type_SelectionGroup);
|
||||||
|
|
||||||
mActorAdapter = std::make_unique<ActorAdapter>(*this);
|
mActorAdapter = std::make_unique<ActorAdapter>(*this);
|
||||||
|
|
||||||
|
@ -908,6 +913,16 @@ CSMWorld::IdCollection<ESM::DebugProfile>& CSMWorld::Data::getDebugProfiles()
|
||||||
return mDebugProfiles;
|
return mDebugProfiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CSMWorld::IdCollection<ESM::SelectionGroup>& CSMWorld::Data::getSelectionGroups()
|
||||||
|
{
|
||||||
|
return mSelectionGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CSMWorld::IdCollection<ESM::SelectionGroup>& CSMWorld::Data::getSelectionGroups() const
|
||||||
|
{
|
||||||
|
return mSelectionGroups;
|
||||||
|
}
|
||||||
|
|
||||||
const CSMWorld::IdCollection<CSMWorld::Land>& CSMWorld::Data::getLand() const
|
const CSMWorld::IdCollection<CSMWorld::Land>& CSMWorld::Data::getLand() const
|
||||||
{
|
{
|
||||||
return mLand;
|
return mLand;
|
||||||
|
@ -1369,6 +1384,17 @@ bool CSMWorld::Data::continueLoading(CSMDoc::Messages& messages)
|
||||||
mDebugProfiles.load(*mReader, mBase);
|
mDebugProfiles.load(*mReader, mBase);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ESM::REC_SELG:
|
||||||
|
|
||||||
|
if (!mProject)
|
||||||
|
{
|
||||||
|
unhandledRecord = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mSelectionGroups.load(*mReader, mBase);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
unhandledRecord = true;
|
unhandledRecord = true;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <components/esm3/loadsoun.hpp>
|
#include <components/esm3/loadsoun.hpp>
|
||||||
#include <components/esm3/loadspel.hpp>
|
#include <components/esm3/loadspel.hpp>
|
||||||
#include <components/esm3/loadsscr.hpp>
|
#include <components/esm3/loadsscr.hpp>
|
||||||
|
#include <components/esm3/selectiongroup.hpp>
|
||||||
#include <components/files/multidircollection.hpp>
|
#include <components/files/multidircollection.hpp>
|
||||||
#include <components/misc/algorithm.hpp>
|
#include <components/misc/algorithm.hpp>
|
||||||
#include <components/to_utf8/to_utf8.hpp>
|
#include <components/to_utf8/to_utf8.hpp>
|
||||||
|
@ -105,6 +106,7 @@ namespace CSMWorld
|
||||||
IdCollection<ESM::BodyPart> mBodyParts;
|
IdCollection<ESM::BodyPart> mBodyParts;
|
||||||
IdCollection<ESM::MagicEffect> mMagicEffects;
|
IdCollection<ESM::MagicEffect> mMagicEffects;
|
||||||
IdCollection<ESM::DebugProfile> mDebugProfiles;
|
IdCollection<ESM::DebugProfile> mDebugProfiles;
|
||||||
|
IdCollection<ESM::SelectionGroup> mSelectionGroups;
|
||||||
IdCollection<ESM::SoundGenerator> mSoundGens;
|
IdCollection<ESM::SoundGenerator> mSoundGens;
|
||||||
IdCollection<ESM::StartScript> mStartScripts;
|
IdCollection<ESM::StartScript> mStartScripts;
|
||||||
NestedInfoCollection mTopicInfos;
|
NestedInfoCollection mTopicInfos;
|
||||||
|
@ -251,6 +253,10 @@ namespace CSMWorld
|
||||||
|
|
||||||
IdCollection<ESM::DebugProfile>& getDebugProfiles();
|
IdCollection<ESM::DebugProfile>& getDebugProfiles();
|
||||||
|
|
||||||
|
const IdCollection<ESM::SelectionGroup>& getSelectionGroups() const;
|
||||||
|
|
||||||
|
IdCollection<ESM::SelectionGroup>& getSelectionGroups();
|
||||||
|
|
||||||
const IdCollection<CSMWorld::Land>& getLand() const;
|
const IdCollection<CSMWorld::Land>& getLand() const;
|
||||||
|
|
||||||
IdCollection<CSMWorld::Land>& getLand();
|
IdCollection<CSMWorld::Land>& getLand();
|
||||||
|
|
|
@ -68,6 +68,7 @@ namespace
|
||||||
":./resources-video" },
|
":./resources-video" },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_DebugProfiles, "Debug Profiles",
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_DebugProfiles, "Debug Profiles",
|
||||||
":./debug-profile.png" },
|
":./debug-profile.png" },
|
||||||
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_SelectionGroup, "Selection Groups", "" },
|
||||||
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_RunLog, "Run Log", ":./run-log.png" },
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_RunLog, "Run Log", ":./run-log.png" },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_SoundGens, "Sound Generators",
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_SoundGens, "Sound Generators",
|
||||||
":./sound-generator.png" },
|
":./sound-generator.png" },
|
||||||
|
|
|
@ -133,6 +133,7 @@ namespace CSMWorld
|
||||||
Type_LandTexture,
|
Type_LandTexture,
|
||||||
Type_Pathgrids,
|
Type_Pathgrids,
|
||||||
Type_Pathgrid,
|
Type_Pathgrid,
|
||||||
|
Type_SelectionGroup,
|
||||||
Type_StartScripts,
|
Type_StartScripts,
|
||||||
Type_StartScript,
|
Type_StartScript,
|
||||||
Type_Search,
|
Type_Search,
|
||||||
|
|
|
@ -170,6 +170,8 @@ namespace ESM
|
||||||
// format 1
|
// format 1
|
||||||
REC_FILT = esm3Recname("FILT"),
|
REC_FILT = esm3Recname("FILT"),
|
||||||
REC_DBGP = esm3Recname("DBGP"), ///< only used in project files
|
REC_DBGP = esm3Recname("DBGP"), ///< only used in project files
|
||||||
|
REC_SELG = esm3Recname("SELG"),
|
||||||
|
|
||||||
REC_LUAL = esm3Recname("LUAL"), // LuaScriptsCfg (only in omwgame or omwaddon)
|
REC_LUAL = esm3Recname("LUAL"), // LuaScriptsCfg (only in omwgame or omwaddon)
|
||||||
|
|
||||||
// format 16 - Lua scripts in saved games
|
// format 16 - Lua scripts in saved games
|
||||||
|
|
Loading…
Reference in a new issue