mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 04:19:55 +00:00
Quick and dirty prototype of actual nested header data implementation
This commit is contained in:
parent
256b075914
commit
a076798f8f
9 changed files with 76 additions and 49 deletions
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
#include "columns.hpp"
|
#include "columns.hpp"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
CSMWorld::ColumnBase::ColumnBase (int columnId, Display displayType, int flags, bool canNest)
|
CSMWorld::ColumnBase::ColumnBase (int columnId, Display displayType, int flags, bool canNest)
|
||||||
: mColumnId (columnId), mDisplayType (displayType), mFlags (flags), mCanNest(canNest)
|
: mColumnId (columnId), mDisplayType (displayType), mFlags (flags), mCanNest(canNest)
|
||||||
{}
|
{}
|
||||||
|
@ -28,3 +30,15 @@ bool CSMWorld::ColumnBase::canHaveNestedColumns() const
|
||||||
{
|
{
|
||||||
return mCanNest;
|
return mCanNest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CSMWorld::ColumnBase::getNestedColumnTitle(int columnNumber) const
|
||||||
|
{
|
||||||
|
return Columns::getName (mDisplayType, columnNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMWorld::ColumnBase::addNestedColumnDisplay(CSMWorld::ColumnBase::Display displayDefinition)
|
||||||
|
{
|
||||||
|
assert (canHaveNestedColumns());
|
||||||
|
|
||||||
|
mNestedDisplayType.push_back(displayDefinition);
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define CSM_WOLRD_COLUMNBASE_H
|
#define CSM_WOLRD_COLUMNBASE_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <Qt>
|
#include <Qt>
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
|
@ -97,6 +98,7 @@ namespace CSMWorld
|
||||||
int mColumnId;
|
int mColumnId;
|
||||||
int mFlags;
|
int mFlags;
|
||||||
Display mDisplayType;
|
Display mDisplayType;
|
||||||
|
std::vector<Display> mNestedDisplayType;
|
||||||
const bool mCanNest;
|
const bool mCanNest;
|
||||||
|
|
||||||
ColumnBase (int columnId, Display displayType, int flag, bool canNest = false);
|
ColumnBase (int columnId, Display displayType, int flag, bool canNest = false);
|
||||||
|
@ -110,6 +112,10 @@ namespace CSMWorld
|
||||||
|
|
||||||
virtual std::string getTitle() const;
|
virtual std::string getTitle() const;
|
||||||
|
|
||||||
|
std::string getNestedColumnTitle(int columnNumber) const;
|
||||||
|
|
||||||
|
virtual void addNestedColumnDisplay(Display displayDefinition);
|
||||||
|
|
||||||
virtual int getId() const;
|
virtual int getId() const;
|
||||||
|
|
||||||
bool canHaveNestedColumns() const;
|
bool canHaveNestedColumns() const;
|
||||||
|
|
|
@ -216,6 +216,21 @@ std::string CSMWorld::Columns::getName (ColumnId column)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CSMWorld::Columns::getName(CSMWorld::ColumnBase::Display displayType, int columnNumber)
|
||||||
|
{
|
||||||
|
//TODO, this is just temporary solution
|
||||||
|
switch (displayType)
|
||||||
|
{
|
||||||
|
case CSMWorld::ColumnBase::Display_NestedItemList:
|
||||||
|
if (columnNumber == 0)
|
||||||
|
return "ID";
|
||||||
|
|
||||||
|
if (columnNumber == 1)
|
||||||
|
return "Count";
|
||||||
|
}
|
||||||
|
return "Do yourself a favor and take a look at the columns.cpp";
|
||||||
|
}
|
||||||
|
|
||||||
int CSMWorld::Columns::getId (const std::string& name)
|
int CSMWorld::Columns::getId (const std::string& name)
|
||||||
{
|
{
|
||||||
std::string name2 = Misc::StringUtils::lowerCase (name);
|
std::string name2 = Misc::StringUtils::lowerCase (name);
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "columnbase.hpp"
|
||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
namespace Columns
|
namespace Columns
|
||||||
|
@ -208,6 +210,8 @@ namespace CSMWorld
|
||||||
|
|
||||||
std::string getName (ColumnId column);
|
std::string getName (ColumnId column);
|
||||||
|
|
||||||
|
std::string getName (ColumnBase::Display displayType, int columnNumber);
|
||||||
|
|
||||||
int getId (const std::string& name);
|
int getId (const std::string& name);
|
||||||
///< Will return -1 for an invalid name.
|
///< Will return -1 for an invalid name.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "idtable.hpp"
|
#include "idtable.hpp"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
#include "collectionbase.hpp"
|
#include "collectionbase.hpp"
|
||||||
#include "columnbase.hpp"
|
#include "columnbase.hpp"
|
||||||
|
|
||||||
|
@ -70,6 +72,25 @@ QVariant CSMWorld::IdTable::headerData (int section,
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVariant CSMWorld::IdTable::nestedHeaderData(int section, int subSection, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
assert(mIdCollection->getColumn(section).canHaveNestedColumns());
|
||||||
|
|
||||||
|
if (orientation==Qt::Vertical)
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
if (role==Qt::DisplayRole)
|
||||||
|
return tr (mIdCollection->getColumn(section).getNestedColumnTitle(subSection).c_str());
|
||||||
|
|
||||||
|
if (role==ColumnBase::Role_Flags)
|
||||||
|
return mIdCollection->getColumn (section).mFlags;
|
||||||
|
|
||||||
|
if (role==ColumnBase::Role_Display)
|
||||||
|
return mIdCollection->getColumn (section).mNestedDisplayType.at(subSection);
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
bool CSMWorld::IdTable::setData (const QModelIndex &index, const QVariant &value, int role)
|
bool CSMWorld::IdTable::setData (const QModelIndex &index, const QVariant &value, int role)
|
||||||
{
|
{
|
||||||
if (mIdCollection->getColumn (index.column()).isEditable() && role==Qt::EditRole)
|
if (mIdCollection->getColumn (index.column()).isEditable() && role==Qt::EditRole)
|
||||||
|
|
|
@ -72,6 +72,8 @@ namespace CSMWorld
|
||||||
|
|
||||||
virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||||
|
|
||||||
|
QVariant nestedHeaderData(int section, int subSection, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||||
|
|
||||||
virtual bool setData ( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
virtual bool setData ( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
|
||||||
|
|
||||||
virtual Qt::ItemFlags flags (const QModelIndex & index) const;
|
virtual Qt::ItemFlags flags (const QModelIndex & index) const;
|
||||||
|
|
|
@ -6,21 +6,20 @@
|
||||||
CSMWorld::NestedTableModel::NestedTableModel(const QModelIndex& parent,
|
CSMWorld::NestedTableModel::NestedTableModel(const QModelIndex& parent,
|
||||||
ColumnBase::Display columnId,
|
ColumnBase::Display columnId,
|
||||||
CSMWorld::IdTable* parentModel)
|
CSMWorld::IdTable* parentModel)
|
||||||
: mParentColumn(parent.column())
|
: mParentColumn(parent.column()),
|
||||||
|
mMainModel(parentModel)
|
||||||
{
|
{
|
||||||
const int parentRow = parent.row();
|
const int parentRow = parent.row();
|
||||||
|
|
||||||
mId = std::string(parentModel->index(parentRow, 0).data().toString().toUtf8());
|
mId = std::string(parentModel->index(parentRow, 0).data().toString().toUtf8());
|
||||||
|
|
||||||
QAbstractProxyModel::setSourceModel(parentModel);
|
QAbstractProxyModel::setSourceModel(parentModel);
|
||||||
|
|
||||||
setupHeaderVectors(columnId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex CSMWorld::NestedTableModel::mapFromSource(const QModelIndex& sourceIndex) const
|
QModelIndex CSMWorld::NestedTableModel::mapFromSource(const QModelIndex& sourceIndex) const
|
||||||
{
|
{
|
||||||
const QModelIndex& testedParent = sourceModel()->parent(sourceIndex);
|
const QModelIndex& testedParent = mMainModel->parent(sourceIndex);
|
||||||
const QModelIndex& parent = dynamic_cast<CSMWorld::IdTable*>(sourceModel())->getModelIndex (mId, mParentColumn);
|
const QModelIndex& parent = mMainModel->getModelIndex (mId, mParentColumn);
|
||||||
if (testedParent == parent)
|
if (testedParent == parent)
|
||||||
{
|
{
|
||||||
return createIndex(sourceIndex.row(), sourceIndex.column());
|
return createIndex(sourceIndex.row(), sourceIndex.column());
|
||||||
|
@ -34,36 +33,30 @@ QModelIndex CSMWorld::NestedTableModel::mapFromSource(const QModelIndex& sourceI
|
||||||
|
|
||||||
QModelIndex CSMWorld::NestedTableModel::mapToSource(const QModelIndex& proxyIndex) const
|
QModelIndex CSMWorld::NestedTableModel::mapToSource(const QModelIndex& proxyIndex) const
|
||||||
{
|
{
|
||||||
const QModelIndex& parent = dynamic_cast<CSMWorld::IdTable*>(sourceModel())->getModelIndex (mId, mParentColumn);
|
const QModelIndex& parent = mMainModel->getModelIndex (mId, mParentColumn);
|
||||||
return sourceModel()->index(proxyIndex.row(), proxyIndex.column(), parent);
|
return mMainModel->index(proxyIndex.row(), proxyIndex.column(), parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CSMWorld::NestedTableModel::rowCount(const QModelIndex& index) const
|
int CSMWorld::NestedTableModel::rowCount(const QModelIndex& index) const
|
||||||
{
|
{
|
||||||
assert (!index.isValid());
|
assert (!index.isValid());
|
||||||
|
|
||||||
CSMWorld::IdTable* table = dynamic_cast<CSMWorld::IdTable*>(sourceModel());
|
return mMainModel->rowCount(mMainModel->getModelIndex(mId, mParentColumn));
|
||||||
|
|
||||||
return table->rowCount(table->getModelIndex(mId, mParentColumn));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CSMWorld::NestedTableModel::columnCount(const QModelIndex& parent) const
|
int CSMWorld::NestedTableModel::columnCount(const QModelIndex& parent) const
|
||||||
{
|
{
|
||||||
assert (!parent.isValid());
|
assert (!parent.isValid());
|
||||||
|
|
||||||
CSMWorld::IdTable* table = dynamic_cast<CSMWorld::IdTable*>(sourceModel());
|
return mMainModel->columnCount(mMainModel->getModelIndex(mId, mParentColumn));
|
||||||
|
|
||||||
return table->columnCount(table->getModelIndex(mId, mParentColumn));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex CSMWorld::NestedTableModel::index(int row, int column, const QModelIndex& parent) const
|
QModelIndex CSMWorld::NestedTableModel::index(int row, int column, const QModelIndex& parent) const
|
||||||
{
|
{
|
||||||
assert (!parent.isValid());
|
assert (!parent.isValid());
|
||||||
|
|
||||||
CSMWorld::IdTable* table = dynamic_cast<CSMWorld::IdTable*>(sourceModel());
|
int rows = mMainModel->rowCount(parent);
|
||||||
|
int columns = mMainModel->columnCount(parent);
|
||||||
int rows = table->rowCount(parent);
|
|
||||||
int columns = table->columnCount(parent);
|
|
||||||
|
|
||||||
if (row < 0 ||
|
if (row < 0 ||
|
||||||
row >= rows ||
|
row >= rows ||
|
||||||
|
@ -85,34 +78,5 @@ QVariant CSMWorld::NestedTableModel::headerData(int section,
|
||||||
Qt::Orientation orientation,
|
Qt::Orientation orientation,
|
||||||
int role) const
|
int role) const
|
||||||
{
|
{
|
||||||
if (orientation==Qt::Vertical)
|
return mMainModel->nestedHeaderData(mParentColumn, section, orientation, role);
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
if (role==Qt::DisplayRole)
|
|
||||||
return tr (mHeaderTitle[section].c_str());
|
|
||||||
|
|
||||||
if (role==ColumnBase::Role_Flags)
|
|
||||||
return QVariant(); //TODO
|
|
||||||
|
|
||||||
if (role==ColumnBase::Role_Display)
|
|
||||||
return mHeaderDisplay[section];
|
|
||||||
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSMWorld::NestedTableModel::setupHeaderVectors(ColumnBase::Display columnId)
|
|
||||||
{
|
|
||||||
switch(columnId)
|
|
||||||
{
|
|
||||||
case ColumnBase::Display_NestedItemList:
|
|
||||||
mHeaderTitle.push_back("test1");
|
|
||||||
mHeaderTitle.push_back("test2");
|
|
||||||
|
|
||||||
mHeaderDisplay.push_back(ColumnBase::Display_String);
|
|
||||||
mHeaderDisplay.push_back(ColumnBase::Display_Integer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,8 @@ namespace CSMWorld
|
||||||
class NestedTableModel : public QAbstractProxyModel
|
class NestedTableModel : public QAbstractProxyModel
|
||||||
{
|
{
|
||||||
const int mParentColumn;
|
const int mParentColumn;
|
||||||
|
IdTable* mMainModel;
|
||||||
std::string mId;
|
std::string mId;
|
||||||
std::vector<std::string> mHeaderTitle;
|
|
||||||
std::vector<ColumnBase::Display> mHeaderDisplay;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NestedTableModel(const QModelIndex& parent,
|
NestedTableModel(const QModelIndex& parent,
|
||||||
|
|
|
@ -168,6 +168,8 @@ CSMWorld::RefIdCollection::RefIdCollection()
|
||||||
|
|
||||||
mColumns.push_back(RefIdColumn (Columns::ColumnId_ContainerContent, ColumnBase::Display_NestedItemList, ColumnBase::Flag_Dialogue, true, true, true));
|
mColumns.push_back(RefIdColumn (Columns::ColumnId_ContainerContent, ColumnBase::Display_NestedItemList, ColumnBase::Flag_Dialogue, true, true, true));
|
||||||
const RefIdColumn *content = &mColumns.back();
|
const RefIdColumn *content = &mColumns.back();
|
||||||
|
(&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_String);
|
||||||
|
(&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_Integer);
|
||||||
|
|
||||||
CreatureColumns creatureColumns (actorsColumns);
|
CreatureColumns creatureColumns (actorsColumns);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue