/*
5 * Authors: see git history
7 * Copyright (C) 2018 Authors
8 * Released under GNU GPL v2+, read the file
'COPYING' for more information.
42 iter.observer->notifyChildAdded(
node,
child, prev);
55 iter.observer->notifyChildRemoved(
node,
child, prev);
69 iter.observer->notifyChildOrderChanged(
node,
child, old_prev, new_prev);
83 iter.observer->notifyContentChanged(
node, old_content, new_content);
97 iter.observer->notifyAttributeChanged(
node,
name, old_value, new_value);
108 iter.observer->notifyElementNameChanged(
node, old_name, new_name);
127template <
typename ObserverPredicate>
128struct unmarked_record_satisfying {
130 unmarked_record_satisfying(ObserverPredicate p) :
predicate(p) {}
131 bool operator()(ObserverRecord
const &record) {
132 return !record.marked &&
predicate(record.observer);
136template <
typename Predicate>
137bool mark_one(ObserverRecordList &observers,
unsigned &marked_count,
140 auto found = std::find_if(
141 observers.begin(), observers.end(),
142 unmarked_record_satisfying<Predicate>(p)
145 if ( found != observers.end() ) {
147 found->marked =
true;
154template <
typename Predicate>
155bool remove_one(ObserverRecordList &observers,
unsigned &,
158 auto found = std::find_if(
159 observers.begin(), observers.end(),
160 unmarked_record_satisfying<Predicate>(p)
163 if ( found != observers.end() ) {
165 if (observers.size() > 3) {
166 *found = std::move(observers.back());
167 observers.pop_back();
169 observers.erase(found);
177bool is_marked(ObserverRecord
const &record) {
return record.marked; }
179void remove_all_marked(ObserverRecordList &observers,
unsigned &marked_count)
182 g_assert(!observers.empty());
184 auto newEnd = std::remove_if(observers.begin(), observers.end(), is_marked);
185 observers.erase(newEnd, observers.end());
207 eql_observer(NodeObserver
const *o) :
observer(o) {}
208 bool operator()(NodeObserver
const *other) {
void add(NodeObserver &observer)
Add an observer to the list.
void remove(NodeObserver &observer)
Remove an observer from the list.
void notifyContentChanged(Node &node, Util::ptr_shared old_content, Util::ptr_shared new_content) override
Content change callback.
void notifyChildOrderChanged(Node &node, Node &child, Node *old_prev, Node *new_prev) override
Child order change callback.
void notifyElementNameChanged(Node &node, GQuark old_name, GQuark new_name) override
Element name change callback.
void notifyChildRemoved(Node &node, Node &child, Node *prev) override
Child removal callback.
void notifyChildAdded(Node &node, Node &child, Node *prev) override
Child addition callback.
void notifyAttributeChanged(Node &node, GQuark name, Util::ptr_shared old_value, Util::ptr_shared new_value) override
Attribute change callback.
ObserverRecordList _active
ObserverRecordList _pending
std::vector< ObserverRecord, Inkscape::GC::Alloc< ObserverRecord, Inkscape::GC::ATOMIC > > ObserverRecordList
Interface for XML node observers.
Interface for refcounted XML nodes.
ObserverPredicate predicate
NodeObserver const * observer
Inkscape::XML::CompositeNodeObserver - combine multiple observers.
Inkscape::XML::Node * node
Helper class to stream background task notifications as a series of messages.