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 "shuttle_control.h"
43 #include "session_option_editor.h"
44 #include "speaker_dialog.h"
46 #include "theme_manager.h"
47 #include "time_info_box.h"
51 using namespace ARDOUR
;
55 using namespace Gtkmm2ext
;
58 ARDOUR_UI::set_session (Session
*s
)
60 SessionHandlePtr::set_session (s
);
66 if (location_ui
->get()) {
67 location_ui
->get()->set_session(s
);
70 if (speaker_config_window
->get()) {
71 speaker_config_window
->get()->set_speakers (s
->get_speakers());
75 route_params
->set_session (s
);
78 if (add_route_dialog
) {
79 add_route_dialog
->set_session (s
);
82 if (session_option_editor
) {
83 session_option_editor
->set_session (s
);
87 shuttle_box
->set_session (s
);
90 for (ARDOUR::DataType::iterator i
= ARDOUR::DataType::begin(); i
!= ARDOUR::DataType::end(); ++i
) {
91 if (_global_port_matrix
[*i
]->get()) {
92 _global_port_matrix
[*i
]->get()->set_session (_session
);
96 primary_clock
->set_session (s
);
97 secondary_clock
->set_session (s
);
98 big_clock
->set_session (s
);
99 preroll_clock
->set_session (s
);
100 postroll_clock
->set_session (s
);
101 time_info_box
->set_session (s
);
103 /* sensitize menu bar options that are now valid */
105 ActionManager::set_sensitive (ActionManager::session_sensitive_actions
, true);
106 ActionManager::set_sensitive (ActionManager::write_sensitive_actions
, _session
->writable());
108 if (_session
->locations()->num_range_markers()) {
109 ActionManager::set_sensitive (ActionManager::range_sensitive_actions
, true);
111 ActionManager::set_sensitive (ActionManager::range_sensitive_actions
, false);
114 if (!_session
->monitor_out()) {
115 Glib::RefPtr
<Action
> act
= ActionManager::get_action (X_("options"), X_("SoloViaBus"));
117 act
->set_sensitive (false);
121 /* allow wastebasket flush again */
123 Glib::RefPtr
<Action
> act
= ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
125 act
->set_sensitive (true);
128 /* there are never any selections on startup */
130 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions
, false);
131 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions
, false);
132 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions
, false);
133 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions
, false);
134 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions
, false);
136 rec_button
.set_sensitive (true);
138 solo_alert_button
.set_active (_session
->soloing());
140 setup_session_options ();
142 Blink
.connect (sigc::mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink
));
143 Blink
.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink
));
144 Blink
.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink
));
145 Blink
.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink
));
147 _session
->RecordStateChanged
.connect (_session_connections
, MISSING_INVALIDATOR
, boost::bind (&ARDOUR_UI::record_state_changed
, this), gui_context());
148 _session
->StepEditStatusChange
.connect (_session_connections
, MISSING_INVALIDATOR
, boost::bind (&ARDOUR_UI::step_edit_status_change
, this, _1
), gui_context());
149 _session
->TransportStateChange
.connect (_session_connections
, MISSING_INVALIDATOR
, boost::bind (&ARDOUR_UI::map_transport_state
, this), gui_context());
150 _session
->DirtyChanged
.connect (_session_connections
, MISSING_INVALIDATOR
, boost::bind (&ARDOUR_UI::update_autosave
, this), gui_context());
152 _session
->Xrun
.connect (_session_connections
, MISSING_INVALIDATOR
, ui_bind (&ARDOUR_UI::xrun_handler
, this, _1
), gui_context());
153 _session
->SoloActive
.connect (_session_connections
, MISSING_INVALIDATOR
, ui_bind (&ARDOUR_UI::soloing_changed
, this, _1
), gui_context());
154 _session
->AuditionActive
.connect (_session_connections
, MISSING_INVALIDATOR
, ui_bind (&ARDOUR_UI::auditioning_changed
, this, _1
), gui_context());
155 _session
->locations()->added
.connect (_session_connections
, MISSING_INVALIDATOR
, ui_bind (&ARDOUR_UI::handle_locations_change
, this, _1
), gui_context());
156 _session
->locations()->removed
.connect (_session_connections
, MISSING_INVALIDATOR
, ui_bind (&ARDOUR_UI::handle_locations_change
, this, _1
), gui_context());
158 #ifdef HAVE_JACK_SESSION
159 engine
->JackSessionEvent
.connect (*_session
, MISSING_INVALIDATOR
, ui_bind (&Session::jack_session_event
, _session
, _1
), gui_context());
162 /* Clocks are on by default after we are connected to a session, so show that here.
165 connect_dependents_to_session (s
);
167 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
168 restore their modes or are explicitly set, we will cause the "new" mode to be saved
169 back to the session XML ("Extra") state.
172 AudioClock::ModeChanged
.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes
));
174 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle
));
179 map_transport_state ();
181 second_connection
= Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second
), 1000);
182 point_one_second_connection
= Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds
), 100);
183 point_zero_one_second_connection
= Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds
), 40);
187 ARDOUR_UI::unload_session (bool hide_stuff
)
189 if (_session
&& _session
->dirty()) {
190 std::vector
<std::string
> actions
;
191 actions
.push_back (_("Don't close"));
192 actions
.push_back (_("Just close"));
193 actions
.push_back (_("Save and close"));
194 switch (ask_about_saving_session (actions
)) {
200 _session
->save_state ("");
208 theme_manager
->hide ();
211 second_connection
.disconnect ();
212 point_one_second_connection
.disconnect ();
213 point_oh_five_second_connection
.disconnect ();
214 point_zero_one_second_connection
.disconnect();
216 ActionManager::set_sensitive (ActionManager::session_sensitive_actions
, false);
218 rec_button
.set_sensitive (false);
223 /* drop everything attached to the blink signal */
229 update_buffer_load ();
235 ARDOUR_UI::toggle_big_clock_window ()
237 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
239 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
241 if (tact
->get_active()) {
242 big_clock_window
->get()->show_all ();
243 big_clock_window
->get()->present ();
245 big_clock_window
->get()->hide ();
251 ARDOUR_UI::toggle_speaker_config_window ()
253 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("toggle-speaker-config"));
255 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
257 if (tact
->get_active()) {
258 speaker_config_window
->get()->show_all ();
259 speaker_config_window
->get()->present ();
261 speaker_config_window
->get()->hide ();
267 ARDOUR_UI::new_midi_tracer_window ()
269 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
274 std::list
<MidiTracer
*>::iterator i
= _midi_tracer_windows
.begin ();
275 while (i
!= _midi_tracer_windows
.end() && (*i
)->get_visible() == true) {
279 if (i
== _midi_tracer_windows
.end()) {
280 /* all our MIDITracer windows are visible; make a new one */
281 MidiTracer
* t
= new MidiTracer ();
284 _midi_tracer_windows
.push_back (t
);
286 /* re-use the hidden one */
292 ARDOUR_UI::toggle_rc_options_window ()
294 if (rc_option_editor
== 0) {
295 rc_option_editor
= new RCOptionEditor
;
296 rc_option_editor
->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction
), X_("<Actions>/Common/ToggleRCOptionsEditor")));
297 rc_option_editor
->set_session (_session
);
300 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
302 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
304 if (tact
->get_active()) {
305 rc_option_editor
->show_all ();
306 rc_option_editor
->present ();
308 rc_option_editor
->hide ();
314 ARDOUR_UI::toggle_session_options_window ()
316 if (session_option_editor
== 0) {
317 session_option_editor
= new SessionOptionEditor (_session
);
318 session_option_editor
->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction
), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
321 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
323 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic (act
);
325 if (tact
->get_active()) {
326 session_option_editor
->show_all ();
327 session_option_editor
->present ();
329 session_option_editor
->hide ();
335 ARDOUR_UI::create_location_ui ()
337 if (location_ui
->get() == 0) {
338 location_ui
->set (new LocationUIWindow ());
339 location_ui
->get()->set_session (_session
);
340 location_ui
->get()->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction
), X_("<Actions>/Common/ToggleLocations")));
346 ARDOUR_UI::toggle_location_window ()
348 if (create_location_ui()) {
352 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
354 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
356 if (tact
->get_active()) {
357 location_ui
->get()->show_all ();
358 location_ui
->get()->present ();
360 location_ui
->get()->hide ();
366 ARDOUR_UI::toggle_key_editor ()
368 if (key_editor
== 0) {
369 key_editor
= new KeyEditor
;
370 key_editor
->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction
), X_("<Actions>/Common/ToggleKeyEditor")));
373 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
375 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
377 if (tact
->get_active()) {
378 key_editor
->show_all ();
379 key_editor
->present ();
387 ARDOUR_UI::toggle_theme_manager ()
389 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
391 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
393 if (tact
->get_active()) {
394 theme_manager
->show_all ();
395 theme_manager
->present ();
397 theme_manager
->hide ();
403 ARDOUR_UI::create_bundle_manager ()
405 if (bundle_manager
== 0) {
406 bundle_manager
= new BundleManager (_session
);
407 bundle_manager
->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction
), X_("<Actions>/Common/ToggleBundleManager")));
412 ARDOUR_UI::toggle_bundle_manager ()
414 create_bundle_manager ();
416 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
418 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic (act
);
420 if (tact
->get_active()) {
421 bundle_manager
->show_all ();
422 bundle_manager
->present ();
424 bundle_manager
->hide ();
430 ARDOUR_UI::create_route_params ()
432 if (route_params
== 0) {
433 route_params
= new RouteParams_UI ();
434 route_params
->set_session (_session
);
435 route_params
->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction
), X_("<Actions>/Common/ToggleInspector")));
441 ARDOUR_UI::toggle_route_params_window ()
443 if (create_route_params ()) {
447 RefPtr
<Action
> act
= ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
449 RefPtr
<ToggleAction
> tact
= RefPtr
<ToggleAction
>::cast_dynamic(act
);
451 if (tact
->get_active()) {
452 route_params
->show_all ();
453 route_params
->present ();
455 route_params
->hide ();
461 ARDOUR_UI::handle_locations_change (Location
*)
464 if (_session
->locations()->num_range_markers()) {
465 ActionManager::set_sensitive (ActionManager::range_sensitive_actions
, true);
467 ActionManager::set_sensitive (ActionManager::range_sensitive_actions
, false);
473 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState
* ev
, bool window_was_editor
)
475 if (window_was_editor
) {
477 if ((ev
->changed_mask
& GDK_WINDOW_STATE_FULLSCREEN
) &&
478 (ev
->new_window_state
& GDK_WINDOW_STATE_FULLSCREEN
)) {
479 float_big_clock (editor
);
484 if ((ev
->changed_mask
& GDK_WINDOW_STATE_FULLSCREEN
) &&
485 (ev
->new_window_state
& GDK_WINDOW_STATE_FULLSCREEN
)) {
486 float_big_clock (mixer
);