Add an "encapsulate" button to the layer dialog. Can someone design a better icon...
[synfig.git] / synfig-studio / trunk / src / gtkmm / state_draw.cpp
index b8c90f3..6122064 100644 (file)
@@ -115,6 +115,7 @@ class studio::StateDraw_Context : public sigc::trackable
        Duckmatic::Type old_duckmask;
 
        void fill_last_stroke();
+       void fill_last_stroke_and_unselect_other_layers();
 
        Smach::event_result new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline_flag,float radius);
 
@@ -715,14 +716,16 @@ StateDraw_Context::process_stroke(StrokeData stroke_data, WidthData width_data,
        }
 
        // If the start and end points are similar, then make them the same point
-       if(get_auto_loop_flag() &&
-          bline.size()>2&&(bline.front().get_vertex()-bline.back().get_vertex()).mag()<=radius)
+       if (get_auto_loop_flag() &&
+               bline.size() > 2 &&
+               (bline.front().get_vertex() - bline.back().get_vertex()).mag() <= radius)
        {
                loop_bline_flag=true;
                Vector tangent;
                Real width(0);
 
-               while(bline.size()>2&&(bline.front().get_vertex()-bline.back().get_vertex()).mag()<=radius)
+               while (bline.size() > 2 &&
+                          (bline.front().get_vertex() - bline.back().get_vertex()).mag() <= radius)
                {
                        tangent=bline.back().get_tangent1();
                        width=bline.back().get_width();
@@ -752,8 +755,15 @@ StateDraw_Context::process_stroke(StrokeData stroke_data, WidthData width_data,
        }
 
        // If the bline only has one blinepoint, then there is nothing to do.
-       if(bline.size()<=1)
+       if(bline.size() < 2)
+       {
+               // hide the 'stroke' line we were drawing, unless the user
+               // explicitly requests that they are kept
+               if (!getenv("SYNFIG_KEEP_ABORTED_DRAW_LINES"))
+                       refresh_ducks();
+
                return Smach::RESULT_OK;
+       }
 
        if(region_flag)
                return new_region(bline,radius);
@@ -764,6 +774,8 @@ StateDraw_Context::process_stroke(StrokeData stroke_data, WidthData width_data,
 Smach::event_result
 StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline_flag,float radius)
 {
+       synfigapp::SelectionManager::LayerList layer_list = get_canvas_view()->get_selection_manager()->get_selected_layers();
+
        // Create the action group
        synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Sketch BLine"));
 
@@ -1025,7 +1037,7 @@ StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline
 
                // fill_last_stroke() will take care of clearing the selection if we're calling it
                if(get_outline_flag() && get_region_flag())
-                       fill_last_stroke();
+                       fill_last_stroke_and_unselect_other_layers();
                else
                        get_canvas_interface()->get_selection_manager()->clear_selected_layers();
 
@@ -1078,7 +1090,8 @@ StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline
                        //refresh_ducks();
                        return Smach::RESULT_ERROR;
                }
-               get_canvas_view()->get_selection_manager()->set_selected_layer(layer);
+               layer_list.push_back(layer);
+               get_canvas_view()->get_selection_manager()->set_selected_layers(layer_list);
                //refresh_ducks();
        }
 
@@ -1933,7 +1946,7 @@ StateDraw_Context::reverse_bline(std::list<synfig::BLinePoint> &bline)
 }
 
 void
-StateDraw_Context::fill_last_stroke()
+StateDraw_Context::fill_last_stroke_and_unselect_other_layers()
 {
        if(!last_stroke)
                return;
@@ -1982,3 +1995,14 @@ StateDraw_Context::fill_last_stroke()
        }
        get_canvas_view()->get_selection_manager()->set_selected_layer(layer);
 }
+
+void
+StateDraw_Context::fill_last_stroke()
+{
+       if(!last_stroke)
+               return;
+
+       synfigapp::SelectionManager::LayerList layer_list = get_canvas_view()->get_selection_manager()->get_selected_layers();
+       fill_last_stroke_and_unselect_other_layers();
+       get_canvas_view()->get_selection_manager()->set_selected_layers(layer_list);
+}