mirror of
https://github.com/OpenMW/openmw.git
synced 2025-07-04 12:11:34 +00:00
use commands for modifying globals
This commit is contained in:
parent
8a09e03d5c
commit
4086b556d2
7 changed files with 164 additions and 9 deletions
|
@ -5,6 +5,7 @@ set (OPENCS_SRC
|
||||||
model/doc/documentmanager.cpp model/doc/document.cpp
|
model/doc/documentmanager.cpp model/doc/document.cpp
|
||||||
|
|
||||||
model/world/universalid.cpp model/world/idcollection.cpp model/world/data.cpp model/world/idtable.cpp
|
model/world/universalid.cpp model/world/idcollection.cpp model/world/data.cpp model/world/idtable.cpp
|
||||||
|
model/world/commands.cpp
|
||||||
|
|
||||||
view/doc/viewmanager.cpp view/doc/view.cpp view/doc/operations.cpp view/doc/operation.cpp
|
view/doc/viewmanager.cpp view/doc/view.cpp view/doc/operations.cpp view/doc/operation.cpp
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ set (OPENCS_HDR
|
||||||
model/world/idtable.hpp model/world/columns.hpp
|
model/world/idtable.hpp model/world/columns.hpp
|
||||||
|
|
||||||
view/doc/viewmanager.hpp view/doc/view.hpp view/doc/operations.hpp view/doc/operation.hpp
|
view/doc/viewmanager.hpp view/doc/view.hpp view/doc/operations.hpp view/doc/operation.hpp
|
||||||
|
model/world/commands.hpp
|
||||||
|
|
||||||
view/world/subview.hpp view/world/globals.hpp
|
view/world/subview.hpp view/world/globals.hpp
|
||||||
)
|
)
|
||||||
|
|
23
apps/opencs/model/world/commands.cpp
Normal file
23
apps/opencs/model/world/commands.cpp
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
#include "commands.hpp"
|
||||||
|
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
|
||||||
|
CSMWorld::ModifyCommand::ModifyCommand (QAbstractItemModel& model, const QModelIndex& index,
|
||||||
|
const QVariant& new_, QUndoCommand *parent)
|
||||||
|
: QUndoCommand (parent), mModel (model), mIndex (index), mNew (new_)
|
||||||
|
{
|
||||||
|
mOld = mModel.data (mIndex, Qt::EditRole);
|
||||||
|
|
||||||
|
setText ("Modify " + mModel.headerData (mIndex.column(), Qt::Horizontal, Qt::DisplayRole).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::ModifyCommand::redo()
|
||||||
|
{
|
||||||
|
mModel.setData (mIndex, mNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::ModifyCommand::undo()
|
||||||
|
{
|
||||||
|
mModel.setData (mIndex, mOld);
|
||||||
|
}
|
33
apps/opencs/model/world/commands.hpp
Normal file
33
apps/opencs/model/world/commands.hpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef CSM_WOLRD_COMMANDS_H
|
||||||
|
#define CSM_WOLRD_COMMANDS_H
|
||||||
|
|
||||||
|
#include "record.hpp"
|
||||||
|
|
||||||
|
#include <QVariant>
|
||||||
|
#include <QUndoCommand>
|
||||||
|
#include <QModelIndex>
|
||||||
|
|
||||||
|
class QModelIndex;
|
||||||
|
class QAbstractItemModel;
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
class ModifyCommand : public QUndoCommand
|
||||||
|
{
|
||||||
|
QAbstractItemModel& mModel;
|
||||||
|
QModelIndex mIndex;
|
||||||
|
QVariant mNew;
|
||||||
|
QVariant mOld;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ModifyCommand (QAbstractItemModel& model, const QModelIndex& index, const QVariant& new_,
|
||||||
|
QUndoCommand *parent = 0);
|
||||||
|
|
||||||
|
virtual void redo();
|
||||||
|
|
||||||
|
virtual void undo();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -193,7 +193,7 @@ void CSVDoc::View::addSubView (const CSMWorld::UniversalId& id)
|
||||||
if (iter==mSubViewFactories.end())
|
if (iter==mSubViewFactories.end())
|
||||||
throw std::logic_error ("can't create subview for " + id.toString());
|
throw std::logic_error ("can't create subview for " + id.toString());
|
||||||
|
|
||||||
CSVWorld::SubView *view = iter->second->makeSubView (id, mDocument->getData());
|
CSVWorld::SubView *view = iter->second->makeSubView (id, mDocument->getData(), mDocument->getUndoStack());
|
||||||
addDockWidget (Qt::TopDockWidgetArea, view);
|
addDockWidget (Qt::TopDockWidgetArea, view);
|
||||||
view->show();
|
view->show();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,18 +4,73 @@
|
||||||
#include <QTableView>
|
#include <QTableView>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
|
#include <QUndoStack>
|
||||||
|
|
||||||
#include "../../model/world/data.hpp"
|
#include "../../model/world/data.hpp"
|
||||||
|
|
||||||
CSVWorld::Globals::Globals (const CSMWorld::UniversalId& id, CSMWorld::Data& data)
|
#include "../../model/world/commands.hpp"
|
||||||
|
|
||||||
|
CSVWorld::NastyTableModelHack::NastyTableModelHack (QAbstractItemModel& model)
|
||||||
|
: mModel (model)
|
||||||
|
{}
|
||||||
|
|
||||||
|
int CSVWorld::NastyTableModelHack::rowCount (const QModelIndex & parent) const
|
||||||
|
{
|
||||||
|
return mModel.rowCount (parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSVWorld::NastyTableModelHack::columnCount (const QModelIndex & parent) const
|
||||||
|
{
|
||||||
|
return mModel.columnCount (parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CSVWorld::NastyTableModelHack::data (const QModelIndex & index, int role) const
|
||||||
|
{
|
||||||
|
return mModel.data (index, role);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSVWorld::NastyTableModelHack::setData ( const QModelIndex &index, const QVariant &value, int role)
|
||||||
|
{
|
||||||
|
mData = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant CSVWorld::NastyTableModelHack::getData() const
|
||||||
|
{
|
||||||
|
return mData;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVWorld::CommandDelegate::CommandDelegate (QUndoStack& undoStack, QObject *parent)
|
||||||
|
: QStyledItemDelegate (parent), mUndoStack (undoStack)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CSVWorld::CommandDelegate::setModelData (QWidget *editor, QAbstractItemModel *model,
|
||||||
|
const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
NastyTableModelHack hack (*model);
|
||||||
|
QStyledItemDelegate::setModelData (editor, &hack, index);
|
||||||
|
mUndoStack.push (new CSMWorld::ModifyCommand (*model, index, hack.getData()));
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVWorld::Globals::Globals (const CSMWorld::UniversalId& id, CSMWorld::Data& data, QUndoStack& undoStack)
|
||||||
: SubView (id)
|
: SubView (id)
|
||||||
{
|
{
|
||||||
QTableView *table = new QTableView();
|
QTableView *table = new QTableView();
|
||||||
|
|
||||||
setWidget (table);
|
setWidget (table);
|
||||||
|
|
||||||
|
QAbstractTableModel *model = data.getTableModel (id);
|
||||||
|
|
||||||
|
int columns = model->columnCount();
|
||||||
|
|
||||||
|
for (int i=1; i<columns; ++i)
|
||||||
|
{
|
||||||
|
CommandDelegate *delegate = new CommandDelegate (undoStack, table);
|
||||||
|
table->setItemDelegateForColumn (i, delegate);
|
||||||
|
}
|
||||||
|
|
||||||
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel (this);
|
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel (this);
|
||||||
proxyModel->setSourceModel (data.getTableModel (id));
|
proxyModel->setSourceModel (model);
|
||||||
|
|
||||||
table->setModel (proxyModel);
|
table->setModel (proxyModel);
|
||||||
table->horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
table->horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
||||||
|
|
|
@ -3,14 +3,52 @@
|
||||||
|
|
||||||
#include "subview.hpp"
|
#include "subview.hpp"
|
||||||
|
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
|
||||||
|
class QUndoStack;
|
||||||
|
|
||||||
namespace CSVWorld
|
namespace CSVWorld
|
||||||
{
|
{
|
||||||
class Globals : public SubView
|
///< \brief Getting the data out of an editor widget
|
||||||
|
///
|
||||||
|
/// Really, Qt? Really?
|
||||||
|
class NastyTableModelHack : public QAbstractTableModel
|
||||||
{
|
{
|
||||||
|
QAbstractItemModel& mModel;
|
||||||
|
QVariant mData;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Globals (const CSMWorld::UniversalId& id, CSMWorld::Data& data);
|
NastyTableModelHack (QAbstractItemModel& model);
|
||||||
|
|
||||||
|
int rowCount (const QModelIndex & parent = QModelIndex()) const;
|
||||||
|
|
||||||
|
int columnCount (const QModelIndex & parent = QModelIndex()) const;
|
||||||
|
|
||||||
|
QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const;
|
||||||
|
|
||||||
|
bool setData (const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
||||||
|
|
||||||
|
QVariant getData() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
///< \brief Use commands instead of manipulating the model directly
|
||||||
|
class CommandDelegate : public QStyledItemDelegate
|
||||||
|
{
|
||||||
|
QUndoStack& mUndoStack;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CommandDelegate (QUndoStack& undoStack, QObject *parent);
|
||||||
|
|
||||||
|
void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Globals : public SubView
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
Globals (const CSMWorld::UniversalId& id, CSMWorld::Data& data, QUndoStack& undoStack);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
|
|
||||||
#include <QDockWidget>
|
#include <QDockWidget>
|
||||||
|
|
||||||
|
class QUndoStack;
|
||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
class Data;
|
class Data;
|
||||||
|
@ -31,19 +33,21 @@ namespace CSVWorld
|
||||||
|
|
||||||
struct SubViewFactoryBase
|
struct SubViewFactoryBase
|
||||||
{
|
{
|
||||||
virtual SubView *makeSubView (const CSMWorld::UniversalId& id, CSMWorld::Data& data) = 0;
|
virtual SubView *makeSubView (const CSMWorld::UniversalId& id, CSMWorld::Data& data, QUndoStack& undoStack)
|
||||||
|
= 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class SubViewT>
|
template<class SubViewT>
|
||||||
struct SubViewFactory : public SubViewFactoryBase
|
struct SubViewFactory : public SubViewFactoryBase
|
||||||
{
|
{
|
||||||
virtual SubView *makeSubView (const CSMWorld::UniversalId& id, CSMWorld::Data& data);
|
virtual SubView *makeSubView (const CSMWorld::UniversalId& id, CSMWorld::Data& data, QUndoStack& undoStack);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class SubViewT>
|
template<class SubViewT>
|
||||||
SubView *SubViewFactory<SubViewT>::makeSubView (const CSMWorld::UniversalId& id, CSMWorld::Data& data)
|
SubView *SubViewFactory<SubViewT>::makeSubView (const CSMWorld::UniversalId& id, CSMWorld::Data& data,
|
||||||
|
QUndoStack& undoStack)
|
||||||
{
|
{
|
||||||
return new SubViewT (id, data);
|
return new SubViewT (id, data, undoStack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue