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