/* === S Y N F I G ========================================================= */
/*! \file valuenode_dynamiclist.cpp
-** \brief Template File
+** \brief Implementation of the "Dynamic List" valuenode conversion.
**
-** $Id: valuenode_dynamiclist.cpp,v 1.1.1.1 2005/01/04 01:23:15 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2008 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
ActivepointList::const_iterator prev_iter;
bool state(true);
- // New "symetric" state mechanism
+ // New "symmetric" state mechanism
if(!timing_info.empty())
{
if(timing_info.size()==1)
if(value_node)
{
remove_child(value_node.get());
- if(get_parent_canvas())
- get_parent_canvas()->signal_value_node_child_removed()(this,value_node);
- else if(get_root_canvas() && get_parent_canvas())
+ // changed to fix bug 1420091 - it seems that when a .sif file containing a bline layer encapsulated inside
+ // another layer, get_parent_canvas() is false and get_root_canvas() is true, but when we come to erase a
+ // vertex, both are true. So the signal is sent to the parent, but the signal wasn't sent to the parent
+ // when it was added. This probably isn't the right fix, but it seems to work for now. Note that the same
+ // strange "if (X) else if (Y && X)" code is also present in the two previous functions, above.
+
+ // if(get_parent_canvas())
+ // get_parent_canvas()->signal_value_node_child_removed()(this,value_node);
+ // else if(get_root_canvas() && get_parent_canvas())
+ // get_root_canvas()->signal_value_node_child_removed()(this,value_node);
+ if(get_root_canvas())
get_root_canvas()->signal_value_node_child_removed()(this,value_node);
}
break;
ValueNode_DynamicList* value_node(new ValueNode_DynamicList(value_list.front().get_type()));
+ // when creating a list of vectors, start it off being looped.
+ // I think the only time this is used if for creating polygons,
+ // and we want them to be looped by default
+ if (value_node->get_contained_type() == ValueBase::TYPE_VECTOR)
+ value_node->set_loop(true);
+
for(iter=value_list.begin();iter!=value_list.end();++iter)
{
ValueNode::Handle item(ValueNode_Const::create(*iter));
ValueNode_DynamicList::set_link_vfunc(int i,ValueNode::Handle x)
{
assert(i>=0);
+
if((unsigned)i>=list.size())
return false;
if(x->get_type()!=container_type)
ValueNode_DynamicList::get_link_vfunc(int i)const
{
assert(i>=0);
+
if((unsigned)i>=list.size())
return 0;
return list[i].value_node;
String
ValueNode_DynamicList::link_local_name(int i)const
{
- assert(i>=0 && (unsigned)i<list.size());
+ assert(i>=0 && i<link_count());
+
return etl::strprintf(_("Item %03d"),i+1);
}
return type==ValueBase::TYPE_LIST;
}
+void
+ValueNode_DynamicList::set_member_canvas(etl::loose_handle<Canvas> canvas)
+{
+ for (vector<ListEntry>::iterator iter = list.begin(); iter != list.end(); iter++)
+ iter->value_node->set_parent_canvas(canvas);
+}
+
ValueBase::Type
ValueNode_DynamicList::get_contained_type()const
{
LinkableValueNode*
ValueNode_DynamicList::create_new()const
{
- assert(0);
- return 0;
+ return new ValueNode_DynamicList(container_type);
}
int