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 "ardour_ui.h"
31 #include "location_ui.h"
33 #include "rc_option_editor.h"
34 #include "session_option_editor.h"
35 #include "public_editor.h"
36 #include "route_params_ui.h"
38 #include "theme_manager.h"
39 #include "bundle_manager.h"
40 #include "keyeditor.h"
41 #include "gui_thread.h"
42 #include "midi_tracer.h"
43 #include "add_route_dialog.h"
44 #include "global_port_matrix.h"
48 using namespace ARDOUR;
52 using namespace Gtkmm2ext;
55 ARDOUR_UI::set_session (Session *s)
57 SessionHandlePtr::set_session (s);
63 if (location_ui->get()) {
64 location_ui->get()->set_session(s);
68 route_params->set_session (s);
71 if (add_route_dialog) {
72 add_route_dialog->set_session (s);
75 if (session_option_editor) {
76 session_option_editor->set_session (s);
79 for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
80 if (_global_port_matrix[*i]->get()) {
81 _global_port_matrix[*i]->get()->set_session (_session);
85 primary_clock.set_session (s);
86 secondary_clock.set_session (s);
87 big_clock.set_session (s);
88 preroll_clock.set_session (s);
89 postroll_clock.set_session (s);
91 /* sensitize menu bar options that are now valid */
93 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
94 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
96 if (_session->locations()->num_range_markers()) {
97 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
99 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
102 if (!_session->monitor_out()) {
103 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
105 act->set_sensitive (false);
109 /* allow wastebasket flush again */
111 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
113 act->set_sensitive (true);
116 /* there are never any selections on startup */
118 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
119 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
120 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
121 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
122 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
124 rec_button.set_sensitive (true);
125 shuttle_box.set_sensitive (true);
126 solo_alert_button.set_active (_session->soloing());
128 setup_session_options ();
130 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
131 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink));
132 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink));
133 Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink));
135 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
136 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
137 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
138 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_autosave, this), gui_context());
140 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
141 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
142 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
143 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
144 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
146 #ifdef HAVE_JACK_SESSION
147 engine->JackSessionEvent.connect (*_session, MISSING_INVALIDATOR, ui_bind (&Session::jack_session_event, _session, _1), gui_context());
150 /* Clocks are on by default after we are connected to a session, so show that here.
153 connect_dependents_to_session (s);
155 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
156 restore their modes or are explicitly set, we will cause the "new" mode to be saved
157 back to the session XML ("Extra") state.
160 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
162 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
167 map_transport_state ();
169 second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second), 1000);
170 point_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
171 point_zero_one_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
175 ARDOUR_UI::unload_session (bool hide_stuff)
177 if (_session && _session->dirty()) {
178 switch (ask_about_saving_session (_("close"))) {
184 _session->save_state ("");
192 theme_manager->hide ();
195 second_connection.disconnect ();
196 point_one_second_connection.disconnect ();
197 point_oh_five_second_connection.disconnect ();
198 point_zero_one_second_connection.disconnect();
200 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
202 rec_button.set_sensitive (false);
203 shuttle_box.set_sensitive (false);
208 /* drop everything attached to the blink signal */
214 update_buffer_load ();
220 ARDOUR_UI::toggle_big_clock_window ()
222 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
224 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
226 if (tact->get_active()) {
227 big_clock_window->get()->show_all ();
228 big_clock_window->get()->present ();
230 big_clock_window->get()->hide ();
236 ARDOUR_UI::new_midi_tracer_window ()
238 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
243 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
244 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
248 if (i == _midi_tracer_windows.end()) {
249 /* all our MIDITracer windows are visible; make a new one */
250 MidiTracer* t = new MidiTracer ();
253 _midi_tracer_windows.push_back (t);
255 /* re-use the hidden one */
261 ARDOUR_UI::toggle_rc_options_window ()
263 if (rc_option_editor == 0) {
264 rc_option_editor = new RCOptionEditor;
265 rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleRCOptionsEditor")));
266 rc_option_editor->set_session (_session);
269 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
271 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
273 if (tact->get_active()) {
274 rc_option_editor->show_all ();
275 rc_option_editor->present ();
277 rc_option_editor->hide ();
283 ARDOUR_UI::toggle_session_options_window ()
285 if (session_option_editor == 0) {
286 session_option_editor = new SessionOptionEditor (_session);
287 session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
290 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
292 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
294 if (tact->get_active()) {
295 session_option_editor->show_all ();
296 session_option_editor->present ();
298 session_option_editor->hide ();
304 ARDOUR_UI::create_location_ui ()
306 if (location_ui->get() == 0) {
307 location_ui->set (new LocationUIWindow ());
308 location_ui->get()->set_session (_session);
309 location_ui->get()->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
315 ARDOUR_UI::toggle_location_window ()
317 if (create_location_ui()) {
321 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
323 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
325 if (tact->get_active()) {
326 location_ui->get()->show_all ();
327 location_ui->get()->present ();
329 location_ui->get()->hide ();
335 ARDOUR_UI::toggle_key_editor ()
337 if (key_editor == 0) {
338 key_editor = new KeyEditor;
339 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
342 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
344 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
346 if (tact->get_active()) {
347 key_editor->show_all ();
348 key_editor->present ();
356 ARDOUR_UI::toggle_theme_manager ()
358 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
360 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
362 if (tact->get_active()) {
363 theme_manager->show_all ();
364 theme_manager->present ();
366 theme_manager->hide ();
372 ARDOUR_UI::create_bundle_manager ()
374 if (bundle_manager == 0) {
375 bundle_manager = new BundleManager (_session);
376 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
381 ARDOUR_UI::toggle_bundle_manager ()
383 create_bundle_manager ();
385 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
387 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
389 if (tact->get_active()) {
390 bundle_manager->show_all ();
391 bundle_manager->present ();
393 bundle_manager->hide ();
399 ARDOUR_UI::create_route_params ()
401 if (route_params == 0) {
402 route_params = new RouteParams_UI ();
403 route_params->set_session (_session);
404 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
410 ARDOUR_UI::toggle_route_params_window ()
412 if (create_route_params ()) {
416 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
418 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
420 if (tact->get_active()) {
421 route_params->show_all ();
422 route_params->present ();
424 route_params->hide ();
430 ARDOUR_UI::handle_locations_change (Location *)
433 if (_session->locations()->num_range_markers()) {
434 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
436 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
442 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
444 if (window_was_editor) {
446 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
447 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
448 float_big_clock (editor);
453 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
454 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
455 float_big_clock (mixer);