#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
- double floor_lower_beat = floor(_session->tempo_map().beat_at_frame (lower));
+ 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 (_session->tempo_map().beat_at_frame (upper)) + 1.0);
+ 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--;
+ bbt_bars = _session->tempo_map().bbt_at_beat (ceil_upper_beat).bars - _session->tempo_map().bbt_at_beat (floor_lower_beat).bars;
- /* XX ?? */
- if ((*i).beat >= (*grid.begin()).beat) {
- bbt_bars = (*i).bar - (*grid.begin()).bar;
- } else {
- bbt_bars = (*i).bar - (*grid.begin()).bar;
- }
+ 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;
- beats = distance (grid.begin(), grid.end()) - bbt_bars;
- double beat_density = ((distance (grid.begin(), grid.end()) + 1) * ((double) (upper - lower) / (double) (1 + grid.back().frame - grid.front().frame))) / 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;