X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fcanvasview.cpp;h=3154ae48580fa0fc17dc210a97c4d391b243562a;hb=0d5d578cc0c1a680c4fe39e4ea8317e267311f12;hp=2c4815867d5860abc33da37b99ea07efb4fd0c3b;hpb=071939c9c44d0080e0843381adc19a6600f0fd69;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/canvasview.cpp b/synfig-studio/trunk/src/gtkmm/canvasview.cpp index 2c48158..3154ae4 100644 --- a/synfig-studio/trunk/src/gtkmm/canvasview.cpp +++ b/synfig-studio/trunk/src/gtkmm/canvasview.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -1239,6 +1240,14 @@ CanvasView::init_menus() sigc::mem_fun(*work_area,&studio::WorkArea::select_all_ducks) ); + action_group->add( Gtk::Action::create("unselect-all-ducks", _("Unselect All Ducks")), + sigc::mem_fun(*work_area,&studio::WorkArea::unselect_all_ducks) + ); + + action_group->add( Gtk::Action::create("select-all-layers", _("Select All Layers")), + sigc::mem_fun(*this,&CanvasView::on_select_layers) + ); + action_group->add( Gtk::Action::create("unselect-all-layers", _("Unselect All Layers")), sigc::mem_fun(*this,&CanvasView::on_unselect_layers) ); @@ -1519,6 +1528,8 @@ CanvasView::init_menus() // editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-paste"),NOT_IMPLEMENTED_SLOT)); // editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); // editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Ducks"),Gtk::AccelKey('E',Gdk::CONTROL_MASK),sigc::mem_fun(*work_area,&studio::WorkArea::select_all_ducks))); +// editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unselect All Ducks"),Gtk::AccelKey('E',Gdk::CONTROL_MASK),sigc::mem_fun(*work_area,&studio::WorkArea::unselect_all_ducks))); +// editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Layers"),Gtk::AccelKey('A',Gdk::CONTROL_MASK),sigc::mem_fun(*this,&CanvasView::on_select_layers))); // editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unselect All Layers"),Gtk::AccelKey('D',Gdk::CONTROL_MASK),sigc::mem_fun(*this,&CanvasView::on_unselect_layers))); // editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); // @@ -1718,6 +1729,14 @@ CanvasView::init_menus() } void +CanvasView::on_select_layers() +{ + Canvas::Handle canvas(get_canvas()); + for (CanvasBase::iterator iter = canvas->begin(); iter != canvas->end(); iter++) + layer_tree->select_all_children_layers(*iter); +} + +void CanvasView::on_unselect_layers() { layer_tree->clear_selected_layers(); @@ -1961,6 +1980,18 @@ CanvasView::refresh_rend_desc() } //clamp time to big bounds... + if(time_window_adjustment().get_value() < begin_time) + { + time_window_adjustment().set_value(begin_time); + time_window_adjustment().value_changed(); + } + + if(time_window_adjustment().get_value() + time_window_adjustment().get_page_size() > end_time) + { + time_window_adjustment().set_value(end_time - time_window_adjustment().get_page_size()); + time_window_adjustment().value_changed(); + } + if(time_adjustment().get_value() < begin_time) { time_adjustment().set_value(begin_time); @@ -2142,7 +2173,7 @@ CanvasView::build_tables() void CanvasView::on_layer_toggle(synfig::Layer::Handle layer) { - synfigapp::Action::Handle action(synfigapp::Action::create("layer_activate")); + synfigapp::Action::Handle action(synfigapp::Action::create("LayerActivate")); assert(action); if(!action) @@ -2586,16 +2617,47 @@ CanvasView::duck_change_param(const synfig::Point &value,synfig::Layer::Handle l bool CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc) { - switch(value_desc.get_value_type()) + if (ValueNode_BLineCalcWidth::Handle bline_width = ValueNode_BLineCalcWidth::Handle::cast_dynamic(value_desc.get_value_node())) { - case ValueBase::TYPE_REAL: - return canvas_interface()->change_value(value_desc,value.mag()); - break; - case ValueBase::TYPE_ANGLE: - return canvas_interface()->change_value(value_desc,Angle::tan(value[1],value[0])); - break; - case ValueBase::TYPE_VECTOR: - if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node())) + Real old_width((*bline_width)(get_time()).get(Real())); + Real new_width(value.mag()); + int scale_index(bline_width->get_link_index_from_name("scale")); + Real scale((*(bline_width->get_link(scale_index)))(get_time()).get(Real())); + return canvas_interface()->change_value(synfigapp::ValueDesc(bline_width,scale_index), new_width * scale / old_width); + } + + if (ValueNode_BLineCalcVertex::Handle bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node())) + { + ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline"))); + Real radius = 0.0; + Real amount = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop()); + return canvas_interface()->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount); + } + + if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node())) + { + switch(value_desc.get_value_type()) + { + case ValueBase::TYPE_REAL: + { + Real old_length = (*bline_tangent)(get_time()).get(Real()); + Real new_length = value.mag(); + int scale_index(bline_tangent->get_link_index_from_name("scale")); + int fixed_length_index(bline_tangent->get_link_index_from_name("fixed_length")); + Real scale((*(bline_tangent->get_link(scale_index)))(get_time()).get(Real())); + bool fixed_length((*(bline_tangent->get_link(fixed_length_index)))(get_time()).get(bool())); + if (fixed_length) + return canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length); + if (old_length == 0) + return true; + return canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length * scale / old_length); + } + + case ValueBase::TYPE_ANGLE: + assert(0); // doesn't happen? + break; + + case ValueBase::TYPE_VECTOR: { Vector old_tangent = (*bline_tangent)(get_time()).get(Vector()); Angle old_angle = old_tangent.angle(); @@ -2610,36 +2672,39 @@ CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDes bool fixed_length((*(bline_tangent->get_link(fixed_length_index)))(get_time()).get(bool())); if (fixed_length) { - if (!(canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), - new_length))) + if (!(canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length))) return false; } - else if (old_length != 0 && - !(canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), - new_length * scale / old_length))) + else if (old_length != 0 && !(canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length * scale / old_length))) return false; return canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,offset_index), old_offset + new_angle - old_angle); } - - if (ValueNode_BLineCalcVertex::Handle bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node())) - { - ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline"))); - Real radius = 0.0; - Real amount = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop()); - return canvas_interface()->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount); + default: + break; } - default: // fall through + } + switch(value_desc.get_value_type()) + { + case ValueBase::TYPE_REAL: + return canvas_interface()->change_value(value_desc,value.mag()); + case ValueBase::TYPE_ANGLE: + return canvas_interface()->change_value(value_desc,Angle::tan(value[1],value[0])); + default: return canvas_interface()->change_value(value_desc,value); - break; } - - return true; } bool CanvasView::on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc) { + if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node())) + { + int offset_index(bline_tangent->get_link_index_from_name("offset")); + Angle old_offset((*(bline_tangent->get_link(offset_index)))(get_time()).get(Angle())); + return canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,offset_index), old_offset + rotation); + } + // \todo will this really always be the case? assert(value_desc.get_value_type() == ValueBase::TYPE_ANGLE); return canvas_interface()->change_value(value_desc, value_desc.get_value(get_time()).get(Angle()) + rotation); @@ -2777,15 +2842,16 @@ CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, synfig Vector origin(layer->get_param("origin").get(Vector())); Canvas::Handle child_canvas(layer->get_param("canvas").get(Canvas::Handle())); + Vector focus(layer->get_param("focus").get(Vector())); if(!scale.is_equal_to(Vector(1,1))) - transform_stack.push(new Transform_Scale(scale,origin)); - if(!scale.is_equal_to(Vector(0,0))) - transform_stack.push(new Transform_Translate(origin)); + transform_stack.push(new Transform_Scale(layer->get_guid(), scale,origin+focus)); + if(!origin.is_equal_to(Vector(0,0))) + transform_stack.push(new Transform_Translate(layer->get_guid(), origin)); rebuild_ducks_layer_(transform_stack,child_canvas,selected_list); - if(!scale.is_equal_to(Vector(0,0))) + if(!origin.is_equal_to(Vector(0,0))) transform_stack.pop(); if(!scale.is_equal_to(Vector(1,1))) transform_stack.pop(); @@ -3129,7 +3195,7 @@ set_waypoint_model(std::set > waypoints, Waypoint waypoint(*iter); waypoint.apply_model(model); - synfigapp::Action::Handle action(synfigapp::Action::create("waypoint_set")); + synfigapp::Action::Handle action(synfigapp::Action::create("WaypointSet")); assert(action); @@ -3254,6 +3320,16 @@ CanvasView::on_waypoint_clicked_canvasview(synfigapp::ValueDesc value_desc, } // ------------------------------------------------------------------------ + if (size == 1) + { + const synfigapp::ValueDesc value_desc(synfig::ValueNode_Animated::Handle::cast_reinterpret(waypoint.get_parent_value_node()), time); + get_instance()->make_param_menu(waypoint_menu,canvas_interface()->get_canvas(),value_desc,0.5f); + + // ------------------------------------------------------------------------ + waypoint_menu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); + } + + // ------------------------------------------------------------------------ waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Jump To"), sigc::bind(sigc::mem_fun(*canvas_interface(), &synfigapp::CanvasInterface::set_time), time))); @@ -3295,7 +3371,7 @@ CanvasView::on_waypoint_changed() param_list.add("waypoint",waypoint_dialog.get_waypoint()); // param_list.add("time",canvas_interface()->get_time()); - get_instance()->process_action("waypoint_set_smart", param_list); + get_instance()->process_action("WaypointSetSmart", param_list); } void @@ -3308,7 +3384,7 @@ CanvasView::on_waypoint_delete() param_list.add("waypoint",waypoint_dialog.get_waypoint()); // param_list.add("time",canvas_interface()->get_time()); - get_instance()->process_action("waypoint_remove", param_list); + get_instance()->process_action("WaypointRemove", param_list); } void @@ -3332,7 +3408,7 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr& con if(!layer->set_param("text",ValueBase(selection_data))) break; - synfigapp::Action::Handle action(synfigapp::Action::create("layer_add")); + synfigapp::Action::Handle action(synfigapp::Action::create("LayerAdd")); assert(action); if(!action) @@ -3396,8 +3472,11 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr& con } else { - if(canvas_interface()->import(filename)) + String errors, warnings; + if(canvas_interface()->import(filename, errors, warnings, App::resize_imported_images)) success=true; + if (warnings != "") + App::dialog_warning_blocking(_("Warnings"), strprintf("%s:\n\n%s", _("Warnings"), warnings.c_str())); } continue; @@ -3414,7 +3493,7 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr& con void CanvasView::on_keyframe_add_pressed() { - synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_add")); + synfigapp::Action::Handle action(synfigapp::Action::create("KeyframeAdd")); if(!action) { @@ -3442,7 +3521,7 @@ CanvasView::on_keyframe_duplicate_pressed() } keyframe=row[model.keyframe]; - synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_duplicate")); + synfigapp::Action::Handle action(synfigapp::Action::create("KeyframeDuplicate")); if(!action) { @@ -3471,7 +3550,7 @@ CanvasView::on_keyframe_remove_pressed() } keyframe=row[model.keyframe]; - synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_remove")); + synfigapp::Action::Handle action(synfigapp::Action::create("KeyframeRemove")); if(!action) { @@ -3504,8 +3583,13 @@ CanvasView::image_import() { // String filename(dirname(get_canvas()->get_file_name())); String filename("*.*"); + String errors, warnings; if(App::dialog_open_file(_("Import Image"), filename, IMAGE_DIR_PREFERENCE)) - canvas_interface()->import(filename); + { + canvas_interface()->import(filename, errors, warnings, App::resize_imported_images); + if (warnings != "") + App::dialog_warning_blocking(_("Warnings"), strprintf("%s:\n\n%s", _("Warnings"), warnings.c_str())); + } } Smach::event_result