Add Static option for Constant Value Nodes and the corresponding action to set and...
authorCarlos Lopez <genetita@gmail.com>
Thu, 19 Aug 2010 07:58:36 +0000 (09:58 +0200)
committerCarlos Lopez <genetita@gmail.com>
Thu, 19 Aug 2010 07:58:36 +0000 (09:58 +0200)
Pending:
Save and load static status.
Add static option actions for layer parameters.

synfig-core/src/synfig/value.cpp
synfig-core/src/synfig/value.h
synfig-core/src/synfig/valuenode_const.cpp
synfig-core/src/synfig/valuenode_const.h
synfig-studio/src/gui/trees/canvastreestore.cpp
synfig-studio/src/synfigapp/Makefile.am
synfig-studio/src/synfigapp/action.cpp
synfig-studio/src/synfigapp/actions/valuenodeconstsetstatic.cpp [new file with mode: 0644]
synfig-studio/src/synfigapp/actions/valuenodeconstsetstatic.h [new file with mode: 0644]
synfig-studio/src/synfigapp/actions/valuenodeconstunsetstatic.cpp [new file with mode: 0644]
synfig-studio/src/synfigapp/actions/valuenodeconstunsetstatic.h [new file with mode: 0644]

index fdc629b..5e5c333 100644 (file)
@@ -57,14 +57,15 @@ using namespace etl;
 
 /* === M E T H O D S ======================================================= */
 
-ValueBase::ValueBase():type(TYPE_NIL),data(0),ref_count(0),loop_(0)
+ValueBase::ValueBase():type(TYPE_NIL),data(0),ref_count(0),loop_(0),static_(0)
 {
 }
 
 ValueBase::ValueBase(Type x):
        type(x),
        data(0),
