Add index columns and fix edge indexing for point deletion.

This commit is contained in:
cc9cii 2015-04-10 07:31:01 +10:00
parent 330920daa8
commit bc9dad3ff2
5 changed files with 96 additions and 28 deletions

View file

@ -2289,6 +2289,28 @@ namespace CSMWorld
} }
}; };
template<typename ESXRecordT>
struct PathgridIndexColumn : public Column<ESXRecordT>
{
PathgridIndexColumn()
: Column<ESXRecordT> (Columns::ColumnId_PathgridIndex, ColumnBase::Display_Integer)
{}
virtual QVariant get (const Record<ESXRecordT>& record) const
{
return QVariant(); // FIXME
}
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
{
}
virtual bool isEditable() const
{
return false;
}
};
template<typename ESXRecordT> template<typename ESXRecordT>
struct PathgridPointColumn : public Column<ESXRecordT> struct PathgridPointColumn : public Column<ESXRecordT>
{ {
@ -2338,6 +2360,28 @@ namespace CSMWorld
}; };
template<typename ESXRecordT>
struct PathgridEdgeIndexColumn : public Column<ESXRecordT>
{
PathgridEdgeIndexColumn()
: Column<ESXRecordT> (Columns::ColumnId_PathgridEdgeIndex, ColumnBase::Display_Integer)
{}
virtual QVariant get (const Record<ESXRecordT>& record) const
{
return QVariant(); // FIXME
}
virtual void set (Record<ESXRecordT>& record, const QVariant& data)
{
}
virtual bool isEditable() const
{
return false;
}
};
template<typename ESXRecordT> template<typename ESXRecordT>
struct PathgridEdgeColumn : public Column<ESXRecordT> struct PathgridEdgeColumn : public Column<ESXRecordT>
{ {

View file

@ -224,12 +224,14 @@ namespace CSMWorld
{ ColumnId_BoltSound, "Bolt Sound" }, { ColumnId_BoltSound, "Bolt Sound" },
{ ColumnId_PathgridPoints, "Points"}, { ColumnId_PathgridPoints, "Points"},
{ ColumnId_PathgridIndex, "Index"},
{ ColumnId_PathgridPosX, "X"}, { ColumnId_PathgridPosX, "X"},
{ ColumnId_PathgridPosY, "Y"}, { ColumnId_PathgridPosY, "Y"},
{ ColumnId_PathgridPosZ, "Z"}, { ColumnId_PathgridPosZ, "Z"},
{ ColumnId_PathgridEdges, "Edges"}, { ColumnId_PathgridEdges, "Edges"},
{ ColumnId_PathgridEdge0, "Edge 0"}, { ColumnId_PathgridEdgeIndex, "Index"},
{ ColumnId_PathgridEdge1, "Edge 1"}, { ColumnId_PathgridEdge0, "Point 0"},
{ ColumnId_PathgridEdge1, "Point 1"},
{ ColumnId_UseValue1, "Use value 1" }, { ColumnId_UseValue1, "Use value 1" },
{ ColumnId_UseValue2, "Use value 2" }, { ColumnId_UseValue2, "Use value 2" },

View file

@ -213,12 +213,14 @@ namespace CSMWorld
ColumnId_BoltSound = 198, ColumnId_BoltSound = 198,
ColumnId_PathgridPoints = 199, ColumnId_PathgridPoints = 199,
ColumnId_PathgridPosX = 200, ColumnId_PathgridIndex = 200,
ColumnId_PathgridPosY = 201, ColumnId_PathgridPosX = 201,
ColumnId_PathgridPosZ = 202, ColumnId_PathgridPosY = 202,
ColumnId_PathgridEdges = 203, ColumnId_PathgridPosZ = 203,
ColumnId_PathgridEdge0 = 204, ColumnId_PathgridEdges = 204,
ColumnId_PathgridEdge1 = 205, ColumnId_PathgridEdgeIndex = 205,
ColumnId_PathgridEdge0 = 206,
ColumnId_PathgridEdge1 = 207,
// Allocated to a separate value range, so we don't get a collision should we ever need // Allocated to a separate value range, so we don't get a collision should we ever need
// to extend the number of use values. // to extend the number of use values.

View file

@ -262,6 +262,8 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
// new object deleted in dtor of SubCellCollection<T,A> // new object deleted in dtor of SubCellCollection<T,A>
mPathgrids.addAdapter (std::make_pair(pointList, new PathgridPointListAdapter<Pathgrid> ())); mPathgrids.addAdapter (std::make_pair(pointList, new PathgridPointListAdapter<Pathgrid> ()));
// new objects deleted in dtor of NestableColumn // new objects deleted in dtor of NestableColumn
// WARNING: The order of the columns below are assumed in PathgridPointListAdapter
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridIndexColumn<Pathgrid> ());
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn<Pathgrid> (0)); mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn<Pathgrid> (0));
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn<Pathgrid> (1)); mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn<Pathgrid> (1));
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn<Pathgrid> (2)); mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridPointColumn<Pathgrid> (2));
@ -269,6 +271,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
PathgridEdgeListColumn<Pathgrid> *edgeList = new PathgridEdgeListColumn<Pathgrid> (); PathgridEdgeListColumn<Pathgrid> *edgeList = new PathgridEdgeListColumn<Pathgrid> ();
mPathgrids.addColumn (edgeList); mPathgrids.addColumn (edgeList);
mPathgrids.addAdapter (std::make_pair(edgeList, new PathgridEdgeListAdapter<Pathgrid> ())); mPathgrids.addAdapter (std::make_pair(edgeList, new PathgridEdgeListAdapter<Pathgrid> ()));
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeIndexColumn<Pathgrid> ());
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn<Pathgrid> (0)); mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn<Pathgrid> (0));
mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn<Pathgrid> (1)); mPathgrids.getNestableColumn(mPathgrids.getColumns()-1)->addColumn(new PathgridEdgeColumn<Pathgrid> (1));

