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"))) {
175 session->save_state ("");
185 second_connection.disconnect ();
186 point_one_second_connection.disconnect ();
187 point_oh_five_second_connection.disconnect ();
188 point_zero_one_second_connection.disconnect();
190 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
192 rec_button.set_sensitive (false);
193 shuttle_box.set_sensitive (false);
198 /* drop everything attached to the blink signal */
202 primary_clock.set_session (0);
203 secondary_clock.set_session (0);
204 big_clock.set_session (0);
205 preroll_clock.set_session (0);
206 postroll_clock.set_session (0);
209 option_editor->set_session (0);
215 update_buffer_load ();
221 ARDOUR_UI::create_connection_editor ()
224 if (connection_editor == 0) {
225 connection_editor = new ConnectionEditor ();
226 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
230 connection_editor->set_session (session);
238 ARDOUR_UI::toggle_connection_editor ()
240 if (create_connection_editor()) {
245 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
247 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
249 if (tact->get_active()) {
250 connection_editor->show_all ();
251 connection_editor->present ();
253 connection_editor->hide ();
260 ARDOUR_UI::toggle_big_clock_window ()
262 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
264 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
266 if (tact->get_active()) {
267 big_clock_window->show_all ();
268 big_clock_window->present ();
270 big_clock_window->hide ();
276 ARDOUR_UI::toggle_options_window ()
278 if (option_editor == 0) {
279 option_editor = new OptionEditor (*this, *editor, *mixer);
280 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
281 option_editor->set_session (session);
284 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
286 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
288 if (tact->get_active()) {
289 option_editor->show_all ();
290 option_editor->present ();
292 option_editor->hide ();
298 ARDOUR_UI::create_location_ui ()
300 if (location_ui == 0) {
301 location_ui = new LocationUI ();
302 location_ui->set_session (session);
303 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
309 ARDOUR_UI::toggle_location_window ()
311 if (create_location_ui()) {
315 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
317 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
319 if (tact->get_active()) {
320 location_ui->show_all ();
321 location_ui->present ();
323 location_ui->hide ();
329 ARDOUR_UI::toggle_theme_manager ()
331 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
333 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
335 if (tact->get_active()) {
336 theme_manager->show_all ();
337 theme_manager->present ();
339 theme_manager->hide ();
345 ARDOUR_UI::create_route_params ()
347 if (route_params == 0) {
348 route_params = new RouteParams_UI ();
349 route_params->set_session (session);
350 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
356 ARDOUR_UI::toggle_route_params_window ()
358 if (create_route_params ()) {
362 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
364 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
366 if (tact->get_active()) {
367 route_params->show_all ();
368 route_params->present ();
370 route_params->hide ();
376 ARDOUR_UI::handle_locations_change (Location* ignored)
379 if (session->locations()->num_range_markers()) {
380 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
382 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);