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 ()
168 if (session && session->dirty()) {
169 switch (ask_about_saving_session (_("close"))) {
175 session->save_state ("");
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);
204 option_editor->set_session (0);
214 update_buffer_load ();
220 ARDOUR_UI::create_connection_editor ()
223 if (connection_editor == 0) {
224 connection_editor = new ConnectionEditor ();
225 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
229 connection_editor->set_session (session);
237 ARDOUR_UI::toggle_connection_editor ()
239 if (create_connection_editor()) {
244 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
246 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
248 if (tact->get_active()) {
249 connection_editor->show_all ();
250 connection_editor->present ();
252 connection_editor->hide ();
259 ARDOUR_UI::toggle_big_clock_window ()
261 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
263 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
265 if (tact->get_active()) {
266 big_clock_window->show_all ();
267 big_clock_window->present ();
269 big_clock_window->hide ();
275 ARDOUR_UI::toggle_options_window ()
277 if (option_editor == 0) {
278 option_editor = new OptionEditor (*this, *editor, *mixer);
279 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
280 option_editor->set_session (session);
283 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
285 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
287 if (tact->get_active()) {
288 option_editor->show_all ();
289 option_editor->present ();
291 option_editor->hide ();
297 ARDOUR_UI::create_location_ui ()
299 if (location_ui == 0) {
300 location_ui = new LocationUI ();
301 location_ui->set_session (session);
302 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
308 ARDOUR_UI::toggle_location_window ()
310 if (create_location_ui()) {
314 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
316 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
318 if (tact->get_active()) {
319 location_ui->show_all ();
320 location_ui->present ();
322 location_ui->hide ();
328 ARDOUR_UI::toggle_theme_manager ()
330 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
332 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
334 if (tact->get_active()) {
335 theme_manager->show_all ();
336 theme_manager->present ();
338 theme_manager->hide ();
344 ARDOUR_UI::create_route_params ()
346 if (route_params == 0) {
347 route_params = new RouteParams_UI ();
348 route_params->set_session (session);
349 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
355 ARDOUR_UI::toggle_route_params_window ()
357 if (create_route_params ()) {
361 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
363 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
365 if (tact->get_active()) {
366 route_params->show_all ();
367 route_params->present ();
369 route_params->hide ();
375 ARDOUR_UI::handle_locations_change (Location* ignored)
378 if (session->locations()->num_range_markers()) {
379 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
381 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);