/** * Checks if the given marker is used in the shape, and if so, it * releases it by calling sp_marker_hide. Also detaches signals * and unrefs the marker from the shape. */ static void sp_shape_marker_release (SPObject *marker, SPShape *shape) { SPItem *item = dynamic_cast<SPItem *>(shape); g_return_if_fail(item != NULL); for (int i = 0; i < SP_MARKER_LOC_QTY; i++) { if (marker == shape->_marker[i]) { SPItemView *v; /* Hide marker */ for (v = item->display; v != NULL; v = v->next) { sp_marker_hide(shape->_marker[i], v->arenaitem->key() + i); } /* Detach marker */ shape->_release_connect[i].disconnect(); shape->_modified_connect[i].disconnect(); shape->_marker[i] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[i], item)); } } }
void URIReference::_setObject(SPObject *obj) { if ( obj && !_acceptObject(obj) ) { obj = NULL; } if ( obj == _obj ) return; SPObject *old_obj=_obj; _obj = obj; _release_connection.disconnect(); if (_obj) { sp_object_href(_obj, _owner); _release_connection = _obj->connectRelease(sigc::mem_fun(*this, &URIReference::_release)); } _changed_signal.emit(old_obj, _obj); if (old_obj) { /* release the old object _after_ the signal emission */ sp_object_hunref(old_obj, _owner); } }
/** * Removes, releases and unrefs all children of object * * This is the inverse of sp_shape_build(). It must be invoked as soon * as the shape is removed from the tree, even if it is still referenced * by other objects. This routine also disconnects/unrefs markers and * curves attached to it. * * \see SPObject::release() */ void SPShape::release() { for (int i = 0; i < SP_MARKER_LOC_QTY; i++) { if (this->_marker[i]) { for (SPItemView *v = this->display; v != NULL; v = v->next) { sp_marker_hide(_marker[i], v->arenaitem->key() + i); } this->_release_connect[i].disconnect(); this->_modified_connect[i].disconnect(); _marker[i] = static_cast<SPMarker *>(sp_object_hunref(_marker[i], this)); } } if (this->_curve) { this->_curve = this->_curve->unref(); } if (this->_curve_before_lpe) { this->_curve_before_lpe = this->_curve_before_lpe->unref(); } SPLPEItem::release(); }
/** * Adds a new marker to shape object at the location indicated by key. value * must be a valid URI reference resolvable from the shape object (i.e., present * in the document <defs>). If the shape object already has a marker * registered at the given position, it is removed first. Then the * new marker is hrefed and its signals connected. */ void sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value) { SPShape *shape = dynamic_cast<SPShape *>(object); g_return_if_fail(shape != NULL); if (key > SP_MARKER_LOC_END) { return; } SPObject *mrk = sp_css_uri_reference_resolve(object->document, value); SPMarker *marker = dynamic_cast<SPMarker *>(mrk); if (marker != shape->_marker[key]) { if (shape->_marker[key]) { SPItemView *v; /* Detach marker */ shape->_release_connect[key].disconnect(); shape->_modified_connect[key].disconnect(); /* Hide marker */ for (v = shape->display; v != NULL; v = v->next) { sp_marker_hide(shape->_marker[key], v->arenaitem->key() + key); } /* Unref marker */ shape->_marker[key] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[key], object)); } if (marker) { shape->_marker[key] = static_cast<SPMarker *>(sp_object_href(marker, object)); shape->_release_connect[key] = marker->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_shape_marker_release), shape)); shape->_modified_connect[key] = marker->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_shape_marker_modified), shape)); } } }