mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-16 08:39:40 +00:00
Nest columns directly, created NestedColumn class and NestColumn.
This commit is contained in:
parent
0252d021eb
commit
f0c6ef185e
6 changed files with 71 additions and 41 deletions
|
@ -2,8 +2,6 @@
|
|||
|
||||
#include "columns.hpp"
|
||||
|
||||
#include <cassert>
|
||||
|
||||
CSMWorld::ColumnBase::ColumnBase (int columnId, Display displayType, int flags, bool canNest)
|
||||
: mColumnId (columnId), mDisplayType (displayType), mFlags (flags), mCanNest(canNest)
|
||||
{}
|
||||
|
@ -25,28 +23,42 @@ int CSMWorld::ColumnBase::getId() const
|
|||
return mColumnId;
|
||||
}
|
||||
|
||||
bool CSMWorld::ColumnBase::canHaveNestedColumns() const
|
||||
bool CSMWorld::NestColumn::canHaveNestedColumns() const
|
||||
{
|
||||
return mCanNest;
|
||||
}
|
||||
|
||||
std::string CSMWorld::ColumnBase::getNestedColumnTitle(int columnNumber) const
|
||||
void CSMWorld::NestColumn::addNestedColumn(int columnId, Display displayType)
|
||||
{
|
||||
assert (mCanNest);
|
||||
|
||||
return Columns::getName(static_cast<Columns::ColumnId>(mNestedColumnId[columnNumber]));
|
||||
if (!mCanNest)
|
||||
throw std::logic_error("Tried to nest inside of the non-nest column");
|
||||
|
||||
mNestedColumns.push_back(CSMWorld::NestedColumn(columnId, displayType, mFlags, this));
|
||||
}
|
||||
|
||||
void CSMWorld::ColumnBase::addNestedColumnDisplay(CSMWorld::ColumnBase::Display displayDefinition)
|
||||
const CSMWorld::ColumnBase& CSMWorld::NestColumn::nestedColumn(int subColumn) const
|
||||
{
|
||||
assert (mCanNest);
|
||||
|
||||
mNestedDisplayType.push_back(displayDefinition);
|
||||
if (!mCanNest)
|
||||
throw std::logic_error("Tried to access nested column of the non-nest column");
|
||||
|
||||
return mNestedColumns.at(subColumn);
|
||||
}
|
||||
|
||||
void CSMWorld::ColumnBase::addNestedColumnId(int columnId)
|
||||
int CSMWorld::NestColumn::nestedColumnCount() const
|
||||
{
|
||||
assert (mCanNest);
|
||||
|
||||
mNestedColumnId.push_back(columnId);
|
||||
if (!mCanNest)
|
||||
throw std::logic_error("Tried to access number of the subcolumns in the non-nest column");
|
||||
|
||||
return mNestedColumns.size();
|
||||
}
|
||||
|
||||
CSMWorld::NestColumn::NestColumn(int columnId, Display displayType, int flags, bool canNest)
|
||||
: CSMWorld::ColumnBase(columnId, displayType, flags, canNest) {}
|
||||
|
||||
CSMWorld::NestedColumn::NestedColumn(int columnId, Display displayType, int flag, const CSMWorld::NestColumn* parent)
|
||||
: mParent(parent), CSMWorld::ColumnBase(columnId, displayType, flag) {}
|
||||
|
||||
bool CSMWorld::NestedColumn::isEditable() const
|
||||
{
|
||||
return mParent->isEditable();
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <exception>
|
||||
|
||||
#include <Qt>
|
||||
#include <QVariant>
|
||||
|
@ -110,9 +111,7 @@ namespace CSMWorld
|
|||
int mColumnId;
|
||||
int mFlags;
|
||||
Display mDisplayType;
|
||||
std::vector<Display> mNestedDisplayType; //used only for the columns that actually nest other columns
|
||||
std::vector<int> mNestedColumnId; //used only for the columns that actually nest other columns
|
||||
const bool mCanNest;
|
||||
bool mCanNest;
|
||||
|
||||
ColumnBase (int columnId, Display displayType, int flag, bool canNest = false);
|
||||
|
||||
|
@ -125,22 +124,42 @@ namespace CSMWorld
|
|||
|
||||
virtual std::string getTitle() const;
|
||||
|
||||
std::string getNestedColumnTitle(int columnNumber) const;
|
||||
|
||||
void addNestedColumnDisplay(Display displayDefinition);
|
||||
|
||||
void addNestedColumnId(int columnId);
|
||||
|
||||
virtual int getId() const;
|
||||
|
||||
bool canHaveNestedColumns() const;
|
||||
};
|
||||
|
||||
class NestedColumn;
|
||||
|
||||
class NestColumn : public ColumnBase
|
||||
{
|
||||
std::vector<NestedColumn> mNestedColumns;
|
||||
|
||||
public:
|
||||
NestColumn(int columnId, Display displayType, int flags, bool canNest);
|
||||
|
||||
void addNestedColumn(int columnId, Display displayType);
|
||||
|
||||
bool canHaveNestedColumns() const;
|
||||
|
||||
const ColumnBase& nestedColumn(int subColumn) const;
|
||||
|
||||
int nestedColumnCount() const;
|
||||
};
|
||||
|
||||
class NestedColumn : public ColumnBase
|
||||
{
|
||||
const ColumnBase* mParent;
|
||||
|
||||
public:
|
||||
NestedColumn(int columnId, Display displayType, int flag, const NestColumn* parent);
|
||||
|
||||
virtual bool isEditable() const;
|
||||
};
|
||||
|
||||
template<typename ESXRecordT>
|
||||
struct Column : public ColumnBase
|
||||
struct Column : public NestColumn
|
||||
{
|
||||
Column (int columnId, Display displayType, int flags = Flag_Table | Flag_Dialogue, bool canNest = false)
|
||||
: ColumnBase (columnId, displayType, flags, canNest) {}
|
||||
: NestColumn (columnId, displayType, canNest, flags) {}
|
||||
|
||||
virtual QVariant get (const Record<ESXRecordT>& record) const = 0;
|
||||
|
||||
|
|
|
@ -75,19 +75,19 @@ QVariant CSMWorld::IdTable::headerData (int section,
|
|||
|
||||
QVariant CSMWorld::IdTable::nestedHeaderData(int section, int subSection, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
assert(mIdCollection->getColumn(section).canHaveNestedColumns());
|
||||
const NestColumn& parentColumn = dynamic_cast<const NestColumn&>(mIdCollection->getColumn(section));
|
||||
|
||||
if (orientation==Qt::Vertical)
|
||||
return QVariant();
|
||||
|
||||
if (role==Qt::DisplayRole)
|
||||
return tr (mIdCollection->getColumn(section).getNestedColumnTitle(subSection).c_str());
|
||||
return tr(parentColumn.nestedColumn(subSection).getTitle().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 parentColumn.nestedColumn(subSection).mDisplayType;
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
@ -354,6 +354,6 @@ bool CSMWorld::IdTable::hasChildren(const QModelIndex& index) const
|
|||
{
|
||||
return (index.isValid() &&
|
||||
index.internalId() == 0 &&
|
||||
mIdCollection->getColumn (index.column()).canHaveNestedColumns() &&
|
||||
mIdCollection->getColumn(index.column()).mCanNest &&
|
||||
index.data().isValid());
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "refidadapterimp.hpp"
|
||||
|
||||
#include <cassert>
|
||||
#include <stdexcept>
|
||||
|
||||
CSMWorld::PotionRefIdAdapter::PotionRefIdAdapter (const InventoryColumns& columns,
|
||||
const RefIdColumn *autoCalc)
|
||||
|
@ -296,7 +297,7 @@ void CSMWorld::ContainerRefIdAdapter::setNestedData(const RefIdColumn *column,
|
|||
break;
|
||||
|
||||
default:
|
||||
throw "Trying to access non-existing column in the nested table!";
|
||||
throw std::logic_error("Trying to access non-existing column in the nested table!");
|
||||
}
|
||||
} else
|
||||
{
|
||||
|
@ -326,11 +327,11 @@ QVariant CSMWorld::ContainerRefIdAdapter::getNestedData (const CSMWorld::RefIdCo
|
|||
return content.mCount;
|
||||
|
||||
default:
|
||||
throw "Trying to access non-existing column in the nested table!";
|
||||
throw std::logic_error("Trying to access non-existing column in the nested table!");
|
||||
}
|
||||
} else
|
||||
{
|
||||
throw "This column does not hold multiple values.";
|
||||
throw std::logic_error("This column does not hold multiple values.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
CSMWorld::RefIdColumn::RefIdColumn (int columnId, Display displayType, int flag,
|
||||
bool editable, bool userEditable, bool canNest)
|
||||
: ColumnBase (columnId, displayType, flag, canNest), mEditable (editable), mUserEditable (userEditable)
|
||||
: NestColumn (columnId, displayType, flag, canNest), mEditable (editable), mUserEditable (userEditable)
|
||||
{}
|
||||
|
||||
bool CSMWorld::RefIdColumn::isEditable() const
|
||||
|
@ -168,10 +168,8 @@ CSMWorld::RefIdCollection::RefIdCollection()
|
|||
|
||||
mColumns.push_back(RefIdColumn (Columns::ColumnId_ContainerContent, ColumnBase::Display_NestedItemList, ColumnBase::Flag_Dialogue, true, true, true));
|
||||
const RefIdColumn *content = &mColumns.back();
|
||||
(&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_String);
|
||||
(&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_Integer);
|
||||
(&mColumns.back())->addNestedColumnId(Columns::ColumnId_InventoryItemId);
|
||||
(&mColumns.back())->addNestedColumnId(Columns::ColumnId_ItemCount);
|
||||
(&mColumns.back())->addNestedColumn(Columns::ColumnId_InventoryItemId, CSMWorld::ColumnBase::Display_String);
|
||||
(&mColumns.back())->addNestedColumn(Columns::ColumnId_ItemCount, CSMWorld::ColumnBase::Display_Integer);
|
||||
|
||||
CreatureColumns creatureColumns (actorsColumns);
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ namespace CSMWorld
|
|||
{
|
||||
class RefIdAdapter;
|
||||
|
||||
class RefIdColumn : public ColumnBase
|
||||
class RefIdColumn : public NestColumn
|
||||
{
|
||||
bool mEditable;
|
||||
bool mUserEditable;
|
||||
|
|
Loading…
Reference in a new issue