index 4e7e9f694f6a49e00fe995aa6aebe263c8572fa0..1988865d10c98b88221d875eb5292d5b1c6ba92b 100644 (file)
--- a/src/document-subset.cpp
+++ b/src/document-subset.cpp
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;
} 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++;
}
}
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();
+ }
}
}
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)
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];
}
}
+ record.release_connection.disconnect();
+ record.position_changed_connection.disconnect();
+ records.erase(obj);
removed_signal.emit(obj);
sp_object_unref(obj);
}
}
}
- static void _release_object(SPObject *obj, void *relations_p) {
- Relations &relations=*static_cast<Relations *>(relations_p);
- if (relations.get(obj)) {
- relations.remove(obj, true);
+ void _release_object(SPObject *obj) {
+ if (get(obj)) {
+ remove(obj, true);
}
}
};
/* remove obj's record */
_doRemove(obj);
}
-
+
changed_signal.emit();
}