View file

@ -33,6 +33,9 @@ namespace CSMWorld
point.mUnknown = 0; point.mUnknown = 0;
// inserting a point should trigger re-indexing of the edges // inserting a point should trigger re-indexing of the edges
//
// FIXME: undo does not restore edges table view
// FIXME: does not auto refresh edges table view
std::vector<ESM::Pathgrid::Edge>::iterator iter = pathgrid.mEdges.begin(); std::vector<ESM::Pathgrid::Edge>::iterator iter = pathgrid.mEdges.begin();
for (;iter != pathgrid.mEdges.end(); ++iter) for (;iter != pathgrid.mEdges.end(); ++iter)
{ {
@ -59,19 +62,25 @@ namespace CSMWorld
// deleting a point should trigger re-indexing of the edges // deleting a point should trigger re-indexing of the edges
// dangling edges are not allowed and hence removed // dangling edges are not allowed and hence removed
//
// FIXME: undo does not restore edges table view
// FIXME: does not auto refresh edges table view
std::vector<ESM::Pathgrid::Edge>::iterator iter = pathgrid.mEdges.begin(); std::vector<ESM::Pathgrid::Edge>::iterator iter = pathgrid.mEdges.begin();
for (;iter != pathgrid.mEdges.end(); ++iter) for (; iter != pathgrid.mEdges.end();)
{ {
if (((*iter).mV0 == rowToRemove) || ((*iter).mV1 == rowToRemove)) if (((*iter).mV0 == rowToRemove) || ((*iter).mV1 == rowToRemove))
pathgrid.mEdges.erase(iter); iter = pathgrid.mEdges.erase(iter);
else
{
if ((*iter).mV0 > rowToRemove)
(*iter).mV0--;
if ((*iter).mV0 >= rowToRemove) if ((*iter).mV1 > rowToRemove)
(*iter).mV0--; (*iter).mV1--;
if ((*iter).mV1 >= rowToRemove) ++iter;
(*iter).mV1--; }
} }
points.erase(points.begin()+rowToRemove); points.erase(points.begin()+rowToRemove);
pathgrid.mData.mS2 -= 1; // decrement the number of points pathgrid.mData.mS2 -= 1; // decrement the number of points
@ -95,9 +104,10 @@ namespace CSMWorld
ESM::Pathgrid::Point point = record.get().mPoints[subRowIndex]; ESM::Pathgrid::Point point = record.get().mPoints[subRowIndex];
switch (subColIndex) switch (subColIndex)
{ {
case 0: return point.mX; case 0: return subRowIndex;
case 1: return point.mY; case 1: return point.mX;
case 2: return point.mZ; case 2: return point.mY;
case 3: return point.mZ;
default: throw std::logic_error("Pathgrid point subcolumn index out of range"); default: throw std::logic_error("Pathgrid point subcolumn index out of range");
} }
} }
@ -109,9 +119,10 @@ namespace CSMWorld
ESM::Pathgrid::Point point = pathgrid.mPoints[subRowIndex]; ESM::Pathgrid::Point point = pathgrid.mPoints[subRowIndex];
switch (subColIndex) switch (subColIndex)
{ {
case 0: point.mX = value.toInt(); break; case 0: break;
case 1: point.mY = value.toInt(); break; case 1: point.mX = value.toInt(); break;
case 2: point.mZ = value.toInt(); break; case 2: point.mY = value.toInt(); break;
case 3: point.mZ = value.toInt(); break;
default: throw std::logic_error("Pathgrid point subcolumn index out of range"); default: throw std::logic_error("Pathgrid point subcolumn index out of range");
} }
@ -122,7 +133,7 @@ namespace CSMWorld
virtual int getNestedColumnsCount(const Record<ESXRecordT>& record) const virtual int getNestedColumnsCount(const Record<ESXRecordT>& record) const
{ {
return 3; return 4;
} }
virtual int getNestedRowsCount(const Record<ESXRecordT>& record) const virtual int getNestedRowsCount(const Record<ESXRecordT>& record) const
@ -149,8 +160,11 @@ namespace CSMWorld
edge.mV0 = 0; edge.mV0 = 0;
edge.mV1 = 0; edge.mV1 = 0;
// FIXME: inserting a blank edge does not really make sense, perhaps this should be a // NOTE: inserting a blank edge does not really make sense, perhaps this should be a
// logic_error exception // logic_error exception
//
// Currently the code assumes that the end user to know what he/she is doing.
// e.g. Edges come in pairs, from points a->b and b->a
edges.insert(edges.begin()+position, edge); edges.insert(edges.begin()+position, edge);
record.setModified (pathgrid); record.setModified (pathgrid);
@ -187,12 +201,14 @@ namespace CSMWorld
ESM::Pathgrid::Edge edge = record.get().mEdges[subRowIndex]; ESM::Pathgrid::Edge edge = record.get().mEdges[subRowIndex];
switch (subColIndex) switch (subColIndex)
{ {
case 0: return edge.mV0; case 0: return subRowIndex;
case 1: return edge.mV1; case 1: return edge.mV0;
case 2: return edge.mV1;
default: throw std::logic_error("Pathgrid edge subcolumn index out of range"); default: throw std::logic_error("Pathgrid edge subcolumn index out of range");
} }
} }
// FIXME: detect duplicates in mEdges
virtual void setNestedData(Record<ESXRecordT>& record, const QVariant& value, virtual void setNestedData(Record<ESXRecordT>& record, const QVariant& value,
int subRowIndex, int subColIndex) const int subRowIndex, int subColIndex) const
{ {
@ -200,8 +216,9 @@ namespace CSMWorld
ESM::Pathgrid::Edge edge = pathgrid.mEdges[subRowIndex]; ESM::Pathgrid::Edge edge = pathgrid.mEdges[subRowIndex];
switch (subColIndex) switch (subColIndex)
{ {
case 0: edge.mV0 = value.toInt(); break; case 0: break;
case 1: edge.mV1 = value.toInt(); break; case 1: edge.mV0 = value.toInt(); break;
case 2: edge.mV1 = value.toInt(); break;
default: throw std::logic_error("Pathgrid edge subcolumn index out of range"); default: throw std::logic_error("Pathgrid edge subcolumn index out of range");
} }
@ -212,7 +229,7 @@ namespace CSMWorld
virtual int getNestedColumnsCount(const Record<ESXRecordT>& record) const virtual int getNestedColumnsCount(const Record<ESXRecordT>& record) const
{ {
return 2; return 3;
} }
virtual int getNestedRowsCount(const Record<ESXRecordT>& record) const virtual int getNestedRowsCount(const Record<ESXRecordT>& record) const