forked from teamnwah/openmw-tes3coop
added body part table
This commit is contained in:
parent
5649552f18
commit
d96ed38d49
13 changed files with 130 additions and 7 deletions
|
@ -62,6 +62,9 @@ CSMDoc::Saving::Saving (Document& document, const boost::filesystem::path& proje
|
||||||
appendStage (new WriteCollectionStage<CSMWorld::IdCollection<ESM::Enchantment> >
|
appendStage (new WriteCollectionStage<CSMWorld::IdCollection<ESM::Enchantment> >
|
||||||
(mDocument.getData().getEnchantments(), mState));
|
(mDocument.getData().getEnchantments(), mState));
|
||||||
|
|
||||||
|
appendStage (new WriteCollectionStage<CSMWorld::IdCollection<ESM::BodyPart> >
|
||||||
|
(mDocument.getData().getBodyParts(), mState));
|
||||||
|
|
||||||
appendStage (new WriteDialogueCollectionStage (mDocument, mState, false));
|
appendStage (new WriteDialogueCollectionStage (mDocument, mState, false));
|
||||||
|
|
||||||
appendStage (new WriteDialogueCollectionStage (mDocument, mState, true));
|
appendStage (new WriteDialogueCollectionStage (mDocument, mState, true));
|
||||||
|
|
|
@ -463,14 +463,21 @@ namespace CSMWorld
|
||||||
struct FlagColumn : public Column<ESXRecordT>
|
struct FlagColumn : public Column<ESXRecordT>
|
||||||
{
|
{
|
||||||
int mMask;
|
int mMask;
|
||||||
|
bool mInverted;
|
||||||
|
|
||||||
FlagColumn (int columnId, int mask)
|
FlagColumn (int columnId, int mask, bool inverted = false)
|
||||||
: Column<ESXRecordT> (columnId, ColumnBase::Display_Boolean), mMask (mask)
|
: Column<ESXRecordT> (columnId, ColumnBase::Display_Boolean), mMask (mask),
|
||||||
|
mInverted (inverted)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual QVariant get (const Record<ESXRecordT>& record) const
|
virtual QVariant get (const Record<ESXRecordT>& 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<ESXRecordT>& record, const QVariant& data)
|
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
|
||||||
|
@ -479,7 +486,7 @@ namespace CSMWorld
|
||||||
|
|
||||||
int flags = record2.mData.mFlags & ~mMask;
|
int flags = record2.mData.mFlags & ~mMask;
|
||||||
|
|
||||||
if (data.toInt())
|
if ((data.toInt()!=0)!=mInverted)
|
||||||
flags |= mMask;
|
flags |= mMask;
|
||||||
|
|
||||||
record2.mData.mFlags = flags;
|
record2.mData.mFlags = flags;
|
||||||
|
@ -1758,6 +1765,58 @@ namespace CSMWorld
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename ESXRecordT>
|
||||||
|
struct ModelColumn : public Column<ESXRecordT>
|
||||||
|
{
|
||||||
|
ModelColumn() : Column<ESXRecordT> (Columns::ColumnId_Model, ColumnBase::Display_String) {}
|
||||||
|
|
||||||
|
virtual QVariant get (const Record<ESXRecordT>& record) const
|
||||||
|
{
|
||||||
|
return QString::fromUtf8 (record.get().mModel.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
|
||||||
|
{
|
||||||
|
ESXRecordT record2 = record.get();
|
||||||
|
|
||||||
|
record2.mModel = data.toString().toUtf8().constData();
|
||||||
|
|
||||||
|
record.setModified (record2);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool isEditable() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename ESXRecordT>
|
||||||
|
struct VampireColumn : public Column<ESXRecordT>
|
||||||
|
{
|
||||||
|
VampireColumn() : Column<ESXRecordT> (Columns::ColumnId_Vampire, ColumnBase::Display_Boolean)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual QVariant get (const Record<ESXRecordT>& record) const
|
||||||
|
{
|
||||||
|
return record.get().mData.mVampire!=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
|
||||||
|
{
|
||||||
|
ESXRecordT record2 = record.get();
|
||||||
|
|
||||||
|
record2.mData.mVampire = data.toInt();
|
||||||
|
|
||||||
|
record.setModified (record2);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool isEditable() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -178,7 +178,7 @@ namespace CSMWorld
|
||||||
{ ColumnId_MagicState, "Magic" },
|
{ ColumnId_MagicState, "Magic" },
|
||||||
{ ColumnId_StealthState, "Stealth" },
|
{ ColumnId_StealthState, "Stealth" },
|
||||||
{ ColumnId_EnchantmentType, "Enchantment Type" },
|
{ ColumnId_EnchantmentType, "Enchantment Type" },
|
||||||
{ ColumnId_AutoCalc, "Auto Calc" },
|
{ ColumnId_Vampire, "Vampire" },
|
||||||
|
|
||||||
{ ColumnId_UseValue1, "Use value 1" },
|
{ ColumnId_UseValue1, "Use value 1" },
|
||||||
{ ColumnId_UseValue2, "Use value 2" },
|
{ ColumnId_UseValue2, "Use value 2" },
|
||||||
|
|
|
@ -171,6 +171,7 @@ namespace CSMWorld
|
||||||
ColumnId_MagicState = 158,
|
ColumnId_MagicState = 158,
|
||||||
ColumnId_StealthState = 159,
|
ColumnId_StealthState = 159,
|
||||||
ColumnId_EnchantmentType = 160,
|
ColumnId_EnchantmentType = 160,
|
||||||
|
ColumnId_Vampire = 161,
|
||||||
|
|
||||||
// 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.
|
||||||
|
|
|
@ -206,6 +206,18 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding)
|
||||||
mEnchantments.addColumn (new ChargesColumn2<ESM::Enchantment>);
|
mEnchantments.addColumn (new ChargesColumn2<ESM::Enchantment>);
|
||||||
mEnchantments.addColumn (new AutoCalcColumn<ESM::Enchantment>);
|
mEnchantments.addColumn (new AutoCalcColumn<ESM::Enchantment>);
|
||||||
|
|
||||||
|
mBodyParts.addColumn (new StringIdColumn<ESM::BodyPart>);
|
||||||
|
mBodyParts.addColumn (new RecordStateColumn<ESM::BodyPart>);
|
||||||
|
mBodyParts.addColumn (new FixedRecordTypeColumn<ESM::BodyPart> (UniversalId::Type_BodyPart));
|
||||||
|
|
||||||
|
mBodyParts.addColumn (new VampireColumn<ESM::BodyPart>);
|
||||||
|
mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Female, ESM::BodyPart::BPF_Female));
|
||||||
|
mBodyParts.addColumn (new FlagColumn<ESM::BodyPart> (Columns::ColumnId_Playable, ESM::BodyPart::BPF_NotPlayable, true));
|
||||||
|
|
||||||
|
mBodyParts.addColumn (new ModelColumn<ESM::BodyPart>);
|
||||||
|
mBodyParts.addColumn (new RaceColumn<ESM::BodyPart>);
|
||||||
|
|
||||||
|
|
||||||
mRefs.addColumn (new StringIdColumn<CellRef> (true));
|
mRefs.addColumn (new StringIdColumn<CellRef> (true));
|
||||||
mRefs.addColumn (new RecordStateColumn<CellRef>);
|
mRefs.addColumn (new RecordStateColumn<CellRef>);
|
||||||
mRefs.addColumn (new FixedRecordTypeColumn<CellRef> (UniversalId::Type_Reference));
|
mRefs.addColumn (new FixedRecordTypeColumn<CellRef> (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 (&mJournalInfos, IdTable::Feature_ReorderWithinTopic), UniversalId::Type_JournalInfo);
|
||||||
addModel (new IdTable (&mCells, IdTable::Feature_ViewId), UniversalId::Type_Cell);
|
addModel (new IdTable (&mCells, IdTable::Feature_ViewId), UniversalId::Type_Cell);
|
||||||
addModel (new IdTable (&mEnchantments), UniversalId::Type_Enchantment);
|
addModel (new IdTable (&mEnchantments), UniversalId::Type_Enchantment);
|
||||||
|
addModel (new IdTable (&mBodyParts), UniversalId::Type_BodyPart);
|
||||||
addModel (new IdTable (&mReferenceables, IdTable::Feature_Preview),
|
addModel (new IdTable (&mReferenceables, IdTable::Feature_Preview),
|
||||||
UniversalId::Type_Referenceable);
|
UniversalId::Type_Referenceable);
|
||||||
addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference);
|
addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference);
|
||||||
|
@ -476,6 +489,16 @@ CSMWorld::IdCollection<ESM::Enchantment>& CSMWorld::Data::getEnchantments()
|
||||||
return mEnchantments;
|
return mEnchantments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CSMWorld::IdCollection<ESM::BodyPart>& CSMWorld::Data::getBodyParts() const
|
||||||
|
{
|
||||||
|
return mBodyParts;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMWorld::IdCollection<ESM::BodyPart>& CSMWorld::Data::getBodyParts()
|
||||||
|
{
|
||||||
|
return mBodyParts;
|
||||||
|
}
|
||||||
|
|
||||||
QAbstractItemModel *CSMWorld::Data::getTableModel (const CSMWorld::UniversalId& id)
|
QAbstractItemModel *CSMWorld::Data::getTableModel (const CSMWorld::UniversalId& id)
|
||||||
{
|
{
|
||||||
std::map<UniversalId::Type, QAbstractItemModel *>::iterator iter = mModelIndex.find (id.getType());
|
std::map<UniversalId::Type, QAbstractItemModel *>::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_BSGN: mBirthsigns.load (*mReader, mBase); break;
|
||||||
case ESM::REC_SPEL: mSpells.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_ENCH: mEnchantments.load (*mReader, mBase); break;
|
||||||
|
case ESM::REC_BODY: mBodyParts.load (*mReader, mBase); break;
|
||||||
|
|
||||||
case ESM::REC_CELL:
|
case ESM::REC_CELL:
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <components/esm/loadspel.hpp>
|
#include <components/esm/loadspel.hpp>
|
||||||
#include <components/esm/loaddial.hpp>
|
#include <components/esm/loaddial.hpp>
|
||||||
#include <components/esm/loadench.hpp>
|
#include <components/esm/loadench.hpp>
|
||||||
|
#include <components/esm/loadbody.hpp>
|
||||||
|
|
||||||
#include <components/to_utf8/to_utf8.hpp>
|
#include <components/to_utf8/to_utf8.hpp>
|
||||||
|
|
||||||
|
@ -65,6 +66,7 @@ namespace CSMWorld
|
||||||
IdCollection<ESM::Dialogue> mTopics;
|
IdCollection<ESM::Dialogue> mTopics;
|
||||||
IdCollection<ESM::Dialogue> mJournals;
|
IdCollection<ESM::Dialogue> mJournals;
|
||||||
IdCollection<ESM::Enchantment> mEnchantments;
|
IdCollection<ESM::Enchantment> mEnchantments;
|
||||||
|
IdCollection<ESM::BodyPart> mBodyParts;
|
||||||
InfoCollection mTopicInfos;
|
InfoCollection mTopicInfos;
|
||||||
InfoCollection mJournalInfos;
|
InfoCollection mJournalInfos;
|
||||||
IdCollection<Cell> mCells;
|
IdCollection<Cell> mCells;
|
||||||
|
@ -180,6 +182,10 @@ namespace CSMWorld
|
||||||
|
|
||||||
IdCollection<ESM::Enchantment>& getEnchantments();
|
IdCollection<ESM::Enchantment>& getEnchantments();
|
||||||
|
|
||||||
|
const IdCollection<ESM::BodyPart>& getBodyParts() const;
|
||||||
|
|
||||||
|
IdCollection<ESM::BodyPart>& getBodyParts();
|
||||||
|
|
||||||
QAbstractItemModel *getTableModel (const UniversalId& id);
|
QAbstractItemModel *getTableModel (const UniversalId& id);
|
||||||
///< If no table model is available for \a id, an exception is thrown.
|
///< If no table model is available for \a id, an exception is thrown.
|
||||||
///
|
///
|
||||||
|
|
|
@ -36,6 +36,7 @@ namespace
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_JournalInfos, "Journal 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_Cells, "Cells", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Enchantments, "Enchantments", 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,
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Referenceables,
|
||||||
"Referenceables", 0 },
|
"Referenceables", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_References,
|
{ 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_Scene, "Scene", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_Collection, CSMWorld::UniversalId::Type_Preview, "Preview", 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_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
|
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
||||||
};
|
};
|
||||||
|
|
|
@ -102,10 +102,12 @@ namespace CSMWorld
|
||||||
Type_Preview,
|
Type_Preview,
|
||||||
Type_LoadErrorLog,
|
Type_LoadErrorLog,
|
||||||
Type_Enchantments,
|
Type_Enchantments,
|
||||||
Type_Enchantment
|
Type_Enchantment,
|
||||||
|
Type_BodyParts,
|
||||||
|
Type_BodyPart
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { NumberOfTypes = Type_Enchantment+1 };
|
enum { NumberOfTypes = Type_BodyPart+1 };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -191,6 +191,10 @@ void CSVDoc::View::setupCharacterMenu()
|
||||||
QAction *journalInfos = new QAction (tr ("Journal Infos"), this);
|
QAction *journalInfos = new QAction (tr ("Journal Infos"), this);
|
||||||
connect (journalInfos, SIGNAL (triggered()), this, SLOT (addJournalInfosSubView()));
|
connect (journalInfos, SIGNAL (triggered()), this, SLOT (addJournalInfosSubView()));
|
||||||
characters->addAction (journalInfos);
|
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()
|
void CSVDoc::View::setupAssetsMenu()
|
||||||
|
@ -478,6 +482,11 @@ void CSVDoc::View::addEnchantmentsSubView()
|
||||||
addSubView (CSMWorld::UniversalId::Type_Enchantments);
|
addSubView (CSMWorld::UniversalId::Type_Enchantments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVDoc::View::addBodyPartsSubView()
|
||||||
|
{
|
||||||
|
addSubView (CSMWorld::UniversalId::Type_BodyParts);
|
||||||
|
}
|
||||||
|
|
||||||
void CSVDoc::View::abortOperation (int type)
|
void CSVDoc::View::abortOperation (int type)
|
||||||
{
|
{
|
||||||
mDocument->abortOperation (type);
|
mDocument->abortOperation (type);
|
||||||
|
|
|
@ -180,6 +180,8 @@ namespace CSVDoc
|
||||||
|
|
||||||
void addEnchantmentsSubView();
|
void addEnchantmentsSubView();
|
||||||
|
|
||||||
|
void addBodyPartsSubView();
|
||||||
|
|
||||||
void toggleShowStatusBar (bool show);
|
void toggleShowStatusBar (bool show);
|
||||||
|
|
||||||
void loadErrorLog();
|
void loadErrorLog();
|
||||||
|
|
|
@ -40,6 +40,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
||||||
CSMWorld::UniversalId::Type_Birthsigns,
|
CSMWorld::UniversalId::Type_Birthsigns,
|
||||||
CSMWorld::UniversalId::Type_Spells,
|
CSMWorld::UniversalId::Type_Spells,
|
||||||
CSMWorld::UniversalId::Type_Enchantments,
|
CSMWorld::UniversalId::Type_Enchantments,
|
||||||
|
CSMWorld::UniversalId::Type_BodyParts,
|
||||||
|
|
||||||
CSMWorld::UniversalId::Type_None // end marker
|
CSMWorld::UniversalId::Type_None // end marker
|
||||||
};
|
};
|
||||||
|
@ -94,6 +95,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
||||||
CSMWorld::UniversalId::Type_Sound,
|
CSMWorld::UniversalId::Type_Sound,
|
||||||
CSMWorld::UniversalId::Type_Faction,
|
CSMWorld::UniversalId::Type_Faction,
|
||||||
CSMWorld::UniversalId::Type_Enchantment,
|
CSMWorld::UniversalId::Type_Enchantment,
|
||||||
|
CSMWorld::UniversalId::Type_BodyPart,
|
||||||
|
|
||||||
CSMWorld::UniversalId::Type_None // end marker
|
CSMWorld::UniversalId::Type_None // end marker
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,4 +22,14 @@ void BodyPart::save(ESMWriter &esm) const
|
||||||
esm.writeHNT("BYDT", mData, 4);
|
esm.writeHNT("BYDT", mData, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BodyPart::blank()
|
||||||
|
{
|
||||||
|
mData.mPart = 0;
|
||||||
|
mData.mVampire = 0;
|
||||||
|
mData.mFlags = 0;
|
||||||
|
mData.mType = 0;
|
||||||
|
|
||||||
|
mModel.clear();
|
||||||
|
mRace.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,9 @@ struct BodyPart
|
||||||
|
|
||||||
void load(ESMReader &esm);
|
void load(ESMReader &esm);
|
||||||
void save(ESMWriter &esm) const;
|
void save(ESMWriter &esm) const;
|
||||||
|
|
||||||
|
void blank();
|
||||||
|
///< Set record to default state (does not touch the ID).
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue