mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 18:35:20 +00:00
Add the remaining Cell data for editing with dialogue subview. Should resolve Bug #2551.
- NOTE: the interior water flag and water level logic needs reviewing - does not automatically disable region names for interiors without mQuasiEx flag - Colour values can't be entered as RGB - Region names are not drop down menus
This commit is contained in:
parent
aeec1be8b3
commit
b27a879352
@ -62,7 +62,7 @@ namespace CSMWorld
|
|||||||
{ ColumnId_StarterSpell, "Starter Spell" },
|
{ ColumnId_StarterSpell, "Starter Spell" },
|
||||||
{ ColumnId_AlwaysSucceeds, "Always Succeeds" },
|
{ ColumnId_AlwaysSucceeds, "Always Succeeds" },
|
||||||
{ ColumnId_SleepForbidden, "Sleep Forbidden" },
|
{ ColumnId_SleepForbidden, "Sleep Forbidden" },
|
||||||
{ ColumnId_InteriorWater, "Interior Water" },
|
{ ColumnId_Water, "Has Water" },
|
||||||
{ ColumnId_InteriorSky, "Interior Sky" },
|
{ ColumnId_InteriorSky, "Interior Sky" },
|
||||||
{ ColumnId_Model, "Model" },
|
{ ColumnId_Model, "Model" },
|
||||||
{ ColumnId_Script, "Script" },
|
{ ColumnId_Script, "Script" },
|
||||||
@ -303,6 +303,15 @@ namespace CSMWorld
|
|||||||
{ ColumnId_RaceSkill, "Skills" },
|
{ ColumnId_RaceSkill, "Skills" },
|
||||||
{ ColumnId_RaceBonus, "Bonus" },
|
{ ColumnId_RaceBonus, "Bonus" },
|
||||||
|
|
||||||
|
{ ColumnId_Interior, "Interior" },
|
||||||
|
{ ColumnId_Ambient, "Ambient" },
|
||||||
|
{ ColumnId_Sunlight, "Sunlight" },
|
||||||
|
{ ColumnId_Fog, "Fog" },
|
||||||
|
{ ColumnId_FogDensity, "Fog Density" },
|
||||||
|
{ ColumnId_WaterLevel, "Water Level" },
|
||||||
|
{ ColumnId_InteriorWater, "Interior Water" },
|
||||||
|
{ ColumnId_MapColor, "Map Color" },
|
||||||
|
|
||||||
{ ColumnId_UseValue1, "Use value 1" },
|
{ ColumnId_UseValue1, "Use value 1" },
|
||||||
{ ColumnId_UseValue2, "Use value 2" },
|
{ ColumnId_UseValue2, "Use value 2" },
|
||||||
{ ColumnId_UseValue3, "Use value 3" },
|
{ ColumnId_UseValue3, "Use value 3" },
|
||||||
|
@ -57,7 +57,7 @@ namespace CSMWorld
|
|||||||
ColumnId_StarterSpell = 42,
|
ColumnId_StarterSpell = 42,
|
||||||
ColumnId_AlwaysSucceeds = 43,
|
ColumnId_AlwaysSucceeds = 43,
|
||||||
ColumnId_SleepForbidden = 44,
|
ColumnId_SleepForbidden = 44,
|
||||||
ColumnId_InteriorWater = 45,
|
ColumnId_Water = 45,
|
||||||
ColumnId_InteriorSky = 46,
|
ColumnId_InteriorSky = 46,
|
||||||
ColumnId_Model = 47,
|
ColumnId_Model = 47,
|
||||||
ColumnId_Script = 48,
|
ColumnId_Script = 48,
|
||||||
@ -294,6 +294,15 @@ namespace CSMWorld
|
|||||||
ColumnId_RaceSkill = 266,
|
ColumnId_RaceSkill = 266,
|
||||||
ColumnId_RaceBonus = 267,
|
ColumnId_RaceBonus = 267,
|
||||||
|
|
||||||
|
ColumnId_Interior = 268,
|
||||||
|
ColumnId_Ambient = 269,
|
||||||
|
ColumnId_Sunlight = 270,
|
||||||
|
ColumnId_Fog = 271,
|
||||||
|
ColumnId_FogDensity = 272,
|
||||||
|
ColumnId_WaterLevel = 273,
|
||||||
|
ColumnId_InteriorWater = 274,
|
||||||
|
ColumnId_MapColor = 275,
|
||||||
|
|
||||||
// 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,
|
||||||
|
@ -287,10 +287,31 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
mCells.addColumn (new FixedRecordTypeColumn<Cell> (UniversalId::Type_Cell));
|
mCells.addColumn (new FixedRecordTypeColumn<Cell> (UniversalId::Type_Cell));
|
||||||
mCells.addColumn (new NameColumn<Cell>);
|
mCells.addColumn (new NameColumn<Cell>);
|
||||||
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_SleepForbidden, ESM::Cell::NoSleep));
|
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_SleepForbidden, ESM::Cell::NoSleep));
|
||||||
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_InteriorWater, ESM::Cell::HasWater));
|
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_Water, ESM::Cell::HasWater));
|
||||||
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_InteriorSky, ESM::Cell::QuasiEx));
|
mCells.addColumn (new FlagColumn<Cell> (Columns::ColumnId_InteriorSky, ESM::Cell::QuasiEx));
|
||||||
mCells.addColumn (new RegionColumn<Cell>);
|
mCells.addColumn (new RegionColumn<Cell>);
|
||||||
mCells.addColumn (new RefNumCounterColumn<Cell>);
|
mCells.addColumn (new RefNumCounterColumn<Cell>);
|
||||||
|
// Misc Cell data
|
||||||
|
mCells.addColumn (new NestedParentColumn<Cell> (Columns::ColumnId_Cell,
|
||||||
|
ColumnBase::Flag_Dialogue | ColumnBase::Flag_Dialogue_List));
|
||||||
|
index = mCells.getColumns()-1;
|
||||||
|
mCells.addAdapter (std::make_pair(&mCells.getColumn(index), new CellListAdapter ()));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_Interior, ColumnBase::Display_Boolean));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_Ambient, ColumnBase::Display_Integer));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_Sunlight, ColumnBase::Display_Integer));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_Fog, ColumnBase::Display_Integer));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_FogDensity, ColumnBase::Display_Float));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_InteriorWater, ColumnBase::Display_Boolean));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_WaterLevel, ColumnBase::Display_Float));
|
||||||
|
mCells.getNestableColumn(index)->addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_MapColor, ColumnBase::Display_Integer));
|
||||||
|
|
||||||
mEnchantments.addColumn (new StringIdColumn<ESM::Enchantment>);
|
mEnchantments.addColumn (new StringIdColumn<ESM::Enchantment>);
|
||||||
mEnchantments.addColumn (new RecordStateColumn<ESM::Enchantment>);
|
mEnchantments.addColumn (new RecordStateColumn<ESM::Enchantment>);
|
||||||
@ -465,7 +486,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
addModel (new IdTree (&mTopicInfos, &mTopicInfos, IdTable::Feature_ReorderWithinTopic),
|
addModel (new IdTree (&mTopicInfos, &mTopicInfos, IdTable::Feature_ReorderWithinTopic),
|
||||||
UniversalId::Type_TopicInfo);
|
UniversalId::Type_TopicInfo);
|
||||||
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 IdTree (&mCells, &mCells, IdTable::Feature_ViewId), UniversalId::Type_Cell);
|
||||||
addModel (new IdTree (&mEnchantments, &mEnchantments), UniversalId::Type_Enchantment);
|
addModel (new IdTree (&mEnchantments, &mEnchantments), UniversalId::Type_Enchantment);
|
||||||
addModel (new IdTable (&mBodyParts), UniversalId::Type_BodyPart);
|
addModel (new IdTable (&mBodyParts), UniversalId::Type_BodyPart);
|
||||||
addModel (new IdTable (&mSoundGens), UniversalId::Type_SoundGen);
|
addModel (new IdTable (&mSoundGens), UniversalId::Type_SoundGen);
|
||||||
|
@ -88,7 +88,7 @@ namespace CSMWorld
|
|||||||
IdCollection<ESM::StartScript> mStartScripts;
|
IdCollection<ESM::StartScript> mStartScripts;
|
||||||
NestedInfoCollection mTopicInfos;
|
NestedInfoCollection mTopicInfos;
|
||||||
InfoCollection mJournalInfos;
|
InfoCollection mJournalInfos;
|
||||||
IdCollection<Cell> mCells;
|
NestedIdCollection<Cell> mCells;
|
||||||
IdCollection<LandTexture> mLandTextures;
|
IdCollection<LandTexture> mLandTextures;
|
||||||
IdCollection<Land> mLand;
|
IdCollection<Land> mLand;
|
||||||
RefIdCollection mReferenceables;
|
RefIdCollection mReferenceables;
|
||||||
|
@ -481,7 +481,7 @@ namespace CSMWorld
|
|||||||
|
|
||||||
void InfoListAdapter::removeRow(Record<Info>& record, int rowToRemove) const
|
void InfoListAdapter::removeRow(Record<Info>& record, int rowToRemove) const
|
||||||
{
|
{
|
||||||
throw std::logic_error ("cannot add a row to a fixed table");
|
throw std::logic_error ("cannot remove a row to a fixed table");
|
||||||
}
|
}
|
||||||
|
|
||||||
void InfoListAdapter::setTable(Record<Info>& record,
|
void InfoListAdapter::setTable(Record<Info>& record,
|
||||||
@ -1033,4 +1033,163 @@ namespace CSMWorld
|
|||||||
// there are 7 skill bonuses
|
// there are 7 skill bonuses
|
||||||
return static_cast<int>(sizeof(record.get().mData.mBonus)/sizeof(record.get().mData.mBonus[0]));
|
return static_cast<int>(sizeof(record.get().mData.mBonus)/sizeof(record.get().mData.mBonus[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CellListAdapter::CellListAdapter () {}
|
||||||
|
|
||||||
|
void CellListAdapter::addRow(Record<CSMWorld::Cell>& record, int position) const
|
||||||
|
{
|
||||||
|
throw std::logic_error ("cannot add a row to a fixed table");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellListAdapter::removeRow(Record<CSMWorld::Cell>& record, int rowToRemove) const
|
||||||
|
{
|
||||||
|
throw std::logic_error ("cannot remove a row to a fixed table");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellListAdapter::setTable(Record<CSMWorld::Cell>& record,
|
||||||
|
const NestedTableWrapperBase& nestedTable) const
|
||||||
|
{
|
||||||
|
throw std::logic_error ("table operation not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
NestedTableWrapperBase* CellListAdapter::table(const Record<CSMWorld::Cell>& record) const
|
||||||
|
{
|
||||||
|
throw std::logic_error ("table operation not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CellListAdapter::getData(const Record<CSMWorld::Cell>& record,
|
||||||
|
int subRowIndex, int subColIndex) const
|
||||||
|
{
|
||||||
|
CSMWorld::Cell cell = record.get();
|
||||||
|
|
||||||
|
bool isInterior = (cell.mData.mFlags & ESM::Cell::Interior) != 0;
|
||||||
|
bool behaveLikeExterior = (cell.mData.mFlags & ESM::Cell::QuasiEx) != 0;
|
||||||
|
|
||||||
|
switch (subColIndex)
|
||||||
|
{
|
||||||
|
case 0: return isInterior;
|
||||||
|
case 1: return (isInterior && !behaveLikeExterior) ? cell.mAmbi.mAmbient : QVariant();
|
||||||
|
case 2: return (isInterior && !behaveLikeExterior) ? cell.mAmbi.mSunlight : QVariant();
|
||||||
|
case 3: return (isInterior && !behaveLikeExterior) ? cell.mAmbi.mFog : QVariant();
|
||||||
|
case 4: return (isInterior && !behaveLikeExterior) ? cell.mAmbi.mFogDensity : QVariant();
|
||||||
|
case 5: return (isInterior && !behaveLikeExterior) ? cell.mWaterInt==true : QVariant();
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior && cell.mWaterInt)
|
||||||
|
return cell.mWater;
|
||||||
|
else
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
case 7: return isInterior ? QVariant() : cell.mMapColor; // TODO: how to select?
|
||||||
|
//case 8: return isInterior ? behaveLikeExterior : QVariant();
|
||||||
|
default: throw std::runtime_error("Cell subcolumn index out of range");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellListAdapter::setData(Record<CSMWorld::Cell>& record,
|
||||||
|
const QVariant& value, int subRowIndex, int subColIndex) const
|
||||||
|
{
|
||||||
|
CSMWorld::Cell cell = record.get();
|
||||||
|
|
||||||
|
bool isInterior = (cell.mData.mFlags & ESM::Cell::Interior) != 0;
|
||||||
|
bool behaveLikeExterior = (cell.mData.mFlags & ESM::Cell::QuasiEx) != 0;
|
||||||
|
|
||||||
|
switch (subColIndex)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
if (value.toBool())
|
||||||
|
cell.mData.mFlags |= ESM::Cell::Interior;
|
||||||
|
else
|
||||||
|
cell.mData.mFlags &= ~ESM::Cell::Interior;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior)
|
||||||
|
cell.mAmbi.mAmbient = static_cast<int32_t>(value.toInt());
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior)
|
||||||
|
cell.mAmbi.mSunlight = static_cast<int32_t>(value.toInt());
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior)
|
||||||
|
cell.mAmbi.mFog = static_cast<int32_t>(value.toInt());
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior)
|
||||||
|
cell.mAmbi.mFogDensity = value.toFloat();
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior)
|
||||||
|
cell.mWaterInt = value.toBool();
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
if (isInterior && !behaveLikeExterior && cell.mWaterInt)
|
||||||
|
cell.mWater = value.toFloat();
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
if (!isInterior)
|
||||||
|
cell.mMapColor = value.toInt();
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
// redundant since this flag is shown in the main table as "Interior Sky"
|
||||||
|
// keep here for documenting the logic based on vanilla
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
if (isInterior)
|
||||||
|
{
|
||||||
|
if (value.toBool())
|
||||||
|
cell.mData.mFlags |= ESM::Cell::QuasiEx;
|
||||||
|
else
|
||||||
|
cell.mData.mFlags &= ~ESM::Cell::QuasiEx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return; // return without saving
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
default: throw std::runtime_error("Cell subcolumn index out of range");
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified (cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CellListAdapter::getColumnsCount(const Record<CSMWorld::Cell>& record) const
|
||||||
|
{
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CellListAdapter::getRowsCount(const Record<CSMWorld::Cell>& record) const
|
||||||
|
{
|
||||||
|
return 1; // fixed at size 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "nestedcolumnadapter.hpp"
|
#include "nestedcolumnadapter.hpp"
|
||||||
#include "nestedtablewrapper.hpp"
|
#include "nestedtablewrapper.hpp"
|
||||||
|
#include "cell.hpp"
|
||||||
|
|
||||||
namespace ESM
|
namespace ESM
|
||||||
{
|
{
|
||||||
@ -488,6 +489,31 @@ namespace CSMWorld
|
|||||||
|
|
||||||
virtual int getRowsCount(const Record<ESM::Race>& record) const;
|
virtual int getRowsCount(const Record<ESM::Race>& record) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CellListAdapter : public NestedColumnAdapter<CSMWorld::Cell>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CellListAdapter ();
|
||||||
|
|
||||||
|
virtual void addRow(Record<CSMWorld::Cell>& record, int position) const;
|
||||||
|
|
||||||
|
virtual void removeRow(Record<CSMWorld::Cell>& record, int rowToRemove) const;
|
||||||
|
|
||||||
|
virtual void setTable(Record<CSMWorld::Cell>& record,
|
||||||
|
const NestedTableWrapperBase& nestedTable) const;
|
||||||
|
|
||||||
|
virtual NestedTableWrapperBase* table(const Record<CSMWorld::Cell>& record) const;
|
||||||
|
|
||||||
|
virtual QVariant getData(const Record<CSMWorld::Cell>& record,
|
||||||
|
int subRowIndex, int subColIndex) const;
|
||||||
|
|
||||||
|
virtual void setData(Record<CSMWorld::Cell>& record,
|
||||||
|
const QVariant& value, int subRowIndex, int subColIndex) const;
|
||||||
|
|
||||||
|
virtual int getColumnsCount(const Record<CSMWorld::Cell>& record) const;
|
||||||
|
|
||||||
|
virtual int getRowsCount(const Record<CSMWorld::Cell>& record) const;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // CSM_WOLRD_NESTEDCOLADAPTERIMP_H
|
#endif // CSM_WOLRD_NESTEDCOLADAPTERIMP_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user