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_object.h"
35 #include "gui_thread.h"
36 #include "keyeditor.h"
37 #include "location_ui.h"
38 #include "midi_tracer.h"
40 #include "public_editor.h"
41 #include "rc_option_editor.h"
42 #include "route_params_ui.h"
43 #include "shuttle_control.h"
44 #include "session_option_editor.h"
45 #include "speaker_dialog.h"
47 #include "theme_manager.h"
48 #include "time_info_box.h"
52 using namespace ARDOUR;
56 using namespace Gtkmm2ext;
59 ARDOUR_UI::set_session (Session *s)
61 SessionHandlePtr::set_session (s);
67 const XMLNode* node = _session->extra_xml (X_("UI"));
70 const XMLNodeList& children = node->children();
71 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
72 if ((*i)->name() == GUIObjectState::xml_node_name) {
73 gui_object_state->load (**i);
79 if (location_ui->get()) {
80 location_ui->get()->set_session(s);
83 if (speaker_config_window->get()) {
84 speaker_config_window->get()->set_speakers (s->get_speakers());
88 route_params->set_session (s);
91 if (add_route_dialog) {
92 add_route_dialog->set_session (s);
95 if (session_option_editor) {
96 session_option_editor->set_session (s);
100 shuttle_box->set_session (s);
103 for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
104 if (_global_port_matrix[*i]->get()) {
105 _global_port_matrix[*i]->get()->set_session (_session);
109 primary_clock->set_session (s);
110 secondary_clock->set_session (s);
111 big_clock->set_session (s);
112 preroll_clock->set_session (s);
113 postroll_clock->set_session (s);
114 time_info_box->set_session (s);
116 /* sensitize menu bar options that are now valid */
118 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
119 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
121 if (_session->locations()->num_range_markers()) {
122 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
124 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
127 if (!_session->monitor_out()) {
128 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
130 act->set_sensitive (false);
134 /* allow wastebasket flush again */
136 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
138 act->set_sensitive (true);
141 /* there are never any selections on startup */
143 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
144 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
145 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
146 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
147 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
149 rec_button.set_sensitive (true);
151 solo_alert_button.set_active (_session->soloing());
153 setup_session_options ();
155 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
156 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink));
157 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink));
158 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink));
160 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
161 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
162 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
163 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context());
165 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
166 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
167 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
168 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
169 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
170 _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ());
172 #ifdef HAVE_JACK_SESSION
173 engine->JackSessionEvent.connect (*_session, MISSING_INVALIDATOR, ui_bind (&Session::jack_session_event, _session, _1), gui_context());
176 /* Clocks are on by default after we are connected to a session, so show that here.
179 connect_dependents_to_session (s);
181 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
182 restore their modes or are explicitly set, we will cause the "new" mode to be saved
183 back to the session XML ("Extra") state.
186 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
188 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
193 map_transport_state ();
195 second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000);
196 point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
197 point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
203 ARDOUR_UI::unload_session (bool hide_stuff)
205 if (_session && _session->dirty()) {
206 std::vector<std::string> actions;
207 actions.push_back (_("Don't close"));
208 actions.push_back (_("Just close"));
209 actions.push_back (_("Save and close"));
210 switch (ask_about_saving_session (actions)) {
216 _session->save_state ("");
224 theme_manager->hide ();
227 second_connection.disconnect ();
228 point_one_second_connection.disconnect ();
229 point_oh_five_second_connection.disconnect ();
230 point_zero_one_second_connection.disconnect();
232 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
234 rec_button.set_sensitive (false);
239 /* drop everything attached to the blink signal */
246 update_buffer_load ();
252 ARDOUR_UI::toggle_big_clock_window ()
254 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
256 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
258 if (tact->get_active()) {
259 big_clock_window->get()->show_all ();
260 big_clock_window->get()->present ();
262 big_clock_window->get()->hide ();
268 ARDOUR_UI::toggle_speaker_config_window ()
270 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-speaker-config"));
272 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
274 if (tact->get_active()) {
275 speaker_config_window->get()->show_all ();
276 speaker_config_window->get()->present ();
278 speaker_config_window->get()->hide ();
284 ARDOUR_UI::new_midi_tracer_window ()
286 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
291 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
292 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
296 if (i == _midi_tracer_windows.end()) {
297 /* all our MIDITracer windows are visible; make a new one */
298 MidiTracer* t = new MidiTracer ();
301 _midi_tracer_windows.push_back (t);
303 /* re-use the hidden one */
309 ARDOUR_UI::toggle_rc_options_window ()
311 if (rc_option_editor == 0) {
312 rc_option_editor = new RCOptionEditor;
313 rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleRCOptionsEditor")));
314 rc_option_editor->set_session (_session);
317 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
319 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
321 if (tact->get_active()) {
322 rc_option_editor->show_all ();
323 rc_option_editor->present ();
325 rc_option_editor->hide ();
331 ARDOUR_UI::toggle_session_options_window ()
333 if (session_option_editor == 0) {
334 session_option_editor = new SessionOptionEditor (_session);
335 session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
338 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
340 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
342 if (tact->get_active()) {
343 session_option_editor->show_all ();
344 session_option_editor->present ();
346 session_option_editor->hide ();
352 ARDOUR_UI::create_location_ui ()
354 if (location_ui->get() == 0) {
355 location_ui->set (new LocationUIWindow ());
356 location_ui->get()->set_session (_session);
357 location_ui->get()->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
363 ARDOUR_UI::toggle_location_window ()
365 if (create_location_ui()) {
369 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
371 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
373 if (tact->get_active()) {
374 location_ui->get()->show_all ();
375 location_ui->get()->present ();
377 location_ui->get()->hide ();
383 ARDOUR_UI::toggle_key_editor ()
385 if (key_editor == 0) {
386 key_editor = new KeyEditor;
387 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
390 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
392 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
394 if (tact->get_active()) {
395 key_editor->show_all ();
396 key_editor->present ();
404 ARDOUR_UI::toggle_theme_manager ()
406 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
408 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
410 if (tact->get_active()) {
411 theme_manager->show_all ();
412 theme_manager->present ();
414 theme_manager->hide ();
420 ARDOUR_UI::create_bundle_manager ()
422 if (bundle_manager == 0) {
423 bundle_manager = new BundleManager (_session);
424 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
429 ARDOUR_UI::toggle_bundle_manager ()
431 create_bundle_manager ();
433 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
435 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
437 if (tact->get_active()) {
438 bundle_manager->show_all ();
439 bundle_manager->present ();
441 bundle_manager->hide ();
447 ARDOUR_UI::create_route_params ()
449 if (route_params == 0) {
450 route_params = new RouteParams_UI ();
451 route_params->set_session (_session);
452 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
458 ARDOUR_UI::toggle_route_params_window ()
460 if (create_route_params ()) {
464 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
466 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
468 if (tact->get_active()) {
469 route_params->show_all ();
470 route_params->present ();
472 route_params->hide ();
478 ARDOUR_UI::handle_locations_change (Location *)
481 if (_session->locations()->num_range_markers()) {
482 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
484 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
490 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
492 if (window_was_editor) {
494 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
495 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
496 float_big_clock (editor);
501 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
502 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
503 float_big_clock (mixer);