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);
60 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, session->writable());
62 if (session->locations()->num_range_markers()) {
63 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
65 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
68 if (!session->control_out()) {
69 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
71 act->set_sensitive (false);
75 /* allow wastebasket flush again */
77 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
79 act->set_sensitive (true);
82 /* there are never any selections on startup */
84 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
85 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
86 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
87 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
88 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
90 session->locations()->added.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
91 session->locations()->removed.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
93 rec_button.set_sensitive (true);
94 shuttle_box.set_sensitive (true);
97 location_ui->set_session(s);
101 route_params->set_session (s);
104 setup_session_options ();
106 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
107 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
108 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
110 /* these are all need to be handled in an RT-safe and MT way, so don't
111 do any GUI work, just queue it for handling by the GUI thread.
114 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
116 /* alert the user to these things happening */
118 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
119 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
121 solo_alert_button.set_active (session->soloing());
123 /* update autochange callback on dirty state changing */
125 session->DirtyChanged.connect (mem_fun(*this, &ARDOUR_UI::update_autosave));
127 /* can't be auditioning here */
129 primary_clock.set_session (s);
130 secondary_clock.set_session (s);
131 big_clock.set_session (s);
132 preroll_clock.set_session (s);
133 postroll_clock.set_session (s);
135 /* Clocks are on by default after we are connected to a session, so show that here.
138 connect_dependents_to_session (s);
140 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
141 restore their modes or are explicitly set, we will cause the "new" mode to be saved
142 back to the session XML ("Extra") state.
145 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
147 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
152 transport_stopped ();
154 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
155 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
156 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
160 ARDOUR_UI::unload_session (bool hide_stuff)
162 if (session && session->dirty()) {
163 switch (ask_about_saving_session (_("close"))) {
169 session->save_state ("");
177 theme_manager->hide ();
180 second_connection.disconnect ();
181 point_one_second_connection.disconnect ();
182 point_oh_five_second_connection.disconnect ();
183 point_zero_one_second_connection.disconnect();
185 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
187 rec_button.set_sensitive (false);
188 shuttle_box.set_sensitive (false);
193 /* drop everything attached to the blink signal */
197 primary_clock.set_session (0);
198 secondary_clock.set_session (0);
199 big_clock.set_session (0);
200 preroll_clock.set_session (0);
201 postroll_clock.set_session (0);
206 update_buffer_load ();
212 ARDOUR_UI::toggle_big_clock_window ()
214 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
216 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
218 if (tact->get_active()) {
219 big_clock_window->show_all ();
220 big_clock_window->present ();
222 big_clock_window->hide ();
228 ARDOUR_UI::toggle_rc_options_window ()
230 if (rc_option_editor == 0) {
231 rc_option_editor = new RCOptionEditor;
232 rc_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleRCOptionsEditor")));
233 rc_option_editor->set_session (session);
236 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleRCOptionsEditor"));
238 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
240 if (tact->get_active()) {
241 rc_option_editor->show_all ();
242 rc_option_editor->present ();
244 rc_option_editor->hide ();
250 ARDOUR_UI::toggle_session_options_window ()
252 if (session_option_editor == 0) {
253 session_option_editor = new SessionOptionEditor (session);
254 session_option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSessionOptionsEditor")));
257 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSessionOptionsEditor"));
259 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
261 if (tact->get_active()) {
262 session_option_editor->show_all ();
263 session_option_editor->present ();
265 session_option_editor->hide ();
271 ARDOUR_UI::create_location_ui ()
273 if (location_ui == 0) {
274 location_ui = new LocationUI ();
275 location_ui->set_session (session);
276 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
282 ARDOUR_UI::toggle_location_window ()
284 if (create_location_ui()) {
288 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
290 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
292 if (tact->get_active()) {
293 location_ui->show_all ();
294 location_ui->present ();
296 location_ui->hide ();
302 ARDOUR_UI::toggle_key_editor ()
304 if (key_editor == 0) {
305 key_editor = new KeyEditor;
306 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
309 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
311 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
313 if (tact->get_active()) {
314 key_editor->show_all ();
315 key_editor->present ();
323 ARDOUR_UI::toggle_theme_manager ()
325 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
327 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
329 if (tact->get_active()) {
330 theme_manager->show_all ();
331 theme_manager->present ();
333 theme_manager->hide ();
339 ARDOUR_UI::create_bundle_manager ()
341 if (bundle_manager == 0) {
342 bundle_manager = new BundleManager (*session);
343 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
348 ARDOUR_UI::toggle_bundle_manager ()
350 create_bundle_manager ();
352 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
354 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
356 if (tact->get_active()) {
357 bundle_manager->show_all ();
358 bundle_manager->present ();
360 bundle_manager->hide ();
366 ARDOUR_UI::create_route_params ()
368 if (route_params == 0) {
369 route_params = new RouteParams_UI ();
370 route_params->set_session (session);
371 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
377 ARDOUR_UI::toggle_route_params_window ()
379 if (create_route_params ()) {
383 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
385 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
387 if (tact->get_active()) {
388 route_params->show_all ();
389 route_params->present ();
391 route_params->hide ();
397 ARDOUR_UI::handle_locations_change (Location *)
400 if (session->locations()->num_range_markers()) {
401 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
403 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
409 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
411 if (window_was_editor) {
413 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
414 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
415 float_big_clock (editor);
420 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
421 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
422 float_big_clock (mixer);