-       loop_(0)
+       loop_(0),
+       static_(0)
 {
        switch(type)
        {
index 1ff51c5..62fd04f 100644 (file)
@@ -123,6 +123,8 @@ protected:
        etl::reference_counter ref_count;
        //! For Values with loop option like TYPE_LIST
        bool loop_;
+       //! For Values of Constant Value Nodes or Layer parameters
+       bool static_;
 
        /*
  --    ** -- C O N S T R U C T O R S -----------------------------------
@@ -135,8 +137,8 @@ public:
 
        //! Template constructor for any type
        template <typename T>
-       ValueBase(const T &x, bool loop_=false):
-               type(TYPE_NIL),data(0),ref_count(0),loop_(loop_)
+       ValueBase(const T &x, bool loop_=false, bool static_=false):
+               type(TYPE_NIL),data(0),ref_count(0),loop_(loop_), static_(static_)
                { set(x); }
 
        //! Copy constructor. The data is not copied, just the type.
@@ -184,6 +186,12 @@ public:
        //! Sets the loop option.
        void set_loop(bool x) { loop_=x; }
 
+       //! Gets the static option.
+       bool get_static()const { return static_; }
+
+       //! Sets the static option.
+       void set_static(bool x) { static_=x; }
+
        //! True if the Value is not valid or is type LIST and is empty
        bool empty()const;
 
index 89ecae7..69caae5 100644 (file)
@@ -118,13 +118,13 @@ ValueNode_Const::set_value(const ValueBase &data)
 String
 ValueNode_Const::get_name()const
 {
-       return "constant";
+       return get_static()?"static":"constant";
 }
 
 String
 ValueNode_Const::get_local_name()const
 {
-       return _("Constant");
+       return get_static()?_("Static"):_("Constant");
 }
 
 void ValueNode_Const::get_times_vfunc(Node::time_set &/*set*/) const
index 08a4559..a97bbde 100644 (file)
@@ -56,7 +56,8 @@ public:
        ValueBase &get_value();
        void set_value(const ValueBase &data);
 
-
+       bool get_static()const {return get_value().get_static();}
+       void set_static(bool x) { get_value().set_static(x); }
        virtual String get_name()const;
        virtual String get_local_name()const;
 
index 33bf9a7..0f89783 100644 (file)
@@ -193,6 +193,7 @@ CanvasTreeStore::get_value_vfunc(const Gtk::TreeModel::iterator& iter, int colum
        if(column==model.type.index())
        {
                synfigapp::ValueDesc value_desc((*iter)[model.value_desc]);
+               String stype, lname;
 
                Glib::Value<Glib::ustring> x;
                g_value_init(x.gobj(),x.value_type());
@@ -205,16 +206,20 @@ CanvasTreeStore::get_value_vfunc(const Gtk::TreeModel::iterator& iter, int colum
                }
                else
                {
-                       if(!value_desc.is_value_node() || value_desc.get_value_node()->get_name()=="constant")
-                       {
-                               x.set(ValueBase::type_local_name(value_desc.get_value_type()));
-                       }
-                       else
-                       {
-                               x.set(value_desc.get_value_node()->get_local_name());
-                       }
+                       stype=ValueBase::type_local_name(value_desc.get_value_type());
+                       if(value_desc.get_value_node())
+                               {
+                                       lname=value_desc.get_value_node()->get_name();
+                                       if (lname=="animated" || lname=="static")
+                                               stype+=" (" + value_desc.get_value_node()->get_local_name() + ")";
+                               }
+                       else if(value_desc.parent_is_layer_param())
+                               {
+                                       if(value_desc.get_value().get_static())
+                                               stype+=_(" (Static)");
+                               }
                }
-
+               x.set(stype.c_str());
                g_value_init(value.gobj(),x.value_type());
                g_value_copy(x.gobj(),value.gobj());
        }
index 887205e..8ad4090 100644 (file)
@@ -58,6 +58,8 @@ VALUEDESC_ACTION_CC = \
 VALUENODE_ACTION_HH = \
        actions/valuenodeadd.h \
        actions/valuenodeconstset.h \
+       actions/valuenodeconstsetstatic.h\
+       actions/valuenodeconstunsetstatic.h\
        actions/valuenodedynamiclistinsert.h \
        actions/valuenodedynamiclistinsertsmart.h \
        actions/valuenodedynamiclistloop.h \
@@ -74,6 +76,8 @@ VALUENODE_ACTION_HH = \
 VALUENODE_ACTION_CC = \
        actions/valuenodeadd.cpp \
        actions/valuenodeconstset.cpp \
+       actions/valuenodeconstsetstatic.cpp\
+       actions/valuenodeconstunsetstatic.cpp\
        actions/valuenodedynamiclistinsert.cpp \
        actions/valuenodedynamiclistinsertsmart.cpp \
        actions/valuenodedynamiclistloop.cpp \
index 7a98252..0e3647a 100644 (file)
@@ -48,6 +48,8 @@
 #include "actions/layersetdesc.h"
 
 #include "actions/valuenodeconstset.h"
+#include "actions/valuenodeconstsetstatic.h"
+#include "actions/valuenodeconstunsetstatic.h"
 #include "actions/valuenodeadd.h"
 #include "actions/valuenodereplace.h"
 #include "actions/valuenodelinkconnect.h"
@@ -168,6 +170,8 @@ Action::Main::Main()
        ADD_ACTION(Action::LayerSetDesc);
 
        ADD_ACTION(Action::ValueNodeConstSet);
+       ADD_ACTION(Action::ValueNodeConstSetStatic);
+       ADD_ACTION(Action::ValueNodeConstUnSetStatic);
        ADD_ACTION(Action::ValueNodeAdd);
        ADD_ACTION(Action::ValueNodeReplace);
        ADD_ACTION(Action::ValueNodeLinkConnect);
diff --git a/synfig-studio/src/synfigapp/actions/valuenodeconstsetstatic.cpp b/synfig-studio/src/synfigapp/actions/valuenodeconstsetstatic.cpp
new file mode 100644 (file)
index 0000000..d7c6d6a
--- /dev/null
@@ -0,0 +1,169 @@
+/* === S Y N F I G ========================================================= */
+/*!    \file valuenodeconstsetstatic.cpp
+**     \brief Template File
+**
+**     $Id$
+**
+**     \legal
+**     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2010 Carlos López
+**
+**     This package is free software; you can redistribute it and/or
+**     modify it under the terms of the GNU General Public License as
+**     published by the Free Software Foundation; either version 2 of
+**     the License, or (at your option) any later version.
+**
+**     This package is distributed in the hope that it will be useful,
+**     but WITHOUT ANY WARRANTY; without even the implied warranty of
+**     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+**     General Public License for more details.
+**     \endlegal
+*/
+/* ========================================================================= */
+
+/* === H E A D E R S ======================================================= */
+
+#ifdef USING_PCH
+#      include "pch.h"
+#else
+#ifdef HAVE_CONFIG_H
+#      include <config.h>
+#endif
+
+#include "valuenodeconstsetstatic.h"
+#include <synfigapp/canvasinterface.h>
+
+#include <synfigapp/general.h>
+
+#endif
+
+using namespace std;
+using namespace etl;
+using namespace synfig;
+using namespace synfigapp;
+using namespace Action;
+
+/* === M A C R O S ========================================================= */
+
+ACTION_INIT(Action::ValueNodeConstSetStatic);
+ACTION_SET_NAME(Action::ValueNodeConstSetStatic,"ValueNodeConstSetStatic");
+ACTION_SET_LOCAL_NAME(Action::ValueNodeConstSetStatic,N_("Set Static"));
+ACTION_SET_TASK(Action::ValueNodeConstSetStatic,"setstatic");
+ACTION_SET_CATEGORY(Action::ValueNodeConstSetStatic,Action::CATEGORY_VALUEDESC|Action::CATEGORY_VALUENODE);
+ACTION_SET_PRIORITY(Action::ValueNodeConstSetStatic,0);
+ACTION_SET_VERSION(Action::ValueNodeConstSetStatic,"0.0");
+ACTION_SET_CVS_ID(Action::ValueNodeConstSetStatic,"$Id$");
+
+/* === G L O B A L S ======================================================= */
+
+/* === P R O C E D U R E S ================================================= */
+
+/* === M E T H O D S ======================================================= */
+
+Action::ValueNodeConstSetStatic::ValueNodeConstSetStatic()
+{
+}
+
+Action::ParamVocab
+Action::ValueNodeConstSetStatic::get_param_vocab()
+{
+       ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
+
+       ret.push_back(ParamDesc("value_node",Param::TYPE_VALUENODE)
+               .set_local_name(_("ValueNode"))
+       );
+
+       return ret;
+}
+
+bool
+Action::ValueNodeConstSetStatic::is_candidate(const ParamList &x)
+{
+       if (!candidate_check(get_param_vocab(),x))
+               return false;
+
+       ValueNode::Handle value_node;
+       ValueDesc value_desc(x.find("value_desc")->second.get_value_desc());
+
+       if(value_desc.parent_is_value_node())
+               value_node = value_desc.get_parent_value_node();
+       else
+               value_node = x.find("value_node")->second.get_value_node();
+
+       // We need a constant value node or a constant layer param.
+       return (
+                       (ValueNode_Const::Handle::cast_dynamic(value_node) &&
+                       // We need the constant value node to be not static.
+                       !ValueNode_Const::Handle::cast_dynamic(value_node)->get_static())
+                       );
+}
+
+bool
+Action::ValueNodeConstSetStatic::set_param(const synfig::String& name, const Action::Param &param)
+{
+       if(!value_node && name=="value_desc" && param.get_type()==Param::TYPE_VALUEDESC)
+       {
+               ValueDesc value_desc(param.get_value_desc());
+               if(!value_desc.parent_is_value_node())
+                       return false;
+
+               value_node=ValueNode_Const::Handle::cast_dynamic(value_desc.get_parent_value_node());
+
+               if(!value_node)
+                       return false;
+
+               return true;
+       }
+
+       if(!value_node && name=="value_node" && param.get_type()==Param::TYPE_VALUENODE)
+       {
+               value_node=ValueNode_Const::Handle::cast_dynamic(param.get_value_node());
+
+               if(!value_node)
+                       return false;
+
+               return true;
+       }
+
+       return Action::CanvasSpecific::set_param(name,param);
+}
+
+bool
+Action::ValueNodeConstSetStatic::is_ready()const
+{
+       if(!value_node)
+               return false;
+       return Action::CanvasSpecific::is_ready();
+}
+
+void
+Action::ValueNodeConstSetStatic::perform()
+{
+       old_static_value=value_node->get_static();
+
+       if(old_static_value==true)
+       {
+               set_dirty(false);
+               return;
+       }
+       set_dirty(true);
+       value_node->set_static(true);
+
+       value_node->changed();
+}
+
+void
+Action::ValueNodeConstSetStatic::undo()
+{
+       if(old_static_value==value_node->get_static())
+       {
+               set_dirty(false);
+               return;
+       }
+
+       set_dirty(true);
+       value_node->set_static(old_static_value);
+
+       value_node->changed();
+
+}
diff --git a/synfig-studio/src/synfigapp/actions/valuenodeconstsetstatic.h b/synfig-studio/src/synfigapp/actions/valuenodeconstsetstatic.h
new file mode 100644 (file)
index 0000000..f8aad32
--- /dev/null
@@ -0,0 +1,77 @@
+/* === S Y N F I G ========================================================= */
+/*!    \file valuenodeconstsetstatic.h
+**     \brief Template File
+**
+**     $Id$
+**
+**     \legal
+**     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2010 Carlos López
+**
+**     This package is free software; you can redistribute it and/or
+**     modify it under the terms of the GNU General Public License as
+**     published by the Free Software Foundation; either version 2 of
+**     the License, or (at your option) any later version.
+**
+**     This package is distributed in the hope that it will be useful,
+**     but WITHOUT ANY WARRANTY; without even the implied warranty of
+**     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+**     General Public License for more details.
+**     \endlegal
+*/
+/* ========================================================================= */
+
+/* === S T A R T =========================================================== */
+
+#ifndef __SYNFIG_APP_ACTION_VALUENODECONSTSETSTATIC_H
+#define __SYNFIG_APP_ACTION_VALUENODECONSTSETSTATIC_H
+
+/* === H E A D E R S ======================================================= */
+
+#include <synfigapp/action.h>
+#include <synfig/valuenode_const.h>
+
+/* === M A C R O S ========================================================= */
+
+/* === T Y P E D E F S ===================================================== */
+
+/* === C L A S S E S & S T R U C T S ======================================= */
+
+namespace synfigapp {
+
+class Instance;
+
+namespace Action {
+
+class ValueNodeConstSetStatic :
+       public Undoable,
+       public CanvasSpecific
+{
+private:
+
+       synfig::ValueNode_Const::Handle value_node;
+       bool old_static_value;
+
+
+public:
+
+       ValueNodeConstSetStatic();
+
+       static ParamVocab get_param_vocab();
+       static bool is_candidate(const ParamList &x);
+
+       virtual bool set_param(const synfig::String& name, const Param &);
+       virtual bool is_ready()const;
+
+       virtual void perform();
+       virtual void undo();
+
+       ACTION_MODULE_EXT
+};
+
+}; // END of namespace action
+}; // END of namespace studio
+
+/* === E N D =============================================================== */
+
+#endif
diff --git a/synfig-studio/src/synfigapp/actions/valuenodeconstunsetstatic.cpp b/synfig-studio/src/synfigapp/actions/valuenodeconstunsetstatic.cpp
new file mode 100644 (file)
index 0000000..c94bff1
--- /dev/null
@@ -0,0 +1,169 @@
+/* === S Y N F I G ========================================================= */
+/*!    \file valuenodeconstunsetstatic.cpp
+**     \brief Template File
+**
+**     $Id$
+**
+**     \legal
+**     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2010 Carlos López
+**
+**     This package is free software; you can redistribute it and/or
+**     modify it under the terms of the GNU General Public License as
+**     published by the Free Software Foundation; either version 2 of
+**     the License, or (at your option) any later version.
+**
+**     This package is distributed in the hope that it will be useful,
+**     but WITHOUT ANY WARRANTY; without even the implied warranty of
+**     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+**     General Public License for more details.
+**     \endlegal
+*/
+/* ========================================================================= */
+
+/* === H E A D E R S ======================================================= */
+
+#ifdef USING_PCH
+#      include "pch.h"
+#else
+#ifdef HAVE_CONFIG_H
+#      include <config.h>
+#endif
+
+#include "valuenodeconstunsetstatic.h"
+#include <synfigapp/canvasinterface.h>
+
+#include <synfigapp/general.h>
+
+#endif
+
+using namespace std;
+using namespace etl;
+using namespace synfig;
+using namespace synfigapp;
+using namespace Action;
+
+/* === M A C R O S ========================================================= */
+
+ACTION_INIT(Action::ValueNodeConstUnSetStatic);
+ACTION_SET_NAME(Action::ValueNodeConstUnSetStatic,"ValueNodeConstUnSetStatic");
+ACTION_SET_LOCAL_NAME(Action::ValueNodeConstUnSetStatic,N_("UnSet Static"));
+ACTION_SET_TASK(Action::ValueNodeConstUnSetStatic,"unsetstatic");
+ACTION_SET_CATEGORY(Action::ValueNodeConstUnSetStatic,Action::CATEGORY_VALUEDESC|Action::CATEGORY_VALUENODE);
+ACTION_SET_PRIORITY(Action::ValueNodeConstUnSetStatic,0);
+ACTION_SET_VERSION(Action::ValueNodeConstUnSetStatic,"0.0");
+ACTION_SET_CVS_ID(Action::ValueNodeConstUnSetStatic,"$Id$");
+
+/* === G L O B A L S ======================================================= */
+
+/* === P R O C E D U R E S ================================================= */
+
+/* === M E T H O D S ======================================================= */
+
+Action::ValueNodeConstUnSetStatic::ValueNodeConstUnSetStatic()
+{
+}
+
+Action::ParamVocab
+Action::ValueNodeConstUnSetStatic::get_param_vocab()
+{
+       ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
+
+       ret.push_back(ParamDesc("value_node",Param::TYPE_VALUENODE)
+               .set_local_name(_("ValueNode"))
+       );
+
+       return ret;
+}
+
+bool
+Action::ValueNodeConstUnSetStatic::is_candidate(const ParamList &x)
+{
+       if (!candidate_check(get_param_vocab(),x))
+               return false;
+
+       ValueNode::Handle value_node;
+       ValueDesc value_desc(x.find("value_desc")->second.get_value_desc());
+
+       if(value_desc.parent_is_value_node())
+               value_node = value_desc.get_parent_value_node();
+       else
+               value_node = x.find("value_node")->second.get_value_node();
+
+       // We need a constant value node or a constant layer param.
+       return (
+                       (ValueNode_Const::Handle::cast_dynamic(value_node) &&
+                       // We need the constant value node to be static.
+                       ValueNode_Const::Handle::cast_dynamic(value_node)->get_static())
+                       );
+}
+
+bool
+Action::ValueNodeConstUnSetStatic::set_param(const synfig::String& name, const Action::Param &param)
+{
+       if(!value_node && name=="value_desc" && param.get_type()==Param::TYPE_VALUEDESC)
+       {
+               ValueDesc value_desc(param.get_value_desc());
+               if(!value_desc.parent_is_value_node())
+                       return false;
+
+               value_node=ValueNode_Const::Handle::cast_dynamic(value_desc.get_parent_value_node());
+
+               if(!value_node)
+                       return false;
+
+               return true;
+       }
+
+       if(!value_node && name=="value_node" && param.get_type()==Param::TYPE_VALUENODE)
+       {
+               value_node=ValueNode_Const::Handle::cast_dynamic(param.get_value_node());
+
+               if(!value_node)
+                       return false;
+
+               return true;
+       }
+
+       return Action::CanvasSpecific::set_param(name,param);
+}
+
+bool
+Action::ValueNodeConstUnSetStatic::is_ready()const
+{
+       if(!value_node)
+               return false;
+       return Action::CanvasSpecific::is_ready();
+}
+
+void
+Action::ValueNodeConstUnSetStatic::perform()
+{
+       old_static_value=value_node->get_static();
+
+       if(old_static_value==false)
+       {
+               set_dirty(false);
+               return;
+       }
+       set_dirty(true);
+       value_node->set_static(false);
+
+       value_node->changed();
+}
+
+void
+Action::ValueNodeConstUnSetStatic::undo()
+{
+       if(old_static_value==value_node->get_static())
+       {
+               set_dirty(false);
+               return;
+       }
+
+       set_dirty(true);
+       value_node->set_static(old_static_value);
+
+       value_node->changed();
+
+}
diff --git a/synfig-studio/src/synfigapp/actions/valuenodeconstunsetstatic.h b/synfig-studio/src/synfigapp/actions/valuenodeconstunsetstatic.h
new file mode 100644 (file)
index 0000000..a7af967
--- /dev/null
@@ -0,0 +1,77 @@
+/* === S Y N F I G ========================================================= */
+/*!    \file valuenodeconstunsetstatic.h
+**     \brief Template File
+**
+**     $Id$
+**
+**     \legal
+**     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2010 Carlos López
+**
+**     This package is free software; you can redistribute it and/or
+**     modify it under the terms of the GNU General Public License as
+**     published by the Free Software Foundation; either version 2 of
+**     the License, or (at your option) any later version.
+**
+**     This package is distributed in the hope that it will be useful,
+**     but WITHOUT ANY WARRANTY; without even the implied warranty of
+**     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+**     General Public License for more details.
+**     \endlegal
+*/
+/* ========================================================================= */
+
+/* === S T A R T =========================================================== */
+
+#ifndef __SYNFIG_APP_ACTION_VALUENODECONSTUNSETSTATIC_H
+#define __SYNFIG_APP_ACTION_VALUENODECONSTUNSETSTATIC_H
+
+/* === H E A D E R S ======================================================= */
+
+#include <synfigapp/action.h>
+#include <synfig/valuenode_const.h>
+
+/* === M A C R O S ========================================================= */
+
+/* === T Y P E D E F S ===================================================== */
+
+/* === C L A S S E S & S T R U C T S ======================================= */
+
+namespace synfigapp {
+
+class Instance;
+
+namespace Action {
+
+class ValueNodeConstUnSetStatic :
+       public Undoable,
+       public CanvasSpecific
+{
+private:
+
+       synfig::ValueNode_Const::Handle value_node;
+       bool old_static_value;
+
+
+public:
+
+       ValueNodeConstUnSetStatic();
+
+       static ParamVocab get_param_vocab();
+       static bool is_candidate(const ParamList &x);
+
+       virtual bool set_param(const synfig::String& name, const Param &);
+       virtual bool is_ready()const;
+
+       virtual void perform();
+       virtual void undo();
+
+       ACTION_MODULE_EXT
+};
+
+}; // END of namespace action
+}; // END of namespace studio
+
+/* === E N D =============================================================== */
+
+#endif