034563f2583320e9ed142ab3a86c8290cf29eaa6mental#include "helper-observer.h"
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalnamespace Inkscape {
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalnamespace XML {
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
034563f2583320e9ed142ab3a86c8290cf29eaa6mental// Very simple observer that just emits a signal if anything happens to a node
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalSignalObserver::SignalObserver()
034563f2583320e9ed142ab3a86c8290cf29eaa6mental : _oldsel(NULL)
034563f2583320e9ed142ab3a86c8290cf29eaa6mental{}
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalSignalObserver::~SignalObserver()
034563f2583320e9ed142ab3a86c8290cf29eaa6mental{
c0537dcfe264414d52ad86579d57cb0cb2183dcbAlex Valavanis set(NULL); // if _oldsel!=nullptr, remove observer and decrease refcount
034563f2583320e9ed142ab3a86c8290cf29eaa6mental}
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
a4b21d4581ca8340e9db6c33774eb95b29788068Campbell Barton// Add this observer to the SPObject and remove it from any previous object
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalvoid SignalObserver::set(SPObject* o)
034563f2583320e9ed142ab3a86c8290cf29eaa6mental{
034563f2583320e9ed142ab3a86c8290cf29eaa6mental // XML Tree being used direcly in this function in the following code
034563f2583320e9ed142ab3a86c8290cf29eaa6mental // while it shouldn't be
034563f2583320e9ed142ab3a86c8290cf29eaa6mental // Pointer to object is stored, so refcounting should be increased/decreased
034563f2583320e9ed142ab3a86c8290cf29eaa6mental if(_oldsel) {
034563f2583320e9ed142ab3a86c8290cf29eaa6mental if (_oldsel->getRepr()) {
034563f2583320e9ed142ab3a86c8290cf29eaa6mental _oldsel->getRepr()->removeObserver(*this);
034563f2583320e9ed142ab3a86c8290cf29eaa6mental }
073bb00716d54ed8507757ccf777a668e7da17b0joncruz sp_object_unref(_oldsel);
034563f2583320e9ed142ab3a86c8290cf29eaa6mental _oldsel = NULL;
034563f2583320e9ed142ab3a86c8290cf29eaa6mental }
034563f2583320e9ed142ab3a86c8290cf29eaa6mental if(o) {
034563f2583320e9ed142ab3a86c8290cf29eaa6mental if (o->getRepr()) {
034563f2583320e9ed142ab3a86c8290cf29eaa6mental o->getRepr()->addObserver(*this);
034563f2583320e9ed142ab3a86c8290cf29eaa6mental sp_object_ref(o);
034563f2583320e9ed142ab3a86c8290cf29eaa6mental _oldsel = o;
034563f2583320e9ed142ab3a86c8290cf29eaa6mental }
034563f2583320e9ed142ab3a86c8290cf29eaa6mental }
034563f2583320e9ed142ab3a86c8290cf29eaa6mental}
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalvoid SignalObserver::notifyChildAdded(XML::Node&, XML::Node&, XML::Node*)
034563f2583320e9ed142ab3a86c8290cf29eaa6mental{ signal_changed()(); }
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalvoid SignalObserver::notifyChildRemoved(XML::Node&, XML::Node&, XML::Node*)
034563f2583320e9ed142ab3a86c8290cf29eaa6mental{ signal_changed()(); }
034563f2583320e9ed142ab3a86c8290cf29eaa6mental
034563f2583320e9ed142ab3a86c8290cf29eaa6mentalvoid SignalObserver::notifyChildOrderChanged(XML::Node&, XML::Node&, XML::Node*, XML::Node*)
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan{ signal_changed()(); }
void SignalObserver::notifyContentChanged(XML::Node&, Util::ptr_shared<char>, Util::ptr_shared<char>)
{}
void SignalObserver::notifyAttributeChanged(XML::Node&, GQuark, Util::ptr_shared<char>, Util::ptr_shared<char>)
{ signal_changed()(); }
sigc::signal<void>& SignalObserver::signal_changed()
{
return _signal_changed;
}
} //namespace XML
} //namespace Inkscape