Fix 1914874: update the timeline scrollbars' major step size when zooming time in...
[synfig.git] / synfig-studio / trunk / src / gtkmm / canvasview.cpp
index d0b1026..ed139af 100644 (file)
@@ -155,7 +155,6 @@ using namespace sigc;
 
 /* === C L A S S E S ======================================================= */
 
-
 class studio::UniversalScrubber
 {
        CanvasView *canvas_view;
@@ -226,7 +225,6 @@ public:
        }
 };
 
-
 class studio::CanvasViewUIInterface : public synfigapp::UIInterface
 {
        CanvasView *view;
@@ -236,7 +234,6 @@ public:
        CanvasViewUIInterface(CanvasView *view):
                view(view)
        {
-
                view->statusbar->push(_("Idle"));
        }
 
@@ -385,13 +382,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 +477,6 @@ public:
                view->layer_tree->clear_selected_layers();
        }
 
-
-
        //! Returns the number of value_nodes selected.
        virtual int get_selected_children_count()const
        {
@@ -566,8 +557,6 @@ public:
                return;
        }
 
-
-
        int get_selected_layer_parameter_count()const
        {
                return get_selected_layer_parameters().size();
@@ -623,7 +612,6 @@ public:
 
 }; // END of class SelectionManager
 
-
 CanvasView::IsWorking::IsWorking(CanvasView &canvas_view_):
        canvas_view_(canvas_view_)
 {
@@ -701,7 +689,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        //vpaned->pack2(*notebook, Gtk::SHRINK);
        //vpaned->show_all();
 
-
        //notebook->show();
 
        //notebook->append_page(*create_layer_tree(),_("Layers"));
@@ -718,7 +705,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        init_menus();
        //layout_table->attach(*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 +736,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        time_window_adjustment().signal_value_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::refresh_time_window));
        time_adjustment().signal_value_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::time_was_changed));
 
-
        work_area->signal_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 +758,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
                )
        );
 
-
        //MUCH TIME STUFF TAKES PLACE IN HERE
        refresh_rend_desc();
        refresh_time_window();
@@ -808,9 +792,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        set_default_size(w,h);
        property_window_position().set_value(Gtk::WIN_POS_NONE);
 
-
-
-
        std::list<Gtk::TargetEntry> listTargets;
        listTargets.push_back( Gtk::TargetEntry("STRING") );
        listTargets.push_back( Gtk::TargetEntry("text/plain") );
@@ -819,7 +800,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        drag_dest_set(listTargets);
        signal_drag_data_received().connect( sigc::mem_fun(*this, &studio::CanvasView::on_drop_drag_data_received) );
 
-
        /*
        Time length(get_canvas()->rend_desc().get_time_end()-get_canvas()->rend_desc().get_time_start());
        if(length<10.0)
@@ -864,7 +844,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        time_window_adjustment().set_value(get_canvas()->rend_desc().get_time_start());
        time_window_adjustment().value_changed();
 
-
        GRAB_HINT_DATA("canvas_view");
        /*
        {
@@ -916,8 +895,6 @@ CanvasView::~CanvasView()
                synfig::info("CanvasView::~CanvasView(): Deleted");
 }
 
-
-
 std::list<int>&
 CanvasView::get_pixel_sizes()
 {
@@ -942,7 +919,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 +976,6 @@ CanvasView::create_work_area()
        return work_area.get();
 }
 
-
 Gtk::Widget*
 CanvasView::create_status_bar()
 {
@@ -1021,7 +996,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 +1022,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;
 }
@@ -1351,13 +1324,13 @@ CanvasView::init_menus()
        {
                Glib::RefPtr<Gtk::ToggleAction> 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 +1391,26 @@ CanvasView::init_menus()
 
        }
 
+       {
+               Glib::RefPtr<Gtk::ToggleAction> 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 +1469,6 @@ CanvasView::init_menus()
        }
 */
 
-
-
 #if 0
 //
 //     //Test some key stuff
@@ -1780,7 +1754,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 +1876,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()))
@@ -2012,7 +1983,6 @@ CanvasView::refresh_rend_desc()
        work_area->queue_render_preview();
 }
 
-
 bool
 CanvasView::close_view()
 {
@@ -2034,6 +2004,7 @@ static bool _close_instance(etl::handle<Instance> 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 +2015,7 @@ CanvasView::close_instance()
                        250);
        }
        else
+#endif
                Glib::signal_timeout().connect(
                        sigc::bind(sigc::ptr_fun(_close_instance),
                                           (etl::handle<Instance>)get_instance()),
@@ -2065,14 +2037,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 +2068,6 @@ CanvasView::update_title()
        set_title(title);
 }
 
-
 void
 CanvasView::on_hide()
 {
@@ -2181,12 +2158,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(&parammenu,get_canvas(),value_desc,location);
+       get_instance()->make_param_menu(&parammenu,get_canvas(),value_desc,location,bezier);
 
        parammenu.popup(3,gtk_get_current_event_time());
 }
@@ -2204,7 +2180,6 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow /*row*/, LayerTree::Col
        {
        case 3:
                {
-
                        Gtk::MenuItem* menu = dynamic_cast<Gtk::MenuItem*>(App::ui_manager()->get_widget("/menu-main/menu-layer"));
                        if(menu && menu->get_submenu())
                        {
@@ -2213,7 +2188,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 +2300,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 +2358,6 @@ CanvasView::on_keyframe_tree_event(GdkEvent *event)
        return false;
 }
 
-
 void
 CanvasView::refresh_time_window()
 {
@@ -2421,7 +2392,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 +2420,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 +2435,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 +2477,6 @@ CanvasView::on_id_changed()
        update_title();
 }
 
-
 void
 CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode)
 {
@@ -3106,7 +3077,6 @@ CanvasView::set_sensitive_timebar(bool sensitive)
                children_tree->set_sensitive(sensitive);
 }
 
-
 static void
 set_waypoint_model(std::set<synfig::Waypoint, std::less<UniqueID> > waypoints,
                                   Waypoint::Model model,
@@ -3174,8 +3144,7 @@ remove_waypoints(std::set<synfig::Waypoint, std::less<UniqueID> > waypoints,
 void
 CanvasView::on_waypoint_clicked_canvasview(synfigapp::ValueDesc value_desc,
                                                                                   std::set<synfig::Waypoint, std::less<UniqueID> > waypoint_set,
-                                                                                  int button,
-                                                                                  synfig::Waypoint::Side side)
+                                                                                  int button)
 {
        int size = waypoint_set.size();
        Waypoint waypoint(*(waypoint_set.begin()));
@@ -3479,49 +3448,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 +3461,6 @@ CanvasView::toggle_duck_mask(Duckmatic::Type type)
        work_area->queue_draw();
 }
 
-
 void
 CanvasView::image_import()
 {
@@ -3725,8 +3655,6 @@ CanvasView::on_audio_scrub()
        return true;
 }
 
-
-
 Glib::RefPtr<Glib::ObjectBase>
 CanvasView::get_ref_obj(const synfig::String& x)
 {