Author: Carlos Lopez <[email protected]>
Date:   Thu Jul 28 09:47:03 2011 +0200

Add new parameter 'DIList' (Dash Items List) to Advanced Outline Layer

---

 .../src/modules/mod_geometry/advanced_outline.cpp  |   73 +++++++++++++++++++-
 .../src/modules/mod_geometry/advanced_outline.h    |    2 +
 synfig-studio/src/synfigapp/canvasinterface.cpp    |    9 +++
 3 files changed, 83 insertions(+), 1 deletions(-)

diff --git a/synfig-core/src/modules/mod_geometry/advanced_outline.cpp 
b/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
index adbc4d8..a57b9e9 100644
--- a/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
+++ b/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
@@ -45,6 +45,7 @@
 
 #include <synfig/valuenode_bline.h>
 #include <synfig/valuenode_wplist.h>
+#include <synfig/valuenode_dilist.h>
 #include <synfig/valuenode_composite.h>
 
 #endif
@@ -104,6 +105,9 @@ Advanced_Outline::Advanced_Outline()
        wpoint_list[0].set_side_type_before(WidthPoint::TYPE_INTERPOLATE);
        wpoint_list[1].set_side_type_after(WidthPoint::TYPE_INTERPOLATE);
        wplist_=wpoint_list;
+       vector<DashItem> ditem_list;
+       ditem_list.push_back(DashItem());
+       dilist_=ditem_list;
        Layer::Vocab voc(get_param_vocab());
        Layer::fill_static(voc);
 }
@@ -518,6 +522,11 @@ Advanced_Outline::set_param(const String & param, const 
ValueBase &value)
                wplist_=value;
                return true;
        }
+       if(param=="dilist" && value.get_type()==ValueBase::TYPE_LIST)
+       {
+               dilist_=value;
+               return true;
+       }
        if(param=="vector_list")
                return false;
        return Layer_Polygon::set_param(param,value);
@@ -548,6 +557,7 @@ Advanced_Outline::get_param(const String& param)const
        EXPORT_AS(end_tip_,"end_tip");
        EXPORT_AS(width_, "width");
        EXPORT_AS(wplist_, "wplist");
+       EXPORT_AS(dilist_, "dilist");
        EXPORT_NAME();
        EXPORT_VERSION();
        if(param=="vector_list")
