index c4425add69e85c283e794dee4bec0312e7530545..7c85277768d7e87581e4d118f01b00091f030ec2 100644 (file)
--- a/src/sp-conn-end-pair.cpp
+++ b/src/sp-conn-end-pair.cpp
#include "libavoid/vertices.h"
#include "libavoid/router.h"
#include "document.h"
+#include "sp-item-group.h"
SPConnEndPair::SPConnEndPair(SPPath *const owner)
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();
SPConnEndPair::getAttachedItems(SPItem *h2attItem[2]) const {
for (unsigned h = 0; h < 2; ++h) {
h2attItem[h] = this->_connEnd[h]->ref.getObject();
+
+ // Deal with the case of the attached object being an empty group.
+ // A group containing no items does not have a valid bbox, so
+ // causes problems for the auto-routing code. Also, since such a
+ // group no longer has an onscreen representation and can only be
+ // selected through the XML editor, it makes sense just to detach
+ // connectors from them.
+ if (SP_IS_GROUP(h2attItem[h])) {
+ if (SP_GROUP(h2attItem[h])->group->getItemCount() == 0) {
+ // This group is empty, so detach.
+ sp_conn_end_detach(_path, h);
+ h2attItem[h] = NULL;
+ }
+ }
}
}
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();
+ NR::Maybe<NR::Rect> bbox = h2attItem[h]->getBounds(sp_item_i2doc_affine(h2attItem[h]));
+ if (bbox) {
+ endPts[h] = bbox->midpoint();
+ } else {
+ // FIXME
+ endPts[h] = NR::Point(0, 0);
+ }
}
else
{
NR::Point endPt[2];
getEndpoints(endPt);
- Avoid::Point src = { endPt[0][NR::X], endPt[0][NR::Y] };
- Avoid::Point dst = { endPt[1][NR::X], endPt[1][NR::Y] };
+ Avoid::Point src(endPt[0][NR::X], endPt[0][NR::Y]);
+ Avoid::Point dst(endPt[1][NR::X], endPt[1][NR::Y]);
_connRef->lateSetup(src, dst);
_connRef->setCallback(&emitPathInvalidationNotification, _path);
NR::Point endPt[2];
getEndpoints(endPt);
- Avoid::Point src = { endPt[0][NR::X], endPt[0][NR::Y] };
- Avoid::Point dst = { endPt[1][NR::X], endPt[1][NR::Y] };
+ 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);