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 XMLNodeList& children = _session->extra_xml (X_("UI"))->children();
68 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
69 if ((*i)->name() == GUIObjectState::xml_node_name) {
70 gui_object_state->load (**i);
75 if (location_ui->get()) {
76 location_ui->get()->set_session(s);
79 if (speaker_config_window->get()) {
80 speaker_config_window->get()->set_speakers (s->get_speakers());
84 route_params->set_session (s);
87 if (add_route_dialog) {
88 add_route_dialog->set_session (s);
91 if (session_option_editor) {
92 session_option_editor->set_session (s);
96 shuttle_box->set_session (s);
99 for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
100 if (_global_port_matrix[*i]->get()) {
101 _global_port_matrix[*i]->get()->set_session (_session);
105 primary_clock->set_session (s);
106 secondary_clock->set_session (s);
107 big_clock->set_session (s);
108 preroll_clock->set_session (s);
109 postroll_clock->set_session (s);
110 time_info_box->set_session (s);
112 /* sensitize menu bar options that are now valid */
114 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
115 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
117 if (_session->locations()->num_range_markers()) {
118 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
120 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
123 if (!_session->monitor_out()) {
124 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
126 act->set_sensitive (false);
130 /* allow wastebasket flush again */
132 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
134 act->set_sensitive (true);
137 /* there are never any selections on startup */
139 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
140 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
141 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
142 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
143 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
145 rec_button.set_sensitive (true);
147 solo_alert_button.set_active (_session->soloing());
149 setup_session_options ();
151 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
152 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink));
153 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink));
154 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink));
156 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
157 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
158 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
159 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context());
161 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
162 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
163 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
164 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
165 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
166 _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ());
168 #ifdef HAVE_JACK_SESSION
169 engine->JackSessionEvent.connect (*_session, MISSING_INVALIDATOR, ui_bind (&Session::jack_session_event, _session, _1), gui_context());
172 /* Clocks are on by default after we are connected to a session, so show that here.
175 connect_dependents_to_session (s);
177 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
178 restore their modes or are explicitly set, we will cause the "new" mode to be saved
179 back to the session XML ("Extra") state.
182 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
184 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
189 map_transport_state ();
191 second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000);
192 point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
193 point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
199 ARDOUR_UI::unload_session (bool hide_stuff)
201 if (_session && _session->dirty()) {
202 std::vector<std::string> actions;
203 actions.push_back (_("Don't close"));
204 actions.push_back (_("Just close"));
205 actions.push_back (_("Save and close"));
206 switch (ask_about_saving_session (actions)) {
212 _session->save_state ("");
220 theme_manager->hide ();
223 second_connection.disconnect ();
224 point_one_second_connection.disconnect ();
225 point_oh_five_second_connection.disconnect ();
226 point_zero_one_second_connection.disconnect();
228 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
230 rec_button.set_sensitive (false);
235 /* drop everything attached to the blink signal */
241 update_buffer_load ();
247 ARDOUR_UI::toggle_big_clock_window ()
249 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
251 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
253 if (tact->get_active()) {
254 big_clock_window->get()->show_all ();
255 big_clock_window->get()->present ();
257 big_clock_window->get()->hide ();
263 ARDOUR_UI::toggle_speaker_config_window ()
265 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-speaker-config"));
267 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
269 if (tact->get_active()) {
270 speaker_config_window->get()->show_all ();
271 speaker_config_window->get()->present ();
273 speaker_config_window->get()->hide ();
279 ARDOUR_UI::new_midi_tracer_window ()
281 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
286 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
287 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
291 if (i == _midi_tracer_windows.end()) {
292 /* all our MIDITracer windows are visible; make a new one */
293 MidiTracer* t = new MidiTracer ();
296 _midi_tracer_windows.push_back (t);
298 /* re-use the hidden one */
304 ARDOUR_UI::toggle_rc_options_window ()
306 if (rc_option_editor == 0) {
307 rc_option_editor = new RCOptionEditor;
308 rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleRCOptionsEditor")));
309 rc_option_editor->set_session (_session);
312 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
314 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
316 if (tact->get_active()) {
317 rc_option_editor->show_all ();
318 rc_option_editor->present ();
320 rc_option_editor->hide ();
326 ARDOUR_UI::toggle_session_options_window ()
328 if (session_option_editor == 0) {
329 session_option_editor = new SessionOptionEditor (_session);
330 session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
333 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
335 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
337 if (tact->get_active()) {
338 session_option_editor->show_all ();
339 session_option_editor->present ();
341 session_option_editor->hide ();
347 ARDOUR_UI::create_location_ui ()
349 if (location_ui->get() == 0) {
350 location_ui->set (new LocationUIWindow ());
351 location_ui->get()->set_session (_session);
352 location_ui->get()->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
358 ARDOUR_UI::toggle_location_window ()
360 if (create_location_ui()) {
364 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
366 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
368 if (tact->get_active()) {
369 location_ui->get()->show_all ();
370 location_ui->get()->present ();
372 location_ui->get()->hide ();
378 ARDOUR_UI::toggle_key_editor ()
380 if (key_editor == 0) {
381 key_editor = new KeyEditor;
382 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
385 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
387 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
389 if (tact->get_active()) {
390 key_editor->show_all ();
391 key_editor->present ();
399 ARDOUR_UI::toggle_theme_manager ()
401 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
403 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
405 if (tact->get_active()) {
406 theme_manager->show_all ();
407 theme_manager->present ();
409 theme_manager->hide ();
415 ARDOUR_UI::create_bundle_manager ()
417 if (bundle_manager == 0) {
418 bundle_manager = new BundleManager (_session);
419 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
424 ARDOUR_UI::toggle_bundle_manager ()
426 create_bundle_manager ();
428 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
430 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
432 if (tact->get_active()) {
433 bundle_manager->show_all ();
434 bundle_manager->present ();
436 bundle_manager->hide ();
442 ARDOUR_UI::create_route_params ()
444 if (route_params == 0) {
445 route_params = new RouteParams_UI ();
446 route_params->set_session (_session);
447 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
453 ARDOUR_UI::toggle_route_params_window ()
455 if (create_route_params ()) {
459 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
461 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
463 if (tact->get_active()) {
464 route_params->show_all ();
465 route_params->present ();
467 route_params->hide ();
473 ARDOUR_UI::handle_locations_change (Location *)
476 if (_session->locations()->num_range_markers()) {
477 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
479 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
485 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
487 if (window_was_editor) {
489 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
490 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
491 float_big_clock (editor);
496 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
497 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
498 float_big_clock (mixer);