we_have_dependents ();
- setup_clock ();
- setup_transport();
- build_menu_bar ();
-
theme_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleThemeManager")));
#ifdef TOP_MENUBAR
HBox* status_bar_packer = manage (new HBox);
+ EventBox* status_bar_event_box = manage (new EventBox);
+ status_bar_event_box->add (status_bar_label);
+ status_bar_event_box->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
status_bar_label.set_size_request (300, -1);
- status_bar_packer->pack_start (status_bar_label, true, true, 6);
+ status_bar_packer->pack_start (*status_bar_event_box, true, true, 6);
status_bar_packer->pack_start (error_log_button, false, false);
- error_log_button.signal_clicked().connect (sigc::mem_fun (*this, &UI::toggle_errors));
+ status_bar_label.show ();
+ status_bar_event_box->show ();
+ status_bar_packer->show ();
+ error_log_button.show ();
+
+ error_log_button.signal_clicked().connect (mem_fun (*this, &UI::toggle_errors));
+ status_bar_event_box->signal_button_press_event().connect (mem_fun (*this, &ARDOUR_UI::status_bar_button_press));
editor->get_status_bar_packer().pack_start (*status_bar_packer, true, true);
editor->get_status_bar_packer().pack_start (menu_bar_base, false, false, 6);
editor->add_toplevel_controls (top_packer);
+ setup_clock ();
+ setup_transport();
+ build_menu_bar ();
+
+ setup_tooltips ();
+
return 0;
}
+void
+ARDOUR_UI::setup_tooltips ()
+{
+ set_tip (roll_button, _("Play from playhead"));
+ set_tip (stop_button, _("Stop playback"));
+ set_tip (rec_button, _("Toggle record"));
+ set_tip (play_selection_button, _("Play range/selection"));
+ set_tip (join_play_range_button, _("Always play range/selection"));
+ set_tip (goto_start_button, _("Go to start of session"));
+ set_tip (goto_end_button, _("Go to end of session"));
+ set_tip (auto_loop_button, _("Play loop range"));
+
+ set_tip (auto_return_button, _("Return to last playback start when stopped"));
+ set_tip (auto_play_button, _("Start playback after any locate"));
+ set_tip (auto_input_button, _("Be sensible about input monitoring"));
+ set_tip (punch_in_button, _("Start recording at auto-punch start"));
+ set_tip (punch_out_button, _("Stop recording at auto-punch end"));
+ set_tip (click_button, _("Enable/Disable audio click"));
+ set_tip (sync_button, _("Enable/Disable external positional sync"));
+ set_tip (time_master_button, string_compose (_("Does %1 control the time?"), PROGRAM_NAME));
+ set_tip (shuttle_box, _("Shuttle speed control"));
+ set_tip (shuttle_units_button, _("Select semitones or %%-age for speed display"));
+ set_tip (speed_display_box, _("Current transport speed"));
+ set_tip (solo_alert_button, _("When active, something is soloed.\nClick to de-solo everything"));
+ set_tip (auditioning_alert_button, _("When active, auditioning is taking place\nClick to stop the audition"));
+ set_tip (primary_clock, _("Primary clock"));
+ set_tip (secondary_clock, _("secondary clock"));
+
+ editor->setup_tooltips ();
+}
+
+bool
+ARDOUR_UI::status_bar_button_press (GdkEventButton* ev)
+{
+ bool handled = false;
+
+ switch (ev->button) {
+ case 1:
+ status_bar_label.set_text ("");
+ handled = true;
+ break;
+ default:
+ break;
+ }
+
+ return handled;
+}
+
void
ARDOUR_UI::display_message (const char *prefix, gint prefix_len, RefPtr<TextBuffer::Tag> ptag, RefPtr<TextBuffer::Tag> mtag, const char *msg)
{
#endif
}
-#if 0
-static bool
-null_crossing (GdkEventCrossing* /* ignored */)
+XMLNode*
+ARDOUR_UI::tearoff_settings (const char* name) const
{
- return true;
-}
+ XMLNode* ui_node = Config->extra_xml(X_("UI"));
+
+ if (ui_node) {
+ XMLNode* tearoff_node = ui_node->child (X_("Tearoffs"));
+ if (tearoff_node) {
+ XMLNode* mnode = tearoff_node->child (name);
+ return mnode;
+ }
+ }
-static void
-block_prelight (Gtk::Widget& w)
-{
- w.signal_enter_notify_event().connect (sigc::ptr_fun (null_crossing), false);
- w.signal_leave_notify_event().connect (sigc::ptr_fun (null_crossing), false);
+ return 0;
}
-#endif
void
ARDOUR_UI::setup_transport ()
play_selection_button.set_name ("TransportButton");
rec_button.set_name ("TransportRecButton");
auto_loop_button.set_name ("TransportButton");
+ join_play_range_button.set_name ("TransportButton");
auto_return_button.set_name ("TransportButton");
auto_play_button.set_name ("TransportButton");
w = manage (new Image (get_icon (X_("transport_loop"))));
w->show();
auto_loop_button.add (*w);
+ w = manage (new Image (get_icon (X_("join_tools"))));
+ w->show ();
+ join_play_range_button.add (*w);
RefPtr<Action> act;
act = ActionManager::get_action (X_("Transport"), X_("ToggleExternalSync"));
act->connect_proxy (sync_button);
- ARDOUR_UI::instance()->tooltips().set_tip (roll_button, _("Play from playhead"));
- ARDOUR_UI::instance()->tooltips().set_tip (stop_button, _("Stop playback"));
- ARDOUR_UI::instance()->tooltips().set_tip (play_selection_button, _("Play range/selection"));
- ARDOUR_UI::instance()->tooltips().set_tip (goto_start_button, _("Go to start of session"));
- ARDOUR_UI::instance()->tooltips().set_tip (goto_end_button, _("Go to end of session"));
- ARDOUR_UI::instance()->tooltips().set_tip (auto_loop_button, _("Play loop range"));
-
- ARDOUR_UI::instance()->tooltips().set_tip (auto_return_button, _("Return to last playback start when stopped"));
- ARDOUR_UI::instance()->tooltips().set_tip (auto_play_button, _("Start playback after any locate"));
- ARDOUR_UI::instance()->tooltips().set_tip (auto_input_button, _("Be sensible about input monitoring"));
- ARDOUR_UI::instance()->tooltips().set_tip (punch_in_button, _("Start recording at auto-punch start"));
- ARDOUR_UI::instance()->tooltips().set_tip (punch_out_button, _("Stop recording at auto-punch end"));
- ARDOUR_UI::instance()->tooltips().set_tip (click_button, _("Enable/Disable audio click"));
- ARDOUR_UI::instance()->tooltips().set_tip (sync_button, _("Enable/Disable external positional sync"));
- ARDOUR_UI::instance()->tooltips().set_tip (time_master_button, _("Does Ardour control the time?"));
- ARDOUR_UI::instance()->tooltips().set_tip (shuttle_box, _("Shuttle speed control"));
- ARDOUR_UI::instance()->tooltips().set_tip (shuttle_units_button, _("Select semitones or %%-age for speed display"));
- ARDOUR_UI::instance()->tooltips().set_tip (speed_display_box, _("Current transport speed"));
-
-
shuttle_box.set_flags (CAN_FOCUS);
shuttle_box.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK);
shuttle_box.set_size_request (100, 15);
secondary_clock.ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::secondary_clock_value_changed));
big_clock.ValueChanged.connect (sigc::mem_fun(*this, &ARDOUR_UI::big_clock_value_changed));
- ARDOUR_UI::instance()->tooltips().set_tip (primary_clock, _("Primary clock"));
- ARDOUR_UI::instance()->tooltips().set_tip (secondary_clock, _("secondary clock"));
-
ActionManager::get_action ("Transport", "ToggleAutoReturn")->connect_proxy (auto_return_button);
ActionManager::get_action ("Transport", "ToggleAutoPlay")->connect_proxy (auto_play_button);
ActionManager::get_action ("Transport", "ToggleAutoInput")->connect_proxy (auto_input_button);
/* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
solo_alert_button.set_name ("TransportSoloAlert");
- solo_alert_button.signal_pressed().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_toggle));
+ solo_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_press), false);
auditioning_alert_button.set_name ("TransportAuditioningAlert");
- auditioning_alert_button.signal_pressed().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_toggle));
-
- tooltips().set_tip (solo_alert_button, _("When active, something is soloed.\nClick to de-solo everything"));
- tooltips().set_tip (auditioning_alert_button, _("When active, auditioning is taking place\nClick to stop the audition"));
+ auditioning_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_press), false);
alert_box.pack_start (solo_alert_button, false, false);
alert_box.pack_start (auditioning_alert_button, false, false);
transport_tearoff_hbox.pack_start (*svbox, false, false, 3);
- transport_tearoff_hbox.pack_start (auto_loop_button, false, false);
- if (!Profile->get_sae()) {
- transport_tearoff_hbox.pack_start (play_selection_button, false, false);
+ if (Profile->get_sae()) {
+ transport_tearoff_hbox.pack_start (auto_loop_button);
+ transport_tearoff_hbox.pack_start (roll_button);
+ } else {
+ transport_tearoff_hbox.pack_start (auto_loop_button, false, false);
+ play_range_hbox.pack_start (play_selection_button, false, false);
+ play_range_hbox.pack_start (roll_button, false, false);
+ play_range_vbox.pack_start (play_range_hbox, false, false);
+ play_range_vbox.pack_start (join_play_range_button, false, false);
+ transport_tearoff_hbox.pack_start (play_range_vbox, false, false);
}
- transport_tearoff_hbox.pack_start (roll_button, false, false);
transport_tearoff_hbox.pack_start (stop_button, false, false);
transport_tearoff_hbox.pack_start (rec_button, false, false, 6);
Image* img = manage (new Image ((::get_icon (X_("sae")))));
transport_tearoff_hbox.pack_end (*img, false, false, 6);
}
+
+ XMLNode* tnode = tearoff_settings ("transport");
+ if (tnode) {
+ transport_tearoff->set_state (*tnode);
+ }
}
void
void
ARDOUR_UI::auditioning_changed (bool onoff)
{
- UI::instance()->call_slot (boost::bind (&ARDOUR_UI::_auditioning_changed, this, onoff));
+ UI::instance()->call_slot (MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::_auditioning_changed, this, onoff));
}
-void
-ARDOUR_UI::audition_alert_toggle ()
+bool
+ARDOUR_UI::audition_alert_press (GdkEventButton* ev)
{
- if (session) {
- session->cancel_audition();
+ if (_session) {
+ _session->cancel_audition();
}
+ return true;
}
-void
-ARDOUR_UI::solo_alert_toggle ()
+bool
+ARDOUR_UI::solo_alert_press (GdkEventButton* ev)
{
- if (session) {
- session->set_solo (session->get_routes(), !session->soloing());
- }
+ if (_session) {
+ if (_session->soloing()) {
+ _session->set_solo (_session->get_routes(), false);
+ } else if (_session->listening()) {
+ _session->set_listen (_session->get_routes(), false);
+ }
+ }
+ return true;
}
void
ARDOUR_UI::solo_blink (bool onoff)
{
- if (session == 0) {
+ if (_session == 0) {
return;
}
- if (session->soloing()) {
+ if (_session->soloing() || _session->listening()) {
if (onoff) {
solo_alert_button.set_state (STATE_ACTIVE);
} else {
void
ARDOUR_UI::sync_blink (bool onoff)
{
- if (session == 0 || !session->config.get_external_sync()) {
+ if (_session == 0 || !_session->config.get_external_sync()) {
/* internal sync */
sync_button.set_visual_state (0);
return;
}
- if (!session->transport_locked()) {
+ if (!_session->transport_locked()) {
/* not locked, so blink on and off according to the onoff argument */
if (onoff) {
void
ARDOUR_UI::audition_blink (bool onoff)
{
- if (session == 0) {
+ if (_session == 0) {
return;
}
- if (session->is_auditioning()) {
+ if (_session->is_auditioning()) {
if (onoff) {
auditioning_alert_button.set_state (STATE_ACTIVE);
} else {
gint
ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev)
{
- if (!session) {
+ if (!_session) {
return true;
}
gint
ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
{
- if (!session) {
+ if (!_session) {
return true;
}
shuttle_grabbed = false;
shuttle_box.remove_modal_grab ();
if (Config->get_shuttle_behaviour() == Sprung) {
- if (session->config.get_auto_play() || roll_button.get_visual_state()) {
+ if (_session->config.get_auto_play() || roll_button.get_visual_state()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
- session->request_transport_speed (1.0);
+ _session->request_transport_speed (1.0);
stop_button.set_visual_state (0);
roll_button.set_visual_state (1);
} else {
shuttle_fract = 0;
- session->request_transport_speed (0.0);
+ _session->request_transport_speed (0.0);
}
shuttle_box.queue_draw ();
}
return true;
case 2:
- if (session->transport_rolling()) {
+ if (_session->transport_rolling()) {
shuttle_fract = SHUTTLE_FRACT_SPEED1;
- session->request_transport_speed (1.0);
+ _session->request_transport_speed (1.0);
stop_button.set_visual_state (0);
roll_button.set_visual_state (1);
} else {
gint
ARDOUR_UI::shuttle_box_scroll (GdkEventScroll* ev)
{
- if (!session) {
+ if (!_session) {
return true;
}
gint
ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev)
{
- if (!session || !shuttle_grabbed) {
+ if (!_session || !shuttle_grabbed) {
return true;
}
semitones = round (shuttle_fract / step);
speed = pow (2.0, (semitones / 12.0));
- session->request_transport_speed (speed);
+ _session->request_transport_speed (speed);
} else {
fract = -fract;
}
- session->request_transport_speed (shuttle_max_speed * fract);
+ _session->request_transport_speed (shuttle_max_speed * fract);
}
shuttle_box.queue_draw ();
void
ARDOUR_UI::update_speed_display ()
{
- if (!session) {
+ if (!_session) {
if (last_speed_displayed != 0) {
speed_display_label.set_text (_("stop"));
last_speed_displayed = 0;
}
char buf[32];
- float x = session->transport_speed ();
+ float x = _session->transport_speed ();
if (x != last_speed_displayed) {
if (x != 0) {
if (Config->get_shuttle_units() == Percentage) {
- snprintf (buf, sizeof (buf), "%.2f", x);
+ snprintf (buf, sizeof (buf), "%d", (int) round (x * 100));
} else {
if (x < 0) {