1
0
Fork 1
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:
Marek Kochanowicz 2014-07-16 13:13:22 +02:00
parent 0252d021eb
commit f0c6ef185e
6 changed files with 71 additions and 41 deletions

View file

@ -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();
}

View file

@ -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;

View file

@ -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());
}

View file

@ -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.");
}
}

View file

@ -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);

View file

@ -18,7 +18,7 @@ namespace CSMWorld
{
class RefIdAdapter;
class RefIdColumn : public ColumnBase
class RefIdColumn : public NestColumn
{
bool mEditable;
bool mUserEditable;