mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-21 09:39:56 +00:00
Feat(CS): Implement selection groups into data model
This commit is contained in:
parent
5c10727380
commit
24443e00bf
@ -25,6 +25,7 @@
|
||||
#include <components/esm3/loadsoun.hpp>
|
||||
#include <components/esm3/loadspel.hpp>
|
||||
#include <components/esm3/loadsscr.hpp>
|
||||
#include <components/esm3/selectiongroup.hpp>
|
||||
|
||||
#include "../world/data.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>>(
|
||||
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));
|
||||
|
||||
// save content file
|
||||
|
@ -333,6 +333,37 @@ namespace CSMWorld
|
||||
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)
|
||||
{
|
||||
int index = ESM::Skill::refIdToIndex(ESM::RefId::stringRefId(value));
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <components/esm3/loadinfo.hpp>
|
||||
#include <components/esm3/loadrace.hpp>
|
||||
#include <components/esm3/loadskil.hpp>
|
||||
#include <components/esm3/selectiongroup.hpp>
|
||||
#include <components/esm3/variant.hpp>
|
||||
|
||||
#include <optional>
|
||||
@ -2391,6 +2392,17 @@ namespace CSMWorld
|
||||
void set(Record<ESM::BodyPart>& record, const QVariant& data) 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.
|
||||
|
@ -347,6 +347,8 @@ namespace CSMWorld
|
||||
|
||||
ColumnId_LevelledCreatureId = 315,
|
||||
|
||||
ColumnId_SelectionGroupObjects = 316,
|
||||
|
||||
// Allocated to a separate value range, so we don't get a collision should we ever need
|
||||
// to extend the number of use values.
|
||||
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 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.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_Videos)), UniversalId::Type_Video);
|
||||
addModel(new IdTable(&mMetaData), UniversalId::Type_MetaData);
|
||||
addModel(new IdTable(&mSelectionGroups), UniversalId::Type_SelectionGroup);
|
||||
|
||||
mActorAdapter = std::make_unique<ActorAdapter>(*this);
|
||||
|
||||
@ -908,6 +913,16 @@ CSMWorld::IdCollection<ESM::DebugProfile>& CSMWorld::Data::getDebugProfiles()
|
||||
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
|
||||
{
|
||||
return mLand;
|
||||
@ -1369,6 +1384,17 @@ bool CSMWorld::Data::continueLoading(CSMDoc::Messages& messages)
|
||||
mDebugProfiles.load(*mReader, mBase);
|
||||
break;
|
||||
|
||||
case ESM::REC_SELG:
|
||||
|
||||
if (!mProject)
|
||||
{
|
||||
unhandledRecord = true;
|
||||
break;
|
||||
}
|
||||
|
||||
mSelectionGroups.load(*mReader, mBase);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
unhandledRecord = true;
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <components/esm3/loadsoun.hpp>
|
||||
#include <components/esm3/loadspel.hpp>
|
||||
#include <components/esm3/loadsscr.hpp>
|
||||
#include <components/esm3/selectiongroup.hpp>
|
||||
#include <components/files/multidircollection.hpp>
|
||||
#include <components/misc/algorithm.hpp>
|
||||
#include <components/to_utf8/to_utf8.hpp>
|
||||
@ -105,6 +106,7 @@ namespace CSMWorld
|
||||
IdCollection<ESM::BodyPart> mBodyParts;
|
||||
IdCollection<ESM::MagicEffect> mMagicEffects;
|
||||
IdCollection<ESM::DebugProfile> mDebugProfiles;
|
||||
IdCollection<ESM::SelectionGroup> mSelectionGroups;
|
||||
IdCollection<ESM::SoundGenerator> mSoundGens;
|
||||
IdCollection<ESM::StartScript> mStartScripts;
|
||||
NestedInfoCollection mTopicInfos;
|
||||
@ -251,6 +253,10 @@ namespace CSMWorld
|
||||
|
||||
IdCollection<ESM::DebugProfile>& getDebugProfiles();
|
||||
|
||||
const IdCollection<ESM::SelectionGroup>& getSelectionGroups() const;
|
||||
|
||||
IdCollection<ESM::SelectionGroup>& getSelectionGroups();
|
||||
|
||||
const IdCollection<CSMWorld::Land>& getLand() const;
|
||||
|
||||
IdCollection<CSMWorld::Land>& getLand();
|
||||
|
@ -68,6 +68,7 @@ namespace
|
||||
":./resources-video" },
|
||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_DebugProfiles, "Debug Profiles",
|
||||
":./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_RecordList, CSMWorld::UniversalId::Type_SoundGens, "Sound Generators",
|
||||
":./sound-generator.png" },
|
||||
|
@ -133,6 +133,7 @@ namespace CSMWorld
|
||||
Type_LandTexture,
|
||||
Type_Pathgrids,
|
||||
Type_Pathgrid,
|
||||
Type_SelectionGroup,
|
||||
Type_StartScripts,
|
||||
Type_StartScript,
|
||||
Type_Search,
|
||||
|
@ -170,6 +170,8 @@ namespace ESM
|
||||
// format 1
|
||||
REC_FILT = esm3Recname("FILT"),
|
||||
REC_DBGP = esm3Recname("DBGP"), ///< only used in project files
|
||||
REC_SELG = esm3Recname("SELG"),
|
||||
|
||||
REC_LUAL = esm3Recname("LUAL"), // LuaScriptsCfg (only in omwgame or omwaddon)
|
||||
|
||||
// format 16 - Lua scripts in saved games
|
||||
|
Loading…
x
Reference in New Issue
Block a user