diff options
| author | Martin Owens <doctormo@gmail.com> | 2014-03-27 01:33:44 +0000 |
|---|---|---|
| committer | Martin Owens <doctormo@gmail.com> | 2014-03-27 01:33:44 +0000 |
| commit | 5a4fb2325f60d292b47330f540b26a3279341c90 (patch) | |
| tree | d2aa7967be25450b83e625025366c618101ae49f /src/sp-switch.cpp | |
| parent | The Polar Arrange Tab of the Arrange Dialog now hides the parametric (diff) | |
| parent | Remove Snap menu item and improve grid menu item text (diff) | |
| download | inkscape-5a4fb2325f60d292b47330f540b26a3279341c90.tar.gz inkscape-5a4fb2325f60d292b47330f540b26a3279341c90.zip | |
Commit a merge to trunk, with probabal errors
(bzr r11073.1.36)
Diffstat (limited to 'src/sp-switch.cpp')
| -rw-r--r-- | src/sp-switch.cpp | 120 |
1 files changed, 54 insertions, 66 deletions
diff --git a/src/sp-switch.cpp b/src/sp-switch.cpp index 500e43c9c..db6db9909 100644 --- a/src/sp-switch.cpp +++ b/src/sp-switch.cpp @@ -25,99 +25,83 @@ #include <sigc++/functors/ptr_fun.h> #include <sigc++/adaptors/bind.h> -static void sp_switch_class_init (SPSwitchClass *klass); -static void sp_switch_init (SPSwitch *group); +#include "sp-factory.h" -static SPGroupClass * parent_class; - -GType CSwitch::getType (void) -{ - static GType switch_type = 0; - if (!switch_type) { - GTypeInfo switch_info = { - sizeof (SPSwitchClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) sp_switch_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (SPSwitch), - 16, /* n_preallocs */ - (GInstanceInitFunc) sp_switch_init, - NULL, /* value_table */ - }; - switch_type = g_type_register_static (SP_TYPE_GROUP, "SPSwitch", &switch_info, (GTypeFlags)0); +namespace { + SPObject* createSwitch() { + return new SPSwitch(); } - return switch_type; -} -static void -sp_switch_class_init (SPSwitchClass *) { - parent_class = (SPGroupClass *)g_type_class_ref (SP_TYPE_GROUP); + bool switchRegistered = SPFactory::instance().registerObject("svg:switch", createSwitch); } -static void sp_switch_init (SPSwitch *group) -{ - if (group->group) - delete group->group; - - group->group = new CSwitch(group); +SPSwitch::SPSwitch() : SPGroup() { + this->_cached_item = 0; } -CSwitch::CSwitch(SPGroup *group) : CGroup(group), _cached_item(NULL) { -} - -CSwitch::~CSwitch() { +SPSwitch::~SPSwitch() { _releaseLastItem(_cached_item); } -SPObject *CSwitch::_evaluateFirst() { +SPObject *SPSwitch::_evaluateFirst() { SPObject *first = 0; - for (SPObject *child = _group->firstChild() ; child && !first ; child = child->getNext() ) { + + for (SPObject *child = this->firstChild() ; child && !first ; child = child->getNext() ) { if (SP_IS_ITEM(child) && sp_item_evaluate(SP_ITEM(child))) { - first = child; - } + first = child; + } } + return first; } -GSList *CSwitch::_childList(bool add_ref, SPObject::Action action) { +GSList *SPSwitch::_childList(bool add_ref, SPObject::Action action) { if ( action != SPObject::ActionGeneral ) { - return _group->childList(add_ref, action); + return this->childList(add_ref, action); } SPObject *child = _evaluateFirst(); if (NULL == child) return NULL; - if (add_ref) - g_object_ref (G_OBJECT (child)); + if (add_ref) { + //g_object_ref (G_OBJECT (child)); + sp_object_ref(child); + } return g_slist_prepend (NULL, child); } -gchar *CSwitch::getDescription() { - gint len = getItemCount(); +const char *SPSwitch::displayName() const { + return _("Conditional Group"); +} + +gchar *SPSwitch::description() const { + gint len = this->getItemCount(); return g_strdup_printf( - ngettext("<b>Conditional group</b> of <b>%d</b> object", - "<b>Conditional group</b> of <b>%d</b> objects", - len), len); + ngettext(_("of <b>%d</b> object"), _("of <b>%d</b> objects"), len), len); } -void CSwitch::onChildAdded(Inkscape::XML::Node *) { - _reevaluate(true); +void SPSwitch::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { + SPGroup::child_added(child, ref); + + this->_reevaluate(true); } -void CSwitch::onChildRemoved(Inkscape::XML::Node *) { - _reevaluate(); +void SPSwitch::remove_child(Inkscape::XML::Node *child) { + SPGroup::remove_child(child); + + this->_reevaluate(); } -void CSwitch::onOrderChanged (Inkscape::XML::Node *, Inkscape::XML::Node *, Inkscape::XML::Node *) +void SPSwitch::order_changed (Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) { - _reevaluate(); + SPGroup::order_changed(child, old_ref, new_ref); + + this->_reevaluate(); } -void CSwitch::_reevaluate(bool /*add_to_drawing*/) { +void SPSwitch::_reevaluate(bool /*add_to_drawing*/) { SPObject *evaluated_child = _evaluateFirst(); if (!evaluated_child || _cached_item == evaluated_child) { return; @@ -138,39 +122,43 @@ void CSwitch::_reevaluate(bool /*add_to_drawing*/) { } _cached_item = evaluated_child; - _release_connection = evaluated_child->connectRelease(sigc::bind(sigc::ptr_fun(&CSwitch::_releaseItem), this)); + _release_connection = evaluated_child->connectRelease(sigc::bind(sigc::ptr_fun(&SPSwitch::_releaseItem), this)); - _group->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); } -void CSwitch::_releaseItem(SPObject *obj, CSwitch *selection) +void SPSwitch::_releaseItem(SPObject *obj, SPSwitch *selection) { selection->_releaseLastItem(obj); } -void CSwitch::_releaseLastItem(SPObject *obj) +void SPSwitch::_releaseLastItem(SPObject *obj) { - if (NULL == _cached_item || _cached_item != obj) + if (NULL == this->_cached_item || this->_cached_item != obj) return; - _release_connection.disconnect(); - _cached_item = NULL; + this->_release_connection.disconnect(); + this->_cached_item = NULL; } -void CSwitch::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) { - SPObject *evaluated_child = _evaluateFirst(); +void SPSwitch::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) { + SPObject *evaluated_child = this->_evaluateFirst(); + + GSList *l = this->_childList(false, SPObject::ActionShow); - GSList *l = _childList(false, SPObject::ActionShow); while (l) { SPObject *o = SP_OBJECT (l->data); + if (SP_IS_ITEM (o)) { SPItem * child = SP_ITEM(o); child->setEvaluated(o == evaluated_child); Inkscape::DrawingItem *ac = child->invoke_show (drawing, key, flags); + if (ac) { ai->appendChild(ac); } } + l = g_slist_remove (l, o); } } |
