X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdocument-subset.cpp;h=1988865d10c98b88221d875eb5292d5b1c6ba92b;hb=7adfbd503fbbc8c2c4829f245d24d36f96c105d1;hp=4e7e9f694f6a49e00fe995aa6aebe263c8572fa0;hpb=0832343fd7f087d3b718bc86f2cf74014e56b582;p=inkscape.git diff --git a/src/document-subset.cpp b/src/document-subset.cpp index 4e7e9f694..1988865d1 100644 --- a/src/document-subset.cpp +++ b/src/document-subset.cpp @@ -36,10 +36,10 @@ struct DocumentSubset::Relations : public GC::Managed, SPObject *parent; Siblings children; - gulong release_connection; + sigc::connection release_connection; sigc::connection position_changed_connection; - Record() : parent(NULL), release_connection(0) {} + Record() : parent(NULL) {} unsigned childIndex(SPObject *obj) { Siblings::iterator found; @@ -57,29 +57,28 @@ struct DocumentSubset::Relations : public GC::Managed, } else { Siblings::const_iterator first=children.begin(); Siblings::const_iterator last=children.end() - 1; - if ( children.size() == 1 ) { - int pos = sp_object_compare_position(*first, obj); + + while ( first != last ) { + Siblings::const_iterator mid = first + ( last - first + 1 ) / 2; + int pos = sp_object_compare_position(*mid, obj); if ( pos < 0 ) { - // All good. + first = mid; } else if ( pos > 0 ) { - last++; + if ( last == mid ) { + last = mid - 1; // already at the top limit + } else { + last = mid; + } } else { g_assert_not_reached(); } - } else { - while ( first != last ) { - Siblings::const_iterator mid=first + ( last - first + 1 ) / 2; - int pos=sp_object_compare_position(*mid, obj); - if ( pos < 0 ) { - first = mid; - } else if ( pos > 0 ) { - if ( last == mid ) { - break; - } - last = mid; - } else { - g_assert_not_reached(); - } + } + + if ( first == last ) { + // compare to the single possiblity left + int pos = sp_object_compare_position(*last, obj); + if ( pos < 0 ) { + last++; } } @@ -141,7 +140,12 @@ struct DocumentSubset::Relations : public GC::Managed, for ( Map::iterator iter=records.begin() ; iter != records.end() ; ++iter ) { - sp_object_unref((*iter).first); + if ((*iter).first) { + sp_object_unref((*iter).first); + Record &record=(*iter).second; + record.release_connection.disconnect(); + record.position_changed_connection.disconnect(); + } } } @@ -164,8 +168,9 @@ private: sp_object_ref(obj); Record &record=records[obj]; record.release_connection - = g_signal_connect(obj, "release", - (GCallback)&Relations::_release_object, this); + = obj->connectRelease( + sigc::mem_fun(this, &Relations::_release_object) + ); record.position_changed_connection = obj->connectPositionChanged( sigc::mem_fun(this, &Relations::reorder) @@ -179,12 +184,6 @@ private: void _doRemove(SPObject *obj) { Record &record=records[obj]; - if (record.release_connection) { - g_signal_handler_disconnect(obj, record.release_connection); - record.release_connection = 0; - } - record.position_changed_connection.disconnect(); - records.erase(obj); if ( record.parent == NULL ) { Record &root = records[NULL]; @@ -196,6 +195,9 @@ private: } } + record.release_connection.disconnect(); + record.position_changed_connection.disconnect(); + records.erase(obj); removed_signal.emit(obj); sp_object_unref(obj); } @@ -213,10 +215,9 @@ private: } } - static void _release_object(SPObject *obj, void *relations_p) { - Relations &relations=*static_cast(relations_p); - if (relations.get(obj)) { - relations.remove(obj, true); + void _release_object(SPObject *obj) { + if (get(obj)) { + remove(obj, true); } } }; @@ -300,7 +301,7 @@ void DocumentSubset::Relations::remove(SPObject *obj, bool subtree) { /* remove obj's record */ _doRemove(obj); } - + changed_signal.emit(); }