#ifndef CSM_WOLRD_COLUMNS_H #define CSM_WOLRD_COLUMNS_H #include #include #include "columnbase.hpp" namespace CSMWorld { template struct FloatValueColumn : public Column { FloatValueColumn() : Column ("Value", ColumnBase::Display_Float) {} virtual QVariant get (const Record& record) const { return record.get().mValue.getFloat(); } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mValue.setFloat (data.toFloat()); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct StringIdColumn : public Column { StringIdColumn() : Column ("ID", ColumnBase::Display_String) {} virtual QVariant get (const Record& record) const { return QString::fromUtf8 (record.get().mId.c_str()); } virtual bool isEditable() const { return false; } }; template struct RecordStateColumn : public Column { RecordStateColumn() : Column ("*", ColumnBase::Display_Integer) {} virtual QVariant get (const Record& record) const { if (record.mState==Record::State_Erased) return static_cast (Record::State_Deleted); return static_cast (record.mState); } virtual void set (Record& record, const QVariant& data) { record.mState = static_cast (data.toInt()); } virtual bool isEditable() const { return true; } virtual bool isUserEditable() const { return false; } }; template struct FixedRecordTypeColumn : public Column { int mType; FixedRecordTypeColumn (int type) : Column ("Record Type", ColumnBase::Display_Integer, 0), mType (type) {} virtual QVariant get (const Record& record) const { return mType; } virtual bool isEditable() const { return false; } }; /// \attention A var type column must be immediately followed by a suitable value column. template struct VarTypeColumn : public Column { VarTypeColumn (ColumnBase::Display display) : Column ("Type", display) {} virtual QVariant get (const Record& record) const { return static_cast (record.get().mValue.getType()); } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mValue.setType (static_cast (data.toInt())); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct VarValueColumn : public Column { VarValueColumn() : Column ("Value", ColumnBase::Display_Var) {} virtual QVariant get (const Record& record) const { switch (record.get().mValue.getType()) { case ESM::VT_String: return QString::fromUtf8 (record.get().mValue.getString().c_str()); case ESM::VT_Int: case ESM::VT_Short: case ESM::VT_Long: return record.get().mValue.getInteger(); case ESM::VT_Float: return record.get().mValue.getFloat(); default: return QVariant(); } } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); switch (record2.mValue.getType()) { case ESM::VT_String: record2.mValue.setString (data.toString().toUtf8().constData()); break; case ESM::VT_Int: case ESM::VT_Short: case ESM::VT_Long: record2.mValue.setInteger (data.toInt()); break; case ESM::VT_Float: record2.mValue.setFloat (data.toFloat()); break; default: break; } record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct DescriptionColumn : public Column { DescriptionColumn() : Column ("Description", ColumnBase::Display_String) {} virtual QVariant get (const Record& record) const { return QString::fromUtf8 (record.get().mDescription.c_str()); } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mDescription = data.toString().toUtf8().constData(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct SpecialisationColumn : public Column { SpecialisationColumn() : Column ("Specialisation", ColumnBase::Display_Specialisation) {} virtual QVariant get (const Record& record) const { return record.get().mData.mSpecialization; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mData.mSpecialization = data.toInt(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct UseValueColumn : public Column { int mIndex; UseValueColumn (int index) : Column ("Use value #" + boost::lexical_cast (index), ColumnBase::Display_Float), mIndex (index) {} virtual QVariant get (const Record& record) const { return record.get().mData.mUseValue[mIndex]; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mData.mUseValue[mIndex] = data.toInt(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct AttributeColumn : public Column { AttributeColumn() : Column ("Attribute", ColumnBase::Display_Attribute) {} virtual QVariant get (const Record& record) const { return record.get().mData.mAttribute; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mData.mAttribute = data.toInt(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct NameColumn : public Column { NameColumn() : Column ("Name", ColumnBase::Display_String) {} virtual QVariant get (const Record& record) const { return QString::fromUtf8 (record.get().mName.c_str()); } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mName = data.toString().toUtf8().constData(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct AttributesColumn : public Column { int mIndex; AttributesColumn (int index) : Column ("Attribute #" + boost::lexical_cast (index), ColumnBase::Display_Attribute), mIndex (index) {} virtual QVariant get (const Record& record) const { return record.get().mData.mAttribute[mIndex]; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mData.mAttribute[mIndex] = data.toInt(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct SkillsColumn : public Column { int mIndex; bool mMajor; SkillsColumn (int index, bool typePrefix = false, bool major = false) : Column ((typePrefix ? (major ? "Major Skill #" : "Minor Skill #") : "Skill #")+ boost::lexical_cast (index), ColumnBase::Display_String), mIndex (index), mMajor (major) {} virtual QVariant get (const Record& record) const { int skill = record.get().mData.getSkill (mIndex, mMajor); return QString::fromUtf8 (ESM::Skill::indexToId (skill).c_str()); } virtual void set (Record& record, const QVariant& data) { std::istringstream stream (data.toString().toUtf8().constData()); int index = -1; char c; stream >> c >> index; if (index!=-1) { ESXRecordT record2 = record.get(); record2.mData.getSkill (mIndex, mMajor) = index; record.setModified (record2); } } virtual bool isEditable() const { return true; } }; template struct PlayableColumn : public Column { PlayableColumn() : Column ("Playable", ColumnBase::Display_Boolean) {} virtual QVariant get (const Record& record) const { return record.get().mData.mIsPlayable!=0; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mData.mIsPlayable = data.toInt(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct HiddenColumn : public Column { HiddenColumn() : Column ("Hidden", ColumnBase::Display_Boolean) {} virtual QVariant get (const Record& record) const { return record.get().mData.mIsHidden!=0; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); record2.mData.mIsHidden = data.toInt(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct FlagColumn : public Column { int mMask; FlagColumn (const std::string& name, int mask) : Column (name, ColumnBase::Display_Boolean), mMask (mask) {} virtual QVariant get (const Record& record) const { return (record.get().mData.mFlags & mMask)!=0; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); int flags = record2.mData.mFlags & ~mMask; if (data.toInt()) flags |= mMask; record2.mData.mFlags = flags; record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct WeightHeightColumn : public Column { bool mMale; bool mWeight; WeightHeightColumn (bool male, bool weight) : Column (male ? (weight ? "Male Weight" : "Male Height") : (weight ? "Female Weight" : "Female Height"), ColumnBase::Display_Float), mMale (male), mWeight (weight) {} virtual QVariant get (const Record& record) const { const ESM::Race::MaleFemaleF& value = mWeight ? record.get().mData.mWeight : record.get().mData.mHeight; return mMale ? value.mMale : value.mFemale; } virtual void set (Record& record, const QVariant& data) { ESXRecordT record2 = record.get(); ESM::Race::MaleFemaleF& value = mWeight ? record2.mData.mWeight : record2.mData.mHeight; (mMale ? value.mMale : value.mFemale) = data.toFloat(); record.setModified (record2); } virtual bool isEditable() const { return true; } }; template struct SoundParamColumn : public Column { enum Type { Type_Volume, Type_MinRange, Type_MaxRange }; Type mType; SoundParamColumn (Type type) : Column ( type==Type_Volume ? "Volume" : (type==Type_MinRange ? "Min Range" : "Max Range"), ColumnBase::Display_Integer), mType (type) {} virtual QVariant get (const Record& record) const { int value = 0; switch (mType) { case Type_Volume: value = record.get().mData.mVolume; break; case Type_MinRange: value = record.get().mData.mMinRange; break; case Type_MaxRange: value = record.get().mData.mMaxRange; break; } return value; } virtual void set (Record& record, const QVariant& data) { int value = data.toInt(); if (value<0) value = 0; else if (value>255) value = 255; ESXRecordT record2 = record.get(); switch (mType) { case Type_Volume: record2.mData.mVolume = static_cast (value); break; case Type_MinRange: record2.mData.mMinRange = static_cast (value); break; case Type_MaxRange: record2.mData.mMaxRange = static_cast (value); break; } record.setModified (record2); } virtual bool isEditable() const { return true; } }; } #endif