From ad5dbfa523169deacf8bde03ec1495e4fb2ba594 Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Gomes Date: Dec 13 2019 04:29:26 +0000 Subject: keep Dialog Waypoint data updated with Graphs changes --- diff --git a/synfig-core/src/synfig/timepointcollect.cpp b/synfig-core/src/synfig/timepointcollect.cpp index d02d7b1..db84b45 100644 --- a/synfig-core/src/synfig/timepointcollect.cpp +++ b/synfig-core/src/synfig/timepointcollect.cpp @@ -139,6 +139,76 @@ synfig::waypoint_collect(set > &waypoint_set, return 0; } +bool +synfig::waypoint_search(Waypoint& waypoint, const UniqueID &uid, const etl::handle &node) +{ + // Check if we are a linkable value node + LinkableValueNode::Handle linkable_value_node; + linkable_value_node=linkable_value_node.cast_dynamic(node); + if(linkable_value_node) + { + const int link_count(linkable_value_node->link_count()); + for(int i=0; i < link_count; i++) { + bool ret = waypoint_search(waypoint, uid, linkable_value_node->get_link(i).get()); + if (ret) + return true; + } + return false; + } + + // Check if we are a layer + Layer::Handle layer; + layer=layer.cast_dynamic(node); + if(layer) + { + const Layer::DynamicParamList& dyn_param_list(layer->dynamic_param_list()); + + for(Layer::DynamicParamList::const_iterator iter=dyn_param_list.begin(); iter!=dyn_param_list.end(); ++iter) { + bool ret = waypoint_search(waypoint, uid, iter->second); + if (ret) + return true; + } + + ValueBase canvas_value(layer->get_param("canvas")); + if(canvas_value.get_type()==type_canvas) + { + bool ret = waypoint_search(waypoint, uid, + Canvas::Handle(canvas_value.get(Canvas::Handle()))); + if (ret) + return true; + } + return false; + } + + // Check if we are a canvas + Canvas::Handle canvas; + canvas=canvas.cast_dynamic(node); + if(canvas) + { + for(Canvas::const_iterator iter = canvas->begin(); iter!=canvas->end(); ++iter) { + bool ret = waypoint_search(waypoint, uid, *iter); + if (ret) + return true; + } + return false; + } + + // Check if we are an animated value node + ValueNode_Animated::Handle value_node_animated; + value_node_animated=value_node_animated.cast_dynamic(node); + if(value_node_animated) + { + ValueNode_AnimatedInterfaceConst::const_findresult result = value_node_animated->find_uid(uid); + if (!result.second) + return false; + + waypoint = *result.first; + return true; + } + + return false; +} + //! \writeme int synfig::activepoint_collect(set >& /*activepoint_set*/,const Time& time, const etl::handle& node) diff --git a/synfig-core/src/synfig/timepointcollect.h b/synfig-core/src/synfig/timepointcollect.h index 7f6827c..647c413 100644 --- a/synfig-core/src/synfig/timepointcollect.h +++ b/synfig-core/src/synfig/timepointcollect.h @@ -44,6 +44,9 @@ namespace synfig { //! \writeme int waypoint_collect(std::set >& waypoint_set,const Time& time, const etl::handle& node); +//! Search for a specific waypoint (by its uid) in node. +bool waypoint_search(Waypoint& waypoint, const UniqueID& uid, const etl::handle& node); + //! \writeme int activepoint_collect(std::set >& activepoint_set,const Time& time, const etl::handle& node); diff --git a/synfig-studio/src/gui/dialogs/dialog_waypoint.cpp b/synfig-studio/src/gui/dialogs/dialog_waypoint.cpp index 26fbbf8..17e6c8f 100644 --- a/synfig-studio/src/gui/dialogs/dialog_waypoint.cpp +++ b/synfig-studio/src/gui/dialogs/dialog_waypoint.cpp @@ -43,6 +43,8 @@ #include "widgets/widget_time.h" #include "widgets/widget_waypoint.h" +#include + #include #endif @@ -113,7 +115,7 @@ void Dialog_Waypoint::on_delete_pressed() { hide(); - signal_delete_(); + signal_delete_(); } void @@ -134,9 +136,32 @@ Dialog_Waypoint::set_value_desc(synfigapp::ValueDesc value_desc) value_desc_=value_desc; if(value_desc.get_value_node() && value_desc.get_value_node()->get_parent_canvas()) waypointwidget->set_canvas(value_desc.get_value_node()->get_parent_canvas()); + + if (value_desc.is_value_node()) + value_desc_changed = value_desc.get_value_node()->signal_changed().connect( + sigc::mem_fun(*this, &Dialog_Waypoint::refresh )); + if (value_desc.parent_is_value_node()) + value_desc_changed = value_desc.get_parent_value_node()->signal_changed().connect( + sigc::mem_fun(*this, &Dialog_Waypoint::refresh )); + if (value_desc.parent_is_layer()) + value_desc_changed = value_desc.get_layer()->signal_changed().connect( + sigc::mem_fun(*this, &Dialog_Waypoint::refresh )); + } void Dialog_Waypoint::reset() { } + +void +Dialog_Waypoint::refresh() +{ + Waypoint refreshed_waypoint; + bool ok = synfig::waypoint_search(refreshed_waypoint, waypointwidget->get_waypoint(), value_desc_.get_value_node()); + if (!ok) + hide(); + else + set_waypoint(refreshed_waypoint); +} + diff --git a/synfig-studio/src/gui/dialogs/dialog_waypoint.h b/synfig-studio/src/gui/dialogs/dialog_waypoint.h index c0aaeb1..2ae0f4e 100644 --- a/synfig-studio/src/gui/dialogs/dialog_waypoint.h +++ b/synfig-studio/src/gui/dialogs/dialog_waypoint.h @@ -71,7 +71,6 @@ class Dialog_Waypoint : public Gtk::Dialog { Widget_Waypoint *waypointwidget; etl::handle canvas; - synfig::ValueNode_Animated::WaypointList::iterator waypoint; synfigapp::ValueDesc value_desc_; sigc::signal signal_changed_; @@ -81,6 +80,10 @@ class Dialog_Waypoint : public Gtk::Dialog void on_apply_pressed(); void on_delete_pressed(); + sigc::connection value_desc_changed; + + void refresh(); + public: Dialog_Waypoint(Gtk::Window& parent,etl::handle canvas); ~Dialog_Waypoint();