diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-09-10 21:27:39 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-09-10 21:27:39 +0000 |
commit | c86210a9d5bdb7b36ad58552a1f99f53d48781b3 (patch) | |
tree | 6ab06935a1e2bc4ef6a4448dd01b09f5b2628c66 /gtk2_ardour/editor_tempodisplay.cc | |
parent | 68e943265edf04e63a8e8b8f62bab20f99d9c637 (diff) |
merge 2.0-ongoing into 3.0 @ 3581 - 3710
git-svn-id: svn://localhost/ardour2/branches/3.0@3712 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_tempodisplay.cc')
-rw-r--r-- | gtk2_ardour/editor_tempodisplay.cc | 97 |
1 files changed, 87 insertions, 10 deletions
diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 1e5c02f5d8..49cee3e239 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -171,11 +171,36 @@ Editor::compute_current_bbt_points (nframes_t leftmost, nframes_t rightmost) current_bbt_points = session->tempo_map().get_points (session->tempo_map().frame_time (previous_beat), session->tempo_map().frame_time (next_beat) + 1); } +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); + } + + return line; +} + void Editor::hide_measures () { - tempo_lines->hide(); - marker_tempo_lines->hide(); + // from old pre-merge 3.0 + // tempo_lines->hide(); + // marker_tempo_lines->hide(); + + 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 (); } bool @@ -195,16 +220,68 @@ Editor::draw_measures () return; } - tempo_lines->draw(*current_bbt_points, frames_per_unit); - marker_tempo_lines->draw(*current_bbt_points, frames_per_unit); + 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 + */ + 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; + } + } - /*time_line_group->raise_to_top(); - time_line_group->lower(1);*/ - marker_time_line_group->raise_to_top(); - //marker_time_line_group->lower(1); - /* the cursors are always on top of everything */ - cursor_group->raise_to_top(); + //cursor_group->raise_to_top(); return; } |