From d7c51ea3892dcad46e01642475479ff2379a51ad Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Tue, 10 Apr 2012 19:27:41 +0200 Subject: powerstroke: remove the need to reload the node tool when adding/deleting control width knots (bzr r11210) --- .../parameter/powerstrokepointarray.cpp | 45 ++++++++++++++++------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'src/live_effects/parameter/powerstrokepointarray.cpp') diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp index 9d91dff18..06048cb32 100644 --- a/src/live_effects/parameter/powerstrokepointarray.cpp +++ b/src/live_effects/parameter/powerstrokepointarray.cpp @@ -184,29 +184,50 @@ PowerStrokePointArrayParamKnotHolderEntity::knot_get() void PowerStrokePointArrayParamKnotHolderEntity::knot_click(guint state) { -//g_print ("This is the %d handle associated to parameter '%s'\n", _index, _pparam->param_key.c_str()); - bool knotarray_changed = false; - if (state & GDK_CONTROL_MASK) { if (state & GDK_MOD1_MASK) { // delete the clicked knot std::vector & vec = _pparam->_vector; vec.erase(vec.begin() + _index); _pparam->param_set_and_write_new_value(vec); - knotarray_changed = true; + + // remove knot from knotholder + parent_holder->entity.remove(this); + // shift knots down one index + for(std::list::iterator ent = parent_holder->entity.begin(); ent != parent_holder->entity.end(); ++ent) { + PowerStrokePointArrayParamKnotHolderEntity *pspa_ent = dynamic_cast(*ent); + if ( pspa_ent && pspa_ent->_pparam == this->_pparam ) { // check if the knotentity belongs to this powerstrokepointarray parameter + if (pspa_ent->_index > this->_index) { + --pspa_ent->_index; + } + } + }; + // delete self and return + delete this; + return; } else { - // add a knot + // add a knot to XML std::vector & vec = _pparam->_vector; - vec.insert(vec.begin() + _index, 1, vec.at(_index)); + vec.insert(vec.begin() + _index, 1, vec.at(_index)); // this clicked knot is duplicated _pparam->param_set_and_write_new_value(vec); - knotarray_changed = true; + + // shift knots up one index + for(std::list::iterator ent = parent_holder->entity.begin(); ent != parent_holder->entity.end(); ++ent) { + PowerStrokePointArrayParamKnotHolderEntity *pspa_ent = dynamic_cast(*ent); + if ( pspa_ent && pspa_ent->_pparam == this->_pparam ) { // check if the knotentity belongs to this powerstrokepointarray parameter + if (pspa_ent->_index > this->_index) { + ++pspa_ent->_index; + } + } + }; + // add knot to knotholder + PowerStrokePointArrayParamKnotHolderEntity *e = new PowerStrokePointArrayParamKnotHolderEntity(_pparam, _index+1); + e->create( this->desktop, this->item, parent_holder, + _("Stroke width control point: drag to alter the stroke width. Ctrl+click adds a control point, Ctrl+Alt+click deletes it."), + _pparam->knot_shape, _pparam->knot_mode, _pparam->knot_color); + parent_holder->add(e); } } - - if (knotarray_changed) { - // if knot array has been changed, the on-canvas knots must be reloaded - /// \todo reload! - } } void -- cgit v1.2.3