Author: Konstantin Dmitriev <[email protected]>
Date:   Thu Jan 10 20:23:51 2013 +0700

Enable reverse manipulations for Integer ValueNode (Real and Angle control 
points)

---

 synfig-core/src/synfig/valuenode_integer.cpp       |   27 +++++++++++++++----
 synfig-core/src/synfig/valuenode_integer.h         |    4 +++
 .../src/synfigapp/actions/valuedescset.cpp         |   25 ++++++++++++++++++
 synfig-studio/src/synfigapp/instance.cpp           |    2 +
 4 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/synfig-core/src/synfig/valuenode_integer.cpp 
b/synfig-core/src/synfig/valuenode_integer.cpp
index 2f22e13..25ab291 100644
--- a/synfig-core/src/synfig/valuenode_integer.cpp
+++ b/synfig-core/src/synfig/valuenode_integer.cpp
@@ -8,6 +8,7 @@
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
 **  Copyright (c) 2011 Carlos López
+**  Copyright (c) 2013 Konstantin Dmitriev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -65,16 +66,16 @@ ValueNode_Integer::ValueNode_Integer(const ValueBase &x):
        switch(x.get_type())
        {
        case ValueBase::TYPE_ANGLE:
-               set_link("integer", 
ValueNode_Const::create(round_to_int(Angle::deg(x.get(Angle())).get())));
+               set_link("link", 
ValueNode_Const::create(round_to_int(Angle::deg(x.get(Angle())).get())));
                break;
        case ValueBase::TYPE_BOOL:
-               set_link("integer", 
ValueNode_Const::create(int(x.get(bool()))));
+               set_link("link", ValueNode_Const::create(int(x.get(bool()))));
                break;
        case ValueBase::TYPE_REAL:
-               set_link("integer", 
ValueNode_Const::create(round_to_int(x.get(Real()))));
+               set_link("link", 
ValueNode_Const::create(round_to_int(x.get(Real()))));
                break;
        case ValueBase::TYPE_TIME:
-               set_link("integer", 
ValueNode_Const::create(round_to_int(x.get(Time()))));
+               set_link("link", 
ValueNode_Const::create(round_to_int(x.get(Time()))));
                break;
        default:
                assert(0);
@@ -145,6 +146,20 @@ ValueNode_Integer::operator()(Time t)const
        }
 }
 
+ValueBase
+synfig::ValueNode_Integer::get_inverse(Time t, const synfig::Real 
&target_value) const
+{
+       return (int)target_value;
+}
+
+synfig::ValueBase
+synfig::ValueNode_Integer::get_inverse(Time t, const synfig::Angle 
&target_value) const
+{
+       return (int)Angle::deg(target_value).get();
+}
+
+
+
 String
 ValueNode_Integer::get_name()const
 {
@@ -175,8 +190,8 @@ ValueNode_Integer::get_children_vocab_vfunc()const
 
        LinkableValueNode::Vocab ret;
 
-       ret.push_back(ParamDesc(ValueBase(),"integer")
-               .set_local_name(_("Integer"))
+       ret.push_back(ParamDesc(ValueBase(),"link")
+               .set_local_name(_("Link"))
                .set_description(_("The integer value to be converted"))
        );
 
diff --git a/synfig-core/src/synfig/valuenode_integer.h 
b/synfig-core/src/synfig/valuenode_integer.h
index b36aff7..753b766 100644
--- a/synfig-core/src/synfig/valuenode_integer.h
+++ b/synfig-core/src/synfig/valuenode_integer.h
@@ -55,6 +55,10 @@ public:
        virtual String get_name()const;
        virtual String get_local_name()const;
 
+       //! Returns the modified Link to match the target value at time t
+       ValueBase get_inverse(Time t, const synfig::Real &target_value) const;
+       ValueBase get_inverse(Time t, const synfig::Angle &target_value) const;
+
        virtual ValueNode::LooseHandle get_link_vfunc(int i)const;
 
 protected:
diff --git a/synfig-studio/src/synfigapp/actions/valuedescset.cpp 
b/synfig-studio/src/synfigapp/actions/valuedescset.cpp
index 8d22e17..044969f 100644
--- a/synfig-studio/src/synfigapp/actions/valuedescset.cpp
+++ b/synfig-studio/src/synfigapp/actions/valuedescset.cpp
@@ -8,6 +8,7 @@
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
 **  Copyright (c) 2011 Carlos López
+**  Copyright (c) 2013 Konstantin Dmitriev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -48,6 +49,7 @@
 #include <synfig/valuenode_range.h>
 #include <synfig/valuenode_reference.h>
 #include <synfig/valuenode_scale.h>
+#include <synfig/valuenode_integer.h>
 #include <synfigapp/main.h>
 
 #include <synfigapp/general.h>
@@ -376,6 +378,29 @@ Action::ValueDescSet::prepare()
                add_action(action);
                return;
        }
+       // Integer: integer values only
+       if (ValueNode_Integer::Handle integer_value_node = 
ValueNode_Integer::Handle::cast_dynamic(value_desc.get_value_node()))
+       {
+               ValueBase new_value;
+               if (value.get_type() == ValueBase::TYPE_ANGLE)
+                       new_value = integer_value_node->get_inverse(time, 
value.get(Angle()));
+               else if(value.get_type() == ValueBase::TYPE_REAL)
+                       new_value = integer_value_node->get_inverse(time, 
value.get(Real()));
+               else
+                       throw Error(_("Inverse manipulation of %s scale values 
not implemented in core."), value.type_name().c_str());
+               Action::Handle action(Action::create("ValueDescSet"));
+               if(!action)
+                       throw Error(_("Unable to find action ValueDescSet 
(bug)"));
+               action->set_param("canvas",get_canvas());
+               action->set_param("canvas_interface",get_canvas_interface());
+               action->set_param("time",time);
+               action->set_param("new_value",new_value);
+               
action->set_param("value_desc",ValueDesc(integer_value_node,integer_value_node->get_link_index_from_name("link")));
+               if(!action->is_ready())
+                       throw Error(Error::TYPE_NOTREADY);
+               add_action(action);
+               return;
+       }
        // BlineCalcWidth: modify the scale value node
        // so that the target width is achieved
        if (ValueNode_BLineCalcWidth::Handle bline_width = 
ValueNode_BLineCalcWidth::Handle::cast_dynamic(value_desc.get_value_node()))
diff --git a/synfig-studio/src/synfigapp/instance.cpp 
b/synfig-studio/src/synfigapp/instance.cpp
index f92f860..8c28cc8 100644
--- a/synfig-studio/src/synfigapp/instance.cpp
+++ b/synfig-studio/src/synfigapp/instance.cpp
@@ -46,6 +46,7 @@
 #include <synfig/valuenode_wplist.h>
 #include <synfig/valuenode_scale.h>
 #include <synfig/valuenode_range.h>
+#include <synfig/valuenode_integer.h>
 #include <map>
 
 #include "general.h"
@@ -80,6 +81,7 @@ synfigapp::is_editable(synfig::ValueNode::Handle value_node)
                || ValueNode_BLineCalcWidth::Handle::cast_dynamic(value_node)
                || ValueNode_Scale::Handle::cast_dynamic(value_node)
                || ValueNode_Range::Handle::cast_dynamic(value_node)
+               || ValueNode_Integer::Handle::cast_dynamic(value_node)
        )
                return true;
        return false;


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to