Tempo ramps - rename meter_at() -> meter_at_frame() & make the ticker slightly more...
[ardour.git] / gtk2_ardour / editor.cc
index b267eae67014a0c117283c74ca29045597fc57d3..c5d99c69bf1e58fc32156d172105b93cfdf737e4 100644 (file)
@@ -391,7 +391,8 @@ Editor::Editor ()
        , tempo_lines (0)
        , global_rect_group (0)
        , time_line_group (0)
-       , tempo_or_meter_marker_menu (0)
+       , tempo_marker_menu (0)
+       , meter_marker_menu (0)
        , marker_menu (0)
        , range_marker_menu (0)
        , transport_marker_menu (0)
@@ -436,6 +437,7 @@ Editor::Editor ()
        , show_gain_after_trim (false)
        , selection_op_cmd_depth (0)
        , selection_op_history_it (0)
+       , no_save_instant (false)
        , current_timefx (0)
        , current_mixer_strip (0)
        , show_editor_mixer_when_tracks_arrive (false)
@@ -507,6 +509,7 @@ Editor::Editor ()
 
        TimeAxisView::setup_sizes ();
        ArdourMarker::setup_sizes (timebar_height);
+       TempoCurve::setup_sizes (timebar_height);
 
        bbt_label.set_name ("EditorRulerLabel");
        bbt_label.set_size_request (-1, (int)timebar_height);
@@ -949,7 +952,7 @@ Editor::set_entered_track (TimeAxisView* tav)
 void
 Editor::instant_save ()
 {
-       if (!constructed || !ARDOUR_UI::instance()->session_loaded) {
+       if (!constructed || !ARDOUR_UI::instance()->session_loaded || no_save_instant) {
                return;
        }
 
@@ -1364,6 +1367,7 @@ Editor::set_session (Session *t)
        _session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&Editor::add_routes, this, _1), gui_context());
        _session->DirtyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::update_title, this), gui_context());
        _session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::tempo_map_changed, this, _1), gui_context());
+       _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::marker_position_changed, this), gui_context());
        _session->Located.connect (_session_connections, invalidator (*this), boost::bind (&Editor::located, this), gui_context());
        _session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::parameter_changed, this, _1), gui_context());
        _session->StateSaved.connect (_session_connections, invalidator (*this), boost::bind (&Editor::session_state_saved, this, _1), gui_context());
@@ -2134,6 +2138,37 @@ Editor::snap_type() const
        return _snap_type;
 }
 
+bool
+Editor::snap_musical() const
+{
+       switch (_snap_type) {
+       case SnapToBeatDiv128:
+       case SnapToBeatDiv64:
+       case SnapToBeatDiv32:
+       case SnapToBeatDiv28:
+       case SnapToBeatDiv24:
+       case SnapToBeatDiv20:
+       case SnapToBeatDiv16:
+       case SnapToBeatDiv14:
+       case SnapToBeatDiv12:
+       case SnapToBeatDiv10:
+       case SnapToBeatDiv8:
+       case SnapToBeatDiv7:
+       case SnapToBeatDiv6:
+       case SnapToBeatDiv5:
+       case SnapToBeatDiv4:
+       case SnapToBeatDiv3:
+       case SnapToBeatDiv2:
+       case SnapToBeat:
+       case SnapToBar:
+               return true;
+       default:
+               break;
+       }
+
+       return false;
+}
+
 SnapMode
 Editor::snap_mode() const
 {
@@ -2184,14 +2219,10 @@ Editor::set_snap_to (SnapType st)
        case SnapToBeatDiv4:
        case SnapToBeatDiv3:
        case SnapToBeatDiv2: {
-               ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
-               ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
-               compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(),
-                                           current_bbt_points_begin, current_bbt_points_end);
-               compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples(),
-                                        current_bbt_points_begin, current_bbt_points_end);
-               update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+               std::vector<TempoMap::BBTPoint> grid;
+               compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+               compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame + current_page_samples());
+               update_tempo_based_rulers (grid);
                break;
        }
 