@@ -612,17 +622,24 @@ Advanced_Outline::get_param_vocab()const
                .set_origin("origin")
                .set_description(_("List of width Points that defines the 
variable width"))
        );
+       ret.push_back(ParamDesc("dilist")
+               .set_local_name(_("Dash Item List"))
+               .set_hint("dash")
+               .set_origin("origin")
+               .set_description(_("List of dash items that defines the dashed 
outline"))
+       );
        return ret;
 }
 
 bool
 Advanced_Outline::connect_dynamic_param(const String& param, 
etl::loose_handle<ValueNode> x)
 {
-       //synfig::info("attempting to connect %s", param.c_str());
        if(param=="bline")
        {
                if(!connect_bline_to_wplist(x))
                        synfig::warning("Advanced Outline: WPList doesn't 
accept new bline");
+               if(!connect_bline_to_dilist(x))
+                       synfig::warning("Advanced Outline: DIList doesn't 
accept new bline");
        }
        if(param=="wplist")
        {
@@ -644,6 +661,27 @@ Advanced_Outline::connect_dynamic_param(const String& 
param, etl::loose_handle<V
                else
                        return false;
        }
+       if(param=="dilist")
+       {
+               if(Layer::connect_dynamic_param(param, x))
+               {
+                       DynamicParamList::const_iterator 
iter(dynamic_param_list().find("bline"));
+                       if(iter==dynamic_param_list().end())
+                       {
+                               synfig::warning("BLine doesn't exist yet!!");
+                               return false;
+                       }
+                       else if(!connect_bline_to_dilist(iter->second))
+                       {
+                               synfig::warning("Advanced Outline: DIList 
doesn't accept new bline");
+                               return false;
+                       }
+                       return true;
+               }
+               else
+                       return false;
+       }
+
        return Layer::connect_dynamic_param(param, x);
 }
 
@@ -680,6 +718,39 @@ 
Advanced_Outline::connect_bline_to_wplist(etl::loose_handle<ValueNode> x)
        return true;
 }
 
+bool
+Advanced_Outline::connect_bline_to_dilist(etl::loose_handle<ValueNode> x)
+{
+       if(x->get_type() != ValueBase::TYPE_LIST)
+       {
+               synfig::info("Not a list");
+               return false;
+       }
+       if((*x)(Time(0)).get_list().front().get_type() != 
ValueBase::TYPE_BLINEPOINT)
+       {
+               synfig::info("No blinepoints!");
+               return false;
+       }
+       ValueNode::LooseHandle vnode;
+       DynamicParamList::const_iterator 
iter(dynamic_param_list().find("dilist"));
+       if(iter==dynamic_param_list().end())
+       {
+               synfig::warning("DIList doesn't exist yet");
+               return false;
+       }
+       ValueNode_DIList::Handle 
dilist(ValueNode_DIList::Handle::cast_dynamic(iter->second));
+       if(!dilist)
+       {
+               synfig::info("DIList is not ready: NULL");
+               return false;
+       }
+       if(!dilist->link_count())
+               synfig::warning("Advanced_Outline::connect_bline_to_dilist: 
DIList::link_count()=0");
+       dilist->set_bline(ValueNode::Handle(x));
+       synfig::info("success dlilist");
+       return true;
+}
+
 
 Real
 Advanced_Outline::bline_to_bezier(Real bline_pos, Real origin, Real 
bezier_size)
diff --git a/synfig-core/src/modules/mod_geometry/advanced_outline.h 
b/synfig-core/src/modules/mod_geometry/advanced_outline.h
index d4702f3..3543197 100644
--- a/synfig-core/src/modules/mod_geometry/advanced_outline.h
+++ b/synfig-core/src/modules/mod_geometry/advanced_outline.h
@@ -51,6 +51,7 @@ private:
 
        synfig::ValueBase bline_;
        synfig::ValueBase wplist_;
+       synfig::ValueBase dilist_;
        WidthPoint::SideType start_tip_;
        WidthPoint::SideType end_tip_;
        int cusp_type_;
@@ -81,6 +82,7 @@ public:
 private:
 
        bool connect_bline_to_wplist(etl::loose_handle<ValueNode> x);
+       bool connect_bline_to_dilist(etl::loose_handle<ValueNode> x);
        Real bline_to_bezier(Real bline_pos, Real origin, Real bezier_size);
        Real bezier_to_bline(Real bezier_pos, Real origin, Real bezier_size);
        void add_tip(std::vector<Point> &side_a, std::vector<Point> &side_b, 
const Point vertex, const Vector tangent, const WidthPoint wp);
diff --git a/synfig-studio/src/synfigapp/canvasinterface.cpp 
b/synfig-studio/src/synfigapp/canvasinterface.cpp
index 01947e9..6d76295 100644
--- a/synfig-studio/src/synfigapp/canvasinterface.cpp
+++ b/synfig-studio/src/synfigapp/canvasinterface.cpp
@@ -45,6 +45,7 @@
 #include <synfig/valuenode_stripes.h>
 #include <synfig/valuenode_bline.h>
 #include <synfig/valuenode_wplist.h>
+#include <synfig/valuenode_dilist.h>
 
 #include <synfig/waypoint.h>
 #include <synfig/loadcanvas.h>
@@ -269,6 +270,14 @@ CanvasInterface::add_layer_to(synfig::String name, 
synfig::Canvas::Handle canvas
                                                
value_node=LinkableValueNode::create("wplist",iter->second);
                                                
ValueNode_WPList::Handle::cast_dynamic(value_node)->set_member_canvas(canvas);
                                        }
+                                       for (iter2 = list.begin(); iter2 != 
list.end(); iter2++)
+                                               if (iter2->get_type() != 
ValueBase::TYPE_DASHITEM)
+                                                       break;
+                                       if (iter2 == list.end())
+                                       {
+                                               
value_node=LinkableValueNode::create("dilist",iter->second);
+                                               
ValueNode_DIList::Handle::cast_dynamic(value_node)->set_member_canvas(canvas);
+                                       }
                                }
                                // it has something else so just insert the 
dynamic list
                                if (!value_node)


------------------------------------------------------------------------------
Got Input?   Slashdot Needs You.
Take our quick survey online.  Come on, we don't ask for help often.
Plus, you'll get a chance to win $100 to spend on ThinkGeek.
http://p.sf.net/sfu/slashdot-survey
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to