+ Smach::event_result result;
+ synfig::ValueNode_DynamicList::ListEntry source;
+
+ // the new line's start extends an existing line
+ if(extend_start)
+ {
+ int target_offset = 0;
+ if(complete_loop)trans_bline.pop_back();
+ trans_bline.pop_front();
+ if(start_duck_index==0)
+ { // We need to reverse the BLine first.
+ reverse_bline(trans_bline);
+ result=extend_bline_from_begin(start_duck_value_node_bline,trans_bline,complete_loop);
+ source=start_duck_value_node_bline->list.front();
+ target_offset=trans_bline.size();
+ }
+ else
+ {
+ result=extend_bline_from_end(start_duck_value_node_bline,trans_bline,complete_loop);
+ source=start_duck_value_node_bline->list.back();
+ }
+
+ if(extend_start_join_different)
+ LinkableValueNode::Handle::cast_dynamic(source.value_node)->
+ set_link(0,finish_duck_value_desc.get_value_node());
+ else if(extend_start_join_same)
+ LinkableValueNode::Handle::cast_dynamic(source.value_node)->
+ set_link(0,synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(start_duck_value_node_bline->
+ list[target_offset+finish_duck_index].value_node),0).get_value_node());
+ return result;
+ }
+
+ // the new line's end extends an existing line
+ if(extend_finish)
+ {
+ int target_offset = 0;
+ trans_bline.pop_back();
+ if(finish_duck_index==0)
+ {
+ result=extend_bline_from_begin(finish_duck_value_node_bline,trans_bline,false);
+ source=finish_duck_value_node_bline->list.front();
+ target_offset=trans_bline.size();
+ }
+ else
+ { // We need to reverse the BLine first.
+ reverse_bline(trans_bline);
+ result=extend_bline_from_end(finish_duck_value_node_bline,trans_bline,false);
+ source=finish_duck_value_node_bline->list.back();
+ }
+
+ if(extend_finish_join_different)
+ LinkableValueNode::Handle::cast_dynamic(source.value_node)->
+ set_link(0,start_duck_value_desc.get_value_node());
+ else if(extend_finish_join_same)
+ LinkableValueNode::Handle::cast_dynamic(source.value_node)->
+ set_link(0,synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(finish_duck_value_node_bline->
+ list[target_offset+start_duck_index].value_node),0).get_value_node());
+ return result;
+ }
+