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"
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);
95 if (connection_editor) {
96 connection_editor->set_session (s);
100 location_ui->set_session(s);
104 route_params->set_session (s);
108 option_editor->set_session (s);
111 setup_session_options ();
113 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
114 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
115 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
117 /* these are all need to be handled in an RT-safe and MT way, so don't
118 do any GUI work, just queue it for handling by the GUI thread.
121 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
123 /* alert the user to these things happening */
125 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
126 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
128 solo_alert_button.set_active (session->soloing());
130 /* update autochange callback on dirty state changing */
132 session->DirtyChanged.connect (mem_fun(*this, &ARDOUR_UI::update_autosave));
134 /* can't be auditioning here */
136 primary_clock.set_session (s);
137 secondary_clock.set_session (s);
138 big_clock.set_session (s);
139 preroll_clock.set_session (s);
140 postroll_clock.set_session (s);
142 /* Clocks are on by default after we are connected to a session, so show that here.
145 connect_dependents_to_session (s);
147 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
148 restore their modes or are explicitly set, we will cause the "new" mode to be saved
149 back to the session XML ("extra") state.
152 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
154 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
159 transport_stopped ();
161 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
162 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
163 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
167 ARDOUR_UI::unload_session (bool hide_stuff)
169 if (session && session->dirty()) {
170 switch (ask_about_saving_session (_("close"))) {
176 session->save_state ("");
184 theme_manager->hide ();
187 second_connection.disconnect ();
188 point_one_second_connection.disconnect ();
189 point_oh_five_second_connection.disconnect ();
190 point_zero_one_second_connection.disconnect();
192 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
194 rec_button.set_sensitive (false);
195 shuttle_box.set_sensitive (false);
200 /* drop everything attached to the blink signal */
204 primary_clock.set_session (0);
205 secondary_clock.set_session (0);
206 big_clock.set_session (0);
207 preroll_clock.set_session (0);
208 postroll_clock.set_session (0);
211 option_editor->set_session (0);
217 update_buffer_load ();
223 ARDOUR_UI::create_connection_editor ()
226 if (connection_editor == 0) {
227 connection_editor = new ConnectionEditor ();
228 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
232 connection_editor->set_session (session);
240 ARDOUR_UI::toggle_connection_editor ()
242 if (create_connection_editor()) {
247 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
249 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
251 if (tact->get_active()) {
252 connection_editor->show_all ();
253 connection_editor->present ();
255 connection_editor->hide ();
262 ARDOUR_UI::toggle_big_clock_window ()
264 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
266 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
268 if (tact->get_active()) {
269 big_clock_window->show_all ();
270 big_clock_window->present ();
272 big_clock_window->hide ();
278 ARDOUR_UI::toggle_options_window ()
280 if (option_editor == 0) {
281 option_editor = new OptionEditor (*this, *editor, *mixer);
282 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
283 option_editor->set_session (session);
286 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
288 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
290 if (tact->get_active()) {
291 option_editor->show_all ();
292 option_editor->present ();
294 option_editor->hide ();
300 ARDOUR_UI::create_location_ui ()
302 if (location_ui == 0) {
303 location_ui = new LocationUI ();
304 location_ui->set_session (session);
305 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
311 ARDOUR_UI::toggle_location_window ()
313 if (create_location_ui()) {
317 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
319 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
321 if (tact->get_active()) {
322 location_ui->show_all ();
323 location_ui->present ();
325 location_ui->hide ();
331 ARDOUR_UI::toggle_key_editor ()
333 if (key_editor == 0) {
334 key_editor = new KeyEditor;
335 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
338 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
340 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
342 if (tact->get_active()) {
343 key_editor->show_all ();
344 key_editor->present ();
352 ARDOUR_UI::toggle_theme_manager ()
354 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
356 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
358 if (tact->get_active()) {
359 theme_manager->show_all ();
360 theme_manager->present ();
362 theme_manager->hide ();
368 ARDOUR_UI::create_bundle_manager ()
370 if (bundle_manager == 0) {
371 bundle_manager = new BundleManager (*session);
372 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
377 ARDOUR_UI::toggle_bundle_manager ()
379 create_bundle_manager ();
381 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
383 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
385 if (tact->get_active()) {
386 bundle_manager->show_all ();
387 bundle_manager->present ();
389 bundle_manager->hide ();
395 ARDOUR_UI::create_route_params ()
397 if (route_params == 0) {
398 route_params = new RouteParams_UI ();
399 route_params->set_session (session);
400 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
406 ARDOUR_UI::toggle_route_params_window ()
408 if (create_route_params ()) {
412 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
414 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
416 if (tact->get_active()) {
417 route_params->show_all ();
418 route_params->present ();
420 route_params->hide ();
426 ARDOUR_UI::handle_locations_change (Location* ignored)
429 if (session->locations()->num_range_markers()) {
430 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
432 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);