index 08638b9f3fd517d9aaf00c56ad9e4a9a176dc336..ba6e416cd49a09c08157be7a6c4625c384eb165d 100644 (file)
--- a/src/document-subset.cpp
+++ b/src/document-subset.cpp
#include <glib/gmessages.h>
#include <sigc++/signal.h>
+#include <sigc++/functors/mem_fun.h>
#include "util/list.h"
#include "util/reverse-list.h"
Siblings children;
gulong release_connection;
+ sigc::connection position_changed_connection;
Record() : parent(NULL), release_connection(0) {}
void addOne(SPObject *obj);
void remove(SPObject *obj, bool subtree);
void reorder(SPObject *obj);
+ void clear();
private:
Record &_doAdd(SPObject *obj) {
record.release_connection
= g_signal_connect(obj, "release",
(GCallback)&Relations::_release_object, this);
+ record.position_changed_connection
+ = obj->connectPositionChanged(
+ sigc::mem_fun(this, &Relations::reorder)
+ );
return record;
}
g_signal_handler_disconnect(obj, record.release_connection);
record.release_connection = 0;
}
+ record.position_changed_connection.disconnect();
records.erase(obj);
removed_signal.emit(obj);
sp_object_unref(obj);
}
};
-DocumentSubset::DocumentSubset(SPDocument *document)
-: _document(document), _relations(new DocumentSubset::Relations())
+DocumentSubset::DocumentSubset()
+: _relations(new DocumentSubset::Relations())
{
}
changed_signal.emit();
}
+void DocumentSubset::Relations::clear() {
+ Record &root=records[NULL];
+
+ while (!root.children.empty()) {
+ _doRemoveSubtree(root.children.front());
+ }
+
+ changed_signal.emit();
+}
+
void DocumentSubset::Relations::reorder(SPObject *obj) {
SPObject::ParentIterator parent=obj;
_relations->remove(obj, subtree);
}
+void DocumentSubset::_clear() {
+ _relations->clear();
+}
+
bool DocumentSubset::includes(SPObject *obj) const {
return _relations->get(obj);
}