mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-26 15:39:51 +00:00
Merge remote-tracking branch 'cc9cii/edit-ingredient'
This commit is contained in:
commit
133e04a38e
@ -86,6 +86,10 @@ bool CSMWorld::ColumnBase::isId (Display display)
|
|||||||
Display_InfoCondVar,
|
Display_InfoCondVar,
|
||||||
Display_InfoCondComp,
|
Display_InfoCondComp,
|
||||||
|
|
||||||
|
Display_EffectSkill,
|
||||||
|
Display_EffectAttribute,
|
||||||
|
Display_IngredEffectId,
|
||||||
|
|
||||||
Display_None
|
Display_None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,6 +14,13 @@ namespace CSMWorld
|
|||||||
{
|
{
|
||||||
struct ColumnBase
|
struct ColumnBase
|
||||||
{
|
{
|
||||||
|
enum TableEditModes
|
||||||
|
{
|
||||||
|
TableEdit_None, // no editing
|
||||||
|
TableEdit_Full, // edit cells and add/remove rows
|
||||||
|
TableEdit_FixedRows // edit cells only
|
||||||
|
};
|
||||||
|
|
||||||
enum Roles
|
enum Roles
|
||||||
{
|
{
|
||||||
Role_Flags = Qt::UserRole,
|
Role_Flags = Qt::UserRole,
|
||||||
@ -124,6 +131,10 @@ namespace CSMWorld
|
|||||||
Display_String32,
|
Display_String32,
|
||||||
Display_LongString256,
|
Display_LongString256,
|
||||||
|
|
||||||
|
Display_EffectSkill, // must display at least one, unlike Display_Skill
|
||||||
|
Display_EffectAttribute, // must display at least one, unlike Display_Attribute
|
||||||
|
Display_IngredEffectId, // display none allowed, unlike Display_EffectId
|
||||||
|
|
||||||
//top level columns that nest other columns
|
//top level columns that nest other columns
|
||||||
Display_NestedHeader
|
Display_NestedHeader
|
||||||
};
|
};
|
||||||
@ -186,8 +197,8 @@ namespace CSMWorld
|
|||||||
template<typename ESXRecordT>
|
template<typename ESXRecordT>
|
||||||
struct NestedParentColumn : public Column<ESXRecordT>
|
struct NestedParentColumn : public Column<ESXRecordT>
|
||||||
{
|
{
|
||||||
NestedParentColumn (int id, int flags = ColumnBase::Flag_Dialogue) : Column<ESXRecordT> (id,
|
NestedParentColumn (int id, int flags = ColumnBase::Flag_Dialogue, bool fixedRows = false)
|
||||||
ColumnBase::Display_NestedHeader, flags)
|
: Column<ESXRecordT> (id, ColumnBase::Display_NestedHeader, flags), mFixedRows(fixedRows)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
|
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
|
||||||
@ -198,13 +209,20 @@ namespace CSMWorld
|
|||||||
|
|
||||||
virtual QVariant get (const Record<ESXRecordT>& record) const
|
virtual QVariant get (const Record<ESXRecordT>& record) const
|
||||||
{
|
{
|
||||||
return true; // required by IdTree::hasChildren()
|
// by default editable; also see IdTree::hasChildren()
|
||||||
|
if (mFixedRows)
|
||||||
|
return QVariant::fromValue(ColumnBase::TableEdit_FixedRows);
|
||||||
|
else
|
||||||
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool isEditable() const
|
virtual bool isEditable() const
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool mFixedRows;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NestedChildColumn : public NestableColumn
|
struct NestedChildColumn : public NestableColumn
|
||||||
@ -219,4 +237,6 @@ namespace CSMWorld
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(CSMWorld::ColumnBase::TableEditModes)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -136,7 +136,8 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
mRaces.getNestableColumn(index)->addColumn(
|
mRaces.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_SpellId, ColumnBase::Display_Spell));
|
new NestedChildColumn (Columns::ColumnId_SpellId, ColumnBase::Display_Spell));
|
||||||
// Race attributes
|
// Race attributes
|
||||||
mRaces.addColumn (new NestedParentColumn<ESM::Race> (Columns::ColumnId_RaceAttributes));
|
mRaces.addColumn (new NestedParentColumn<ESM::Race> (Columns::ColumnId_RaceAttributes,
|
||||||
|
ColumnBase::Flag_Dialogue, true)); // fixed rows table
|
||||||
index = mRaces.getColumns()-1;
|
index = mRaces.getColumns()-1;
|
||||||
mRaces.addAdapter (std::make_pair(&mRaces.getColumn(index), new RaceAttributeAdapter()));
|
mRaces.addAdapter (std::make_pair(&mRaces.getColumn(index), new RaceAttributeAdapter()));
|
||||||
mRaces.getNestableColumn(index)->addColumn(
|
mRaces.getNestableColumn(index)->addColumn(
|
||||||
@ -147,7 +148,8 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
mRaces.getNestableColumn(index)->addColumn(
|
mRaces.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Female, ColumnBase::Display_Integer));
|
new NestedChildColumn (Columns::ColumnId_Female, ColumnBase::Display_Integer));
|
||||||
// Race skill bonus
|
// Race skill bonus
|
||||||
mRaces.addColumn (new NestedParentColumn<ESM::Race> (Columns::ColumnId_RaceSkillBonus));
|
mRaces.addColumn (new NestedParentColumn<ESM::Race> (Columns::ColumnId_RaceSkillBonus,
|
||||||
|
ColumnBase::Flag_Dialogue, true)); // fixed rows table
|
||||||
index = mRaces.getColumns()-1;
|
index = mRaces.getColumns()-1;
|
||||||
mRaces.addAdapter (std::make_pair(&mRaces.getColumn(index), new RaceSkillsBonusAdapter()));
|
mRaces.addAdapter (std::make_pair(&mRaces.getColumn(index), new RaceSkillsBonusAdapter()));
|
||||||
mRaces.getNestableColumn(index)->addColumn(
|
mRaces.getNestableColumn(index)->addColumn(
|
||||||
@ -213,9 +215,9 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
mSpells.getNestableColumn(index)->addColumn(
|
mSpells.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
|
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
|
||||||
mSpells.getNestableColumn(index)->addColumn(
|
mSpells.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_SkillId));
|
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_EffectSkill));
|
||||||
mSpells.getNestableColumn(index)->addColumn(
|
mSpells.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_Attribute));
|
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_EffectAttribute));
|
||||||
mSpells.getNestableColumn(index)->addColumn(
|
mSpells.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
|
new NestedChildColumn (Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
|
||||||
mSpells.getNestableColumn(index)->addColumn(
|
mSpells.getNestableColumn(index)->addColumn(
|
||||||
@ -329,9 +331,9 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
mEnchantments.getNestableColumn(index)->addColumn(
|
mEnchantments.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
|
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
|
||||||
mEnchantments.getNestableColumn(index)->addColumn(
|
mEnchantments.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_SkillId));
|
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_EffectSkill));
|
||||||
mEnchantments.getNestableColumn(index)->addColumn(
|
mEnchantments.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_Attribute));
|
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_EffectAttribute));
|
||||||
mEnchantments.getNestableColumn(index)->addColumn(
|
mEnchantments.getNestableColumn(index)->addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
|
new NestedChildColumn (Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
|
||||||
mEnchantments.getNestableColumn(index)->addColumn(
|
mEnchantments.getNestableColumn(index)->addColumn(
|
||||||
|
@ -317,8 +317,34 @@ namespace CSMWorld
|
|||||||
else
|
else
|
||||||
throw std::runtime_error("Magic effects ID unexpected value");
|
throw std::runtime_error("Magic effects ID unexpected value");
|
||||||
}
|
}
|
||||||
case 1: return effect.mSkill;
|
case 1:
|
||||||
case 2: return effect.mAttribute;
|
{
|
||||||
|
switch (effect.mEffectID)
|
||||||
|
{
|
||||||
|
case ESM::MagicEffect::DrainSkill:
|
||||||
|
case ESM::MagicEffect::DamageSkill:
|
||||||
|
case ESM::MagicEffect::RestoreSkill:
|
||||||
|
case ESM::MagicEffect::FortifySkill:
|
||||||
|
case ESM::MagicEffect::AbsorbSkill:
|
||||||
|
return effect.mSkill;
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
switch (effect.mEffectID)
|
||||||
|
{
|
||||||
|
case ESM::MagicEffect::DrainAttribute:
|
||||||
|
case ESM::MagicEffect::DamageAttribute:
|
||||||
|
case ESM::MagicEffect::RestoreAttribute:
|
||||||
|
case ESM::MagicEffect::FortifyAttribute:
|
||||||
|
case ESM::MagicEffect::AbsorbAttribute:
|
||||||
|
return effect.mAttribute;
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
case 3:
|
case 3:
|
||||||
{
|
{
|
||||||
if (effect.mRange >=0 && effect.mRange <=2)
|
if (effect.mRange >=0 && effect.mRange <=2)
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include <components/esm/loadcont.hpp>
|
#include <components/esm/loadcont.hpp>
|
||||||
|
#include <components/esm/loadmgef.hpp>
|
||||||
|
|
||||||
|
#include "columnbase.hpp"
|
||||||
#include "nestedtablewrapper.hpp"
|
#include "nestedtablewrapper.hpp"
|
||||||
|
|
||||||
CSMWorld::PotionColumns::PotionColumns (const InventoryColumns& columns)
|
CSMWorld::PotionColumns::PotionColumns (const InventoryColumns& columns)
|
||||||
@ -25,8 +28,9 @@ QVariant CSMWorld::PotionRefIdAdapter::getData (const RefIdColumn *column, const
|
|||||||
if (column==mAutoCalc)
|
if (column==mAutoCalc)
|
||||||
return record.get().mData.mAutoCalc!=0;
|
return record.get().mData.mAutoCalc!=0;
|
||||||
|
|
||||||
|
// to show nested tables in dialogue subview, see IdTree::hasChildren()
|
||||||
if (column==mColumns.mEffects)
|
if (column==mColumns.mEffects)
|
||||||
return true; // to show nested tables in dialogue subview, see IdTree::hasChildren()
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
|
|
||||||
return InventoryRefIdAdapter<ESM::Potion>::getData (column, data, index);
|
return InventoryRefIdAdapter<ESM::Potion>::getData (column, data, index);
|
||||||
}
|
}
|
||||||
@ -52,6 +56,156 @@ void CSMWorld::PotionRefIdAdapter::setData (const RefIdColumn *column, RefIdData
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CSMWorld::IngredientColumns::IngredientColumns (const InventoryColumns& columns)
|
||||||
|
: InventoryColumns (columns) {}
|
||||||
|
|
||||||
|
CSMWorld::IngredientRefIdAdapter::IngredientRefIdAdapter (const IngredientColumns& columns)
|
||||||
|
: InventoryRefIdAdapter<ESM::Ingredient> (UniversalId::Type_Ingredient, columns),
|
||||||
|
mColumns(columns)
|
||||||
|
{}
|
||||||
|
|
||||||
|
QVariant CSMWorld::IngredientRefIdAdapter::getData (const RefIdColumn *column, const RefIdData& data,
|
||||||
|
int index) const
|
||||||
|
{
|
||||||
|
if (column==mColumns.mEffects)
|
||||||
|
return QVariant::fromValue(ColumnBase::TableEdit_FixedRows);
|
||||||
|
|
||||||
|
return InventoryRefIdAdapter<ESM::Ingredient>::getData (column, data, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::IngredientRefIdAdapter::setData (const RefIdColumn *column, RefIdData& data, int index,
|
||||||
|
const QVariant& value) const
|
||||||
|
{
|
||||||
|
InventoryRefIdAdapter<ESM::Ingredient>::setData (column, data, index, value);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CSMWorld::IngredEffectRefIdAdapter::IngredEffectRefIdAdapter()
|
||||||
|
: mType(UniversalId::Type_Ingredient)
|
||||||
|
{}
|
||||||
|
|
||||||
|
CSMWorld::IngredEffectRefIdAdapter::~IngredEffectRefIdAdapter()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CSMWorld::IngredEffectRefIdAdapter::addNestedRow (const RefIdColumn *column,
|
||||||
|
RefIdData& data, int index, int position) const
|
||||||
|
{
|
||||||
|
// Do nothing, this table cannot be changed by the user
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::IngredEffectRefIdAdapter::removeNestedRow (const RefIdColumn *column,
|
||||||
|
RefIdData& data, int index, int rowToRemove) const
|
||||||
|
{
|
||||||
|
// Do nothing, this table cannot be changed by the user
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::IngredEffectRefIdAdapter::setNestedTable (const RefIdColumn* column,
|
||||||
|
RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) const
|
||||||
|
{
|
||||||
|
Record<ESM::Ingredient>& record =
|
||||||
|
static_cast<Record<ESM::Ingredient>&> (data.getRecord (RefIdData::LocalIndex (index, mType)));
|
||||||
|
ESM::Ingredient ingredient = record.get();
|
||||||
|
|
||||||
|
ingredient.mData =
|
||||||
|
static_cast<const NestedTableWrapper<std::vector<typename ESM::Ingredient::IRDTstruct> >&>(nestedTable).mNestedTable.at(0);
|
||||||
|
|
||||||
|
record.setModified (ingredient);
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMWorld::NestedTableWrapperBase* CSMWorld::IngredEffectRefIdAdapter::nestedTable (const RefIdColumn* column,
|
||||||
|
const RefIdData& data, int index) const
|
||||||
|
{
|
||||||
|
const Record<ESM::Ingredient>& record =
|
||||||
|
static_cast<const Record<ESM::Ingredient>&> (data.getRecord (RefIdData::LocalIndex (index, mType)));
|
||||||
|
|
||||||
|
// return the whole struct
|
||||||
|
std::vector<typename ESM::Ingredient::IRDTstruct> wrap;
|
||||||
|
wrap.push_back(record.get().mData);
|
||||||
|
|
||||||
|
// deleted by dtor of NestedTableStoring
|
||||||
|
return new NestedTableWrapper<std::vector<typename ESM::Ingredient::IRDTstruct> >(wrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CSMWorld::IngredEffectRefIdAdapter::getNestedData (const RefIdColumn *column,
|
||||||
|
const RefIdData& data, int index, int subRowIndex, int subColIndex) const
|
||||||
|
{
|
||||||
|
const Record<ESM::Ingredient>& record =
|
||||||
|
static_cast<const Record<ESM::Ingredient>&> (data.getRecord (RefIdData::LocalIndex (index, mType)));
|
||||||
|
|
||||||
|
if (subRowIndex < 0 || subRowIndex >= 4)
|
||||||
|
throw std::runtime_error ("index out of range");
|
||||||
|
|
||||||
|
switch (subColIndex)
|
||||||
|
{
|
||||||
|
case 0: return record.get().mData.mEffectID[subRowIndex];
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
switch (record.get().mData.mEffectID[subRowIndex])
|
||||||
|
{
|
||||||
|
case ESM::MagicEffect::DrainSkill:
|
||||||
|
case ESM::MagicEffect::DamageSkill:
|
||||||
|
case ESM::MagicEffect::RestoreSkill:
|
||||||
|
case ESM::MagicEffect::FortifySkill:
|
||||||
|
case ESM::MagicEffect::AbsorbSkill:
|
||||||
|
return record.get().mData.mSkills[subRowIndex];
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
switch (record.get().mData.mEffectID[subRowIndex])
|
||||||
|
{
|
||||||
|
case ESM::MagicEffect::DrainAttribute:
|
||||||
|
case ESM::MagicEffect::DamageAttribute:
|
||||||
|
case ESM::MagicEffect::RestoreAttribute:
|
||||||
|
case ESM::MagicEffect::FortifyAttribute:
|
||||||
|
case ESM::MagicEffect::AbsorbAttribute:
|
||||||
|
return record.get().mData.mAttributes[subRowIndex];
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Trying to access non-existing column in the nested table!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::IngredEffectRefIdAdapter::setNestedData (const RefIdColumn *column,
|
||||||
|
RefIdData& data, int row, const QVariant& value, int subRowIndex, int subColIndex) const
|
||||||
|
{
|
||||||
|
Record<ESM::Ingredient>& record =
|
||||||
|
static_cast<Record<ESM::Ingredient>&> (data.getRecord (RefIdData::LocalIndex (row, mType)));
|
||||||
|
ESM::Ingredient ingredient = record.get();
|
||||||
|
|
||||||
|
if (subRowIndex < 0 || subRowIndex >= 4)
|
||||||
|
throw std::runtime_error ("index out of range");
|
||||||
|
|
||||||
|
switch(subColIndex)
|
||||||
|
{
|
||||||
|
case 0: ingredient.mData.mEffectID[subRowIndex] = value.toInt(); break;
|
||||||
|
case 1: ingredient.mData.mSkills[subRowIndex] = value.toInt(); break;
|
||||||
|
case 2: ingredient.mData.mAttributes[subRowIndex] = value.toInt(); break;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Trying to access non-existing column in the nested table!");
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified (ingredient);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSMWorld::IngredEffectRefIdAdapter::getNestedColumnsCount(const RefIdColumn *column, const RefIdData& data) const
|
||||||
|
{
|
||||||
|
return 3; // effect, skill, attribute
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSMWorld::IngredEffectRefIdAdapter::getNestedRowsCount(const RefIdColumn *column, const RefIdData& data, int index) const
|
||||||
|
{
|
||||||
|
return 4; // up to 4 effects
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CSMWorld::ApparatusRefIdAdapter::ApparatusRefIdAdapter (const InventoryColumns& columns,
|
CSMWorld::ApparatusRefIdAdapter::ApparatusRefIdAdapter (const InventoryColumns& columns,
|
||||||
const RefIdColumn *type, const RefIdColumn *quality)
|
const RefIdColumn *type, const RefIdColumn *quality)
|
||||||
: InventoryRefIdAdapter<ESM::Apparatus> (UniversalId::Type_Apparatus, columns),
|
: InventoryRefIdAdapter<ESM::Apparatus> (UniversalId::Type_Apparatus, columns),
|
||||||
@ -118,7 +272,7 @@ QVariant CSMWorld::ArmorRefIdAdapter::getData (const RefIdColumn *column,
|
|||||||
return record.get().mData.mArmor;
|
return record.get().mData.mArmor;
|
||||||
|
|
||||||
if (column==mPartRef)
|
if (column==mPartRef)
|
||||||
return true; // to show nested tables in dialogue subview, see IdTree::hasChildren()
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
|
|
||||||
return EnchantableRefIdAdapter<ESM::Armor>::getData (column, data, index);
|
return EnchantableRefIdAdapter<ESM::Armor>::getData (column, data, index);
|
||||||
}
|
}
|
||||||
@ -206,7 +360,7 @@ QVariant CSMWorld::ClothingRefIdAdapter::getData (const RefIdColumn *column,
|
|||||||
return record.get().mData.mType;
|
return record.get().mData.mType;
|
||||||
|
|
||||||
if (column==mPartRef)
|
if (column==mPartRef)
|
||||||
return true; // to show nested tables in dialogue subview, see IdTree::hasChildren()
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
|
|
||||||
return EnchantableRefIdAdapter<ESM::Clothing>::getData (column, data, index);
|
return EnchantableRefIdAdapter<ESM::Clothing>::getData (column, data, index);
|
||||||
}
|
}
|
||||||
@ -254,7 +408,7 @@ QVariant CSMWorld::ContainerRefIdAdapter::getData (const RefIdColumn *column,
|
|||||||
return (record.get().mFlags & ESM::Container::Respawn)!=0;
|
return (record.get().mFlags & ESM::Container::Respawn)!=0;
|
||||||
|
|
||||||
if (column==mContent)
|
if (column==mContent)
|
||||||
return true; // Required to show nested tables in dialogue subview
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
|
|
||||||
return NameRefIdAdapter<ESM::Container>::getData (column, data, index);
|
return NameRefIdAdapter<ESM::Container>::getData (column, data, index);
|
||||||
}
|
}
|
||||||
@ -323,13 +477,13 @@ QVariant CSMWorld::CreatureRefIdAdapter::getData (const RefIdColumn *column, con
|
|||||||
return QString::fromUtf8 (record.get().mOriginal.c_str());
|
return QString::fromUtf8 (record.get().mOriginal.c_str());
|
||||||
|
|
||||||
if (column==mColumns.mAttributes)
|
if (column==mColumns.mAttributes)
|
||||||
return true; // Required to show nested tables in dialogue subview
|
return QVariant::fromValue(ColumnBase::TableEdit_FixedRows);
|
||||||
|
|
||||||
if (column==mColumns.mAttacks)
|
if (column==mColumns.mAttacks)
|
||||||
return true; // Required to show nested tables in dialogue subview
|
return QVariant::fromValue(ColumnBase::TableEdit_FixedRows);
|
||||||
|
|
||||||
if (column==mColumns.mMisc)
|
if (column==mColumns.mMisc)
|
||||||
return true; // Required to show nested items in dialogue subview
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
|
|
||||||
std::map<const RefIdColumn *, unsigned int>::const_iterator iter =
|
std::map<const RefIdColumn *, unsigned int>::const_iterator iter =
|
||||||
mColumns.mFlags.find (column);
|
mColumns.mFlags.find (column);
|
||||||
@ -569,13 +723,13 @@ QVariant CSMWorld::NpcRefIdAdapter::getData (const RefIdColumn *column, const Re
|
|||||||
if (column==mColumns.mAttributes || column==mColumns.mSkills)
|
if (column==mColumns.mAttributes || column==mColumns.mSkills)
|
||||||
{
|
{
|
||||||
if ((record.get().mFlags & ESM::NPC::Autocalc) != 0)
|
if ((record.get().mFlags & ESM::NPC::Autocalc) != 0)
|
||||||
return QVariant(QVariant::UserType);
|
return QVariant::fromValue(ColumnBase::TableEdit_None);
|
||||||
else
|
else
|
||||||
return true;
|
return QVariant::fromValue(ColumnBase::TableEdit_FixedRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (column==mColumns.mMisc)
|
if (column==mColumns.mMisc)
|
||||||
return true;
|
return QVariant::fromValue(ColumnBase::TableEdit_Full);
|
||||||
|
|
||||||
std::map<const RefIdColumn *, unsigned int>::const_iterator iter =
|
std::map<const RefIdColumn *, unsigned int>::const_iterator iter =
|
||||||
mColumns.mFlags.find (column);
|
mColumns.mFlags.find (column);
|
||||||
|
@ -340,6 +340,66 @@ namespace CSMWorld
|
|||||||
///< If the data type does not match an exception is thrown.
|
///< If the data type does not match an exception is thrown.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct IngredientColumns : public InventoryColumns
|
||||||
|
{
|
||||||
|
const RefIdColumn *mEffects;
|
||||||
|
|
||||||
|
IngredientColumns (const InventoryColumns& columns);
|
||||||
|
};
|
||||||
|
|
||||||
|
class IngredientRefIdAdapter : public InventoryRefIdAdapter<ESM::Ingredient>
|
||||||
|
{
|
||||||
|
IngredientColumns mColumns;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
IngredientRefIdAdapter (const IngredientColumns& columns);
|
||||||
|
|
||||||
|
virtual QVariant getData (const RefIdColumn *column, const RefIdData& data, int index)
|
||||||
|
const;
|
||||||
|
|
||||||
|
virtual void setData (const RefIdColumn *column, RefIdData& data, int index,
|
||||||
|
const QVariant& value) const;
|
||||||
|
///< If the data type does not match an exception is thrown.
|
||||||
|
};
|
||||||
|
|
||||||
|
class IngredEffectRefIdAdapter : public NestedRefIdAdapterBase
|
||||||
|
{
|
||||||
|
UniversalId::Type mType;
|
||||||
|
|
||||||
|
// not implemented
|
||||||
|
IngredEffectRefIdAdapter (const IngredEffectRefIdAdapter&);
|
||||||
|
IngredEffectRefIdAdapter& operator= (const IngredEffectRefIdAdapter&);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
IngredEffectRefIdAdapter();
|
||||||
|
|
||||||
|
virtual ~IngredEffectRefIdAdapter();
|
||||||
|
|
||||||
|
virtual void addNestedRow (const RefIdColumn *column,
|
||||||
|
RefIdData& data, int index, int position) const;
|
||||||
|
|
||||||
|
virtual void removeNestedRow (const RefIdColumn *column,
|
||||||
|
RefIdData& data, int index, int rowToRemove) const;
|
||||||
|
|
||||||
|
virtual void setNestedTable (const RefIdColumn* column,
|
||||||
|
RefIdData& data, int index, const NestedTableWrapperBase& nestedTable) const;
|
||||||
|
|
||||||
|
virtual NestedTableWrapperBase* nestedTable (const RefIdColumn* column,
|
||||||
|
const RefIdData& data, int index) const;
|
||||||
|
|
||||||
|
virtual QVariant getNestedData (const RefIdColumn *column,
|
||||||
|
const RefIdData& data, int index, int subRowIndex, int subColIndex) const;
|
||||||
|
|
||||||
|
virtual void setNestedData (const RefIdColumn *column,
|
||||||
|
RefIdData& data, int row, const QVariant& value, int subRowIndex, int subColIndex) const;
|
||||||
|
|
||||||
|
virtual int getNestedColumnsCount(const RefIdColumn *column, const RefIdData& data) const;
|
||||||
|
|
||||||
|
virtual int getNestedRowsCount(const RefIdColumn *column, const RefIdData& data, int index) const;
|
||||||
|
};
|
||||||
|
|
||||||
struct EnchantableColumns : public InventoryColumns
|
struct EnchantableColumns : public InventoryColumns
|
||||||
{
|
{
|
||||||
const RefIdColumn *mEnchantment;
|
const RefIdColumn *mEnchantment;
|
||||||
|
@ -71,6 +71,21 @@ CSMWorld::RefIdCollection::RefIdCollection()
|
|||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_CoinValue, ColumnBase::Display_Integer));
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_CoinValue, ColumnBase::Display_Integer));
|
||||||
inventoryColumns.mValue = &mColumns.back();
|
inventoryColumns.mValue = &mColumns.back();
|
||||||
|
|
||||||
|
IngredientColumns ingredientColumns (inventoryColumns);
|
||||||
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_EffectList,
|
||||||
|
ColumnBase::Display_NestedHeader, ColumnBase::Flag_Dialogue));
|
||||||
|
ingredientColumns.mEffects = &mColumns.back();
|
||||||
|
std::map<UniversalId::Type, NestedRefIdAdapterBase*> ingredientEffectsMap;
|
||||||
|
ingredientEffectsMap.insert(std::make_pair(UniversalId::Type_Ingredient,
|
||||||
|
new IngredEffectRefIdAdapter ()));
|
||||||
|
mNestedAdapters.push_back (std::make_pair(&mColumns.back(), ingredientEffectsMap));
|
||||||
|
mColumns.back().addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_IngredEffectId));
|
||||||
|
mColumns.back().addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_EffectSkill));
|
||||||
|
mColumns.back().addColumn(
|
||||||
|
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_EffectAttribute));
|
||||||
|
|
||||||
// nested table
|
// nested table
|
||||||
PotionColumns potionColumns (inventoryColumns);
|
PotionColumns potionColumns (inventoryColumns);
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_EffectList,
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_EffectList,
|
||||||
@ -83,9 +98,9 @@ CSMWorld::RefIdCollection::RefIdCollection()
|
|||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
|
new NestedChildColumn (Columns::ColumnId_EffectId, ColumnBase::Display_EffectId));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_SkillId));
|
new NestedChildColumn (Columns::ColumnId_Skill, ColumnBase::Display_EffectSkill));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_Attribute));
|
new NestedChildColumn (Columns::ColumnId_Attribute, ColumnBase::Display_EffectAttribute));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
new NestedChildColumn (Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
|
new NestedChildColumn (Columns::ColumnId_EffectRange, ColumnBase::Display_EffectRange));
|
||||||
mColumns.back().addColumn(
|
mColumns.back().addColumn(
|
||||||
@ -651,7 +666,7 @@ CSMWorld::RefIdCollection::RefIdCollection()
|
|||||||
mAdapters.insert (std::make_pair (UniversalId::Type_Door,
|
mAdapters.insert (std::make_pair (UniversalId::Type_Door,
|
||||||
new DoorRefIdAdapter (nameColumns, openSound, closeSound)));
|
new DoorRefIdAdapter (nameColumns, openSound, closeSound)));
|
||||||
mAdapters.insert (std::make_pair (UniversalId::Type_Ingredient,
|
mAdapters.insert (std::make_pair (UniversalId::Type_Ingredient,
|
||||||
new InventoryRefIdAdapter<ESM::Ingredient> (UniversalId::Type_Ingredient, inventoryColumns)));
|
new IngredientRefIdAdapter (ingredientColumns)));
|
||||||
mAdapters.insert (std::make_pair (UniversalId::Type_CreatureLevelledList,
|
mAdapters.insert (std::make_pair (UniversalId::Type_CreatureLevelledList,
|
||||||
new LevelledListRefIdAdapter<ESM::CreatureLevList> (
|
new LevelledListRefIdAdapter<ESM::CreatureLevList> (
|
||||||
UniversalId::Type_CreatureLevelledList, levListColumns)));
|
UniversalId::Type_CreatureLevelledList, levListColumns)));
|
||||||
|
@ -104,6 +104,9 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager)
|
|||||||
{ CSMWorld::ColumnBase::Display_AiPackageType, CSMWorld::Columns::ColumnId_AiPackageType, false },
|
{ CSMWorld::ColumnBase::Display_AiPackageType, CSMWorld::Columns::ColumnId_AiPackageType, false },
|
||||||
{ CSMWorld::ColumnBase::Display_InfoCondFunc, CSMWorld::Columns::ColumnId_InfoCondFunc, false },
|
{ CSMWorld::ColumnBase::Display_InfoCondFunc, CSMWorld::Columns::ColumnId_InfoCondFunc, false },
|
||||||
{ CSMWorld::ColumnBase::Display_InfoCondComp, CSMWorld::Columns::ColumnId_InfoCondComp, false },
|
{ CSMWorld::ColumnBase::Display_InfoCondComp, CSMWorld::Columns::ColumnId_InfoCondComp, false },
|
||||||
|
{ CSMWorld::ColumnBase::Display_IngredEffectId, CSMWorld::Columns::ColumnId_EffectId, true },
|
||||||
|
{ CSMWorld::ColumnBase::Display_EffectSkill, CSMWorld::Columns::ColumnId_Skill, false },
|
||||||
|
{ CSMWorld::ColumnBase::Display_EffectAttribute, CSMWorld::Columns::ColumnId_Attribute, false },
|
||||||
};
|
};
|
||||||
|
|
||||||
for (std::size_t i=0; i<sizeof (sMapping)/sizeof (Mapping); ++i)
|
for (std::size_t i=0; i<sizeof (sMapping)/sizeof (Mapping); ++i)
|
||||||
|
@ -564,10 +564,23 @@ void CSVWorld::EditWidget::remake(int row)
|
|||||||
static_cast<CSMWorld::UniversalId::Type> (mTable->data (mTable->index (row, typeColumn)).toInt()),
|
static_cast<CSMWorld::UniversalId::Type> (mTable->data (mTable->index (row, typeColumn)).toInt()),
|
||||||
mTable->data (mTable->index (row, idColumn)).toString().toUtf8().constData());
|
mTable->data (mTable->index (row, idColumn)).toString().toUtf8().constData());
|
||||||
|
|
||||||
NestedTable* table = new NestedTable(mDocument, id, mNestedModels.back(), this);
|
bool editable = true;
|
||||||
table->resizeColumnsToContents();
|
bool fixedRows = false;
|
||||||
|
QVariant v = mTable->index(row, i).data();
|
||||||
|
if (v.canConvert<CSMWorld::ColumnBase::TableEditModes>())
|
||||||
|
{
|
||||||
|
assert (QString(v.typeName()) == "CSMWorld::ColumnBase::TableEditModes");
|
||||||
|
|
||||||
if(mTable->index(row, i).data().type() == QVariant::UserType)
|
if (v.value<CSMWorld::ColumnBase::TableEditModes>() == CSMWorld::ColumnBase::TableEdit_None)
|
||||||
|
editable = false;
|
||||||
|
else if (v.value<CSMWorld::ColumnBase::TableEditModes>() == CSMWorld::ColumnBase::TableEdit_FixedRows)
|
||||||
|
fixedRows = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
NestedTable* table =
|
||||||
|
new NestedTable(mDocument, id, mNestedModels.back(), this, editable, fixedRows);
|
||||||
|
table->resizeColumnsToContents();
|
||||||
|
if (!editable)
|
||||||
{
|
{
|
||||||
table->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
table->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||||
table->setEnabled(false);
|
table->setEnabled(false);
|
||||||
@ -583,7 +596,7 @@ void CSVWorld::EditWidget::remake(int row)
|
|||||||
new QLabel (mTable->headerData (i, Qt::Horizontal, Qt::DisplayRole).toString(), mMainWidget);
|
new QLabel (mTable->headerData (i, Qt::Horizontal, Qt::DisplayRole).toString(), mMainWidget);
|
||||||
|
|
||||||
label->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
|
label->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||||
if(mTable->index(row, i).data().type() == QVariant::UserType)
|
if(!editable)
|
||||||
label->setEnabled(false);
|
label->setEnabled(false);
|
||||||
|
|
||||||
tablesLayout->addWidget(label);
|
tablesLayout->addWidget(label);
|
||||||
|
@ -16,8 +16,13 @@
|
|||||||
CSVWorld::NestedTable::NestedTable(CSMDoc::Document& document,
|
CSVWorld::NestedTable::NestedTable(CSMDoc::Document& document,
|
||||||
CSMWorld::UniversalId id,
|
CSMWorld::UniversalId id,
|
||||||
CSMWorld::NestedTableProxyModel* model,
|
CSMWorld::NestedTableProxyModel* model,
|
||||||
QWidget* parent)
|
QWidget* parent,
|
||||||
|
bool editable,
|
||||||
|
bool fixedRows)
|
||||||
: DragRecordTable(document, parent),
|
: DragRecordTable(document, parent),
|
||||||
|
mAddNewRowAction(NULL),
|
||||||
|
mRemoveRowAction(NULL),
|
||||||
|
mEditIdAction(NULL),
|
||||||
mModel(model)
|
mModel(model)
|
||||||
{
|
{
|
||||||
mDispatcher = new CSMWorld::CommandDispatcher (document, id, this);
|
mDispatcher = new CSMWorld::CommandDispatcher (document, id, this);
|
||||||
@ -49,18 +54,24 @@ CSVWorld::NestedTable::NestedTable(CSMDoc::Document& document,
|
|||||||
|
|
||||||
setModel(model);
|
setModel(model);
|
||||||
|
|
||||||
mAddNewRowAction = new QAction (tr ("Add new row"), this);
|
if (editable)
|
||||||
|
{
|
||||||
|
if (!fixedRows)
|
||||||
|
{
|
||||||
|
mAddNewRowAction = new QAction (tr ("Add new row"), this);
|
||||||
|
|
||||||
connect(mAddNewRowAction, SIGNAL(triggered()),
|
connect(mAddNewRowAction, SIGNAL(triggered()),
|
||||||
this, SLOT(addNewRowActionTriggered()));
|
this, SLOT(addNewRowActionTriggered()));
|
||||||
|
|
||||||
mRemoveRowAction = new QAction (tr ("Remove row"), this);
|
mRemoveRowAction = new QAction (tr ("Remove row"), this);
|
||||||
|
|
||||||
connect(mRemoveRowAction, SIGNAL(triggered()),
|
connect(mRemoveRowAction, SIGNAL(triggered()),
|
||||||
this, SLOT(removeRowActionTriggered()));
|
this, SLOT(removeRowActionTriggered()));
|
||||||
|
}
|
||||||
|
|
||||||
mEditIdAction = new TableEditIdAction(*this, this);
|
mEditIdAction = new TableEditIdAction(*this, this);
|
||||||
connect(mEditIdAction, SIGNAL(triggered()), this, SLOT(editCell()));
|
connect(mEditIdAction, SIGNAL(triggered()), this, SLOT(editCell()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CSMWorld::UniversalId> CSVWorld::NestedTable::getDraggedRecords() const
|
std::vector<CSMWorld::UniversalId> CSVWorld::NestedTable::getDraggedRecords() const
|
||||||
@ -71,6 +82,9 @@ std::vector<CSMWorld::UniversalId> CSVWorld::NestedTable::getDraggedRecords() co
|
|||||||
|
|
||||||
void CSVWorld::NestedTable::contextMenuEvent (QContextMenuEvent *event)
|
void CSVWorld::NestedTable::contextMenuEvent (QContextMenuEvent *event)
|
||||||
{
|
{
|
||||||
|
if (!mEditIdAction)
|
||||||
|
return;
|
||||||
|
|
||||||
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
@ -84,10 +98,13 @@ void CSVWorld::NestedTable::contextMenuEvent (QContextMenuEvent *event)
|
|||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectionModel()->selectedRows().size() == 1)
|
if (mAddNewRowAction && mRemoveRowAction)
|
||||||
menu.addAction(mRemoveRowAction);
|
{
|
||||||
|
if (selectionModel()->selectedRows().size() == 1)
|
||||||
|
menu.addAction(mRemoveRowAction);
|
||||||
|
|
||||||
menu.addAction(mAddNewRowAction);
|
menu.addAction(mAddNewRowAction);
|
||||||
|
}
|
||||||
|
|
||||||
menu.exec (event->globalPos());
|
menu.exec (event->globalPos());
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,9 @@ namespace CSVWorld
|
|||||||
NestedTable(CSMDoc::Document& document,
|
NestedTable(CSMDoc::Document& document,
|
||||||
CSMWorld::UniversalId id,
|
CSMWorld::UniversalId id,
|
||||||
CSMWorld::NestedTableProxyModel* model,
|
CSMWorld::NestedTableProxyModel* model,
|
||||||
QWidget* parent = NULL);
|
QWidget* parent = NULL,
|
||||||
|
bool editable = true,
|
||||||
|
bool fixedRows = false);
|
||||||
|
|
||||||
virtual std::vector<CSMWorld::UniversalId> getDraggedRecords() const;
|
virtual std::vector<CSMWorld::UniversalId> getDraggedRecords() const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user