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"
29 #include "ardour_ui.h"
30 #include "location_ui.h"
32 #include "rc_option_editor.h"
33 #include "session_option_editor.h"
34 #include "public_editor.h"
35 #include "route_params_ui.h"
37 #include "theme_manager.h"
38 #include "bundle_manager.h"
39 #include "keyeditor.h"
43 using namespace ARDOUR;
47 using namespace Gtkmm2ext;
50 ARDOUR_UI::connect_to_session (Session *s)
54 session->Xrun.connect (mem_fun(*this, &ARDOUR_UI::xrun_handler));
55 session->RecordStateChanged.connect (mem_fun (*this, &ARDOUR_UI::record_state_changed));
57 /* sensitize menu bar options that are now valid */
59 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
61 if (session->locations()->num_range_markers()) {
62 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
64 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
67 if (!session->control_out()) {
68 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
70 act->set_sensitive (false);
74 /* allow wastebasket flush again */
76 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
78 act->set_sensitive (true);
81 /* there are never any selections on startup */
83 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
84 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
85 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
86 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
87 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
89 session->locations()->added.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
90 session->locations()->removed.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
92 rec_button.set_sensitive (true);
93 shuttle_box.set_sensitive (true);
96 location_ui->set_session(s);
100 route_params->set_session (s);
103 setup_session_options ();
105 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
106 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
107 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
109 /* these are all need to be handled in an RT-safe and MT way, so don't
110 do any GUI work, just queue it for handling by the GUI thread.
113 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
115 /* alert the user to these things happening */
117 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
118 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
120 solo_alert_button.set_active (session->soloing());
122 /* update autochange callback on dirty state changing */
124 session->DirtyChanged.connect (mem_fun(*this, &ARDOUR_UI::update_autosave));
126 /* can't be auditioning here */
128 primary_clock.set_session (s);
129 secondary_clock.set_session (s);
130 big_clock.set_session (s);
131 preroll_clock.set_session (s);
132 postroll_clock.set_session (s);
134 /* Clocks are on by default after we are connected to a session, so show that here.
137 connect_dependents_to_session (s);
139 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
140 restore their modes or are explicitly set, we will cause the "new" mode to be saved
141 back to the session XML ("Extra") state.
144 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
146 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
151 transport_stopped ();
153 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
154 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
155 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
159 ARDOUR_UI::unload_session (bool hide_stuff)
161 if (session && session->dirty()) {
162 switch (ask_about_saving_session (_("close"))) {
168 session->save_state ("");
176 theme_manager->hide ();
179 second_connection.disconnect ();
180 point_one_second_connection.disconnect ();
181 point_oh_five_second_connection.disconnect ();
182 point_zero_one_second_connection.disconnect();
184 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
186 rec_button.set_sensitive (false);
187 shuttle_box.set_sensitive (false);
192 /* drop everything attached to the blink signal */
196 primary_clock.set_session (0);
197 secondary_clock.set_session (0);
198 big_clock.set_session (0);
199 preroll_clock.set_session (0);
200 postroll_clock.set_session (0);
205 update_buffer_load ();
211 ARDOUR_UI::toggle_big_clock_window ()
213 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
215 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
217 if (tact->get_active()) {
218 big_clock_window->show_all ();
219 big_clock_window->present ();
221 big_clock_window->hide ();
227 ARDOUR_UI::toggle_rc_options_window ()
229 if (rc_option_editor == 0) {
230 rc_option_editor = new RCOptionEditor;
231 rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleRCOptionsEditor")));
232 rc_option_editor->set_session (session);
235 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
237 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
239 if (tact->get_active()) {
240 rc_option_editor->show_all ();
241 rc_option_editor->present ();
243 rc_option_editor->hide ();
249 ARDOUR_UI::toggle_session_options_window ()
251 if (session_option_editor == 0) {
252 session_option_editor = new SessionOptionEditor (session);
253 session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
256 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
258 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
260 if (tact->get_active()) {
261 session_option_editor->show_all ();
262 session_option_editor->present ();
264 session_option_editor->hide ();
270 ARDOUR_UI::create_location_ui ()
272 if (location_ui == 0) {
273 location_ui = new LocationUI ();
274 location_ui->set_session (session);
275 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
281 ARDOUR_UI::toggle_location_window ()
283 if (create_location_ui()) {
287 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
289 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
291 if (tact->get_active()) {
292 location_ui->show_all ();
293 location_ui->present ();
295 location_ui->hide ();
301 ARDOUR_UI::toggle_key_editor ()
303 if (key_editor == 0) {
304 key_editor = new KeyEditor;
305 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
308 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
310 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
312 if (tact->get_active()) {
313 key_editor->show_all ();
314 key_editor->present ();
322 ARDOUR_UI::toggle_theme_manager ()
324 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
326 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
328 if (tact->get_active()) {
329 theme_manager->show_all ();
330 theme_manager->present ();
332 theme_manager->hide ();
338 ARDOUR_UI::create_bundle_manager ()
340 if (bundle_manager == 0) {
341 bundle_manager = new BundleManager (*session);
342 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
347 ARDOUR_UI::toggle_bundle_manager ()
349 create_bundle_manager ();
351 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
353 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
355 if (tact->get_active()) {
356 bundle_manager->show_all ();
357 bundle_manager->present ();
359 bundle_manager->hide ();
365 ARDOUR_UI::create_route_params ()
367 if (route_params == 0) {
368 route_params = new RouteParams_UI ();
369 route_params->set_session (session);
370 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
376 ARDOUR_UI::toggle_route_params_window ()
378 if (create_route_params ()) {
382 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
384 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
386 if (tact->get_active()) {
387 route_params->show_all ();
388 route_params->present ();
390 route_params->hide ();
396 ARDOUR_UI::handle_locations_change (Location* ignored)
399 if (session->locations()->num_range_markers()) {
400 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
402 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
408 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
410 if (window_was_editor) {
412 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
413 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
414 float_big_clock (editor);
419 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
420 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
421 float_big_clock (mixer);