X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fconn-avoid-ref.cpp;h=21ef2deab53c14bd87502c68c47648ea9c14d249;hb=8a2e76b7021b9b960d7c30801a1a14461d9b5939;hp=b2aa0ce6bc1e9877242de5f3697a7a90048c410f;hpb=f1300e7a4c2c0a4d039d70c3ec64e9581925b329;p=inkscape.git diff --git a/src/conn-avoid-ref.cpp b/src/conn-avoid-ref.cpp index b2aa0ce6b..21ef2deab 100644 --- a/src/conn-avoid-ref.cpp +++ b/src/conn-avoid-ref.cpp @@ -3,6 +3,7 @@ * * Authors: * Michael Wybrow + * Abhishek Sharma * * Copyright (C) 2005 Michael Wybrow * @@ -28,6 +29,7 @@ #include "libavoid/router.h" #include "libavoid/connector.h" #include "libavoid/geomtypes.h" +#include "libavoid/shape.h" #include "xml/node.h" #include "document.h" #include "desktop.h" @@ -37,7 +39,7 @@ #include "inkscape.h" #include - +using Inkscape::DocumentUndo; using Avoid::Router; @@ -63,8 +65,8 @@ SPAvoidRef::~SPAvoidRef() const bool routerInstanceExists = (item->document->router != NULL); if (shapeRef && routerInstanceExists) { - Router *router = shapeRef->router(); - router->removeShape(shapeRef); + // Deleting the shapeRef will remove it completely from + // an existing Router instance. delete shapeRef; } shapeRef = NULL; @@ -194,10 +196,10 @@ void SPAvoidRef::setConnectionPointsAttrUndoable(const gchar* value, const gchar { SPDocument* doc = SP_OBJECT_DOCUMENT(item); - sp_object_setAttribute( SP_OBJECT(item), "inkscape:connection-points", value, 0 ); + item->setAttribute( "inkscape:connection-points", value, 0 ); item->updateRepr(); - sp_document_ensure_up_to_date(doc); - sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR, action); + doc->ensureUpToDate(); + DocumentUndo::done(doc, SP_VERB_CONTEXT_CONNECTOR, action); } void SPAvoidRef::addConnectionPoint(ConnectionPoint &cp) @@ -294,7 +296,7 @@ void SPAvoidRef::handleSettingChange(void) // isn't the same as the document that this item is part of. This // case can happen if a new document is loaded from the file chooser // or via the recent file menu. In this case, we can end up here - // as a rersult of a sp_document_ensure_up_to_date performed on a + // as a rersult of a ensureUpToDate performed on a // document not yet attached to the active desktop. return; } @@ -314,7 +316,7 @@ void SPAvoidRef::handleSettingChange(void) _transformed_connection = item->connectTransformed( sigc::ptr_fun(&avoid_item_move)); - const char *id = SP_OBJECT_REPR(item)->attribute("id"); + char const *id = item->getAttribute("id"); g_assert(id != NULL); // Get a unique ID for the item. @@ -329,7 +331,8 @@ void SPAvoidRef::handleSettingChange(void) { g_assert(shapeRef); - router->removeShape(shapeRef); + // Deleting the shapeRef will remove it completely from + // an existing Router instance. delete shapeRef; shapeRef = NULL; } @@ -341,7 +344,7 @@ GSList *SPAvoidRef::getAttachedShapes(const unsigned int type) GSList *list = NULL; Avoid::IntList shapes; - GQuark shapeId = g_quark_from_string(item->id); + GQuark shapeId = g_quark_from_string(item->getId()); item->document->router->attachedShapes(shapes, shapeId, type); Avoid::IntList::iterator finish = shapes.end(); @@ -365,7 +368,7 @@ GSList *SPAvoidRef::getAttachedConnectors(const unsigned int type) GSList *list = NULL; Avoid::IntList conns; - GQuark shapeId = g_quark_from_string(item->id); + GQuark shapeId = g_quark_from_string(item->getId()); item->document->router->attachedConns(conns, shapeId, type); Avoid::IntList::iterator finish = conns.end(); @@ -387,14 +390,12 @@ Geom::Point SPAvoidRef::getConnectionPointPos(const int type, const int id) { g_assert(item); Geom::Point pos; - const Geom::Matrix& transform = sp_item_i2doc_affine(item); - // TODO investigate why this was asking for the active desktop: - SPDesktop *desktop = inkscape_active_desktop(); + const Geom::Matrix& transform = item->i2doc_affine(); if ( type == ConnPointDefault ) { // For now, just default to the centre of the item - Geom::OptRect bbox = item->getBounds(sp_item_i2doc_affine(item)); + Geom::OptRect bbox = item->getBounds(item->i2doc_affine()); pos = (bbox) ? bbox->midpoint() : Geom::Point(0, 0); } else @@ -446,6 +447,12 @@ static std::vector approxCurveWithPoints(SPCurve *curve) { Geom::Path::const_iterator cit = pit->begin(); while (cit != pit->end()) + { + if (cit == pit->begin()) + { + poly_points.push_back(cit->initialPoint()); + } + if (dynamic_cast(&*cit)) { at += seg_size; @@ -462,6 +469,7 @@ static std::vector approxCurveWithPoints(SPCurve *curve) poly_points.push_back(cit->finalPoint()); ++cit; } + } ++pit; } return poly_points; @@ -484,7 +492,7 @@ static std::vector approxItemWithPoints(SPItem const *item, const G } else if (SP_IS_SHAPE(item)) { - SPCurve* item_curve = sp_shape_get_curve(SP_SHAPE(item)); + SPCurve* item_curve = SP_SHAPE(item)->getCurve(); // make sure it has an associated curve if (item_curve) { @@ -504,7 +512,7 @@ static Avoid::Polygon avoid_item_poly(SPItem const *item) g_assert(desktop != NULL); double spacing = desktop->namedview->connector_spacing; - Geom::Matrix itd_mat = sp_item_i2doc_affine(item); + Geom::Matrix itd_mat = item->i2doc_affine(); std::vector hull_points; hull_points = approxItemWithPoints(item, itd_mat); @@ -520,7 +528,7 @@ static Avoid::Polygon avoid_item_poly(SPItem const *item) prev_parallel_hull_edge.origin(hull_edge.origin()+hull_edge.versor().ccw()*spacing); prev_parallel_hull_edge.versor(hull_edge.versor()); int hull_size = hull.boundary.size(); - for (int i = 0; i <= hull_size; ++i) + for (int i = 0; i < hull_size; ++i) { hull_edge.setBy2Points(hull[i], hull[i+1]); Geom::Line parallel_hull_edge; @@ -550,8 +558,7 @@ static Avoid::Polygon avoid_item_poly(SPItem const *item) GSList *get_avoided_items(GSList *list, SPObject *from, SPDesktop *desktop, bool initialised) { - for (SPObject *child = sp_object_first_child(SP_OBJECT(from)) ; - child != NULL; child = SP_OBJECT_NEXT(child) ) { + for (SPObject *child = from->firstChild() ; child != NULL; child = child->next ) { if (SP_IS_ITEM(child) && !desktop->isLayer(SP_ITEM(child)) && !SP_ITEM(child)->isLocked() && @@ -589,8 +596,8 @@ void init_avoided_shape_geometry(SPDesktop *desktop) // Don't count this as changes to the document, // it is basically just late initialisation. SPDocument *document = sp_desktop_document(desktop); - bool saved = sp_document_get_undo_sensitive(document); - sp_document_set_undo_sensitive(document, false); + bool saved = DocumentUndo::getUndoSensitive(document); + DocumentUndo::setUndoSensitive(document, false); bool initialised = false; GSList *items = get_avoided_items(NULL, desktop->currentRoot(), desktop, @@ -604,7 +611,7 @@ void init_avoided_shape_geometry(SPDesktop *desktop) if (items) { g_slist_free(items); } - sp_document_set_undo_sensitive(document, saved); + DocumentUndo::setUndoSensitive(document, saved); }