From 4b5437157d4d0dc39137f076ea6dace80c4fadd8 Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Gomes Date: Dec 13 2019 04:29:26 +0000 Subject: fix bug when moving curve points in time issue described here https://github.com/synfig/synfig/pull/982#issuecomment-551694936 --- diff --git a/synfig-studio/src/gui/widgets/widget_curves.cpp b/synfig-studio/src/gui/widgets/widget_curves.cpp index b81a9c7..8afd7d3 100644 --- a/synfig-studio/src/gui/widgets/widget_curves.cpp +++ b/synfig-studio/src/gui/widgets/widget_curves.cpp @@ -755,6 +755,9 @@ void Widget_Curves::delta_drag(int dx, int dy) const Time deltatime = next_time - base_time; if (deltatime != 0) { + auto waypoints_to_restore = saved_waypoints; + saved_waypoints.clear(); + for (auto &point : selected_points) { const ValueDesc &value_desc = point.curve_it->value_desc; const Time &time = point.time_point.get_time(); @@ -762,12 +765,42 @@ void Widget_Curves::delta_drag(int dx, int dy) std::pair meta_data(value_desc, time); if (times_to_move.find(meta_data) == times_to_move.end()) { + auto time_set = WaypointRenderer::get_times_from_valuedesc(value_desc); + + // are we overlapping existing waypoints while moving in time? + auto new_timepoint = time_set.find(new_time); + if (new_timepoint != time_set.end()) { + std::set > waypoint_set; + synfig::waypoint_collect(waypoint_set, new_time, value_desc.get_value_node()); + for (const Waypoint &waypoint : waypoint_set) { + saved_waypoints.push_back(std::pair::iterator>(waypoint, point.curve_it)); + canvas_interface->waypoint_remove(value_desc, waypoint); + } + } + times_to_move.insert(meta_data); canvas_interface->waypoint_move(value_desc, time, deltatime); } point.time_point = TimePoint(new_time); } active_point.time_point = next_time; + + for (auto it : waypoints_to_restore) { + Action::Handle action(Action::create("WaypointAdd")); + + assert(action); + if(!action) + return; + + action->set_param("canvas", canvas_interface->get_canvas()); + action->set_param("canvas_interface", canvas_interface); + action->set_param("value_node", it.second->value_desc.get_value_node()); +// action->set_param("time", i.first.get_time()); + action->set_param("waypoint", it.first); + + if(!canvas_interface->get_instance()->perform_action(action)) + canvas_interface->get_ui_interface()->error(_("Action Failed.")); + } } queue_draw(); @@ -778,6 +811,8 @@ void Widget_Curves::finish_dragging() delete action_group_drag; action_group_drag = nullptr; + saved_waypoints.clear(); + pointer_state = POINTER_NONE; } @@ -796,6 +831,8 @@ void Widget_Curves::cancel_dragging() canvas_interface->get_instance()->clear_redo_stack(); } + saved_waypoints.clear(); + pointer_state = POINTER_NONE; queue_draw(); } diff --git a/synfig-studio/src/gui/widgets/widget_curves.h b/synfig-studio/src/gui/widgets/widget_curves.h index b543f6b..4263639 100644 --- a/synfig-studio/src/gui/widgets/widget_curves.h +++ b/synfig-studio/src/gui/widgets/widget_curves.h @@ -108,6 +108,8 @@ private: bool dragging_started_by_key; synfigapp::Action::PassiveGrouper *action_group_drag; + std::vector::iterator> > saved_waypoints; + static void set_value_base_for_channel_point(synfig::ValueBase &value_base, const ChannelPoint &channel_point, synfig::Real v); public: