#include "ardour_ui.h"
#include "audio_clock.h"
+#include "enums_convert.h"
#include "gui_thread.h"
#include "keyboard.h"
#include "tooltips.h"
, _edit_by_click_field (false)
, _negative_allowed (false)
, edit_is_negative (false)
+ , _limit_pos (INT64_MAX - 1)
, _with_info (with_info)
, editing_attr (0)
, foreground_attr (0)
}
void
-AudioClock::render (cairo_t* cr, cairo_rectangle_t*)
+AudioClock::render (Cairo::RefPtr<Cairo::Context> const& ctx, cairo_rectangle_t*)
{
+ cairo_t* cr = ctx->cobj();
/* main layout: rounded rect, plus the text */
if (_need_bg) {
set (last_when, true);
}
-void
-AudioClock::metric_position_changed ()
-{
- set (last_when, true);
-}
-
void
AudioClock::session_configuration_changed (std::string p)
{
when = when - offset;
}
+ if (when > _limit_pos) {
+ when = _limit_pos;
+ } else if (when < -_limit_pos) {
+ when = -_limit_pos;
+ }
+
if (when == last_when && !force) {
#if 0 // XXX return if no change and no change forced. verify Aug/2014
if (_mode != Timecode && _mode != MinSec) {
switch (sync_src) {
case Engine:
- _left_btn.set_text (sync_source_to_string (sync_src, true));
- _right_btn.set_text ("");
+ _left_btn.set_text (sync_source_to_string (sync_src, true), true);
+ _right_btn.set_text ("", true);
break;
case MIDIClock:
if (slave) {
- _left_btn.set_text (sync_source_to_string (sync_src, true));
+ _left_btn.set_text (sync_source_to_string (sync_src, true), true);
_right_btn.set_text (slave->approximate_current_delta (), true);
} else {
- _left_btn.set_text (_("--pending--"));
- _right_btn.set_text ("");
+ _left_btn.set_text (_("--pending--"), true);
+ _right_btn.set_text ("", true);
}
break;
case LTC:
TimecodeSlave* tcslave;
if ((tcslave = dynamic_cast<TimecodeSlave*>(_session->slave())) != 0) {
matching = (tcslave->apparent_timecode_format() == _session->config.get_timecode_format());
- _left_btn.set_text (string_compose ("%1 <span face=\"monospace\" foreground=\"%3\">%2</span>",
+ _left_btn.set_text (string_compose ("%1<span face=\"monospace\" foreground=\"%3\">%2</span>",
sync_source_to_string(sync_src, true)[0],
dynamic_cast<TimecodeSlave*>(slave)->approximate_current_position (),
matching ? "#66ff66" : "#ff3333"
_right_btn.set_text (slave->approximate_current_delta (), true);
}
} else {
- _left_btn.set_text (_("--pending--"));
- _right_btn.set_text ("");
+ _left_btn.set_text (_("--pending--"), true);
+ _right_btn.set_text ("", true);
}
break;
}
} else {
_left_btn.set_text (string_compose ("%1/%2",
- _("INT"), sync_source_to_string(sync_src, true)));
- _right_btn.set_text ("");
+ _("INT"), sync_source_to_string(sync_src, true)), true);
+ _right_btn.set_text ("", true);
+ }
+}
+
+void
+AudioClock::set_out_of_bounds (bool negative)
+{
+ if (is_duration) {
+ if (negative) {
+ _layout->set_text (" >>> -- <<< ");
+ } else {
+ _layout->set_text (" >>> ++ <<< ");
+ }
+ } else {
+ if (negative) {
+ _layout->set_text (" <<<<<<<<<< ");
+ } else {
+ _layout->set_text (" >>>>>>>>>> ");
+ }
}
}
if (_off) {
_layout->set_text (" ----------");
- _left_btn.set_text ("");
- _right_btn.set_text ("");
+ _left_btn.set_text ("", true);
+ _right_btn.set_text ("", true);
return;
}
negative = true;
}
- if (negative) {
+ if (when >= _limit_pos) {
+ set_out_of_bounds (negative);
+ } else if (negative) {
snprintf (buf, sizeof (buf), "-%10" PRId64, when);
+ _layout->set_text (buf);
} else {
snprintf (buf, sizeof (buf), " %10" PRId64, when);
+ _layout->set_text (buf);
}
- _layout->set_text (buf);
-
if (_with_info) {
framecnt_t rate = _session->frame_rate();
sprintf (buf, "%" PRId64 "Hz", rate);
}
- _left_btn.set_text (string_compose ("%1 %2", _("SR"), buf));
+ _left_btn.set_text (string_compose ("%1 %2", _("SR"), buf), true);
float vid_pullup = _session->config.get_video_pullup();
if (vid_pullup == 0.0) {
- _right_btn.set_text (string_compose ("%1 off", _("Pull")));
+ _right_btn.set_text ("", true);
} else {
sprintf (buf, _("%+.4f%%"), vid_pullup);
- _right_btn.set_text (string_compose ("%1 %2", _("Pull"), buf));
+ _right_btn.set_text (string_compose ("%1 %2", _("Pull"), buf), true);
}
}
}
if (_off) {
_layout->set_text (" --:--:--.---");
- _left_btn.set_text ("");
- _right_btn.set_text ("");
+ _left_btn.set_text ("", true);
+ _right_btn.set_text ("", true);
return;
}
- print_minsec (when, buf, sizeof (buf), _session->frame_rate());
+ if (when >= _limit_pos || when <= -_limit_pos) {
+ set_out_of_bounds (when < 0);
+ } else {
+ print_minsec (when, buf, sizeof (buf), _session->frame_rate());
+ _layout->set_text (buf);
+ }
- _layout->set_text (buf);
set_slave_info();
}
if (_off) {
_layout->set_text (" --:--:--:--");
- _left_btn.set_text ("");
- _right_btn.set_text ("");
+ _left_btn.set_text ("", true);
+ _right_btn.set_text ("", true);
return;
}
when = -when;
negative = true;
}
+ if (when >= _limit_pos) {
+ set_out_of_bounds (negative);
+ set_slave_info();
+ return;
+ }
if (is_duration) {
_session->timecode_duration (when, TC);
Timecode::BBT_Time BBT;
bool negative = false;
- if (_off) {
+ if (_off || when >= _limit_pos || when < -_limit_pos) {
_layout->set_text (" ---|--|----");
- _left_btn.set_text ("");
- _right_btn.set_text ("");
+ _left_btn.set_text ("", true);
+ _right_btn.set_text ("", true);
return;
}
if (m.tempo().note_type() == 4) {
snprintf (buf, sizeof(buf), "\u2669 = %.3f", _session->tempo_map().tempo_at_frame (pos).note_types_per_minute());
+ _left_btn.set_text (string_compose ("%1", buf), true);
} else if (m.tempo().note_type() == 8) {
snprintf (buf, sizeof(buf), "\u266a = %.3f", _session->tempo_map().tempo_at_frame (pos).note_types_per_minute());
+ _left_btn.set_text (string_compose ("%1", buf), true);
} else {
- snprintf (buf, sizeof(buf), "%.1f@%.3f", _session->tempo_map().tempo_at_frame (pos).note_types_per_minute(), m.tempo().note_type());
+ snprintf (buf, sizeof(buf), "%.1f = %.3f", m.tempo().note_type(), _session->tempo_map().tempo_at_frame (pos).note_types_per_minute());
+ _left_btn.set_text (string_compose ("%1: %2", S_("Tempo|T"), buf), true);
}
- _left_btn.set_text (string_compose ("%1: %2", S_("Tempo|T"), buf));
snprintf (buf, sizeof(buf), "%g/%g", m.meter().divisions_per_bar(), m.meter().note_divisor());
- _right_btn.set_text (string_compose ("%1: %2", S_("Meter|M"), buf));
+ _right_btn.set_text (string_compose ("%1: %2", S_("TimeSignature|TS"), buf), true);
}
}
if (_session) {
+ int64_t limit_sec = UIConfiguration::instance().get_clock_display_limit ();
+ if (limit_sec > 0) {
+ _limit_pos = (framecnt_t) floor (limit_sec * _session->frame_rate());
+ }
+
Config->ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_configuration_changed, this, _1), gui_context());
_session->config.ParameterChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_configuration_changed, this, _1), gui_context());
_session->tempo_map().PropertyChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_property_changed, this, _1), gui_context());
- _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::metric_position_changed, this), gui_context());
+ _session->tempo_map().MetricPositionChanged.connect (_session_connections, invalidator (*this), boost::bind (&AudioClock::session_property_changed, this, _1), gui_context());
- XMLProperty const * prop;
XMLNode* node = _session->extra_xml (X_("ClockModes"));
- AudioClock::Mode amode;
if (node) {
for (XMLNodeList::const_iterator i = node->children().begin(); i != node->children().end(); ++i) {
- if ((prop = (*i)->property (X_("name"))) && prop->value() == _name) {
+ std::string name;
+ if ((*i)->get_property (X_("name"), name) && name == _name) {
- if ((prop = (*i)->property (X_("mode"))) != 0) {
- amode = AudioClock::Mode (string_2_enum (prop->value(), amode));
+ AudioClock::Mode amode;
+ if ((*i)->get_property (X_("mode"), amode)) {
set_mode (amode, true);
}
- if ((prop = (*i)->property (X_("on"))) != 0) {
- set_off (!string_is_affirmative (prop->value()));
+ bool on;
+ if ((*i)->get_property (X_("on"), on)) {
+ set_off (!on);
}
break;
}