X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-conn-end-pair.cpp;h=a1c4697e55007eecbd85d90faa8ee94354303e5a;hb=d88d2aa6894cc84f414fbdb64899673c66bc52c1;hp=ff1005a1636e474c130a08289008ef803c731cb0;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/sp-conn-end-pair.cpp b/src/sp-conn-end-pair.cpp index ff1005a16..a1c4697e5 100644 --- a/src/sp-conn-end-pair.cpp +++ b/src/sp-conn-end-pair.cpp @@ -17,6 +17,8 @@ #include "xml/repr.h" #include "sp-path.h" #include "libavoid/vertices.h" +#include "libavoid/router.h" +#include "document.h" SPConnEndPair::SPConnEndPair(SPPath *const owner) @@ -46,7 +48,7 @@ SPConnEndPair::~SPConnEndPair() delete _connRef; _connRef = NULL; } - + _invalid_path_connection.disconnect(); _transformed_connection.disconnect(); } @@ -73,12 +75,9 @@ sp_conn_end_pair_build(SPObject *object) } -static void +static void avoid_conn_move(NR::Matrix const *mp, SPItem *moved_item) { - // Detach from objects if attached. - sp_conn_end_detach(moved_item, 0); - sp_conn_end_detach(moved_item, 1); // Reroute connector SPPath *path = SP_PATH(moved_item); path->connEndPair.makePathInvalid(); @@ -92,9 +91,10 @@ SPConnEndPair::setAttr(unsigned const key, gchar const *const value) if (key == SP_ATTR_CONNECTOR_TYPE) { if (value && (strcmp(value, "polyline") == 0)) { _connType = SP_CONNECTOR_POLYLINE; - + + Avoid::Router *router = _path->document->router; GQuark itemID = g_quark_from_string(SP_OBJECT(_path)->id); - _connRef = new Avoid::ConnRef(itemID); + _connRef = new Avoid::ConnRef(router, itemID); _invalid_path_connection = connectInvalidPath( sigc::ptr_fun(&sp_conn_adjust_invalid_path)); _transformed_connection = _path->connectTransformed( @@ -102,7 +102,7 @@ SPConnEndPair::setAttr(unsigned const key, gchar const *const value) } else { _connType = SP_CONNECTOR_NOAVOID; - + if (_connRef) { _connRef->removeFromGraph(); delete _connRef; @@ -114,7 +114,7 @@ SPConnEndPair::setAttr(unsigned const key, gchar const *const value) return; } - + unsigned const handle_ix = key - SP_ATTR_CONNECTION_START; g_assert( handle_ix <= 1 ); this->_connEnd[handle_ix]->setAttacherHref(value); @@ -146,13 +146,13 @@ SPConnEndPair::getEndpoints(NR::Point endPts[]) const { SPCurve *curve = _path->curve; SPItem *h2attItem[2]; getAttachedItems(h2attItem); - + for (unsigned h = 0; h < 2; ++h) { if ( h2attItem[h] ) { NR::Rect const bbox = h2attItem[h]->invokeBbox(sp_item_i2doc_affine(h2attItem[h])); endPts[h] = bbox.midpoint(); } - else + else { if (h == 0) { endPts[h] = sp_curve_first_point(curve); @@ -177,7 +177,7 @@ static void emitPathInvalidationNotification(void *ptr) // then all connectors (that require it) will be rerouted. Otherwise, // one connector could get rerouted several times as a result of // dragging a couple of shapes. - + SPPath *path = SP_PATH(ptr); path->connEndPair._invalid_path_signal.emit(path); } @@ -211,9 +211,34 @@ SPConnEndPair::update(void) _connRef->lateSetup(src, dst); _connRef->setCallback(&emitPathInvalidationNotification, _path); } + // Store the ID of the objects attached to the connector. + storeIds(); + } +} + + +void SPConnEndPair::storeIds(void) +{ + if (_connEnd[0]->href) { + // href begins with a '#' which we don't want. + const char *startId = _connEnd[0]->href + 1; + GQuark itemId = g_quark_from_string(startId); + _connRef->setEndPointId(Avoid::VertID::src, itemId); + } + else { + _connRef->setEndPointId(Avoid::VertID::src, 0); + } + if (_connEnd[1]->href) { + // href begins with a '#' which we don't want. + const char *endId = _connEnd[1]->href + 1; + GQuark itemId = g_quark_from_string(endId); + _connRef->setEndPointId(Avoid::VertID::tar, itemId); + } + else { + _connRef->setEndPointId(Avoid::VertID::tar, 0); } } - + bool SPConnEndPair::isAutoRoutingConn(void) @@ -223,7 +248,7 @@ SPConnEndPair::isAutoRoutingConn(void) } return false; } - + void SPConnEndPair::makePathInvalid(void) { @@ -245,7 +270,7 @@ SPConnEndPair::reroutePath(void) Avoid::Point src = { endPt[0][NR::X], endPt[0][NR::Y] }; Avoid::Point dst = { endPt[1][NR::X], endPt[1][NR::Y] }; - + _connRef->updateEndPoint(Avoid::VertID::src, src); _connRef->updateEndPoint(Avoid::VertID::tar, dst); @@ -253,7 +278,7 @@ SPConnEndPair::reroutePath(void) Avoid::PolyLine route = _connRef->route(); _connRef->calcRouteDist(); - + sp_curve_reset(curve); sp_curve_moveto(curve, endPt[0]);