21 #include "gtk2ardour-config.h"
31 #include <sigc++/bind.h>
72 if (create_editor ()) {
77 if (create_mixer ()) {
82 if (create_meterbridge ()) {
89 we_have_dependents ();
92 HBox* status_bar_packer = manage (
new HBox);
93 EventBox* status_bar_event_box = manage (
new EventBox);
95 status_bar_event_box->add (status_bar_label);
96 status_bar_event_box->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
97 status_bar_label.set_size_request (300, -1);
98 status_bar_packer->pack_start (*status_bar_event_box,
true,
true, 6);
100 status_bar_label.show ();
101 status_bar_event_box->show ();
102 status_bar_packer->show ();
106 editor->get_status_bar_packer().pack_start (*status_bar_packer,
true,
true);
107 editor->get_status_bar_packer().pack_start (menu_bar_base,
false,
false, 2);
109 top_packer.pack_start (menu_bar_base,
false,
false);
112 editor->add_toplevel_menu (top_packer);
114 editor->add_transport_frame (transport_frame);
128 set_tip (roll_button,
_(
"Play from playhead"));
129 set_tip (stop_button,
_(
"Stop playback"));
130 set_tip (rec_button,
_(
"Toggle record"));
131 set_tip (play_selection_button,
_(
"Play range/selection"));
132 set_tip (goto_start_button,
_(
"Go to start of session"));
133 set_tip (goto_end_button,
_(
"Go to end of session"));
134 set_tip (auto_loop_button,
_(
"Play loop range"));
135 set_tip (midi_panic_button,
_(
"MIDI Panic\nSend note off and reset controller messages on all MIDI channels"));
136 set_tip (auto_return_button,
_(
"Return to last playback start when stopped"));
137 set_tip (follow_edits_button,
_(
"Playhead follows Range Selections and Edits"));
138 set_tip (auto_input_button,
_(
"Be sensible about input monitoring"));
139 set_tip (click_button,
_(
"Enable/Disable audio click"));
140 set_tip (solo_alert_button,
_(
"When active, something is soloed.\nClick to de-solo everything"));
141 set_tip (auditioning_alert_button,
_(
"When active, auditioning is taking place\nClick to stop the audition"));
142 set_tip (feedback_alert_button,
_(
"When active, there is a feedback loop."));
143 set_tip (primary_clock,
_(
"<b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
144 set_tip (secondary_clock,
_(
"<b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify.\nText edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times.\n"));
145 set_tip (editor_meter_peak_display,
_(
"Reset All Peak Indicators"));
146 set_tip (error_alert_button,
_(
"Show Error Log and acknowledge warnings"));
148 synchronize_sync_source_and_video_pullup ();
150 editor->setup_tooltips ();
156 bool handled =
false;
158 switch (ev->button) {
160 status_bar_label.set_text (
"");
171 ARDOUR_UI::display_message (
const char *prefix, gint prefix_len, RefPtr<TextBuffer::Tag> ptag, RefPtr<TextBuffer::Tag> mtag,
const char *msg)
175 UI::display_message (prefix, prefix_len, ptag, mtag, msg);
179 if (strcmp (prefix,
_(
"[ERROR]: ")) == 0) {
180 text =
"<span color=\"red\" weight=\"bold\">";
182 }
else if (strcmp (prefix,
_(
"[WARNING]: ")) == 0) {
183 text =
"<span color=\"yellow\" weight=\"bold\">";
184 ll = LogLevelWarning;
185 }
else if (strcmp (prefix,
_(
"[INFO]: ")) == 0) {
186 text =
"<span color=\"green\" weight=\"bold\">";
189 text =
"<span color=\"white\" weight=\"bold\">???";
192 _log_not_acknowledged = std::max(_log_not_acknowledged, ll);
199 status_bar_label.set_markup (text);
219 #define PX_SCALE(px) std::max((float)px, rintf((float)px * ARDOUR_UI::ui_scale))
226 transport_tearoff_hbox.set_border_width (
PX_SCALE(3));
227 transport_tearoff_hbox.set_spacing (
PX_SCALE(3));
229 transport_tearoff = manage (
new TearOff (transport_tearoff_hbox));
230 transport_tearoff->set_name (
"TransportBase");
231 transport_tearoff->tearoff_window().signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (
relay_key_press), &transport_tearoff->tearoff_window()),
false);
234 transport_tearoff->set_can_be_torn_off (
false);
237 transport_hbox.pack_start (*transport_tearoff,
true,
false);
239 transport_base.set_name (
"TransportBase");
240 transport_base.add (transport_hbox);
242 transport_frame.set_shadow_type (SHADOW_OUT);
243 transport_frame.set_name (
"BaseFrame");
244 transport_frame.add (transport_base);
246 transport_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*
this, &
ARDOUR_UI::detach_tearoff), static_cast<Box*>(&top_packer),
247 static_cast<Widget*>(&transport_frame)));
248 transport_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*
this, &
ARDOUR_UI::reattach_tearoff), static_cast<Box*> (&top_packer),
249 static_cast<Widget*> (&transport_frame), 1));
250 transport_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*
this, &
ARDOUR_UI::detach_tearoff), static_cast<Box*>(&top_packer),
251 static_cast<Widget*>(&transport_frame)));
252 transport_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*
this, &
ARDOUR_UI::reattach_tearoff), static_cast<Box*> (&top_packer),
253 static_cast<Widget*> (&transport_frame), 1));
255 auto_return_button.set_text(
_(
"Auto Return"));
257 follow_edits_button.set_text(
_(
"Follow Edits"));
265 click_button.set_related_action (act);
268 auto_return_button.set_name (
"transport option button");
269 follow_edits_button.set_name (
"transport option button");
270 auto_input_button.set_name (
"transport option button");
274 click_button.set_name (
"transport button");
275 sync_button.set_name (
"transport active option button");
277 stop_button.set_active (
true);
299 stop_button.set_related_action (act);
301 roll_button.set_related_action (act);
303 rec_button.set_related_action (act);
305 goto_start_button.set_related_action (act);
307 goto_end_button.set_related_action (act);
309 auto_loop_button.set_related_action (act);
311 play_selection_button.set_related_action (act);
313 midi_panic_button.set_related_action (act);
315 sync_button.set_related_action (act);
327 auto_return_button.set_related_action (act);
329 follow_edits_button.set_related_action (act);
331 auto_input_button.set_related_action (act);
337 solo_alert_button.set_name (
"rude solo");
339 auditioning_alert_button.set_name (
"rude audition");
341 feedback_alert_button.set_name (
"feedback alert");
343 error_alert_button.set_name (
"error alert");
346 error_alert_button.set_related_action(act);
347 error_alert_button.set_fallthrough_to_parent(
true);
349 alert_box.set_homogeneous (
true);
350 alert_box.set_spacing (
PX_SCALE(2));
351 alert_box.pack_start (solo_alert_button,
true,
true);
352 alert_box.pack_start (auditioning_alert_button,
true,
true);
353 alert_box.pack_start (feedback_alert_button,
true,
true);
359 Glib::RefPtr<SizeGroup> transport_button_size_group = SizeGroup::create (SIZE_GROUP_BOTH);
360 transport_button_size_group->add_widget (goto_start_button);
361 transport_button_size_group->add_widget (goto_end_button);
362 transport_button_size_group->add_widget (auto_loop_button);
363 transport_button_size_group->add_widget (rec_button);
364 transport_button_size_group->add_widget (play_selection_button);
365 transport_button_size_group->add_widget (roll_button);
366 transport_button_size_group->add_widget (stop_button);
369 midi_panic_button.set_size_request (
PX_SCALE(25), -1);
374 HBox* tbox1 = manage (
new HBox);
375 HBox* tbox2 = manage (
new HBox);
376 HBox* tbox = manage (
new HBox);
378 VBox* vbox1 = manage (
new VBox);
379 VBox* vbox2 = manage (
new VBox);
381 Alignment* a1 = manage (
new Alignment);
382 Alignment* a2 = manage (
new Alignment);
389 tbox1->pack_start (midi_panic_button,
true,
true, 5);
390 tbox1->pack_start (click_button,
true,
true, 5);
393 tbox1->pack_start (goto_start_button,
true,
true);
394 tbox1->pack_start (goto_end_button,
true,
true);
395 tbox1->pack_start (auto_loop_button,
true,
true);
398 tbox2->pack_start (play_selection_button,
true,
true);
400 tbox2->pack_start (roll_button,
true,
true);
401 tbox2->pack_start (stop_button,
true,
true);
402 tbox2->pack_start (rec_button,
true,
true, 5);
404 vbox1->pack_start (*tbox1,
true,
true);
405 vbox2->pack_start (*tbox2,
true,
true);
408 a1->set (0.5, 0.5, 0.0, 1.0);
410 a2->set (0.5, 0.5, 0.0, 1.0);
412 tbox->pack_start (*a1,
false,
false);
413 tbox->pack_start (*a2,
false,
false);
415 HBox* clock_box = manage (
new HBox);
417 clock_box->pack_start (*primary_clock,
false,
false);
419 clock_box->pack_start (*secondary_clock,
false,
false);
421 clock_box->set_spacing (
PX_SCALE(3));
424 shuttle_box->show ();
426 VBox* transport_vbox = manage (
new VBox);
427 transport_vbox->set_name (
"TransportBase");
428 transport_vbox->set_border_width (0);
429 transport_vbox->set_spacing (
PX_SCALE(3));
430 transport_vbox->pack_start (*tbox,
true,
true, 0);
433 transport_vbox->pack_start (*shuttle_box,
false,
false, 0);
439 transport_tearoff_hbox.pack_start (*time_info_box,
false,
false);
442 transport_tearoff_hbox.pack_start (*transport_vbox,
false,
false);
446 VBox* auto_box = manage (
new VBox);
447 auto_box->set_homogeneous (
true);
448 auto_box->set_spacing (
PX_SCALE(2));
449 auto_box->pack_start (sync_button,
true,
true);
451 auto_box->pack_start (follow_edits_button,
true,
true);
452 auto_box->pack_start (auto_return_button,
true,
true);
456 transport_tearoff_hbox.pack_start (*auto_box,
false,
false);
458 transport_tearoff_hbox.pack_start (*clock_box,
true,
true);
461 transport_tearoff_hbox.pack_start (*auto_box,
false,
false);
465 transport_tearoff_hbox.pack_start (*time_info_box,
false,
false);
469 transport_tearoff_hbox.pack_start (_editor_transport_box,
false,
false);
473 transport_tearoff_hbox.pack_start (alert_box,
false,
false);
474 transport_tearoff_hbox.pack_start (meter_box,
false,
false);
475 transport_tearoff_hbox.pack_start (editor_meter_peak_display,
false,
false);
479 Image* img = manage (
new Image ((::
get_icon (
X_(
"sae")))));
480 transport_tearoff_hbox.pack_end (*img,
false,
false);
485 set_transport_sensitivity (
false);
487 XMLNode* tnode = tearoff_settings (
"transport");
489 transport_tearoff->set_state (*tnode);
505 b->reorder_child (*w, n);
511 if (transport_tearoff) transport_tearoff->put_it_back();
512 if (editor) editor->reattach_all_tearoffs ();
518 if (solo_alert_button.get_active() != onoff) {
519 solo_alert_button.set_active (onoff);
526 auditioning_alert_button.set_active (onoff);
527 set_transport_sensitivity (!onoff);
540 _session->cancel_audition();
549 if (_session->soloing()) {
550 _session->set_solo (_session->get_routes(),
false);
551 }
else if (_session->listening()) {
552 _session->set_listen (_session->get_routes(),
false);
567 bool do_toggle =
true;
568 if (ev->button == 1) {
569 if (_log_not_acknowledged == LogLevelError) {
572 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
573 if (tact && tact->get_active()) {
577 _log_not_acknowledged = LogLevelNone;
591 if (_session->soloing() || _session->listening()) {
593 solo_alert_button.set_active (
true);
595 solo_alert_button.set_active (
false);
598 solo_alert_button.set_active (
false);
605 if (_session == 0 || !_session->config.get_external_sync()) {
607 sync_button.set_active (
false);
611 if (!_session->transport_locked()) {
615 sync_button.set_active (
true);
617 sync_button.set_active (
false);
621 sync_button.set_active (
true);
632 if (_session->is_auditioning()) {
634 auditioning_alert_button.set_active (
true);
636 auditioning_alert_button.set_active (
false);
639 auditioning_alert_button.set_active (
false);
646 if (_feedback_exists) {
648 feedback_alert_button.set_active (
true);
650 feedback_alert_button.set_active (
false);
653 feedback_alert_button.set_active (
false);
660 switch (_log_not_acknowledged) {
664 error_alert_button.set_custom_led_color(0xff0000ff);
666 error_alert_button.set_custom_led_color(0x880000ff);
669 case LogLevelWarning:
670 error_alert_button.set_custom_led_color(0xccaa00ff);
673 error_alert_button.set_custom_led_color(0x88cc00ff);
676 error_alert_button.set_custom_led_color(0x333333ff);
687 shuttle_box->set_sensitive (yn);
703 editor->update_tearoff_visibility ();
711 editor->maximise_editing_space ();
719 editor->restore_editing_space ();
731 rc_option_editor->set_current_page (
_(
"GUI"));
738 if (ev->button != 3) {
748 rc_option_editor->set_current_page (
_(
"Misc"));
758 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
761 ui_config->set_follow_edits (tact->get_active ());
bool relay_key_press(GdkEventKey *ev, Gtk::Window *win)
void secondary_clock_value_changed()
void display_message(const char *prefix, gint prefix_len, Glib::RefPtr< Gtk::TextBuffer::Tag > ptag, Glib::RefPtr< Gtk::TextBuffer::Tag > mtag, const char *msg)
void set(framepos_t, bool force=false, ARDOUR::framecnt_t offset=0)
XMLNode * tearoff_settings(const char *) const
bool click_button_clicked(GdkEventButton *)
LIBGTKMM2EXT_API Glib::RefPtr< Gtk::Action > get_action(const char *group, const char *name)
bool error_alert_press(GdkEventButton *)
LIBPBD_API Transmitter error
void toggle_follow_edits()
std::ostream & endmsg(std::ostream &ostr)
void detach_tearoff(Gtk::Box *parent, Gtk::Widget *contents)
void reattach_tearoff(Gtk::Box *parent, Gtk::Widget *contents, int32_t order)
bool audition_alert_press(GdkEventButton *ev)
void reattach_all_tearoffs()
LIBGTKMM2EXT_API void set_sensitive(std::vector< Glib::RefPtr< Gtk::Action > > &actions, bool)
LIBARDOUR_API RCConfiguration * Config
void soloing_changed(bool)
void auditioning_changed(bool)
void big_clock_value_changed()
void set_transport_sensitivity(bool)
void audition_blink(bool)
bool feedback_alert_press(GdkEventButton *)
bool solo_alert_press(GdkEventButton *ev)
LIBARDOUR_API RuntimeProfile * Profile
void feedback_blink(bool)
void primary_clock_value_changed()
void map_parameters(boost::function< void(std::string)> &)
bool status_bar_button_press(GdkEventButton *)
void maximise_editing_space()
XMLNode * extra_xml(const std::string &str, bool add_if_missing=false)
static sigc::signal< void, framepos_t, bool, framepos_t > Clock
XMLNode * child(const char *) const
void parameter_changed(std::string)
Glib::RefPtr< Gdk::Pixbuf > get_icon(const char *cname)
#define MISSING_INVALIDATOR
void update_tearoff_visibility()
void restore_editing_space()
Editing of options which are obtained from and written back to one of the .rc files.
std::vector< Glib::RefPtr< Gtk::Action > > transport_sensitive_actions
void _auditioning_changed(bool)