@@ -2287,8 +2318,9 @@ Editor::set_edit_point_preference (EditPoint ep, bool force)
 int
 Editor::set_state (const XMLNode& node, int version)
 {
-       const XMLProperty* prop;
+       XMLProperty const * prop;
        set_id (node);
+       PBD::Unwinder<bool> nsi (no_save_instant, true);
 
        Tabbable::set_state (node, version);
 
@@ -2327,10 +2359,16 @@ Editor::set_state (const XMLNode& node, int version)
 
        if ((prop = node.property ("snap-to"))) {
                snap_type_selection_done ((SnapType) string_2_enum (prop->value(), _snap_type));
+               set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type));
        }
 
        if ((prop = node.property ("snap-mode"))) {
                snap_mode_selection_done((SnapMode) string_2_enum (prop->value(), _snap_mode));
+               /* set text of Dropdown. in case _snap_mode == SnapOff (default)
+                * snap_mode_selection_done() will only mark an already active item as active
+                * which does not trigger set_text().
+                */
+               set_snap_mode ((SnapMode) string_2_enum (prop->value(), _snap_mode));
        }
 
        if ((prop = node.property ("internal-snap-to"))) {
@@ -3805,7 +3843,7 @@ bool
 Editor::edit_controls_button_release (GdkEventButton* ev)
 {
        if (Keyboard::is_context_menu_event (ev)) {
-               ARDOUR_UI::instance()->add_route (current_toplevel());
+               ARDOUR_UI::instance()->add_route ();
        } else if (ev->button == 1) {
                selection->clear_tracks ();
        }
@@ -3873,7 +3911,7 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
         */
 
        int pos;
-       XMLProperty* prop;
+       XMLProperty const * prop;
        char buf[32];
        XMLNode* node = ARDOUR_UI::instance()->editor_settings();
 
@@ -3944,11 +3982,9 @@ Editor::set_show_measures (bool yn)
                                tempo_lines->show();
                        }
 
-                       ARDOUR::TempoMap::BBTPointList::const_iterator begin;
-                       ARDOUR::TempoMap::BBTPointList::const_iterator end;
-
-                       compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_samples(), begin, end);
-                       draw_measures (begin, end);
+                       std::vector<TempoMap::BBTPoint> grid;
+                       compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples());
+                       draw_measures (grid);
                }
 
                instant_save ();
@@ -4069,7 +4105,7 @@ Editor::get_grid_type_as_beats (bool& success, framepos_t position)
                return Evoral::Beats(1.0);
        case SnapToBar:
                if (_session) {
-                       return Evoral::Beats(_session->tempo_map().meter_at (position).divisions_per_bar());
+                       return Evoral::Beats(_session->tempo_map().meter_at_frame (position).divisions_per_bar());
                }
                break;
        default:
@@ -4574,14 +4610,10 @@ Editor::visual_changer (const VisualChange& vc)
 
                compute_fixed_ruler_scale ();
 
-               ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_begin;
-               ARDOUR::TempoMap::BBTPointList::const_iterator current_bbt_points_end;
-
-               compute_current_bbt_points (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
-                                           current_bbt_points_begin, current_bbt_points_end);
-               compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples(),
-                                        current_bbt_points_begin, current_bbt_points_end);
-               update_tempo_based_rulers (current_bbt_points_begin, current_bbt_points_end);
+               std::vector<TempoMap::BBTPoint> grid;
+               compute_current_bbt_points (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+               compute_bbt_ruler_scale (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples());
+               update_tempo_based_rulers (grid);
 
                update_video_timeline();
        }
@@ -5726,12 +5758,6 @@ Editor::session_going_away ()
        SessionHandlePtr::session_going_away ();
 }
 
-void
-Editor::manage_action_scripts ()
-{
-       ARDOUR_UI::instance()->lua_script_manager();
-}
-
 void
 Editor::trigger_script (int i)
 {
@@ -5746,7 +5772,7 @@ Editor::set_script_action_name (int i, const std::string& n)
        assert (act);
        if (n.empty ()) {
                act->set_label (string_compose (_("Unset #%1"), i + 1));
-               act->set_tooltip (_("(no action bound"));
+               act->set_tooltip (_("no action bound"));
                act->set_sensitive (false);
        } else {
                act->set_label (n);