PBD::Signal<...>::connect() is already thread safe, so drop intermediate proxy/call_s...
[ardour.git] / gtk2_ardour / editor_tempodisplay.cc
index 873bec33073b47cfd2624452df0776fdc8add48d..b863cb99011d5377af837a5d008e522c44f35b3f 100644 (file)
@@ -75,7 +75,11 @@ Editor::remove_metric_marks ()
        }
        tempo_curves.clear ();
 }
-
+struct CurveComparator {
+       bool operator() (TempoCurve const * a, TempoCurve const * b) {
+               return a->tempo().frame() < b->tempo().frame();
+       }
+};
 void
 Editor::draw_metric_marks (const Metrics& metrics)
 {
@@ -121,6 +125,7 @@ Editor::draw_metric_marks (const Metrics& metrics)
                }
 
        }
+       tempo_curves.sort (CurveComparator());
 
        const double min_tempo_range = 5.0;
        const double tempo_delta = fabs (max_tempo - min_tempo);
@@ -140,6 +145,13 @@ Editor::draw_metric_marks (const Metrics& metrics)
                } else {
                        (*x)->set_position ((*x)->tempo().frame(), UINT32_MAX);
                }
+
+               if (!(*x)->tempo().active()) {
+                       (*x)->hide();
+               } else {
+                       (*x)->show();
+               }
+
                ++x;
        }
 
@@ -176,14 +188,8 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/)
        update_tempo_based_rulers ();
 }
 
-struct CurveComparator {
-       bool operator() (TempoCurve const * a, TempoCurve const * b) {
-               return a->position() < b->position();
-       }
-};
-
 void
-Editor::marker_position_changed ()
+Editor::tempometric_position_changed (const PropertyChange& /*ignored*/)
 {
        if (!_session) {
                return;
@@ -248,6 +254,13 @@ Editor::marker_position_changed ()
                } else {
                        (*x)->set_position ((*x)->tempo().frame(), UINT32_MAX);
                }
+
+               if (!(*x)->tempo().active()) {
+                       (*x)->hide();
+               } else {
+                       (*x)->show();
+               }
+
                ++x;
        }
 
@@ -410,14 +423,14 @@ Editor::mouse_add_new_meter_event (framepos_t frame)
        meter_dialog.get_bbt_time (requested);
 
        const double beat = map.beat_at_bbt (requested);
-
+       const double al_frame = map.frame_at_beat (beat);
        begin_reversible_command (_("add meter mark"));
         XMLNode &before = map.get_state();
 
        if (meter_dialog.get_lock_style() == MusicTime) {
-               map.add_meter (Meter (bpb, note_type), beat, requested, MusicTime);
+               map.add_meter (Meter (bpb, note_type), beat, requested, 0, MusicTime);
        } else {
-               map.add_meter (Meter (bpb, note_type), beat, requested, AudioTime);
+               map.add_meter (Meter (bpb, note_type), beat, requested, al_frame, AudioTime);
        }
 
        _session->add_command(new MementoCommand<TempoMap>(map, &before, &map.get_state()));
@@ -442,7 +455,7 @@ Editor::remove_tempo_marker (ArdourCanvas::Item* item)
                abort(); /*NOTREACHED*/
        }
 
-       if (tempo_marker->tempo().movable()) {
+       if (!tempo_marker->tempo().locked_to_meter() && tempo_marker->tempo().active()) {
                Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::real_remove_tempo_marker), &tempo_marker->tempo()));
        }
 }
@@ -467,13 +480,13 @@ Editor::edit_meter_section (MeterSection* section)
 
        Timecode::BBT_Time when;
        meter_dialog.get_bbt_time (when);
-
+       const framepos_t frame = _session->tempo_map().frame_at_bbt (when);
        const PositionLockStyle pls = (meter_dialog.get_lock_style() == AudioTime) ? AudioTime : MusicTime;
 
        begin_reversible_command (_("replace meter mark"));
         XMLNode &before = _session->tempo_map().get_state();
 
-       _session->tempo_map().replace_meter (*section, meter, when, pls);
+       _session->tempo_map().replace_meter (*section, meter, when, frame, pls);
 
        XMLNode &after = _session->tempo_map().get_state();
        _session->add_command(new MementoCommand<TempoMap>(_session->tempo_map(), &before, &after));
@@ -559,7 +572,7 @@ Editor::remove_meter_marker (ArdourCanvas::Item* item)
                abort(); /*NOTREACHED*/
        }
 
-       if (meter_marker->meter().movable()) {
+       if (!meter_marker->meter().initial()) {
          Glib::signal_idle().connect (sigc::bind (sigc::mem_fun(*this, &Editor::real_remove_meter_marker), &meter_marker->meter()));
        }
 }