Skip to content

Commit

Permalink
Merge branch 'duck_select_param' into rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
morevnaproject committed Dec 23, 2015
2 parents 58ef4d7 + cc97568 commit f82eb09
Show file tree
Hide file tree
Showing 8 changed files with 161 additions and 1 deletion.
5 changes: 5 additions & 0 deletions synfig-studio/src/gui/duckmatic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@ Duckmatic::select_duck(const etl::handle<Duck> &duck)
{
selected_ducks.insert(duck->get_guid());
signal_duck_selection_changed_();

if(selected_ducks.size() == 1)
{
signal_duck_selection_single_(duck);
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions synfig-studio/src/gui/duckmatic.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ typedef std::map<synfig::GUID,etl::smart_ptr<synfig::Point> > DuckDataMap;
etl::handle<BezierDrag_Base> bezier_dragger_;

sigc::signal<void> signal_duck_selection_changed_;
sigc::signal<void, const etl::handle<Duck>& > signal_duck_selection_single_;

sigc::signal<void> signal_strokes_changed_;

Expand Down Expand Up @@ -294,6 +295,7 @@ typedef std::map<synfig::GUID,etl::smart_ptr<synfig::Point> > DuckDataMap;
bool get_lock_animation_mode()const { return lock_animation_mode_; }

sigc::signal<void>& signal_duck_selection_changed() { return signal_duck_selection_changed_; }
sigc::signal<void, const etl::handle<Duck>& >& signal_duck_selection_single() { return signal_duck_selection_single_; }
sigc::signal<void>& signal_strokes_changed() { return signal_strokes_changed_; }
sigc::signal<void>& signal_grid_changed() { return signal_grid_changed_; }
sigc::signal<void>& signal_sketch_saved() { return signal_sketch_saved_; }
Expand Down
104 changes: 103 additions & 1 deletion synfig-studio/src/gui/trees/layerparamtreestore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
#include "iconcontroller.h"
#include <gtkmm/button.h>
#include <synfig/paramdesc.h>
#include <synfig/valuenodes/valuenode_bone.h>
#include <synfig/valuenodes/valuenode_composite.h>

#include "layertree.h"
#include <synfigapp/action_system.h>
#include <synfigapp/instance.h>
Expand Down Expand Up @@ -299,7 +302,7 @@ LayerParamTreeStore::set_value_impl(const Gtk::TreeModel::iterator& iter, int co
*/
CanvasTreeStore::set_value_impl(iter,column, value);
}
catch(std::exception x)
catch(std::exception& x)
{
g_warning("%s", x.what());
}
Expand Down Expand Up @@ -598,3 +601,102 @@ LayerParamTreeStore::on_layer_param_changed(synfig::Layer::Handle /*handle*/,syn
{
queue_refresh();
}

bool
LayerParamTreeStore::find_value_desc(const synfigapp::ValueDesc& value_desc, Gtk::TreeIter& iter)
{
//! check level0
for(iter = children().begin(); iter && iter != children().end(); ++iter)
{
if(value_desc.is_value_node())
{
//! transformation handle is at level 0, force to inspect deeper if case.
if( (value_desc.get_value_node()==((synfigapp::ValueDesc)(*iter)[model.value_desc]).get_value_node()) &&
(value_desc.get_value_type() == type_transformation)
)
{
Gtk::TreeIter iter2 = iter->children().begin();
for( ; iter2 && iter2 != iter->children().end(); ++iter2)
{
if ( ((synfigapp::ValueDesc)(*iter2)[model.value_desc]).get_name() ==
value_desc.get_sub_name() )
{
iter = iter2;
return true;
}
}
}
}
//! something found
if (value_desc==(*iter)[model.value_desc])
return true;
}

//! let's go for deepness
Gtk::TreeIter iter2;
for(iter2 = children().begin(); iter2 && iter2 != children().end(); ++iter2)
{
if((*iter2).children().empty())
continue;

if(find_value_desc(value_desc,iter,iter2->children()))
return true;
}
return false;
}

bool
LayerParamTreeStore::find_value_desc(const synfigapp::ValueDesc& value_desc, Gtk::TreeIter& iter, const Gtk::TreeNodeChildren child_iter)
{
// actual level from child_iter
for(iter = child_iter.begin(); iter && iter != child_iter.end(); ++iter)
{
if(value_desc.is_value_node())
{
// for vertex handle force to inspect deeper
if( value_desc.get_value_node()==((synfigapp::ValueDesc)(*iter)[model.value_desc]).get_value_node() &&
(value_desc.get_value_type() == type_bline_point)
)
// seems to be not necessary to check the ValueNode
// if((ValueNode_Composite::Handle::cast_dynamic(
// ((synfigapp::ValueDesc)(*iter)[model.value_desc]).get_value_node()))
// )
{
//check iteratively spline point (bline) children for same name.
Gtk::TreeIter iter2 = iter->children().begin();
for( ; iter2 && iter2 != iter->children().end(); ++iter2)
{
if ( ((synfigapp::ValueDesc)(*iter2)[model.value_desc]).get_name() ==
value_desc.get_sub_name() )
{
iter = iter2;
return true;
}
}
}
}
if (value_desc==(*iter)[model.value_desc])
return true;
}

Gtk::TreeIter iter2 = child_iter.begin();

//! for bones, do not inspect recursively to don't get trapped in bones hierarchy
if( ((synfigapp::ValueDesc)(*iter2)[model.value_desc]).parent_is_value_node() )
{
if(ValueNode_Bone::Handle::cast_dynamic(
((synfigapp::ValueDesc)(*iter2)[model.value_desc]).get_parent_value_node()))
return false;
}

for( ; iter2 && iter2 != child_iter.end(); ++iter2)
{
if((*iter2).children().empty())
continue;

if(find_value_desc(value_desc,iter,iter2->children()))
return true;
}

return false;
}
15 changes: 15 additions & 0 deletions synfig-studio/src/gui/trees/layerparamtreestore.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,21 @@ class LayerParamTreeStore : public CanvasTreeStore

void refresh_row(Gtk::TreeModel::Row &row);

//! \brief Search for a value descriptor on the parameter tree.
//! On success get the node reference of the synfigapp::ValueDesc on the tree
//! \Param[in] value_desc The value to search for
//! \Param[out] iter The node reference of the value in the tree
//! \Return Failed or success to find
bool find_value_desc(const synfigapp::ValueDesc& value_desc, Gtk::TreeIter& iter);

//! \brief Search for a value descriptor on the parameter tree from a given treenode level
//! On success get the node reference of the synfigapp::ValueDesc on the tree
//! \Param[in] value_desc The value to search for
//! \Param[out] iter The node reference of the value in the tree
//! \Param[in] child_iter The node level to look from
//! \Return Failed or success to find
bool find_value_desc(const synfigapp::ValueDesc& value_desc, Gtk::TreeIter& iter, const Gtk::TreeNodeChildren child_iter);

sigc::signal<void>& signal_changed() { return signal_changed_; }

void changed() { signal_changed_(); }
Expand Down
23 changes: 23 additions & 0 deletions synfig-studio/src/gui/trees/layertree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,29 @@ LayerTree::set_show_timetrack(bool x)
column_z_depth->set_visible(x);
}

void
LayerTree::select_param(const synfigapp::ValueDesc& valuedesc)
{
get_param_tree_view().get_selection()->unselect_all();

Gtk::TreeIter iter;
if(param_tree_store_->find_value_desc(valuedesc, iter))
{
Gtk::TreePath path(iter);
for(int i=(int)path.size();i;i--)
{
int j;
path=Gtk::TreePath(iter);
for(j=i;j;j--)
path.up();
get_param_tree_view().expand_row(path,false);
}

get_param_tree_view().scroll_to_row(Gtk::TreePath(iter));
get_param_tree_view().get_selection()->select(iter);
}
}

void
LayerTree::set_model(Glib::RefPtr<LayerTreeStore> layer_tree_store)
{
Expand Down
2 changes: 2 additions & 0 deletions synfig-studio/src/gui/trees/layertree.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@ class LayerTree : public Gtk::Table
synfig::Layer::Handle get_selected_layer()const;
void clear_selected_layers();

void select_param(const synfigapp::ValueDesc& valuedesc);

}; // END of LayerTree

}; // END of namespace studio
Expand Down
10 changes: 10 additions & 0 deletions synfig-studio/src/gui/workarea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,7 @@ WorkArea::WorkArea(etl::loose_handle<synfigapp::CanvasInterface> canvas_interfac
insert_renderer(new Renderer_BoneSetup, 501);

signal_duck_selection_changed().connect(sigc::mem_fun(*this,&studio::WorkArea::queue_draw));
signal_duck_selection_single().connect(sigc::mem_fun(*this, &studio::WorkArea::on_duck_selection_single));
signal_strokes_changed().connect(sigc::mem_fun(*this,&studio::WorkArea::queue_draw));
signal_grid_changed().connect(sigc::mem_fun(*this,&studio::WorkArea::queue_draw));
signal_grid_changed().connect(sigc::mem_fun(*this,&studio::WorkArea::save_meta_data));
Expand Down Expand Up @@ -2512,6 +2513,15 @@ WorkArea::on_vruler_event(GdkEvent *event)
return false;
}

void
WorkArea::on_duck_selection_single(const etl::handle<Duck>& duck)
{
if(dragging == DRAG_NONE)
{
studio::LayerTree* tree_layer(dynamic_cast<studio::LayerTree*>(canvas_view->get_ext_widget("layers_cmp")));
tree_layer->select_param(duck->get_value_desc());
}
}

void
WorkArea::refresh_dimension_info()
Expand Down
1 change: 1 addition & 0 deletions synfig-studio/src/gui/workarea.h
Original file line number Diff line number Diff line change
Expand Up @@ -639,6 +639,7 @@ class WorkArea : public Gtk::Table, public Duckmatic
bool on_drawing_area_event(GdkEvent* event);
bool on_hruler_event(GdkEvent* event);
bool on_vruler_event(GdkEvent* event);
void on_duck_selection_single(const etl::handle<Duck>& duck_guid);

/*
-- ** -- S T A T I C P U B L I C M E T H O D S ---------------------------
Expand Down

0 comments on commit f82eb09

Please sign in to comment.