void Layer_Switch::apply_z_range_to_params(ContextParams &cp)const { Layer::Handle layer = get_current_layer(); if (layer) { cp.z_range=true; cp.z_range_position=layer->get_depth(); cp.z_range_depth=0; cp.z_range_blur=0; return; } cp.z_range=true; cp.z_range_position=0; cp.z_range_depth=-1; cp.z_range_blur=0; }
void Layer_Switch::apply_z_range_to_params(ContextParams &cp)const { if (optimized()) return; // z_range already applied while optimizxation Layer::Handle layer = get_current_layer(); if (layer) { cp.z_range=true; cp.z_range_position=layer->get_depth(); cp.z_range_depth=0; cp.z_range_blur=0; return; } cp.z_range=true; cp.z_range_position=0; cp.z_range_depth=-1; cp.z_range_blur=0; }
void StateText_Context::make_text(const Point& _point) { if (get_layer_text_flag()) { synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("New Text")); synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); Layer::Handle layer; Canvas::Handle canvas(get_canvas_view()->get_canvas()); int depth(0); // we are temporarily using the layer to hold something layer=get_canvas_view()->get_selection_manager()->get_selected_layer(); if(layer) { depth=layer->get_depth(); canvas=layer->get_canvas(); } synfigapp::SelectionManager::LayerList layer_selection; if (!getenv("SYNFIG_TOOLS_CLEAR_SELECTION")) layer_selection = get_canvas_view()->get_selection_manager()->get_selected_layers(); const synfig::TransformStack& transform(get_work_area()->get_curr_transform_stack()); const Point point(transform.unperform(_point)); String text; if (get_paragraph_flag()) App::dialog_paragraph(_("Text Paragraph"), _("Enter text here:"), text); else App::dialog_entry(_("Input text"), _("Text: "), text, _("Cancel"), _("Ok")); egress_on_selection_change=false; layer=get_canvas_interface()->add_layer_to("text",canvas,depth); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer,"blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_param("origin",point); get_canvas_interface()->signal_layer_param_changed()(layer,"origin"); layer->set_param("text",text); get_canvas_interface()->signal_layer_param_changed()(layer,"text"); layer->set_param("size",get_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"size"); layer->set_param("orient",get_orientation()); get_canvas_interface()->signal_layer_param_changed()(layer,"orient"); layer->set_param("family",get_family()); get_canvas_interface()->signal_layer_param_changed()(layer,"family"); layer->set_description(get_id()); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); 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); egress_on_selection_change=true; reset(); increment_id(); } }
void StatePolygon_Context::run() { if(polygon_point_list.empty()) return; if(polygon_point_list.size()<3) { get_canvas_view()->get_ui_interface()->error("You need at least 3 points to create a polygon"); return; } synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("New Polygon")); Layer::Handle layer; Canvas::Handle canvas; int depth(0); // we are temporarily using the layer to hold something layer=get_canvas_view()->get_selection_manager()->get_selected_layer(); if(layer) { depth=layer->get_depth(); canvas=layer->get_canvas(); } synfigapp::SelectionManager::LayerList layer_selection; if (!getenv("SYNFIG_TOOLS_CLEAR_SELECTION")) layer_selection = get_canvas_view()->get_selection_manager()->get_selected_layers(); const synfig::TransformStack& transform(get_work_area()->get_curr_transform_stack()); std::vector<BLinePoint> new_list; std::list<synfig::Point>::iterator iter; int i; for(i=0,iter=polygon_point_list.begin();iter!=polygon_point_list.end();++iter,++i) { *iter = transform.unperform(*iter); new_list.push_back(*(new BLinePoint)); new_list[i].set_width(1); new_list[i].set_vertex(*iter); new_list[i].set_tangent(Point(0,0)); } ValueNode_BLine::Handle value_node_bline(ValueNode_BLine::create(new_list)); assert(value_node_bline); ValueNode::Handle value_node_origin(ValueNode_Const::create(Vector())); assert(value_node_origin); // Set the looping flag value_node_bline->set_loop(true); if(!canvas) canvas=get_canvas_view()->get_canvas(); value_node_bline->set_member_canvas(canvas); // count how many layers we're going to be creating int layers_to_create = this->layers_to_create(); /////////////////////////////////////////////////////////////////////////// // P O L Y G O N /////////////////////////////////////////////////////////////////////////// if (get_layer_polygon_flag()) { egress_on_selection_change=false; layer=get_canvas_interface()->add_layer_to("polygon",canvas,depth); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); if(get_feather_size()) { layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); } layer->set_description(get_id()); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->disconnect_dynamic_param("vector_list"); if(!layer->set_param("vector_list",ValueBase::List(polygon_point_list.begin(), polygon_point_list.end()))) { group.cancel(); get_canvas_view()->get_ui_interface()->error("Unable to set layer parameter"); return; } { synfigapp::Action::Handle action(synfigapp::Action::create("ValueDescConvert")); synfigapp::ValueDesc value_desc(layer,"vector_list"); action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",get_canvas_interface()); action->set_param("value_desc",value_desc); action->set_param("type","dynamic_list"); action->set_param("time",get_canvas_interface()->get_time()); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); get_canvas_view()->get_ui_interface()->error("Unable to execute action \"ValueDescConvert\""); return; } } // only link the polygon's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) 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 Polygon layer")); group.cancel(); throw String(_("Unable to create Polygon layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // 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); egress_on_selection_change=false; Layer::Handle layer(get_canvas_interface()->add_layer_to("curve_gradient",canvas,depth)); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Gradient")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method",get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer,"blend_method"); layer->set_param("amount",get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer,"amount"); layer->set_param("width",get_bline_width()); get_canvas_interface()->signal_layer_param_changed()(layer,"width"); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Gradient layer")); return; } } // only link the curve gradient's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Gradient layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // P L A N T /////////////////////////////////////////////////////////////////////////// if(get_layer_plant_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); egress_on_selection_change=false; Layer::Handle layer(get_canvas_interface()->add_layer_to("plant",canvas,depth)); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Plant")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method",get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer,"blend_method"); layer->set_param("amount",get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer,"amount"); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Plant layer")); return; } } // only link the plant's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Plant layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // R E G I O N /////////////////////////////////////////////////////////////////////////// if(get_layer_region_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); egress_on_selection_change=false; Layer::Handle layer(get_canvas_interface()->add_layer_to("region",canvas,depth)); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Region")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method",get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer,"blend_method"); layer->set_param("amount",get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer,"amount"); layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); // I don't know if it's safe to reuse the same LayerParamConnect action, so I'm // using 2 separate ones. { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Region layer")); return; } } // only link the region's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Region layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // O U T L I N E /////////////////////////////////////////////////////////////////////////// if (get_layer_outline_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); egress_on_selection_change=false; Layer::Handle layer(get_canvas_interface()->add_layer_to("outline",canvas,depth)); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Outline")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method",get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer,"blend_method"); layer->set_param("amount",get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer,"amount"); layer->set_param("width",get_bline_width()); get_canvas_interface()->signal_layer_param_changed()(layer,"width"); layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Outline layer")); return; } } // only link the outline's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Outline layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // A D V A N C E D O U T L I N E /////////////////////////////////////////////////////////////////////////// if (get_layer_advanced_outline_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); egress_on_selection_change=false; Layer::Handle layer(get_canvas_interface()->add_layer_to("advanced_outline",canvas,depth)); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Advanced Outline")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method",get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer,"blend_method"); layer->set_param("amount",get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer,"amount"); layer->set_param("width",get_bline_width()); get_canvas_interface()->signal_layer_param_changed()(layer,"width"); layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Advanced Outline layer")); return; } } // only link the advanced outline's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Advanced Outline layer")); return; } } } 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); egress_on_selection_change=true; //post clean up stuff... reset(); increment_id(); }
void StateGradient_Context::make_gradient(const Point& _p1, const Point& _p2) { synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("New Gradient")); synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); Layer::Handle layer; Canvas::Handle canvas(get_canvas_view()->get_canvas()); int depth(0); // we are temporarily using the layer to hold something layer=get_canvas_view()->get_selection_manager()->get_selected_layer(); if(layer) { depth=layer->get_depth(); canvas=layer->get_canvas(); } const synfig::TransformStack& transform(get_work_area()->get_curr_transform_stack()); const Point p1(transform.unperform(_p1)); const Point p2(transform.unperform(_p2)); if (get_layer_linear_gradient_flag()) { egress_on_selection_change=false; layer=get_canvas_interface()->add_layer_to("linear_gradient",canvas,depth); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer->set_param("p1",p1); get_canvas_interface()->signal_layer_param_changed()(layer,"p1"); layer->set_param("p2",p2); get_canvas_interface()->signal_layer_param_changed()(layer,"p2"); } else if (get_layer_radial_gradient_flag()) { egress_on_selection_change=false; layer=get_canvas_interface()->add_layer_to("radial_gradient",canvas,depth); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer->set_param("center",p1); get_canvas_interface()->signal_layer_param_changed()(layer,"center"); layer->set_param("radius",(p2-p1).mag()); get_canvas_interface()->signal_layer_param_changed()(layer,"radius"); } else if (get_layer_conical_gradient_flag()) { egress_on_selection_change=false; layer=get_canvas_interface()->add_layer_to("conical_gradient",canvas,depth); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer->set_param("center",p1); get_canvas_interface()->signal_layer_param_changed()(layer,"center"); { Vector diff(p2-p1); layer->set_param("angle",Angle::tan(diff[1],diff[0])); get_canvas_interface()->signal_layer_param_changed()(layer,"angle"); } } else if (get_layer_spiral_gradient_flag()) { egress_on_selection_change=false; layer=get_canvas_interface()->add_layer_to("spiral_gradient",canvas,depth); egress_on_selection_change=true; if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer->set_param("center",p1); get_canvas_interface()->signal_layer_param_changed()(layer,"center"); layer->set_param("radius",(p2-p1).mag()); get_canvas_interface()->signal_layer_param_changed()(layer,"radius"); { Vector diff(p2-p1); layer->set_param("angle",Angle::tan(diff[1],diff[0])); get_canvas_interface()->signal_layer_param_changed()(layer,"angle"); } } else return; layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_description(get_id()); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); egress_on_selection_change=false; synfigapp::SelectionManager::LayerList layer_selection; if (!getenv("SYNFIG_TOOLS_CLEAR_SELECTION")) layer_selection = get_canvas_view()->get_selection_manager()->get_selected_layers(); get_canvas_interface()->get_selection_manager()->clear_selected_layers(); layer_selection.push_back(layer); get_canvas_interface()->get_selection_manager()->set_selected_layers(layer_selection); egress_on_selection_change=true; reset(); increment_id(); }
void StateRectangle_Context::make_rectangle(const Point& _p1, const Point& _p2) { synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("New Rectangle")); synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); Layer::Handle layer; Canvas::Handle canvas; int depth(0); // we are temporarily using the layer to hold something layer=get_canvas_view()->get_selection_manager()->get_selected_layer(); if(layer) { depth=layer->get_depth(); canvas=layer->get_canvas(); } synfigapp::SelectionManager::LayerList layer_selection; if (!getenv("SYNFIG_TOOLS_CLEAR_SELECTION")) layer_selection = get_canvas_view()->get_selection_manager()->get_selected_layers(); const synfig::TransformStack& transform(get_work_area()->get_curr_transform_stack()); const Point p1(transform.unperform(_p1)); const Point p2(transform.unperform(_p2)); Real x_min, x_max, y_min, y_max; if (p1[0] < p2[0]) { x_min = p1[0]; x_max = p2[0]; } else { x_min = p2[0]; x_max = p1[0]; } if (p1[1] < p2[1]) { y_min = p1[1]; y_max = p2[1]; } else { y_min = p2[1]; y_max = p1[1]; } x_min -= get_expand_size(); x_max += get_expand_size(); y_min -= get_expand_size(); y_max += get_expand_size(); std::vector<BLinePoint> new_list; for (int i = 0; i < 4; i++) { new_list.push_back(*(new BLinePoint)); new_list[i].set_width(1); new_list[i].set_vertex(Point((i==0||i==3)?x_min:x_max, (i==0||i==1)?y_min:y_max)); new_list[i].set_tangent(Point(0,0)); } ValueNode_BLine::Handle value_node_bline(ValueNode_BLine::create(new_list)); assert(value_node_bline); ValueNode::Handle value_node_origin(ValueNode_Const::create(Vector())); assert(value_node_origin); // Set the looping flag value_node_bline->set_loop(true); if(!canvas) canvas=get_canvas_view()->get_canvas(); value_node_bline->set_member_canvas(canvas); // count how many layers we're going to be creating int layers_to_create = this->layers_to_create(); /////////////////////////////////////////////////////////////////////////// // R E C T A N G L E /////////////////////////////////////////////////////////////////////////// if (get_layer_rectangle_flag()) { layer=get_canvas_interface()->add_layer_to("rectangle",canvas,depth); if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_param("point1",p1); get_canvas_interface()->signal_layer_param_changed()(layer,"point1"); layer->set_param("point2",p2); get_canvas_interface()->signal_layer_param_changed()(layer,"point2"); layer->set_param("expand",get_expand_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"expand"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_description(get_id()); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); } /////////////////////////////////////////////////////////////////////////// // 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("curve_gradient",canvas,depth)); if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_param("width",get_bline_width()); get_canvas_interface()->signal_layer_param_changed()(layer,"width"); layer->set_description(get_id()+_(" Gradient")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Gradient layer")); return; } } // only link the curve gradient's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Gradient layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // P L A N T /////////////////////////////////////////////////////////////////////////// if(get_layer_plant_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); Layer::Handle layer(get_canvas_interface()->add_layer_to("plant",canvas,depth)); if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_description(get_id()+_(" Plant")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Plant layer")); return; } } // only link the plant's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Plant layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // 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("region",canvas,depth)); if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_description(get_id()+_(" Region")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); // I don't know if it's safe to reuse the same LayerParamConnect action, so I'm // using 2 separate ones. { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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; } } // only link the region's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) 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; } } } /////////////////////////////////////////////////////////////////////////// // O U T L I N E /////////////////////////////////////////////////////////////////////////// if (get_layer_outline_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); Layer::Handle layer(get_canvas_interface()->add_layer_to("outline",canvas,depth)); if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Outline")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_param("width",get_bline_width()); get_canvas_interface()->signal_layer_param_changed()(layer,"width"); layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Outline layer")); return; } } // only link the outline's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Outline layer")); return; } } } /////////////////////////////////////////////////////////////////////////// // A D V A N C E D O U T L I N E /////////////////////////////////////////////////////////////////////////// if (get_layer_advanced_outline_flag()) { synfigapp::PushMode push_mode(get_canvas_interface(),synfigapp::MODE_NORMAL); Layer::Handle layer(get_canvas_interface()->add_layer_to("advanced_outline",canvas,depth)); if (!layer) { get_canvas_view()->get_ui_interface()->error(_("Unable to create layer")); group.cancel(); return; } layer_selection.push_back(layer); layer->set_description(get_id()+_(" Advanced Outline")); get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description()); layer->set_param("blend_method", get_blend()); get_canvas_interface()->signal_layer_param_changed()(layer, "blend_method"); layer->set_param("amount", get_opacity()); get_canvas_interface()->signal_layer_param_changed()(layer, "amount"); layer->set_param("width",get_bline_width()); get_canvas_interface()->signal_layer_param_changed()(layer,"width"); layer->set_param("feather",get_feather_size()); get_canvas_interface()->signal_layer_param_changed()(layer,"feather"); layer->set_param("invert",get_invert()); get_canvas_interface()->signal_layer_param_changed()(layer,"invert"); { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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)) { group.cancel(); throw String(_("Unable to create Advanced Outline layer")); return; } } // only link the outline's origin parameter if the option is selected and we're creating more than one layer if (get_layer_link_origins_flag() && layers_to_create > 1) { synfigapp::Action::Handle action(synfigapp::Action::create("LayerParamConnect")); 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("origin"))) synfig::error("LayerParamConnect didn't like \"param\""); if(!action->set_param("value_node",ValueNode::Handle(value_node_origin))) synfig::error("LayerParamConnect didn't like \"value_node\""); if(!get_canvas_interface()->get_instance()->perform_action(action)) { group.cancel(); throw String(_("Unable to create Advanced Outline layer")); return; } } } 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); egress_on_selection_change=true; //post clean up stuff... reset(); increment_id(); }