1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-07-04 05:41:36 +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 "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)
{} {}
@ -25,28 +23,42 @@ int CSMWorld::ColumnBase::getId() const
return mColumnId; return mColumnId;
} }
bool CSMWorld::ColumnBase::canHaveNestedColumns() const bool CSMWorld::NestColumn::canHaveNestedColumns() const
{ {
return mCanNest; return mCanNest;
} }
std::string CSMWorld::ColumnBase::getNestedColumnTitle(int columnNumber) const void CSMWorld::NestColumn::addNestedColumn(int columnId, Display displayType)
{ {
assert (mCanNest); if (!mCanNest)
throw std::logic_error("Tried to nest inside of the non-nest column");
return Columns::getName(static_cast<Columns::ColumnId>(mNestedColumnId[columnNumber]));
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); if (!mCanNest)
throw std::logic_error("Tried to access nested column of the non-nest column");
mNestedDisplayType.push_back(displayDefinition);
return mNestedColumns.at(subColumn);
} }
void CSMWorld::ColumnBase::addNestedColumnId(int columnId) int CSMWorld::NestColumn::nestedColumnCount() const
{ {
assert (mCanNest); if (!mCanNest)
throw std::logic_error("Tried to access number of the subcolumns in the non-nest column");
mNestedColumnId.push_back(columnId);
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 <string>
#include <vector> #include <vector>
#include <exception>
#include <Qt> #include <Qt>
#include <QVariant> #include <QVariant>
@ -110,9 +111,7 @@ namespace CSMWorld
int mColumnId; int mColumnId;
int mFlags; int mFlags;
Display mDisplayType; Display mDisplayType;
std::vector<Display> mNestedDisplayType; //used only for the columns that actually nest other columns bool mCanNest;
std::vector<int> mNestedColumnId; //used only for the columns that actually nest other columns
const bool mCanNest;
ColumnBase (int columnId, Display displayType, int flag, bool canNest = false); ColumnBase (int columnId, Display displayType, int flag, bool canNest = false);
@ -125,22 +124,42 @@ namespace CSMWorld
virtual std::string getTitle() const; virtual std::string getTitle() const;
std::string getNestedColumnTitle(int columnNumber) const;
void addNestedColumnDisplay(Display displayDefinition);
void addNestedColumnId(int columnId);
virtual int getId() const; 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> 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) 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; 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 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) if (orientation==Qt::Vertical)
return QVariant(); return QVariant();
if (role==Qt::DisplayRole) 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) if (role==ColumnBase::Role_Flags)
return mIdCollection->getColumn (section).mFlags; return mIdCollection->getColumn (section).mFlags;
if (role==ColumnBase::Role_Display) if (role==ColumnBase::Role_Display)
return mIdCollection->getColumn (section).mNestedDisplayType.at(subSection); return parentColumn.nestedColumn(subSection).mDisplayType;
return QVariant(); return QVariant();
} }
@ -354,6 +354,6 @@ bool CSMWorld::IdTable::hasChildren(const QModelIndex& index) const
{ {
return (index.isValid() && return (index.isValid() &&
index.internalId() == 0 && index.internalId() == 0 &&
mIdCollection->getColumn (index.column()).canHaveNestedColumns() && mIdCollection->getColumn(index.column()).mCanNest &&
index.data().isValid()); index.data().isValid());
} }

View file

@ -1,6 +1,7 @@
#include "refidadapterimp.hpp" #include "refidadapterimp.hpp"
#include <cassert> #include <cassert>
#include <stdexcept>
CSMWorld::PotionRefIdAdapter::PotionRefIdAdapter (const InventoryColumns& columns, CSMWorld::PotionRefIdAdapter::PotionRefIdAdapter (const InventoryColumns& columns,
const RefIdColumn *autoCalc) const RefIdColumn *autoCalc)
@ -296,7 +297,7 @@ void CSMWorld::ContainerRefIdAdapter::setNestedData(const RefIdColumn *column,
break; break;
default: 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 } else
{ {
@ -326,11 +327,11 @@ QVariant CSMWorld::ContainerRefIdAdapter::getNestedData (const CSMWorld::RefIdCo
return content.mCount; return content.mCount;
default: 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 } 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, CSMWorld::RefIdColumn::RefIdColumn (int columnId, Display displayType, int flag,
bool editable, bool userEditable, bool canNest) 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 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)); 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())->addNestedColumn(Columns::ColumnId_InventoryItemId, CSMWorld::ColumnBase::Display_String);
(&mColumns.back())->addNestedColumnDisplay(CSMWorld::ColumnBase::Display_Integer); (&mColumns.back())->addNestedColumn(Columns::ColumnId_ItemCount, CSMWorld::ColumnBase::Display_Integer);
(&mColumns.back())->addNestedColumnId(Columns::ColumnId_InventoryItemId);
(&mColumns.back())->addNestedColumnId(Columns::ColumnId_ItemCount);
CreatureColumns creatureColumns (actorsColumns); CreatureColumns creatureColumns (actorsColumns);

View file

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