X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fcanvasview.cpp;h=18cfb43d4330e0ed12aa80186abbfe25a701e851;hb=24ea782b3d48a3e978bb60713212c2b77529d9a4;hp=d0b102625f14c76e746e967b678c2c56eefb8139;hpb=27fd021972098030939c8c811a3c529f5d3c7209;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/canvasview.cpp b/synfig-studio/trunk/src/gtkmm/canvasview.cpp index d0b1026..18cfb43 100644 --- a/synfig-studio/trunk/src/gtkmm/canvasview.cpp +++ b/synfig-studio/trunk/src/gtkmm/canvasview.cpp @@ -53,6 +53,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -155,7 +159,6 @@ using namespace sigc; /* === C L A S S E S ======================================================= */ - class studio::UniversalScrubber { CanvasView *canvas_view; @@ -226,7 +229,6 @@ public: } }; - class studio::CanvasViewUIInterface : public synfigapp::UIInterface { CanvasView *view; @@ -236,7 +238,6 @@ public: CanvasViewUIInterface(CanvasView *view): view(view) { - view->statusbar->push(_("Idle")); } @@ -385,13 +386,9 @@ class studio::CanvasViewSelectionManager : public synfigapp::SelectionManager CanvasView *view; CanvasView::LayerTreeModel layer_tree_model; CanvasView::ChildrenTreeModel children_tree_model; -public: - - CanvasViewSelectionManager(CanvasView *view): view(view) -{ - - } +public: + CanvasViewSelectionManager(CanvasView *view): view(view) { } private: void _set_selected_layer(const synfig::Layer::Handle &layer) @@ -484,8 +481,6 @@ public: view->layer_tree->clear_selected_layers(); } - - //! Returns the number of value_nodes selected. virtual int get_selected_children_count()const { @@ -566,8 +561,6 @@ public: return; } - - int get_selected_layer_parameter_count()const { return get_selected_layer_parameters().size(); @@ -623,7 +616,6 @@ public: }; // END of class SelectionManager - CanvasView::IsWorking::IsWorking(CanvasView &canvas_view_): canvas_view_(canvas_view_) { @@ -701,7 +693,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlepack2(*notebook, Gtk::SHRINK); //vpaned->show_all(); - //notebook->show(); //notebook->append_page(*create_layer_tree(),_("Layers")); @@ -718,7 +709,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handleattach(*App::ui_manager()->get_widget("/menu-main"), 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - layout_table->attach(*create_time_bar(), 0, 1, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); layout_table->attach(*create_status_bar(), 0, 1, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); @@ -750,7 +740,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlesignal_layer_selected().connect(sigc::mem_fun(*this,&studio::CanvasView::workarea_layer_selected)); work_area->signal_input_device_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::on_input_device_changed)); @@ -773,7 +762,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handle instance,etl::handle listTargets; listTargets.push_back( Gtk::TargetEntry("STRING") ); listTargets.push_back( Gtk::TargetEntry("text/plain") ); @@ -819,7 +804,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlerend_desc().get_time_end()-get_canvas()->rend_desc().get_time_start()); if(length<10.0) @@ -864,7 +848,6 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlerend_desc().get_time_start()); time_window_adjustment().value_changed(); - GRAB_HINT_DATA("canvas_view"); /* { @@ -916,8 +899,6 @@ CanvasView::~CanvasView() synfig::info("CanvasView::~CanvasView(): Deleted"); } - - std::list& CanvasView::get_pixel_sizes() { @@ -942,7 +923,6 @@ CanvasView::create_time_bar() timeslider->set_bounds_adjustment(&time_window_adjustment()); //layout_table->attach(*timeslider, 0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL); - tooltips.set_tip(*time_window_scroll,_("Moves the time window")); tooltips.set_tip(*timeslider,_("Changes the current time")); time_window_scroll->show(); @@ -1000,7 +980,6 @@ CanvasView::create_work_area() return work_area.get(); } - Gtk::Widget* CanvasView::create_status_bar() { @@ -1021,7 +1000,6 @@ CanvasView::create_status_bar() // statusbartable->attach(*lowerbutton, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); // statusbartable->attach(*raisebutton, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); - current_time_widget=manage(new Widget_Time); current_time_widget->set_value(get_time()); current_time_widget->set_fps(get_canvas()->rend_desc().get_frame_rate()); @@ -1048,7 +1026,6 @@ CanvasView::create_status_bar() refreshbutton->signal_clicked().connect(SLOT_EVENT(EVENT_REFRESH)); stopbutton->signal_clicked().connect(SLOT_EVENT(EVENT_STOP)); - statusbartable->show_all(); return statusbartable; } @@ -1263,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) ); @@ -1351,13 +1336,13 @@ CanvasView::init_menus() { Glib::RefPtr action; - action = Gtk::ToggleAction::create("toggle-grid-show", _("Show Grid")); - action->set_active(work_area->grid_status()); - action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid)); + grid_show_toggle = Gtk::ToggleAction::create("toggle-grid-show", _("Show Grid")); + grid_show_toggle->set_active(work_area->grid_status()); + action_group->add(grid_show_toggle, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid)); - action = Gtk::ToggleAction::create("toggle-grid-snap", _("Snap to Grid")); - action->set_active(work_area->get_grid_snap()); - action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap)); + grid_snap_toggle = Gtk::ToggleAction::create("toggle-grid-snap", _("Snap to Grid")); + grid_snap_toggle->set_active(work_area->get_grid_snap()); + action_group->add(grid_snap_toggle, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap)); action = Gtk::ToggleAction::create("toggle-guide-show", _("Show Guides")); action->set_active(work_area->get_show_guides()); @@ -1418,23 +1403,26 @@ CanvasView::init_menus() } + { + Glib::RefPtr action; + +#define DUCK_MASK(lower,upper,string) \ + action=Gtk::ToggleAction::create("mask-" #lower "-ducks", string); \ + action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_##upper)); \ + action_group->add(action, \ + sigc::bind( \ + sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), \ + Duck::TYPE_##upper)) + + DUCK_MASK(position,POSITION,_("Show Position Ducks")); + DUCK_MASK(tangent,TANGENT,_("Show Tangent Ducks")); + DUCK_MASK(vertex,VERTEX,_("Show Vertex Ducks")); + DUCK_MASK(radius,RADIUS,_("Show Radius Ducks")); + DUCK_MASK(width,WIDTH,_("Show Width Ducks")); + DUCK_MASK(angle,ANGLE,_("Show Angle Ducks")); -#define DUCK_MASK(lower,upper,string) \ - duck_mask_##lower=Gtk::ToggleAction::create("mask-" #lower "-ducks", string); \ - duck_mask_##lower->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_##upper)); \ - action_group->add( duck_mask_##lower, \ - sigc::bind( \ - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), \ - Duck::TYPE_##upper \ - ) \ - ) - DUCK_MASK(position,POSITION,_("Show Position Ducks")); - DUCK_MASK(tangent,TANGENT,_("Show Tangent Ducks")); - DUCK_MASK(vertex,VERTEX,_("Show Vertex Ducks")); - DUCK_MASK(radius,RADIUS,_("Show Radius Ducks")); - DUCK_MASK(width,WIDTH,_("Show Width Ducks")); - DUCK_MASK(angle,ANGLE,_("Show Angle Ducks")); #undef DUCK_MASK + } add_accel_group(App::ui_manager()->get_accel_group()); @@ -1493,8 +1481,6 @@ CanvasView::init_menus() } */ - - #if 0 // // //Test some key stuff @@ -1542,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()); // @@ -1741,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(); @@ -1780,7 +1776,6 @@ CanvasView::add_layer(synfig::String x) target_depth=canvas->get_depth(*layer_list.begin()); } - Layer::Handle layer(canvas_interface()->add_layer_to(x,canvas,target_depth)); if(layer) { @@ -1903,13 +1898,11 @@ CanvasView::workarea_layer_selected(synfig::Layer::Handle layer) get_selection_manager()->set_selected_layer(layer); } - void CanvasView::refresh_rend_desc() { current_time_widget->set_fps(get_canvas()->rend_desc().get_frame_rate()); - //???? //synfig::info("Canvasview: Refreshing render desc info"); if(!get_time().is_equal(time_adjustment().get_value())) @@ -1987,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); @@ -2012,7 +2017,6 @@ CanvasView::refresh_rend_desc() work_area->queue_render_preview(); } - bool CanvasView::close_view() { @@ -2034,6 +2038,7 @@ static bool _close_instance(etl::handle instance) bool CanvasView::close_instance() { +#ifdef SINGLE_THREADED if (get_work_area()->get_updating()) { get_work_area()->stop_updating(true); // stop and mark as cancelled @@ -2044,6 +2049,7 @@ CanvasView::close_instance() 250); } else +#endif Glib::signal_timeout().connect( sigc::bind(sigc::ptr_fun(_close_instance), (etl::handle)get_instance()), @@ -2065,14 +2071,20 @@ CanvasView::update_title() { string title; - if(get_instance()->synfigapp::Instance::get_action_count()) - title="*"; - title+=etl::basename(get_instance()->get_file_name()) - +" : "; - if(get_canvas()->get_name().empty()) - title+='"'+get_canvas()->get_id()+'"'; - else - title+='"'+get_canvas()->get_name()+'"'; + title = strprintf("%s%s\"%s\"", + ( + get_instance()->get_action_count() + ? "*" + : "" + ), ( + get_instance()->has_real_filename() + ? (etl::basename(get_instance()->get_file_name()) + " : ").c_str() + : "" + ), ( + get_canvas()->get_name().empty() + ? get_canvas()->get_id().c_str() + : get_canvas()->get_name().c_str() + )); if(get_instance()->synfigapp::Instance::in_repository()) { @@ -2090,7 +2102,6 @@ CanvasView::update_title() set_title(title); } - void CanvasView::on_hide() { @@ -2181,12 +2192,11 @@ CanvasView::on_layer_toggle(synfig::Layer::Handle layer) canvas_interface()->get_instance()->perform_action(action); } - void -CanvasView::popup_param_menu(synfigapp::ValueDesc value_desc, float location) +CanvasView::popup_param_menu(synfigapp::ValueDesc value_desc, float location, bool bezier) { parammenu.items().clear(); - get_instance()->make_param_menu(¶mmenu,get_canvas(),value_desc,location); + get_instance()->make_param_menu(¶mmenu,get_canvas(),value_desc,location,bezier); parammenu.popup(3,gtk_get_current_event_time()); } @@ -2204,7 +2214,6 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow /*row*/, LayerTree::Col { case 3: { - Gtk::MenuItem* menu = dynamic_cast(App::ui_manager()->get_widget("/menu-main/menu-layer")); if(menu && menu->get_submenu()) { @@ -2213,7 +2222,6 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow /*row*/, LayerTree::Col menu->get_submenu()->popup(button,gtk_get_current_event_time()); } - #if 0 bool multiple_selected=true; @@ -2326,8 +2334,6 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow /*row*/, LayerTree::Col } } - - bool CanvasView::on_children_user_click(int button, Gtk::TreeRow row, ChildrenTree::ColumnID column_id) { @@ -2386,7 +2392,6 @@ CanvasView::on_keyframe_tree_event(GdkEvent *event) return false; } - void CanvasView::refresh_time_window() { @@ -2421,7 +2426,6 @@ CanvasView::on_time_changed() if(get_time() != time_adjustment().get_value()) { - //Recenters the window, causing it to jump (possibly undesirably... but whatever) if(time < time_window_adjustment().get_value() || time > time_window_adjustment().get_value()+time_window_adjustment().get_page_size()) @@ -2450,6 +2454,7 @@ CanvasView::time_zoom_in() time_window_adjustment().set_page_size(time_window_adjustment().get_page_size()*0.75); if (time_window_adjustment().get_page_size() < min_page_size) time_window_adjustment().set_page_size(min_page_size); + time_window_adjustment().set_page_increment(time_window_adjustment().get_page_size()); time_window_adjustment().changed(); refresh_time_window(); @@ -2464,6 +2469,7 @@ CanvasView::time_zoom_out() time_window_adjustment().set_page_size(time_window_adjustment().get_page_size()/0.75); if (time_window_adjustment().get_page_size() > length) time_window_adjustment().set_page_size(length); + time_window_adjustment().set_page_increment(time_window_adjustment().get_page_size()); time_window_adjustment().changed(); refresh_time_window(); @@ -2505,7 +2511,6 @@ CanvasView::on_id_changed() update_title(); } - void CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { @@ -2612,25 +2617,94 @@ 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) { + if (ValueNode_BLineCalcWidth::Handle bline_width = ValueNode_BLineCalcWidth::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(); + Real old_length = old_tangent.mag(); + Angle new_angle = value.angle(); + Real new_length = value.mag(); + int offset_index(bline_tangent->get_link_index_from_name("offset")); + int scale_index(bline_tangent->get_link_index_from_name("scale")); + int fixed_length_index(bline_tangent->get_link_index_from_name("fixed_length")); + Angle old_offset((*(bline_tangent->get_link(offset_index)))(get_time()).get(Angle())); + 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) + { + 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))) + return false; + return canvas_interface()->change_value(synfigapp::ValueDesc(bline_tangent,offset_index), old_offset + new_angle - old_angle); + } + default: + break; + } + } + switch(value_desc.get_value_type()) { 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; 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); @@ -3106,7 +3180,6 @@ CanvasView::set_sensitive_timebar(bool sensitive) children_tree->set_sensitive(sensitive); } - static void set_waypoint_model(std::set > waypoints, Waypoint::Model model, @@ -3174,8 +3247,7 @@ remove_waypoints(std::set > waypoints, void CanvasView::on_waypoint_clicked_canvasview(synfigapp::ValueDesc value_desc, std::set > waypoint_set, - int button, - synfig::Waypoint::Side side) + int button) { int size = waypoint_set.size(); Waypoint waypoint(*(waypoint_set.begin())); @@ -3479,49 +3551,11 @@ CanvasView::on_keyframe_remove_pressed() canvas_interface()->get_instance()->perform_action(action); } - void CanvasView::toggle_duck_mask(Duckmatic::Type type) { bool is_currently_on(work_area->get_type_mask()&type); - switch(type) - { - case Duck::TYPE_POSITION: - if(duck_mask_position) - duck_mask_position->set_active(!is_currently_on); - break; - - case Duck::TYPE_VERTEX: - if(duck_mask_vertex) - duck_mask_vertex->set_active(!is_currently_on); - break; - - case Duck::TYPE_TANGENT: - if(duck_mask_tangent) - duck_mask_tangent->set_active(!is_currently_on); - break; - - case Duck::TYPE_RADIUS: - if(duck_mask_radius) - duck_mask_radius->set_active(!is_currently_on); - break; - - case Duck::TYPE_WIDTH: - if(duck_mask_width) - duck_mask_width->set_active(!is_currently_on); - break; - - case Duck::TYPE_ANGLE: - if(duck_mask_angle) - duck_mask_angle->set_active(!is_currently_on); - break; - - default: - synfig::warning("CanvasView::toggle_duck_mask():Unknown duck type!"); - break; - } - if(is_currently_on) work_area->set_type_mask(work_area->get_type_mask()-type); else @@ -3530,7 +3564,6 @@ CanvasView::toggle_duck_mask(Duckmatic::Type type) work_area->queue_draw(); } - void CanvasView::image_import() { @@ -3725,8 +3758,6 @@ CanvasView::on_audio_scrub() return true; } - - Glib::RefPtr CanvasView::get_ref_obj(const synfig::String& x) {