X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fstate_bline.cpp;h=cee1d8d5ef1676778312504bf20630871503c212;hb=003520b8158176c1509825eef09f46cd417dcc16;hp=9211a076c7772d35dddf7d9da474a7d768a6cec6;hpb=c3ad95144d148602f672e95ddda1f18fc35502f8;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/state_bline.cpp b/synfig-studio/trunk/src/gtkmm/state_bline.cpp index 9211a07..cee1d8d 100644 --- a/synfig-studio/trunk/src/gtkmm/state_bline.cpp +++ b/synfig-studio/trunk/src/gtkmm/state_bline.cpp @@ -6,6 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 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 @@ -50,6 +51,8 @@ #include #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -61,6 +64,9 @@ using namespace studio; /* === M A C R O S ========================================================= */ +// if defined, show the first duck as green while drawing +#define DISTINGUISH_FIRST_DUCK + /* === G L O B A L S ======================================================= */ StateBLine studio::state_bline; @@ -111,8 +117,10 @@ class studio::StateBLine_Context : public sigc::trackable Gtk::Table options_table; Gtk::Entry entry_id; Gtk::CheckButton checkbutton_layer_region; - Gtk::CheckButton checkbutton_layer_bline; + Gtk::CheckButton checkbutton_layer_outline; Gtk::CheckButton checkbutton_layer_curve_gradient; + Gtk::CheckButton checkbutton_layer_plant; + Gtk::CheckButton checkbutton_layer_link_offsets; Gtk::CheckButton checkbutton_auto_export; Gtk::Button button_make; Gtk::Button button_clear; @@ -126,9 +134,10 @@ public: int layers_to_create()const { return - get_layer_region_flag()+ - get_layer_bline_flag()+ - get_layer_curve_gradient_flag(); + get_layer_region_flag() + + get_layer_outline_flag() + + get_layer_curve_gradient_flag() + + get_layer_plant_flag(); } void sanity_check() @@ -143,12 +152,18 @@ public: bool get_layer_region_flag()const { return checkbutton_layer_region.get_active(); } void set_layer_region_flag(bool x) { return checkbutton_layer_region.set_active(x); } - bool get_layer_bline_flag()const { return checkbutton_layer_bline.get_active(); } - void set_layer_bline_flag(bool x) { return checkbutton_layer_bline.set_active(x); } + bool get_layer_outline_flag()const { return checkbutton_layer_outline.get_active(); } + void set_layer_outline_flag(bool x) { return checkbutton_layer_outline.set_active(x); } bool get_layer_curve_gradient_flag()const { return checkbutton_layer_curve_gradient.get_active(); } void set_layer_curve_gradient_flag(bool x) { return checkbutton_layer_curve_gradient.set_active(x); } + bool get_layer_plant_flag()const { return checkbutton_layer_plant.get_active(); } + void set_layer_plant_flag(bool x) { return checkbutton_layer_plant.set_active(x); } + + bool get_layer_link_offsets_flag()const { return checkbutton_layer_link_offsets.get_active(); } + void set_layer_link_offsets_flag(bool x) { return checkbutton_layer_link_offsets.set_active(x); } + Real get_feather() const { return adj_feather.get_value(); } void set_feather(Real x) { return adj_feather.set_value(x); } synfig::String get_id()const { return entry_id.get_text(); } @@ -186,10 +201,10 @@ public: bool run_(); bool run(); - bool no_egress_on_selection_change; + bool egress_on_selection_change; Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/) { - if(!no_egress_on_selection_change) + if(egress_on_selection_change) throw Smach::egress_exception(); return Smach::RESULT_OK; } @@ -227,16 +242,26 @@ StateBLine_Context::load_settings() else set_layer_region_flag(true); - if(settings.get_value("bline.layer_bline",value) && value=="0") - set_layer_bline_flag(false); + if(settings.get_value("bline.layer_outline",value) && value=="0") + set_layer_outline_flag(false); else - set_layer_bline_flag(true); + set_layer_outline_flag(true); if(settings.get_value("bline.layer_curve_gradient",value) && value=="1") set_layer_curve_gradient_flag(true); else set_layer_curve_gradient_flag(false); + if(settings.get_value("bline.layer_plant",value) && value=="1") + set_layer_plant_flag(true); + else + set_layer_plant_flag(false); + + if(settings.get_value("bline.layer_link_offsets",value) && value=="0") + set_layer_link_offsets_flag(false); + else + set_layer_link_offsets_flag(true); + if(settings.get_value("bline.auto_export",value) && value=="1") set_auto_export_flag(true); else @@ -260,9 +285,11 @@ void StateBLine_Context::save_settings() { sanity_check(); - settings.set_value("bline.layer_bline",get_layer_bline_flag()?"1":"0"); + settings.set_value("bline.layer_outline",get_layer_outline_flag()?"1":"0"); settings.set_value("bline.layer_region",get_layer_region_flag()?"1":"0"); settings.set_value("bline.layer_curve_gradient",get_layer_curve_gradient_flag()?"1":"0"); + settings.set_value("bline.layer_plant",get_layer_plant_flag()?"1":"0"); + settings.set_value("bline.layer_link_offsets",get_layer_link_offsets_flag()?"1":"0"); settings.set_value("bline.auto_export",get_auto_export_flag()?"1":"0"); settings.set_value("bline.id",get_id().c_str()); settings.set_value("bline.feather",strprintf("%f",get_feather())); @@ -292,12 +319,15 @@ StateBLine_Context::increment_id() if(id[id.size()-1]<='9' && id[id.size()-1]>='0') { // figure out how many digits it is - for(digits=0;(int)id.size()-1>=digits && id[id.size()-1-digits]<='9' && id[id.size()-1-digits]>='0';digits++)while(false); + for (digits = 0; + (int)id.size()-1 >= digits && id[id.size()-1-digits] <= '9' && id[id.size()-1-digits] >= '0'; + digits++) + ; 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()); } @@ -324,13 +354,15 @@ StateBLine_Context::StateBLine_Context(CanvasView* canvas_view): canvas_view_(canvas_view), is_working(*canvas_view), loop_(false), - prev_workarea_layer_status_(get_work_area()->allow_layer_clicks), + prev_workarea_layer_status_(get_work_area()->get_allow_layer_clicks()), duckmatic_push(get_work_area()), settings(synfigapp::Main::get_selected_input_device()->settings()), entry_id(), checkbutton_layer_region(_("Fill")), - checkbutton_layer_bline(_("Outline")), + checkbutton_layer_outline(_("Outline")), checkbutton_layer_curve_gradient(_("Gradient")), + checkbutton_layer_plant(_("Plant")), + checkbutton_layer_link_offsets(_("Link Offsets")), checkbutton_auto_export(_("Auto Export")), button_make(_("Make")), button_clear(_("Clear")), @@ -338,18 +370,20 @@ StateBLine_Context::StateBLine_Context(CanvasView* canvas_view): spin_feather(adj_feather,0.01,4) { depth=-1; - no_egress_on_selection_change=false; + egress_on_selection_change=true; load_settings(); // Set up the tool options dialog //options_table.attach(*manage(new Gtk::Label(_("BLine 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_layer_region, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_layer_bline, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_layer_curve_gradient, 0, 2, 4, 5, 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_layer_outline, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_layer_region, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_layer_plant, 0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_layer_curve_gradient, 0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(checkbutton_layer_link_offsets, 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(*manage(new Gtk::Label(_("Feather"))), 0, 1, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(spin_feather, 1, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_auto_export, 0, 2, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); + options_table.attach(spin_feather, 1, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); //options_table.attach(button_make, 0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); //button_make.signal_pressed().connect(sigc::mem_fun(*this,&StateBLine_Context::run)); options_table.show_all(); @@ -357,7 +391,7 @@ StateBLine_Context::StateBLine_Context(CanvasView* canvas_view): App::dialog_tool_options->present(); // Turn off layer clicking - get_work_area()->allow_layer_clicks=false; + get_work_area()->set_allow_layer_clicks(false); // clear out the ducks get_work_area()->clear_ducks(); @@ -425,7 +459,7 @@ StateBLine_Context::~StateBLine_Context() get_canvas_view()->work_area->reset_cursor(); // Restore layer clicking - get_work_area()->allow_layer_clicks=prev_workarea_layer_status_; + get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_); // Enable the time bar get_canvas_view()->set_sensitive_timebar(true); @@ -444,7 +478,7 @@ StateBLine_Context::~StateBLine_Context() Smach::event_result StateBLine_Context::event_stop_handler(const Smach::event& /*x*/) { - synfig::info("STATE RotoBLine: Received Stop Event"); +// synfig::info("STATE RotoBLine: Received Stop Event"); // run(); reset(); // throw Smach::egress_exception(); @@ -455,7 +489,7 @@ StateBLine_Context::event_stop_handler(const Smach::event& /*x*/) Smach::event_result StateBLine_Context::event_refresh_handler(const Smach::event& /*x*/) { - synfig::info("STATE RotoBLine: Received Refresh Event"); +// synfig::info("STATE RotoBLine: Received Refresh Event"); refresh_ducks(); return Smach::RESULT_ACCEPT; } @@ -533,9 +567,11 @@ StateBLine_Context::run_() } ValueNode_BLine::Handle value_node_bline(ValueNode_BLine::create(new_list)); - assert(value_node_bline); + ValueNode_Const::Handle value_node_offset(ValueNode_Const::create(Vector())); + assert(value_node_offset); + // Set the looping flag value_node_bline->set_loop(loop_); @@ -567,138 +603,263 @@ StateBLine_Context::run_() if(!canvas) canvas=get_canvas_view()->get_canvas(); + value_node_bline->set_member_canvas(canvas); + synfigapp::SelectionManager::LayerList layer_selection; - // If we were asked to create a region layer, go ahead and do so - if(get_layer_region_flag()) + /////////////////////////////////////////////////////////////////////////// + // C U R V E G R A D I E N T + /////////////////////////////////////////////////////////////////////////// + + if(get_layer_curve_gradient_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); - Layer::Handle layer(get_canvas_interface()->add_layer_to("region",canvas,depth)); - layer_selection.push_back(layer); + Layer::Handle layer(get_canvas_interface()->add_layer_to("curve_gradient",canvas,depth)); assert(layer); - layer->set_description(get_id()+_(" Region")); + layer_selection.push_back(layer); + layer->set_description(get_id()+_(" Gradient")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); - if(get_feather()) { - layer->set_param("feather",get_feather()); - get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("bline"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); + group.cancel(); + throw String(_("Unable to create Gradient layer")); + return false; + } } - if(get_layer_bline_flag()) - layer->set_param("color",synfigapp::Main::get_background_color()); + if (get_layer_link_offsets_flag()) + { + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("offset"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_offset))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); + group.cancel(); + throw String(_("Unable to create Gradient layer")); + return false; + } + } + } - synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + /////////////////////////////////////////////////////////////////////////// + // P L A N T + /////////////////////////////////////////////////////////////////////////// - assert(action); + if(get_layer_plant_flag()) + { + synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); - action->set_param("canvas",get_canvas()); - action->set_param("canvas_interface",get_canvas_interface()); - action->set_param("layer",layer); - if(!action->set_param("param",String("bline"))) - synfig::error("LayerParamConnect didn't like \"param\""); - if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) - synfig::error("LayerParamConnect didn't like \"value_node\""); + Layer::Handle layer(get_canvas_interface()->add_layer_to("plant",canvas,depth)); + assert(layer); + layer_selection.push_back(layer); + layer->set_description(get_id()+_(" Plant")); + get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); - if(!get_canvas_interface()->get_instance()->perform_action(action)) { - //get_canvas_view()->get_ui_interface()->error(_("Unable to create Region layer")); - group.cancel(); - throw String(_("Unable to create Region layer")); - return false; + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("bline"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); + group.cancel(); + throw String(_("Unable to create Plant layer")); + return false; + } + } + + // plants don't have offsets? + if (get_layer_link_offsets_flag()) + { + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("offset"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_offset))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); + group.cancel(); + throw String(_("Unable to create Plant layer")); + return false; + } } } - // If we were asked to create a BLine layer, go ahead and do so - if(get_layer_bline_flag()) + /////////////////////////////////////////////////////////////////////////// + // R E G I O N + /////////////////////////////////////////////////////////////////////////// + + if(get_layer_region_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); - Layer::Handle layer(get_canvas_interface()->add_layer_to("outline",canvas,depth)); + Layer::Handle layer(get_canvas_interface()->add_layer_to("region",canvas,depth)); + assert(layer); layer_selection.push_back(layer); - layer->set_description(get_id()+_(" Outline")); + layer->set_description(get_id()+_(" Region")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); + if(get_feather()) { layer->set_param("feather",get_feather()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); } - assert(layer); - - - synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); - - assert(action); - - action->set_param("canvas",get_canvas()); - action->set_param("canvas_interface",get_canvas_interface()); - action->set_param("layer",layer); - if(!action->set_param("param",String("bline"))) - synfig::error("LayerParamConnect didn't like \"param\""); - if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) - synfig::error("LayerParamConnect didn't like \"value_node\""); + if(get_layer_outline_flag()) + layer->set_param("color",synfigapp::Main::get_background_color()); - if(!get_canvas_interface()->get_instance()->perform_action(action)) + // I don't know if it's safe to reuse the same layer_param_connect action, so I'm + // using 2 separate ones. { - //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); - group.cancel(); - throw String(_("Unable to create Outline layer")); - return false; + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("bline"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create Region layer")); + group.cancel(); + throw String(_("Unable to create Region layer")); + return false; + } } - /*if(get_layer_region_flag() && !get_auto_export_flag()) + if (get_layer_link_offsets_flag()) { - get_canvas_interface()->auto_export(synfigapp::ValueDesc(layer,"bline")); - }*/ + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("offset"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_offset))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create Region layer")); + group.cancel(); + throw String(_("Unable to create Region layer")); + return false; + } + } } + /////////////////////////////////////////////////////////////////////////// + // O U T L I N E + /////////////////////////////////////////////////////////////////////////// - - // If we were asked to create a CurveGradient layer, go ahead and do so - if(get_layer_curve_gradient_flag()) + if(get_layer_outline_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); - Layer::Handle layer(get_canvas_interface()->add_layer_to("curve_gradient",canvas,depth)); + Layer::Handle layer(get_canvas_interface()->add_layer_to("outline",canvas,depth)); + assert(layer); layer_selection.push_back(layer); - layer->set_description(get_id()+_(" Gradient")); + layer->set_description(get_id()+_(" Outline")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); + if(get_feather()) + { + layer->set_param("feather",get_feather()); + get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); + } - assert(layer); - - - synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); - - assert(action); - - action->set_param("canvas",get_canvas()); - action->set_param("canvas_interface",get_canvas_interface()); - action->set_param("layer",layer); - if(!action->set_param("param",String("bline"))) - synfig::error("LayerParamConnect didn't like \"param\""); - if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) - synfig::error("LayerParamConnect didn't like \"value_node\""); - - if(!get_canvas_interface()->get_instance()->perform_action(action)) { - //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); - group.cancel(); - throw String(_("Unable to create Gradient layer")); - return false; + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("bline"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_bline))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); + group.cancel(); + throw String(_("Unable to create Outline layer")); + return false; + } } - /*if(get_layer_region_flag() && !get_auto_export_flag()) + if (get_layer_link_offsets_flag()) { - get_canvas_interface()->auto_export(synfigapp::ValueDesc(layer,"bline")); - }*/ + synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect")); + assert(action); + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("layer",layer); + if(!action->set_param("param",String("offset"))) + synfig::error("LayerParamConnect didn't like \"param\""); + if(!action->set_param("value_node",ValueNode::Handle(value_node_offset))) + synfig::error("LayerParamConnect didn't like \"value_node\""); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to create BLine layer")); + group.cancel(); + throw String(_("Unable to create Outline layer")); + return false; + } + } } - no_egress_on_selection_change=true; + egress_on_selection_change=false; get_canvas_interface()->get_selection_manager()->clear_selected_layers(); get_canvas_interface()->get_selection_manager()->set_selected_layers(layer_selection); - no_egress_on_selection_change=false; + egress_on_selection_change=true; //if(finish_bline_dialog.get_region_flag() || finish_bline_dialog.get_bline_flag()) // get_canvas_interface()->signal_dirty_preview()(); @@ -750,7 +911,7 @@ StateBLine_Context::event_mouse_release_handler(const Smach::event& /*x*/) Smach::event_result StateBLine_Context::event_mouse_click_handler(const Smach::event& x) { - synfig::info("STATE BLINE: Received mouse button down Event"); + // synfig::info("STATE BLINE: Received mouse button down Event"); const EventMouse& event(*reinterpret_cast(&x)); switch(event.button) { @@ -798,8 +959,9 @@ StateBLine_Context::event_mouse_click_handler(const Smach::event& x) return Smach::RESULT_ACCEPT; } - case BUTTON_RIGHT: // Intercept the right-button click to short-circut the pop-up menu - return Smach::RESULT_ACCEPT; + case BUTTON_RIGHT: // Intercept the right-button click to short-circuit the pop-up menu + if (!getenv("SYNFIG_ENABLE_POPUP_MENU_IN_ALL_TOOLS")) + return Smach::RESULT_ACCEPT; default: return Smach::RESULT_OK; @@ -831,7 +993,12 @@ StateBLine_Context::refresh_ducks(bool button_down) // First add the duck associated with this vertex duck=new WorkArea::Duck(bline_point.get_vertex()); duck->set_editable(true); +#ifdef DISTINGUISH_FIRST_DUCK + if (iter!=bline_point_list.begin()) + duck->set_type(Duck::TYPE_VERTEX); +#else duck->set_type(Duck::TYPE_VERTEX); +#endif duck->set_name(strprintf("%x-vertex",value_node.get())); duck->signal_edited().connect( sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::on_vertex_change),value_node) @@ -839,7 +1006,7 @@ StateBLine_Context::refresh_ducks(bool button_down) duck->signal_user_click(2).connect( sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_vertex_menu),value_node) ); - duck->set_guid(value_node->get_guid()^GUID::hasher(0)); + duck->set_guid(value_node->get_guid()^synfig::GUID::hasher(0)); get_work_area()->add_duck(duck); @@ -850,7 +1017,7 @@ StateBLine_Context::refresh_ducks(bool button_down) tduck->set_origin(duck); tduck->set_scalar(-0.33333333333333333); tduck->set_tangent(true); - tduck->set_guid(value_node->get_guid()^GUID::hasher(3)); + tduck->set_guid(value_node->get_guid()^synfig::GUID::hasher(3)); tduck->signal_edited().connect( sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::on_tangent1_change),value_node) ); @@ -913,7 +1080,7 @@ StateBLine_Context::refresh_ducks(bool button_down) sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::on_tangent1_change),value_node) ); } - tduck->set_guid(value_node->get_guid()^GUID::hasher(4)); + tduck->set_guid(value_node->get_guid()^synfig::GUID::hasher(4)); tduck->signal_user_click(2).connect( sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),value_node) ); @@ -934,6 +1101,9 @@ StateBLine_Context::refresh_ducks(bool button_down) duck=new WorkArea::Duck(bline_point.get_vertex()); duck->set_editable(true); +#ifndef DISTINGUISH_FIRST_DUCK + duck->set_type(Duck::TYPE_VERTEX); +#endif duck->set_name(strprintf("%x-vertex",bline_point_list.front().get())); duck->signal_edited().connect( sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::on_vertex_change),bline_point_list.front()) @@ -977,12 +1147,12 @@ StateBLine_Context::refresh_ducks(bool button_down) if(bezier && !loop_) { duck=new WorkArea::Duck(bline_point.get_vertex()); - duck->set_editable(false); + duck->set_ignore(true); duck->set_name("temp"); // Add the tangent1 duck tduck=new WorkArea::Duck(Vector(0,0)); - tduck->set_editable(false); + tduck->set_ignore(true); tduck->set_name("ttemp"); tduck->set_origin(duck); tduck->set_scalar(-0.33333333333333333); @@ -995,8 +1165,8 @@ StateBLine_Context::refresh_ducks(bool button_down) //get_work_area()->add_duck(bezier->c2); get_work_area()->add_bezier(bezier); - duck->set_guid(GUID()); - tduck->set_guid(GUID()); + duck->set_guid(synfig::GUID()); + tduck->set_guid(synfig::GUID()); next_duck=duck; } @@ -1069,16 +1239,16 @@ StateBLine_Context::popup_vertex_menu(synfig::ValueNode_Const::Handle value_node if(loop_) { - menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Unloop BLine", + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unloop BLine"), sigc::mem_fun(*this,&studio::StateBLine_Context::unloop_bline) )); } else { - menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Loop BLine", + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Loop BLine"), sigc::mem_fun(*this,&studio::StateBLine_Context::loop_bline) )); } - menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Delete Vertex", + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Delete Vertex"), sigc::bind( sigc::mem_fun(*this,&studio::StateBLine_Context::bline_delete_vertex), value_node @@ -1093,7 +1263,7 @@ StateBLine_Context::popup_bezier_menu(float location, synfig::ValueNode_Const::H { menu.items().clear(); - menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Insert Vertex", + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Insert Vertex"), sigc::bind( sigc::bind( sigc::mem_fun(*this,&studio::StateBLine_Context::bline_insert_vertex), @@ -1114,36 +1284,29 @@ StateBLine_Context::bline_insert_vertex(synfig::ValueNode_Const::Handle value_no for(iter=bline_point_list.begin();iter!=bline_point_list.end();++iter) if(*iter==value_node) { - list::iterator prev(iter); - --prev; - BLinePoint bline_point; - BLinePoint next_bline_point((*iter)->get_value().get(BLinePoint())); BLinePoint prev_bline_point; - if(iter!=bline_point_list.begin()) - { - prev_bline_point=(*prev)->get_value().get(BLinePoint()); - } - else + list::iterator prev(iter); + if(iter==bline_point_list.begin()) { - prev_bline_point.set_vertex(Point(0,0)); - prev_bline_point.set_width(next_bline_point.get_width()); - prev_bline_point.set_origin(0.5); - prev_bline_point.set_split_tangent_flag(false); + assert(loop_); + prev = bline_point_list.end(); } + prev--; + + prev_bline_point=(*prev)->get_value().get(BLinePoint()); - etl::hermite curve(prev_bline_point.get_vertex(),next_bline_point.get_vertex(),prev_bline_point.get_tangent2(),next_bline_point.get_tangent1()); + etl::hermite curve(prev_bline_point.get_vertex(), + next_bline_point.get_vertex(), + prev_bline_point.get_tangent2(), + next_bline_point.get_tangent1()); etl::derivative< etl::hermite > deriv(curve); bline_point.set_vertex(curve(origin)); bline_point.set_width((next_bline_point.get_width()-prev_bline_point.get_width())*origin+prev_bline_point.get_width()); -#ifdef ETL_FIXED_DERIVATIVE bline_point.set_tangent1(deriv(origin)*std::min(1.0f-origin,origin)); -#else - bline_point.set_tangent1(-deriv(origin)*std::min(1.0f-origin,origin)); -#endif bline_point.set_tangent2(bline_point.get_tangent1()); bline_point.set_split_tangent_flag(false); bline_point.set_origin(origin); @@ -1162,7 +1325,7 @@ StateBLine_Context::bline_insert_vertex(synfig::ValueNode_Const::Handle value_no if(iter==bline_point_list.end()) { - get_canvas_view()->get_ui_interface()->error("Unable to find where to insert vertex, internal error, please report this bug"); + get_canvas_view()->get_ui_interface()->error(_("Unable to find where to insert vertex, internal error, please report this bug")); } refresh_ducks(false); @@ -1181,7 +1344,7 @@ StateBLine_Context::bline_delete_vertex(synfig::ValueNode_Const::Handle value_no } if(iter==bline_point_list.end()) { - get_canvas_view()->get_ui_interface()->error("Unable to remove vertex, internal error, please report this bug"); + get_canvas_view()->get_ui_interface()->error(_("Unable to remove vertex, internal error, please report this bug")); } refresh_ducks(false); @@ -1195,14 +1358,14 @@ StateBLine_Context::popup_handle_menu(synfig::ValueNode_Const::Handle value_node BLinePoint bline_point(value_node->get_value().get(BLinePoint())); if(bline_point.get_split_tangent_flag()) - menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Merge Tangents", + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Merge Tangents"), sigc::bind( sigc::mem_fun(*this,&studio::StateBLine_Context::bline_attach_handle), value_node ) )); else - menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Split Tangents", + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Split Tangents"), sigc::bind( sigc::mem_fun(*this,&studio::StateBLine_Context::bline_detach_handle), value_node