From 38d414e486f69b2d2e51720338a1cf579f0f7e8f Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Gomes Date: Dec 13 2019 04:29:26 +0000 Subject: no need to enter in edit mode --- diff --git a/synfig-studio/src/gui/widgets/widget_curves.cpp b/synfig-studio/src/gui/widgets/widget_curves.cpp index 581974f..8da3245 100644 --- a/synfig-studio/src/gui/widgets/widget_curves.cpp +++ b/synfig-studio/src/gui/widgets/widget_curves.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include @@ -602,8 +603,6 @@ void Widget_Curves::start_dragging(const ChannelPoint& pointed_item) group = new synfigapp::Action::PassiveGrouper(canvas_interface->get_instance().get(), _("Change animation curve")); - is_dragging_initial_edit_mode_animate = canvas_interface->get_mode() & EditMode::MODE_ANIMATE; - canvas_interface->set_mode(canvas_interface->get_mode() | EditMode::MODE_ANIMATE); pointer_state = POINTER_DRAGGING; } @@ -614,7 +613,7 @@ void Widget_Curves::drag(int pointer_x, int pointer_y) int waypoint_dy = current_y - active_point_initial_y; int dy = pointer_dy - waypoint_dy; for (auto point : selected_points) { - if (!point.curve_it->value_desc.is_animated()) + if (!point.is_draggable()) continue; Time time = point.time_point.get_time(); Real v = point.get_value(time_plot_data->dt); @@ -626,20 +625,23 @@ void Widget_Curves::drag(int pointer_x, int pointer_y) set_value_base_for_channel_point(value_base, point, v); - bool ok = canvas_interface->change_value_at_time(point.curve_it->value_desc, value_base, time); - if (!ok) { - cancel_dragging(); - pointer_state = POINTER_NONE; - } + const ValueDesc &value_desc = point.curve_it->value_desc; + ValueNode::Handle value_node = value_desc.get_value_node(); + std::set > waypoint_set; + synfig::waypoint_collect(waypoint_set, time, value_node); + if (waypoint_set.size() < 1) + break; + + Waypoint waypoint(*(waypoint_set.begin())); + waypoint.set_value(value_base); + + canvas_interface->waypoint_set_value_node(value_node, waypoint); } queue_draw(); } void Widget_Curves::finish_dragging() { - if (!is_dragging_initial_edit_mode_animate) - canvas_interface->set_mode(canvas_interface->get_mode() - EditMode::MODE_ANIMATE); - delete group; group = nullptr; @@ -651,8 +653,6 @@ void Widget_Curves::cancel_dragging() if (pointer_state != POINTER_DRAGGING) return; - if (!is_dragging_initial_edit_mode_animate) - canvas_interface->set_mode(canvas_interface->get_mode() - EditMode::MODE_ANIMATE); // Sadly group->cancel() just remove PassiverGroup indicator, not its actions, from stack bool has_any_content = 0 < group->get_depth(); @@ -971,6 +971,12 @@ bool Widget_Curves::ChannelPoint::is_valid() const return channel_idx >= 0; } +bool Widget_Curves::ChannelPoint::is_draggable() const +{ + const ValueDesc &value_desc(curve_it->value_desc); + return value_desc.is_animated() || value_desc.parent_is_linkable_value_node(); +} + bool Widget_Curves::ChannelPoint::operator ==(const Widget_Curves::ChannelPoint& b) const { return curve_it == b.curve_it && time_point == b.time_point && channel_idx == b.channel_idx; diff --git a/synfig-studio/src/gui/widgets/widget_curves.h b/synfig-studio/src/gui/widgets/widget_curves.h index 9e2b186..fb04c35 100644 --- a/synfig-studio/src/gui/widgets/widget_curves.h +++ b/synfig-studio/src/gui/widgets/widget_curves.h @@ -68,6 +68,7 @@ private: ChannelPoint(std::list::iterator &curve_it, const synfig::TimePoint time_point, int channel_idx); void invalidate(); bool is_valid() const; + bool is_draggable() const; bool operator ==(const ChannelPoint &b) const; bool operator !=(const ChannelPoint &b) const {return !operator==(b);} @@ -98,7 +99,6 @@ private: int pointer_tracking_start_x, pointer_tracking_start_y; ChannelPoint active_point; int active_point_initial_y; - bool is_dragging_initial_edit_mode_animate; void start_dragging(const ChannelPoint &pointed_item); void drag(int pointer_x, int pointer_y); void finish_dragging(); diff --git a/synfig-studio/src/synfigapp/canvasinterface.cpp b/synfig-studio/src/synfigapp/canvasinterface.cpp index 65989c2..b7ee733 100644 --- a/synfig-studio/src/synfigapp/canvasinterface.cpp +++ b/synfig-studio/src/synfigapp/canvasinterface.cpp @@ -1136,6 +1136,23 @@ CanvasInterface::import_sequence( return true; } +void CanvasInterface::waypoint_set_value_node(ValueNode::Handle value_node, const Waypoint& waypoint) +{ + Action::Handle action(Action::create("WaypointSetSmart")); + + assert(action); + if(!action) + return; + + action->set_param("canvas", get_canvas()); + action->set_param("canvas_interface", this); + action->set_param("value_node", value_node); + action->set_param("waypoint", waypoint); +// action->set_param("time",canvas_interface()->get_time()); + + if(!get_instance()->perform_action(action)) + get_ui_interface()->error(_("Action Failed.")); +} void CanvasInterface::waypoint_duplicate(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint) diff --git a/synfig-studio/src/synfigapp/canvasinterface.h b/synfig-studio/src/synfigapp/canvasinterface.h index b19ecd3..675181c 100644 --- a/synfig-studio/src/synfigapp/canvasinterface.h +++ b/synfig-studio/src/synfigapp/canvasinterface.h @@ -314,6 +314,7 @@ public: synfig::String &warnings, bool resize_image = false ); + void waypoint_set_value_node(synfig::ValueNode::Handle value_node, const synfig::Waypoint& waypoint); void waypoint_duplicate(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint); void waypoint_duplicate(synfig::ValueNode::Handle value_node,synfig::Waypoint waypoint);