#include "editor_cursors.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
{
XMLNode* node = new XMLNode(X_("RulerVisibility"));
- node->add_property (X_("timecode"), ruler_timecode_action->get_active() ? "yes": "no");
- node->add_property (X_("bbt"), ruler_bbt_action->get_active() ? "yes": "no");
- node->add_property (X_("samples"), ruler_samples_action->get_active() ? "yes": "no");
- node->add_property (X_("minsec"), ruler_minsec_action->get_active() ? "yes": "no");
- node->add_property (X_("tempo"), ruler_tempo_action->get_active() ? "yes": "no");
- node->add_property (X_("meter"), ruler_meter_action->get_active() ? "yes": "no");
- node->add_property (X_("marker"), ruler_marker_action->get_active() ? "yes": "no");
- node->add_property (X_("rangemarker"), ruler_range_action->get_active() ? "yes": "no");
- node->add_property (X_("transportmarker"), ruler_loop_punch_action->get_active() ? "yes": "no");
- node->add_property (X_("cdmarker"), ruler_cd_marker_action->get_active() ? "yes": "no");
- node->add_property (X_("videotl"), ruler_video_action->get_active() ? "yes": "no");
+ node->set_property (X_("timecode"), ruler_timecode_action->get_active());
+ node->set_property (X_("bbt"), ruler_bbt_action->get_active());
+ node->set_property (X_("samples"), ruler_samples_action->get_active());
+ node->set_property (X_("minsec"), ruler_minsec_action->get_active());
+ node->set_property (X_("tempo"), ruler_tempo_action->get_active());
+ node->set_property (X_("meter"), ruler_meter_action->get_active());
+ node->set_property (X_("marker"), ruler_marker_action->get_active());
+ node->set_property (X_("rangemarker"), ruler_range_action->get_active());
+ node->set_property (X_("transportmarker"), ruler_loop_punch_action->get_active());
+ node->set_property (X_("cdmarker"), ruler_cd_marker_action->get_active());
+ node->set_property (X_("videotl"), ruler_video_action->get_active());
_session->add_extra_xml (*node);
_session->set_dirty ();
void
Editor::restore_ruler_visibility ()
{
- XMLProperty const * prop;
XMLNode * node = _session->extra_xml (X_("RulerVisibility"));
no_ruler_shown_update = true;
+ bool yn;
if (node) {
- if ((prop = node->property ("timecode")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_timecode_action->set_active (true);
- } else {
- ruler_timecode_action->set_active (false);
- }
+ if (node->get_property ("timecode", yn)) {
+ ruler_timecode_action->set_active (yn);
}
- if ((prop = node->property ("bbt")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_bbt_action->set_active (true);
- } else {
- ruler_bbt_action->set_active (false);
- }
+ if (node->get_property ("bbt", yn)) {
+ ruler_bbt_action->set_active (yn);
}
- if ((prop = node->property ("samples")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_samples_action->set_active (true);
- } else {
- ruler_samples_action->set_active (false);
- }
+ if (node->get_property ("samples", yn)) {
+ ruler_samples_action->set_active (yn);
}
- if ((prop = node->property ("minsec")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_minsec_action->set_active (true);
- } else {
- ruler_minsec_action->set_active (false);
- }
+ if (node->get_property ("minsec", yn)) {
+ ruler_minsec_action->set_active (yn);
}
- if ((prop = node->property ("tempo")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_tempo_action->set_active (true);
- } else {
- ruler_tempo_action->set_active (false);
- }
+ if (node->get_property ("tempo", yn)) {
+ ruler_tempo_action->set_active (yn);
}
- if ((prop = node->property ("meter")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_meter_action->set_active (true);
- } else {
- ruler_meter_action->set_active (false);
- }
+ if (node->get_property ("meter", yn)) {
+ ruler_meter_action->set_active (yn);
}
- if ((prop = node->property ("marker")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_marker_action->set_active (true);
- } else {
- ruler_marker_action->set_active (false);
- }
+ if (node->get_property ("marker", yn)) {
+ ruler_marker_action->set_active (yn);
}
- if ((prop = node->property ("rangemarker")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_range_action->set_active (true);
- } else {
- ruler_range_action->set_active (false);
- }
+ if (node->get_property ("rangemarker", yn)) {
+ ruler_range_action->set_active (yn);
}
-
- if ((prop = node->property ("transportmarker")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_loop_punch_action->set_active (true);
- } else {
- ruler_loop_punch_action->set_active (false);
- }
+ if (node->get_property ("transportmarker", yn)) {
+ ruler_loop_punch_action->set_active (yn);
}
- if ((prop = node->property ("cdmarker")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_cd_marker_action->set_active (true);
- } else {
- ruler_cd_marker_action->set_active (false);
- }
-
+ if (node->get_property ("cdmarker", yn)) {
+ ruler_cd_marker_action->set_active (yn);
} else {
// this _session doesn't yet know about the cdmarker ruler
// as a benefit to the user who doesn't know the feature exists, show the ruler if
}
}
- if ((prop = node->property ("videotl")) != 0) {
- if (string_is_affirmative (prop->value())) {
- ruler_video_action->set_active (true);
- } else {
- ruler_video_action->set_active (false);
- }
+ if (node->get_property ("videotl", yn)) {
+ ruler_video_action->set_active (yn);
}
}
}
void
-Editor::update_tempo_based_rulers (std::vector<TempoMap::BBTPoint>& grid)
+Editor::update_tempo_based_rulers ()
{
if (_session == 0) {
return;
}
- compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame+current_page_samples());
-
_bbt_metric->units_per_pixel = samples_per_pixel;
if (ruler_bbt_action->get_active()) {
upper = upper + spacer;
framecnt_t const range = upper - lower;
- if (range < (2 * _session->frames_per_timecode_frame())) { /* 0 - 2 frames */
+ if (range < (2 * _session->samples_per_timecode_frame())) { /* 0 - 2 frames */
timecode_ruler_scale = timecode_show_bits;
timecode_mark_modulo = 20;
timecode_nmarks = 2 + (2 * _session->config.get_subframes_per_frame());
} else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */
timecode_ruler_scale = timecode_show_frames;
timecode_mark_modulo = 1;
- timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
+ timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
} else if (range <= (fr / 2)) { /* 0.25-0.5 second */
timecode_ruler_scale = timecode_show_frames;
timecode_mark_modulo = 2;
- timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
+ timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
} else if (range <= fr) { /* 0.5-1 second */
timecode_ruler_scale = timecode_show_frames;
timecode_mark_modulo = 5;
- timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
+ timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
} else if (range <= 2 * fr) { /* 1-2 seconds */
timecode_ruler_scale = timecode_show_frames;
timecode_mark_modulo = 10;
- timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
+ timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
} else if (range <= 8 * fr) { /* 2-8 seconds */
timecode_ruler_scale = timecode_show_seconds;
timecode_mark_modulo = 1;
mark.position = pos;
marks.push_back (mark);
++n;
- }
- /* can't use Timecode::increment_hours() here because we may be traversing thousands of hours
- and doing it 1 hour at a time is just stupid (and slow).
- */
- timecode.hours += timecode_mark_modulo;
+ }
+ /* can't use Timecode::increment_hours() here because we may be traversing thousands of hours
+ * and doing it 1 hour at a time is just stupid (and slow).
+ */
+ timecode.hours += timecode_mark_modulo - (timecode.hours % timecode_mark_modulo);
}
break;
}
}
void
-Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper)
+Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper)
{
if (_session == 0) {
return;
std::vector<TempoMap::BBTPoint>::const_iterator i;
Timecode::BBT_Time lower_beat, upper_beat; // the beats at each end of the ruler
- framecnt_t beat_before_lower_pos = _session->tempo_map().frame_at_beat (floor(_session->tempo_map().beat_at_frame (lower)));
- framecnt_t beat_after_upper_pos = _session->tempo_map().frame_at_beat (floor (_session->tempo_map().beat_at_frame (upper)) + 1.0);
+ double floor_lower_beat = floor(max (0.0, _session->tempo_map().beat_at_frame (lower)));
+
+ if (floor_lower_beat < 0.0) {
+ floor_lower_beat = 0.0;
+ }
+
+ const framecnt_t beat_before_lower_pos = _session->tempo_map().frame_at_beat (floor_lower_beat);
+ const framecnt_t beat_after_upper_pos = _session->tempo_map().frame_at_beat (floor (max (0.0, _session->tempo_map().beat_at_frame (upper))) + 1.0);
_session->bbt_time (beat_before_lower_pos, lower_beat);
_session->bbt_time (beat_after_upper_pos, upper_beat);
bbt_beat_subdivision = 4;
break;
}
- if (distance (grid.begin(), grid.end()) == 0) {
+
+ const double ceil_upper_beat = floor (max (0.0, _session->tempo_map().beat_at_frame (upper))) + 1.0;
+ if (ceil_upper_beat == floor_lower_beat) {
return;
}
- i = grid.end();
- i--;
-
- /* XX ?? */
- if ((*i).beat >= (*grid.begin()).beat) {
- bbt_bars = (*i).bar - (*grid.begin()).bar;
- } else {
- bbt_bars = (*i).bar - (*grid.begin()).bar;
- }
+ bbt_bars = _session->tempo_map().bbt_at_beat (ceil_upper_beat).bars - _session->tempo_map().bbt_at_beat (floor_lower_beat).bars;
- beats = distance (grid.begin(), grid.end()) - bbt_bars;
+ beats = (ceil_upper_beat - floor_lower_beat);// - bbt_bars; possible thinko; this fixes the problem (for me) where measure lines alternately appear&disappear while playing at certain zoom scales
+ double beat_density = ((beats + 1) * ((double) (upper - lower) / (double) (1 + beat_after_upper_pos - beat_before_lower_pos))) / 5.0;
/* Only show the bar helper if there aren't many bars on the screen */
if ((bbt_bars < 2) || (beats < 5)) {
bbt_bar_helper_on = true;
}
- if (bbt_bars > 8192) {
+ if (beat_density > 8192) {
bbt_ruler_scale = bbt_show_many;
- } else if (bbt_bars > 1024) {
+ } else if (beat_density > 1024) {
bbt_ruler_scale = bbt_show_64;
- } else if (bbt_bars > 256) {
+ } else if (beat_density > 512) {
bbt_ruler_scale = bbt_show_16;
- } else if (bbt_bars > 64) {
+ } else if (beat_density > 128) {
bbt_ruler_scale = bbt_show_4;
- } else if (bbt_bars > 10) {
+ } else if (beat_density > 16) {
bbt_ruler_scale = bbt_show_1;
- } else if (bbt_bars > 2) {
+ } else if (beat_density > 2) {
bbt_ruler_scale = bbt_show_beats;
- } else if (bbt_bars > 0) {
+ } else if (beat_density > 0.5) {
bbt_ruler_scale = bbt_show_ticks;
} else {
bbt_ruler_scale = bbt_show_ticks_detail;
next_beat.beats = (*i).beat;
next_beat.bars = (*i).bar;
next_beat.ticks = tick;
- pos = _session->tempo_map().frame_time (next_beat);
+ pos = _session->tempo_map().frame_at_bbt (next_beat);
if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
i_am_accented = true;
next_beat.beats = (*i).beat;
next_beat.bars = (*i).bar;
next_beat.ticks = tick;
- pos = _session->tempo_map().frame_time (next_beat);
+ pos = _session->tempo_map().frame_at_bbt (next_beat);
if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
i_am_accented = true;
while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
next_beat.ticks = tick;
- pos = _session->tempo_map().frame_time (next_beat);
+ pos = _session->tempo_map().frame_at_bbt (next_beat);
if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
i_am_accented = true;
}