the "final" (??) fixes for transport state stuff before 2.8.4. y'all let me know...
[ardour.git] / gtk2_ardour / editor_tempodisplay.cc
index 16fe3b8464a2ce43be83853ffa099f8482a4a949..92efed3b27a5e68db50d5b88647895141beb6455 100644 (file)
@@ -44,6 +44,7 @@
 #include "gui_thread.h"
 #include "ardour_ui.h"
 #include "time_axis_view.h"
+#include "tempo_lines.h"
 
 #include "i18n.h"
 
@@ -100,9 +101,15 @@ Editor::tempo_map_changed (Change ignored)
        }
 
        ENSURE_GUI_THREAD(bind (mem_fun (*this, &Editor::tempo_map_changed), ignored));
-       
-       redisplay_tempo (false); // redraw rulers and measures
+
+       if (tempo_lines) {
+               tempo_lines->tempo_map_changed();
+       }
+
+       compute_current_bbt_points(leftmost_frame, leftmost_frame + current_page_frames());
        session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers
+       redraw_measures ();
+       update_tempo_based_rulers ();
 }
 
 /**
@@ -116,20 +123,40 @@ Editor::redisplay_tempo (bool immediate_redraw)
                return;
        }
 
+       compute_current_bbt_points (leftmost_frame, leftmost_frame + current_page_frames());
+       if (immediate_redraw) {
+               redraw_measures ();
+       } else {
+#ifdef GTKOSX
+               redraw_measures ();
+#else
+               Glib::signal_idle().connect (mem_fun (*this, &Editor::redraw_measures));
+#endif
+       }
+       update_tempo_based_rulers (); // redraw rulers and measures
+}
+
+void
+Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost)
+{
+       if (!session) {
+               return;
+       }
+
        BBT_Time previous_beat, next_beat; // the beats previous to the leftmost frame and after the rightmost frame
 
-       session->bbt_time(leftmost_frame, previous_beat);
-       session->bbt_time(leftmost_frame + current_page_frames(), next_beat);
+       session->bbt_time(leftmost, previous_beat);
+       session->bbt_time(rightmost, next_beat);
 
        if (previous_beat.beats > 1) {
-               previous_beat.beats -= 1;
+               previous_beat.beats -= 1;
        } else if (previous_beat.bars > 1) {
-               previous_beat.bars--;
+               previous_beat.bars--;
                previous_beat.beats += 1;
        }
        previous_beat.ticks = 0;
 
-       if (session->tempo_map().meter_at(leftmost_frame + current_page_frames()).beats_per_bar () > next_beat.beats + 1) {
+       if (session->tempo_map().meter_at(rightmost).beats_per_bar () > next_beat.beats + 1) {
                next_beat.beats += 1;
        } else {
                next_beat.bars += 1;
@@ -138,66 +165,24 @@ Editor::redisplay_tempo (bool immediate_redraw)
        next_beat.ticks = 0;
        
        if (current_bbt_points) {
-               delete current_bbt_points;
-               current_bbt_points = 0;
-       }
-
-       if (session) {
-               current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat));
-               update_tempo_based_rulers ();
-       } else {
+               delete current_bbt_points;
                current_bbt_points = 0;
        }
 
-       if (immediate_redraw) {
-
-               hide_measures ();
-
-               if (session && current_bbt_points) {
-                       draw_measures ();
-               }
-
-       } else {
-
-               if (session && current_bbt_points) {
-                       Glib::signal_idle().connect (mem_fun (*this, &Editor::lazy_hide_and_draw_measures));
-               } else {
-                       hide_measures ();
-               }
-       }
+       current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat) + 1);
 }
 
 void
 Editor::hide_measures ()
 {
-       for (TimeLineList::iterator i = used_measure_lines.begin(); i != used_measure_lines.end(); ++i) {
-               (*i)->hide();
-               free_measure_lines.push_back (*i);
-       }
-       used_measure_lines.clear ();
-}
-
-ArdourCanvas::SimpleLine *
-Editor::get_time_line ()
-{
-         ArdourCanvas::SimpleLine *line;
-
-       if (free_measure_lines.empty()) {
-               line = new ArdourCanvas::SimpleLine (*time_line_group);
-               used_measure_lines.push_back (line);
-       } else {
-               line = free_measure_lines.front();
-               free_measure_lines.erase (free_measure_lines.begin());
-               used_measure_lines.push_back (line);
+       if (tempo_lines) {
+               tempo_lines->hide();
        }
-
-       return line;
 }
 
 bool
-Editor::lazy_hide_and_draw_measures ()
+Editor::redraw_measures ()
 {
-       hide_measures ();
        draw_measures ();
        return false;
 }
@@ -205,74 +190,16 @@ Editor::lazy_hide_and_draw_measures ()
 void
 Editor::draw_measures ()
 {
-       if (session == 0 || _show_measures == false) {
-               return;
-       }
-
-       TempoMap::BBTPointList::iterator i;
-       ArdourCanvas::SimpleLine *line;
-       gdouble xpos;
-       double beat_density;
-
-        uint32_t beats = 0;
-        uint32_t bars = 0;
-       uint32_t color;
-
-       if (current_bbt_points == 0 || current_bbt_points->empty()) {
-               return;
-       }
-
-       /* get the first bar spacing */
-
-       i = current_bbt_points->end();
-       i--;
-       bars = (*i).bar - (*current_bbt_points->begin()).bar;
-       beats = current_bbt_points->size() - bars;
-
-       beat_density =  (beats * 10.0f) / track_canvas->get_width ();
-
-       if (beat_density > 4.0f) {
-               /* if the lines are too close together, they become useless
-                */
+       if (session == 0 || _show_measures == false || 
+           !current_bbt_points || current_bbt_points->empty()) {
                return;
        }
 
-       for (i = current_bbt_points->begin(); i != current_bbt_points->end(); ++i) {
-
-               switch ((*i).type) {
-               case TempoMap::Bar:
-                       break;
-
-               case TempoMap::Beat:
-                       
-                       if ((*i).beat == 1) {
-                               color = ARDOUR_UI::config()->canvasvar_MeasureLineBar.get();
-                       } else {
-                               color = ARDOUR_UI::config()->canvasvar_MeasureLineBeat.get();
-
-                               if (beat_density > 2.0) {
-                                       /* only draw beat lines if the gaps between beats are large.
-                                       */
-                                       break;
-                               }
-                       }
-
-                       xpos = frame_to_unit ((nframes64_t) (*i).frame);
-                       line = get_time_line ();
-                       line->property_x1() = xpos;
-                       line->property_x2() = xpos;
-                       line->property_y2() = canvas_height;
-                       line->property_color_rgba() = color;
-                       //line->raise_to_top();
-                       line->show();   
-                       break;
-               }
+       if (tempo_lines == 0) {
+               tempo_lines = new TempoLines(*track_canvas, time_line_group, physical_screen_height);
        }
 
-       if (logo_item) {
-               logo_item->lower_to_bottom ();
-       }
-       return;
+       tempo_lines->draw(*current_bbt_points, frames_per_unit);
 }
 
 void