2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /* This file contains any ARDOUR_UI methods that require knowledge of
21 the various dialog boxes, and exists so that no compilation dependency
22 exists between the main ARDOUR_UI modules and their respective classes.
23 This is to cut down on the compile times. It also helps with my sanity.
26 #include "ardour/session.h"
27 #include "ardour/audioengine.h"
30 #include "add_route_dialog.h"
31 #include "ardour_ui.h"
32 #include "bundle_manager.h"
33 #include "global_port_matrix.h"
34 #include "gui_thread.h"
35 #include "keyeditor.h"
36 #include "location_ui.h"
37 #include "midi_tracer.h"
39 #include "public_editor.h"
40 #include "rc_option_editor.h"
41 #include "route_params_ui.h"
42 #include "session_option_editor.h"
43 #include "speaker_dialog.h"
45 #include "theme_manager.h"
49 using namespace ARDOUR;
53 using namespace Gtkmm2ext;
56 ARDOUR_UI::set_session (Session *s)
58 SessionHandlePtr::set_session (s);
64 if (location_ui->get()) {
65 location_ui->get()->set_session(s);
68 if (speaker_config_window->get()) {
69 speaker_config_window->get()->set_speakers (s->get_speakers());
73 route_params->set_session (s);
76 if (add_route_dialog) {
77 add_route_dialog->set_session (s);
80 if (session_option_editor) {
81 session_option_editor->set_session (s);
84 for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
85 if (_global_port_matrix[*i]->get()) {
86 _global_port_matrix[*i]->get()->set_session (_session);
90 primary_clock.set_session (s);
91 secondary_clock.set_session (s);
92 big_clock.set_session (s);
93 preroll_clock.set_session (s);
94 postroll_clock.set_session (s);
96 /* sensitize menu bar options that are now valid */
98 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
99 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
101 if (_session->locations()->num_range_markers()) {
102 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
104 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
107 if (!_session->monitor_out()) {
108 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
110 act->set_sensitive (false);
114 /* allow wastebasket flush again */
116 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
118 act->set_sensitive (true);
121 /* there are never any selections on startup */
123 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
124 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
125 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
126 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
127 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
129 rec_button.set_sensitive (true);
130 shuttle_box.set_sensitive (true);
131 solo_alert_button.set_active (_session->soloing());
133 setup_session_options ();
135 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
136 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink));
137 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink));
138 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink));
140 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
141 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
142 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
143 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context());
145 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
146 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
147 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
148 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
149 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
151 #ifdef HAVE_JACK_SESSION
152 engine->JackSessionEvent.connect (*_session, MISSING_INVALIDATOR, ui_bind (&Session::jack_session_event, _session, _1), gui_context());
155 /* Clocks are on by default after we are connected to a session, so show that here.
158 connect_dependents_to_session (s);
160 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
161 restore their modes or are explicitly set, we will cause the "new" mode to be saved
162 back to the session XML ("Extra") state.
165 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
167 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
172 map_transport_state ();
174 second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000);
175 point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
176 point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
180 ARDOUR_UI::unload_session (bool hide_stuff)
182 if (_session && _session->dirty()) {
183 switch (ask_about_saving_session (_("close"))) {
189 _session->save_state ("");
197 theme_manager->hide ();
200 second_connection.disconnect ();
201 point_one_second_connection.disconnect ();
202 point_oh_five_second_connection.disconnect ();
203 point_zero_one_second_connection.disconnect();
205 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
207 rec_button.set_sensitive (false);
208 shuttle_box.set_sensitive (false);
213 /* drop everything attached to the blink signal */
219 update_buffer_load ();
225 ARDOUR_UI::toggle_big_clock_window ()
227 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
229 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
231 if (tact->get_active()) {
232 big_clock_window->get()->show_all ();
233 big_clock_window->get()->present ();
235 big_clock_window->get()->hide ();
241 ARDOUR_UI::toggle_speaker_config_window ()
243 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-speaker-config"));
245 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
247 if (tact->get_active()) {
248 speaker_config_window->get()->show_all ();
249 speaker_config_window->get()->present ();
251 speaker_config_window->get()->hide ();
257 ARDOUR_UI::new_midi_tracer_window ()
259 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
264 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
265 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
269 if (i == _midi_tracer_windows.end()) {
270 /* all our MIDITracer windows are visible; make a new one */
271 MidiTracer* t = new MidiTracer ();
274 _midi_tracer_windows.push_back (t);
276 /* re-use the hidden one */
282 ARDOUR_UI::toggle_rc_options_window ()
284 if (rc_option_editor == 0) {
285 rc_option_editor = new RCOptionEditor;
286 rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleRCOptionsEditor")));
287 rc_option_editor->set_session (_session);
290 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
292 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
294 if (tact->get_active()) {
295 rc_option_editor->show_all ();
296 rc_option_editor->present ();
298 rc_option_editor->hide ();
304 ARDOUR_UI::toggle_session_options_window ()
306 if (session_option_editor == 0) {
307 session_option_editor = new SessionOptionEditor (_session);
308 session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
311 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
313 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
315 if (tact->get_active()) {
316 session_option_editor->show_all ();
317 session_option_editor->present ();
319 session_option_editor->hide ();
325 ARDOUR_UI::create_location_ui ()
327 if (location_ui->get() == 0) {
328 location_ui->set (new LocationUIWindow ());
329 location_ui->get()->set_session (_session);
330 location_ui->get()->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
336 ARDOUR_UI::toggle_location_window ()
338 if (create_location_ui()) {
342 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
344 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
346 if (tact->get_active()) {
347 location_ui->get()->show_all ();
348 location_ui->get()->present ();
350 location_ui->get()->hide ();
356 ARDOUR_UI::toggle_key_editor ()
358 if (key_editor == 0) {
359 key_editor = new KeyEditor;
360 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
363 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
365 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
367 if (tact->get_active()) {
368 key_editor->show_all ();
369 key_editor->present ();
377 ARDOUR_UI::toggle_theme_manager ()
379 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
381 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
383 if (tact->get_active()) {
384 theme_manager->show_all ();
385 theme_manager->present ();
387 theme_manager->hide ();
393 ARDOUR_UI::create_bundle_manager ()
395 if (bundle_manager == 0) {
396 bundle_manager = new BundleManager (_session);
397 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
402 ARDOUR_UI::toggle_bundle_manager ()
404 create_bundle_manager ();
406 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
408 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
410 if (tact->get_active()) {
411 bundle_manager->show_all ();
412 bundle_manager->present ();
414 bundle_manager->hide ();
420 ARDOUR_UI::create_route_params ()
422 if (route_params == 0) {
423 route_params = new RouteParams_UI ();
424 route_params->set_session (_session);
425 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
431 ARDOUR_UI::toggle_route_params_window ()
433 if (create_route_params ()) {
437 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
439 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
441 if (tact->get_active()) {
442 route_params->show_all ();
443 route_params->present ();
445 route_params->hide ();
451 ARDOUR_UI::handle_locations_change (Location *)
454 if (_session->locations()->num_range_markers()) {
455 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
457 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
463 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
465 if (window_was_editor) {
467 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
468 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
469 float_big_clock (editor);
474 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
475 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
476 float_big_clock (mixer);