X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fstate_draw.cpp;h=79c478879b84d81677fc22081d3e5f5bdd07036f;hb=8d84ce1bd606706b14e876d61856644b9d5d3c20;hp=b8c90f325318f3dff6be7ae580ed06545f9ff3a4;hpb=7c7a0076ee45cffd2165eefe4ede81e4a631ac18;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/state_draw.cpp b/synfig-studio/trunk/src/gtkmm/state_draw.cpp index b8c90f3..79c4788 100644 --- a/synfig-studio/trunk/src/gtkmm/state_draw.cpp +++ b/synfig-studio/trunk/src/gtkmm/state_draw.cpp @@ -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 bline,bool loop_bline_flag,float radius); @@ -376,7 +377,7 @@ StateDraw_Context::increment_id() String str_number; str_number=String(id,id.size()-digits,id.size()); id=String(id,0,id.size()-digits); - synfig::info("---------------- \"%s\"",str_number.c_str()); + // synfig::info("---------------- \"%s\"",str_number.c_str()); number=atoi(str_number.c_str()); } @@ -409,8 +410,8 @@ StateDraw_Context::StateDraw_Context(CanvasView* canvas_view): checkbutton_auto_loop(_("Auto Loop")), checkbutton_auto_extend(_("Auto Extend")), checkbutton_auto_link(_("Auto Link")), - checkbutton_region(_("Create Region")), - checkbutton_outline(_("Create Outline")), + checkbutton_region(_("Create Region BLine")), + checkbutton_outline(_("Create Outline BLine")), checkbutton_auto_export(_("Auto Export")), button_fill_last_stroke(_("Fill Last Stroke")), adj_min_pressure(0,0,1,0.01,0.1), @@ -424,32 +425,30 @@ StateDraw_Context::StateDraw_Context(CanvasView* canvas_view): check_localerror(_("LocalError")) { - synfig::info("STATE SKETCH: entering state"); - nested=0; load_settings(); UpdateErrorBox(); - //options_table.attach(*manage(new Gtk::Label(_("Draw Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(entry_id, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_region, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_outline, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_auto_loop, 0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_auto_extend, 0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_auto_link, 0, 2, 6, 7, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_auto_export, 0, 2, 7, 8, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_pressure_width, 0, 2, 8, 9, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(check_localerror, 0, 2, 9, 10, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(*manage(new Gtk::Label(_("Draw Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(entry_id, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_outline, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_region, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_auto_loop, 0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_auto_extend, 0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_auto_link, 0, 2, 6, 7, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_auto_export, 0, 2, 7, 8, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_pressure_width, 0, 2, 8, 9, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(check_localerror, 0, 2, 9, 10, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(check_min_pressure, 0, 1, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(spin_min_pressure, 1, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(check_min_pressure, 0, 1, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(spin_min_pressure, 1, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(*manage(new Gtk::Label(_("Smooth"))), 0, 1, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(spin_globalthres, 1, 2, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(*manage(new Gtk::Label(_("Smooth"))), 0, 1, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(spin_globalthres, 1, 2, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(*manage(new Gtk::Label(_("Feather"))), 0, 1, 12, 13, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(spin_feather, 1, 2, 12, 13, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(*manage(new Gtk::Label(_("Feather"))), 0, 1, 12, 13, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(spin_feather, 1, 2, 12, 13, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); //options_table.attach(button_fill_last_stroke, 0, 2, 13, 14, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); @@ -715,14 +714,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 +753,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,11 +772,13 @@ StateDraw_Context::process_stroke(StrokeData stroke_data, WidthData width_data, Smach::event_result StateDraw_Context::new_bline(std::list 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")); - bool shift_offset = false; - Vector shift_offset_vector; + bool shift_origin = false; + Vector shift_origin_vector; bool join_start_no_extend=false,join_finish_no_extend=false; synfigapp::ValueDesc start_duck_value_desc,finish_duck_value_desc; bool extend_start=false,extend_finish=false,complete_loop=false; @@ -804,8 +814,8 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline (start_duck_index==0||start_duck_index==start_duck_value_node_bline->link_count()-1)) { extend_start=true; - shift_offset=true; - shift_offset_vector=start_duck->get_origin(); + shift_origin=true; + shift_origin_vector=start_duck->get_origin(); } }while(0); @@ -835,8 +845,8 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline complete_loop=extend_finish=true; }else{ extend_finish=true; - shift_offset=true; - shift_offset_vector=finish_duck->get_origin(); + shift_origin=true; + shift_origin_vector=finish_duck->get_origin(); } } }while(0); @@ -850,10 +860,10 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline start_duck_value_desc=synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(start_duck_value_desc.get_value_node()),0); // fall through case synfig::ValueBase::TYPE_VECTOR: - if (shift_offset && shift_offset_vector != start_duck->get_origin()) + if (shift_origin && shift_origin_vector != start_duck->get_origin()) break; - shift_offset = true; - shift_offset_vector = start_duck->get_origin(); + shift_origin = true; + shift_origin_vector = start_duck->get_origin(); get_canvas_interface()->auto_export(start_duck_value_desc); if (extend_finish) if(start_duck_value_node_bline&&start_duck_value_node_bline==finish_duck_value_node_bline) @@ -875,10 +885,10 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline finish_duck_value_desc=synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(finish_duck_value_desc.get_value_node()),0); // fall through case synfig::ValueBase::TYPE_VECTOR: - if (shift_offset && shift_offset_vector != finish_duck->get_origin()) + if (shift_origin && shift_origin_vector != finish_duck->get_origin()) break; - shift_offset = true; - shift_offset_vector = finish_duck->get_origin(); + shift_origin = true; + shift_origin_vector = finish_duck->get_origin(); get_canvas_interface()->auto_export(finish_duck_value_desc); if(extend_start) if(finish_duck_value_node_bline&&start_duck_value_node_bline==finish_duck_value_node_bline) @@ -916,14 +926,19 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline ) -new_vertex ); - if (shift_offset) - new_vertex=new_vertex-shift_offset_vector; + if (shift_origin) + new_vertex=new_vertex-shift_origin_vector; bline_point.set_vertex(new_vertex); trans_bline.push_back(bline_point); } value_node=ValueNode_BLine::create(synfig::ValueBase(trans_bline,loop_bline_flag)); + + Canvas::Handle canvas(get_canvas_view()->get_canvas()); + Layer::Handle layer(get_canvas_view()->get_selection_manager()->get_selected_layer()); + if (layer) canvas=layer->get_canvas(); + value_node->set_member_canvas(canvas); } Smach::event_result result; @@ -994,8 +1009,7 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline LinkableValueNode::Handle::cast_dynamic(value_node->list.back().value_node)-> set_link(0,finish_duck_value_desc.get_value_node()); - if(get_auto_export_flag()) { - printf("this is where we would export the new line\n"); + if(get_auto_export_flag()) if (!get_canvas_interface()->add_value_node(value_node,get_id())) { /* it's no big deal, is it? let's keep the shape anyway */ @@ -1004,7 +1018,6 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline // increment_id(); // return Smach::RESULT_ERROR; } - } last_stroke=value_node; last_stroke_id=get_id(); @@ -1025,7 +1038,7 @@ StateDraw_Context::new_bline(std::list 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(); @@ -1054,9 +1067,9 @@ StateDraw_Context::new_bline(std::list bline,bool loop_bline //layer->set_description(strprintf("Stroke %d",number)); //get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); - if (shift_offset) + if (shift_origin) get_canvas_interface()-> - change_value(synfigapp::ValueDesc(layer,"offset"),shift_offset_vector); + change_value(synfigapp::ValueDesc(layer,"origin"),shift_origin_vector); synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); @@ -1078,7 +1091,8 @@ StateDraw_Context::new_bline(std::list 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 +1947,7 @@ StateDraw_Context::reverse_bline(std::list &bline) } void -StateDraw_Context::fill_last_stroke() +StateDraw_Context::fill_last_stroke_and_unselect_other_layers() { if(!last_stroke) return; @@ -1982,3 +1996,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); +}