diff --git a/apps/opencs/model/world/nestedtablemodel.cpp b/apps/opencs/model/world/nestedtablemodel.cpp index 20a68faad8..9a685557eb 100644 --- a/apps/opencs/model/world/nestedtablemodel.cpp +++ b/apps/opencs/model/world/nestedtablemodel.cpp @@ -1,10 +1,11 @@ #include "nestedtablemodel.hpp" +#include #include "./idtable.hpp" CSMWorld::NestedTableModel::NestedTableModel(const QModelIndex& parent, ColumnBase::Display columnId, - CSMWorld::IdTable* parentModel) + CSMWorld::IdTable* parentModel) : mParentColumn(parent.column()) { const int parentRow = parent.row(); @@ -20,7 +21,7 @@ QModelIndex CSMWorld::NestedTableModel::mapFromSource(const QModelIndex& sourceI { return createIndex(sourceIndex.row(), sourceIndex.column()); } - else + else { return QModelIndex(); } @@ -32,3 +33,46 @@ QModelIndex CSMWorld::NestedTableModel::mapToSource(const QModelIndex& proxyInde const QModelIndex& parent = dynamic_cast(sourceModel())->getModelIndex (mId, mParentColumn); return sourceModel()->index(proxyIndex.row(), proxyIndex.column(), parent); } + +int CSMWorld::NestedTableModel::rowCount(const QModelIndex& index) const +{ + assert (!index.isValid()); + + CSMWorld::IdTable* table = dynamic_cast(sourceModel()); + + return table->rowCount(table->getModelIndex(mId, mParentColumn)); +} + +int CSMWorld::NestedTableModel::columnCount(const QModelIndex& parent) const +{ + assert (!parent.isValid()); + + CSMWorld::IdTable* table = dynamic_cast(sourceModel()); + + return table->columnCount(table->getModelIndex(mId, mParentColumn)); +} + +QModelIndex CSMWorld::NestedTableModel::index(int row, int column, const QModelIndex& parent) const +{ + assert (!parent.isValid()); + + CSMWorld::IdTable* table = dynamic_cast(sourceModel()); + + unsigned rows = table->rowCount(parent); + usigned columns = table->columnCount(parent); + + if (row < 0 || + row >= rows || + column < 0 || + column >= columns) + { + return QModelIndex(); + } + + return createIndex(row, column); +} + +QModelIndex CSMWorld::NestedTableModel::parent(const QModelIndex& index) const +{ + return QModelIndex(); +} diff --git a/apps/opencs/model/world/nestedtablemodel.hpp b/apps/opencs/model/world/nestedtablemodel.hpp index acab1f8510..be29be2ca2 100644 --- a/apps/opencs/model/world/nestedtablemodel.hpp +++ b/apps/opencs/model/world/nestedtablemodel.hpp @@ -1,4 +1,3 @@ - #ifndef CSM_WOLRD_NESTEDTABLEMODEL_H #define CSM_WOLRD_NESTEDTABLEMODEL_H @@ -26,16 +25,24 @@ namespace CSMWorld std::string mId; std::vector mHeaderTitle; std::vector mHeaderDisplay; - + public: NestedTableModel(const QModelIndex& parent, ColumnBase::Display displayType, IdTable* parentModel); //parent is the parent of columns to work with. Columnid provides information about the column - + virtual QModelIndex mapFromSource(const QModelIndex& sourceIndex) const; - + virtual QModelIndex mapToSource(const QModelIndex& proxyIndex) const; + + virtual int rowCount(const QModelIndex& parent) const; + + virtual int columnCount(const QModelIndex& parent) const; + + virtual QModelIndex index(int row, int column, const QModelIndex& parent) const; + + virtual QModelIndex parent(const QModelIndex& index) const; }; } diff --git a/apps/opencs/view/world/dialoguesubview.cpp b/apps/opencs/view/world/dialoguesubview.cpp index 08bac8b08d..7a0e2efec8 100644 --- a/apps/opencs/view/world/dialoguesubview.cpp +++ b/apps/opencs/view/world/dialoguesubview.cpp @@ -22,6 +22,7 @@ #include #include +#include "../../model/world/nestedtablemodel.hpp" #include "../../model/world/columnbase.hpp" #include "../../model/world/idtable.hpp" #include "../../model/world/columns.hpp" @@ -324,6 +325,14 @@ CSVWorld::DialogueDelegateDispatcher::~DialogueDelegateDispatcher() =============================================================EditWidget===================================================== */ +CSVWorld::EditWidget::~EditWidget() +{ + for (unsigned i = 0; i < mNestedModels.size(); ++i) + { + delete mNestedModels[i]; + } +} + CSVWorld::EditWidget::EditWidget(QWidget *parent, int row, CSMWorld::IdTable* table, QUndoStack& undoStack, bool createAndDelete) : mDispatcher(this, table, undoStack), QScrollArea(parent), @@ -340,6 +349,11 @@ mTable(table) void CSVWorld::EditWidget::remake(int row) { + for (unsigned i = 0; i < mNestedModels.size(); ++i) + { + delete mNestedModels[i]; + } + if (mMainWidget) { delete mMainWidget; @@ -379,7 +393,7 @@ void CSVWorld::EditWidget::remake(int row) int locked = 0; const int columns = mTable->columnCount(); - for (int i=0; iheaderData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Flags).toInt(); @@ -390,9 +404,12 @@ void CSVWorld::EditWidget::remake(int row) if (mTable->hasChildren(mTable->index(row, i))) { + mNestedModels.push_back(new CSMWorld::NestedTableModel (mTable->index(row, i), display, mTable)); + QTableView* table = new QTableView(); - table->setModel(mTable); - table->setRootIndex(mTable->index(row, i)); + + table->setModel(*(mNestedModels.rbegin())); + tablesLayout->addWidget(table); } else { diff --git a/apps/opencs/view/world/dialoguesubview.hpp b/apps/opencs/view/world/dialoguesubview.hpp index f36785e887..90a3655924 100644 --- a/apps/opencs/view/world/dialoguesubview.hpp +++ b/apps/opencs/view/world/dialoguesubview.hpp @@ -21,6 +21,7 @@ class QVBoxLayout; namespace CSMWorld { class IdTable; + class NestedTableModel; } namespace CSMDoc @@ -169,12 +170,15 @@ namespace CSVWorld QWidget* mMainWidget; CSMWorld::IdTable* mTable; QUndoStack& mUndoStack; + std::vector mNestedModels; //Plain, raw C pointers, deleted in the dtor public: EditWidget (QWidget *parent, int row, CSMWorld::IdTable* table, QUndoStack& undoStack, bool createAndDelete = false); + ~EditWidget(); + void remake(int row); signals: