diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index 56362e4cdb..4d0ecb58eb 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -14,6 +14,18 @@ namespace CSMWorld { return record.get().mValue; } + + virtual void set (Record& record, const QVariant& data) + { + ESXRecordT base = record.getBase(); + base.mValue = data.toFloat(); + record.setModified (base); + } + + virtual bool isEditable() const + { + return true; + } }; } diff --git a/apps/opencs/model/world/idcollection.hpp b/apps/opencs/model/world/idcollection.hpp index 0bddda1ac9..ee6a4b2ce8 100644 --- a/apps/opencs/model/world/idcollection.hpp +++ b/apps/opencs/model/world/idcollection.hpp @@ -23,6 +23,10 @@ namespace CSMWorld virtual ~Column() {} virtual QVariant get (const Record& record) const = 0; + + virtual void set (Record& record, const QVariant& data) = 0; + + virtual bool isEditable() const = 0; }; class IdCollectionBase @@ -46,6 +50,10 @@ namespace CSMWorld virtual std::string getTitle (int column) const = 0; virtual QVariant getData (int index, int column) const = 0; + + virtual void setData (int index, int column, const QVariant& data) = 0; + + virtual bool isEditable (int column) const = 0; }; ///< \brief Collection of ID-based records @@ -77,9 +85,13 @@ namespace CSMWorld virtual QVariant getData (int index, int column) const; + virtual void setData (int index, int column, const QVariant& data); + virtual std::string getTitle (int column) const; - virtual void addColumn (Column *column); + virtual bool isEditable (int column) const; + + void addColumn (Column *column); }; template @@ -142,12 +154,24 @@ namespace CSMWorld return mColumns.at (column)->get (mRecords.at (index)); } + template + void IdCollection::setData (int index, int column, const QVariant& data) + { + return mColumns.at (column)->set (mRecords.at (index), data); + } + template std::string IdCollection::getTitle (int column) const { return mColumns.at (column)->mTitle; } + template + bool IdCollection::isEditable (int column) const + { + return mColumns.at (column)->isEditable(); + } + template void IdCollection::addColumn (Column *column) { diff --git a/apps/opencs/model/world/idtable.cpp b/apps/opencs/model/world/idtable.cpp index f8acd4f9fe..8fdc4fb8ff 100644 --- a/apps/opencs/model/world/idtable.cpp +++ b/apps/opencs/model/world/idtable.cpp @@ -31,9 +31,18 @@ int CSMWorld::IdTable::columnCount (const QModelIndex & parent) const QVariant CSMWorld::IdTable::data (const QModelIndex & index, int role) const { - if (role!=Qt::DisplayRole) + if (role!=Qt::DisplayRole && role!=Qt::EditRole) return QVariant(); + if (role==Qt::EditRole) + { + if (index.column()==0) + return QVariant(); + + if (!mIdCollection->isEditable (index.column()-1)) + return QVariant(); + } + if (index.column()==0) return QVariant (tr (mIdCollection->getId (index.row()).c_str())); @@ -52,4 +61,26 @@ QVariant CSMWorld::IdTable::headerData (int section, Qt::Orientation orientation return QVariant (tr ("ID")); return tr (mIdCollection->getTitle (section-1).c_str()); +} + +bool CSMWorld::IdTable::setData ( const QModelIndex &index, const QVariant &value, int role) +{ + if (index.column()>0 && role==Qt::EditRole) + { + mIdCollection->setData (index.row(), index.column()-1, value); + emit dataChanged (index, index); + return true; + } + + return false; +} + +Qt::ItemFlags CSMWorld::IdTable::flags (const QModelIndex & index) const +{ + Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; + + if (index.column()>0) + flags |= Qt::ItemIsEditable; + + return flags; } \ No newline at end of file diff --git a/apps/opencs/model/world/idtable.hpp b/apps/opencs/model/world/idtable.hpp index 4fb939fa31..30af3aaf70 100644 --- a/apps/opencs/model/world/idtable.hpp +++ b/apps/opencs/model/world/idtable.hpp @@ -31,6 +31,10 @@ namespace CSMWorld QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const; QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + + bool setData ( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + + Qt::ItemFlags flags (const QModelIndex & index) const; }; } diff --git a/apps/opencs/model/world/record.hpp b/apps/opencs/model/world/record.hpp index 230d39eb06..950d7f176e 100644 --- a/apps/opencs/model/world/record.hpp +++ b/apps/opencs/model/world/record.hpp @@ -8,7 +8,7 @@ namespace CSMWorld template struct Record { - enum state + enum State { State_BaseOnly, // defined in base only State_Modified, // exists in base, but has been modified @@ -18,7 +18,7 @@ namespace CSMWorld ESXRecordT mBase; ESXRecordT mModified; - state mState; + State mState; bool isDeleted() const; @@ -27,10 +27,11 @@ namespace CSMWorld const ESXRecordT& get() const; ///< Throws an exception, if the record is deleted. - ESXRecordT& get(); - ///< Throws an exception, if the record is deleted. + const ESXRecordT& getBase() const; + ///< Throws an exception, if the record is deleted. Returns modified, if there is no base. void setModified (const ESXRecordT& modified); + ///< Throws an exception, if the record is deleted. }; template @@ -55,21 +56,24 @@ namespace CSMWorld } template - ESXRecordT& Record::get() + const ESXRecordT& Record::getBase() const { if (isDeleted()) throw std::logic_error ("attempt to access a deleted record"); - return mState==State_BaseOnly ? mBase : mModified; + return mState==State_ModifiedOnly ? mModified : mBase; } template void Record::setModified (const ESXRecordT& modified) { + if (isDeleted()) + throw std::logic_error ("attempt to modify a deleted record"); + mModified = modified; if (mState!=State_ModifiedOnly) - mState = State_Modified; + mState = mBase==mModified ? State_BaseOnly : State_Modified; } } diff --git a/components/esm/loadglob.cpp b/components/esm/loadglob.cpp index 39c07fb310..0335da0df3 100644 --- a/components/esm/loadglob.cpp +++ b/components/esm/loadglob.cpp @@ -44,4 +44,8 @@ void Global::save(ESMWriter &esm) esm.writeHNT("FLTV", mValue); } + bool operator== (const Global& left, const Global& right) + { + return left.mId==right.mId && left.mValue==right.mValue && left.mType==right.mType; + } } diff --git a/components/esm/loadglob.hpp b/components/esm/loadglob.hpp index 5cfb3c87b7..5c5dafaecb 100644 --- a/components/esm/loadglob.hpp +++ b/components/esm/loadglob.hpp @@ -24,5 +24,8 @@ struct Global void load(ESMReader &esm); void save(ESMWriter &esm); }; + +bool operator== (const Global& left, const Global& right); + } #endif