From 3fea53c3e91bfe887e67441426326944d802bf68 Mon Sep 17 00:00:00 2001 From: mjwybrow Date: Tue, 14 Feb 2006 00:36:28 +0000 Subject: [PATCH] * src/graphlayout/graphlayout.cpp, src/conn-avoid-ref.cpp, src/conn-avoid-ref.h, src/libavoid/connector.cpp, src/libavoid/connector.h: Change the behaviour and naming of some connector querying code after feedback from Tim Dwyer in implementing graph drawing functionality. --- ChangeLog | 10 +++++++++ src/conn-avoid-ref.cpp | 37 +++++++++++++++++++++++++++++---- src/conn-avoid-ref.h | 5 +++-- src/graphlayout/graphlayout.cpp | 2 +- src/libavoid/connector.cpp | 33 ++++++++++++++++++++++++++++- src/libavoid/connector.h | 8 +++++-- 6 files changed, 85 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index f55fd6ba2..c5ff0b589 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-02-13 Michael Wybrow + + * src/graphlayout/graphlayout.cpp, src/conn-avoid-ref.cpp, + src/conn-avoid-ref.h, src/libavoid/connector.cpp, + src/libavoid/connector.h: + + Change the behaviour and naming of some connector querying code + after feedback from Tim Dwyer in implementing graph drawing + functionality. + 2006-02-11 Michael Wybrow * src/sp-conn-end-pair.cpp, src/conn-avoid-ref.cpp: diff --git a/src/conn-avoid-ref.cpp b/src/conn-avoid-ref.cpp index d7cca60f9..d832a34b4 100644 --- a/src/conn-avoid-ref.cpp +++ b/src/conn-avoid-ref.cpp @@ -109,20 +109,49 @@ void SPAvoidRef::handleSettingChange(void) } +GSList *SPAvoidRef::getAttachedShapes(const unsigned int type) +{ + GSList *list = NULL; + + Avoid::IntList shapes; + GQuark shapeId = g_quark_from_string(item->id); + Avoid::attachedShapes(shapes, shapeId, type); + + Avoid::IntList::iterator finish = shapes.end(); + for (Avoid::IntList::iterator i = shapes.begin(); i != finish; ++i) { + const gchar *connId = g_quark_to_string(*i); + SPObject *obj = item->document->getObjectById(connId); + if (obj == NULL) { + g_warning("getAttachedShapes: Object with id=\"%s\" is not " + "found. Skipping.", connId); + continue; + } + SPItem *shapeItem = SP_ITEM(obj); + list = g_slist_prepend(list, shapeItem); + } + return list; +} + + GSList *SPAvoidRef::getAttachedConnectors(const unsigned int type) { GSList *list = NULL; Avoid::IntList conns; GQuark shapeId = g_quark_from_string(item->id); - Avoid::attachedToShape(conns, shapeId, type); + Avoid::attachedConns(conns, shapeId, type); Avoid::IntList::iterator finish = conns.end(); for (Avoid::IntList::iterator i = conns.begin(); i != finish; ++i) { const gchar *connId = g_quark_to_string(*i); - SPItem *citem = SP_ITEM(item->document->getObjectById(connId)); - g_assert(citem != NULL); - list = g_slist_prepend(list, citem); + SPObject *obj = item->document->getObjectById(connId); + if (obj == NULL) { + g_warning("getAttachedConnectors: Object with id=\"%s\" is not " + "found. Skipping.", connId); + continue; + } + SPItem *connItem = SP_ITEM(obj); + list = g_slist_prepend(list, connItem); } return list; } diff --git a/src/conn-avoid-ref.h b/src/conn-avoid-ref.h index 28d5de28a..a30dc4b93 100644 --- a/src/conn-avoid-ref.h +++ b/src/conn-avoid-ref.h @@ -31,11 +31,12 @@ public: void setAvoid(char const *value); void handleSettingChange(void); - // Returns a list of SPItems of all connectors attached to this - // object. Pass one of the following for 'type': + // Returns a list of SPItems of all connectors/shapes attached to + // this object. Pass one of the following for 'type': // Avoid::ConnRef::runningTo // Avoid::ConnRef::runningFrom // Avoid::ConnRef::runningToAndFrom + GSList *getAttachedShapes(const unsigned int type); GSList *getAttachedConnectors(const unsigned int type); private: diff --git a/src/graphlayout/graphlayout.cpp b/src/graphlayout/graphlayout.cpp index 77452aff2..112a942a7 100644 --- a/src/graphlayout/graphlayout.cpp +++ b/src/graphlayout/graphlayout.cpp @@ -96,7 +96,7 @@ void graphlayout(GSList const *const items) { using NR::X; using NR::Y; SPItem *itu=*it; Vertex u=nodelookup[itu->id]; - GSList *nlist=itu->avoidRef->getAttachedConnectors(Avoid::ConnRef::runningFrom); + GSList *nlist=itu->avoidRef->getAttachedShapes(Avoid::ConnRef::runningFrom); std::list neighbours; neighbours.insert >(neighbours.end(),nlist,NULL); for (std::list::iterator ne(neighbours.begin()); diff --git a/src/libavoid/connector.cpp b/src/libavoid/connector.cpp index 06a0cd4aa..4d5821741 100644 --- a/src/libavoid/connector.cpp +++ b/src/libavoid/connector.cpp @@ -421,8 +421,14 @@ const unsigned int ConnRef::runningFrom = 2; const unsigned int ConnRef::runningToAndFrom = ConnRef::runningTo | ConnRef::runningFrom; +// XXX: attachedShapes and attachedConns both need to be rewritten +// for constant time lookup of attached objects once this info +// is stored better within libavoid. -void attachedToShape(IntList &conns, const unsigned int shapeId, + + // Returns a list of connector Ids of all the connectors of type + // 'type' attached to the shape with the ID 'shapeId'. +void attachedConns(IntList &conns, const unsigned int shapeId, const unsigned int type) { ConnRefList::iterator fin = connRefs.end(); @@ -437,6 +443,31 @@ void attachedToShape(IntList &conns, const unsigned int shapeId, } + // Returns a list of shape Ids of all the shapes attached to the + // shape with the ID 'shapeId' with connection type 'type'. +void attachedShapes(IntList &shapes, const unsigned int shapeId, + const unsigned int type) +{ + ConnRefList::iterator fin = connRefs.end(); + for (ConnRefList::iterator i = connRefs.begin(); i != fin; ++i) { + if ((type & ConnRef::runningTo) && ((*i)->_dstId == shapeId)) { + if ((*i)->_srcId != 0) + { + // Only if there is a shape attached to the other end. + shapes.push_back((*i)->_srcId); + } + } + else if ((type & ConnRef::runningFrom) && ((*i)->_srcId == shapeId)) { + if ((*i)->_dstId != 0) + { + // Only if there is a shape attached to the other end. + shapes.push_back((*i)->_dstId); + } + } + } +} + + // It's intended this function is called after shape movement has // happened to alert connectors that they need to be rerouted. void callbackAllInvalidConnectors(void) diff --git a/src/libavoid/connector.h b/src/libavoid/connector.h index 1fd4255a8..a08b9ab8a 100644 --- a/src/libavoid/connector.h +++ b/src/libavoid/connector.h @@ -64,7 +64,9 @@ class ConnRef void makePathInvalid(void); friend void markConnectors(ShapeRef *shape); - friend void attachedToShape(IntList &conns, + friend void attachedShapes(IntList &shapes, + const unsigned int shapeId, const unsigned int type); + friend void attachedConns(IntList &conns, const unsigned int shapeId, const unsigned int type); static const unsigned int runningTo; @@ -91,7 +93,9 @@ class ConnRef extern ConnRefList connRefs; extern void callbackAllInvalidConnectors(void); -extern void attachedToShape(IntList &conns, const unsigned int shapeId, +extern void attachedConns(IntList &conns, const unsigned int shapeId, + const unsigned int type); +extern void attachedShapes(IntList &shapes, const unsigned int shapeId, const unsigned int type); } -- 2.30.2