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 "connection_editor.h"
31 #include "location_ui.h"
33 #include "option_editor.h"
34 #include "public_editor.h"
35 #include "route_params_ui.h"
37 #include "theme_manager.h"
41 using namespace ARDOUR;
45 using namespace Gtkmm2ext;
48 ARDOUR_UI::connect_to_session (Session *s)
52 session->HaltOnXrun.connect (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
53 session->RecordStateChanged.connect (mem_fun (*this, &ARDOUR_UI::record_state_changed));
55 /* sensitize menu bar options that are now valid */
57 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
59 if (session->locations()->num_range_markers()) {
60 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
62 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
65 if (!session->control_out()) {
66 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
68 act->set_sensitive (false);
72 /* allow wastebasket flush again */
74 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
76 act->set_sensitive (true);
79 /* there are never any selections on startup */
81 ActionManager::set_sensitive (ActionManager::region_selection_sensitive_actions, false);
82 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
83 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
84 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
85 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
86 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
88 session->locations()->added.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
89 session->locations()->removed.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
91 rec_button.set_sensitive (true);
92 shuttle_box.set_sensitive (true);
94 if (connection_editor) {
95 connection_editor->set_session (s);
99 location_ui->set_session(s);
103 route_params->set_session (s);
107 option_editor->set_session (s);
110 setup_session_options ();
112 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
113 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
114 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
116 /* these are all need to be handled in an RT-safe and MT way, so don't
117 do any GUI work, just queue it for handling by the GUI thread.
120 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
122 /* alert the user to these things happening */
124 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
125 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
127 solo_alert_button.set_active (session->soloing());
129 /* update autochange callback on dirty state changing */
131 session->DirtyChanged.connect (mem_fun(*this, &ARDOUR_UI::update_autosave));
133 /* can't be auditioning here */
135 primary_clock.set_session (s);
136 secondary_clock.set_session (s);
137 big_clock.set_session (s);
138 preroll_clock.set_session (s);
139 postroll_clock.set_session (s);
141 /* Clocks are on by default after we are connected to a session, so show that here.
144 connect_dependents_to_session (s);
146 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
147 restore their modes or are explicitly set, we will cause the "new" mode to be saved
148 back to the session XML ("extra") state.
151 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
153 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
158 transport_stopped ();
160 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
161 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
162 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
166 ARDOUR_UI::unload_session (bool hide_stuff)
168 if (session && session->dirty()) {
169 switch (ask_about_saving_session (_("close"))) {
174 session->save_state ("");
184 second_connection.disconnect ();
185 point_one_second_connection.disconnect ();
186 point_oh_five_second_connection.disconnect ();
187 point_zero_one_second_connection.disconnect();
189 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
191 rec_button.set_sensitive (false);
192 shuttle_box.set_sensitive (false);
197 /* drop everything attached to the blink signal */
201 primary_clock.set_session (0);
202 secondary_clock.set_session (0);
203 big_clock.set_session (0);
204 preroll_clock.set_session (0);
205 postroll_clock.set_session (0);
208 option_editor->set_session (0);
218 update_buffer_load ();
224 ARDOUR_UI::create_connection_editor ()
227 if (connection_editor == 0) {
228 connection_editor = new ConnectionEditor ();
229 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
233 connection_editor->set_session (session);
241 ARDOUR_UI::toggle_connection_editor ()
243 if (create_connection_editor()) {
248 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
250 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
252 if (tact->get_active()) {
253 connection_editor->show_all ();
254 connection_editor->present ();
256 connection_editor->hide ();
263 ARDOUR_UI::toggle_big_clock_window ()
265 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
267 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
269 if (tact->get_active()) {
270 big_clock_window->show_all ();
271 big_clock_window->present ();
273 big_clock_window->hide ();
279 ARDOUR_UI::toggle_options_window ()
281 if (option_editor == 0) {
282 option_editor = new OptionEditor (*this, *editor, *mixer);
283 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
284 option_editor->set_session (session);
287 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
289 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
291 if (tact->get_active()) {
292 option_editor->show_all ();
293 option_editor->present ();
295 option_editor->hide ();
301 ARDOUR_UI::create_location_ui ()
303 if (location_ui == 0) {
304 location_ui = new LocationUI ();
305 location_ui->set_session (session);
306 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
312 ARDOUR_UI::toggle_location_window ()
314 if (create_location_ui()) {
318 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
320 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
322 if (tact->get_active()) {
323 location_ui->show_all ();
324 location_ui->present ();
326 location_ui->hide ();
332 ARDOUR_UI::toggle_theme_manager ()
334 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
336 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
338 if (tact->get_active()) {
339 theme_manager->show_all ();
340 theme_manager->present ();
342 theme_manager->hide ();
348 ARDOUR_UI::create_route_params ()
350 if (route_params == 0) {
351 route_params = new RouteParams_UI ();
352 route_params->set_session (session);
353 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
359 ARDOUR_UI::toggle_route_params_window ()
361 if (create_route_params ()) {
365 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
367 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
369 if (tact->get_active()) {
370 route_params->show_all ();
371 route_params->present ();
373 route_params->hide ();
379 ARDOUR_UI::handle_locations_change (Location* ignored)
382 if (session->locations()->num_range_markers()) {
383 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
385 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);