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 "color_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 /* there are never any selections on startup */
67 ActionManager::set_sensitive (ActionManager::region_selection_sensitive_actions, false);
68 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
69 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
70 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
71 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
72 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
74 session->locations()->added.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
75 session->locations()->removed.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
77 rec_button.set_sensitive (true);
78 shuttle_box.set_sensitive (true);
80 if (connection_editor) {
81 connection_editor->set_session (s);
85 location_ui->set_session(s);
89 route_params->set_session (s);
93 option_editor->set_session (s);
96 setup_session_options ();
98 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
99 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
100 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
102 /* these are all need to be handled in an RT-safe and MT way, so don't
103 do any GUI work, just queue it for handling by the GUI thread.
106 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
108 /* alert the user to these things happening */
110 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
111 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
113 solo_alert_button.set_active (session->soloing());
115 /* can't be auditioning here */
117 primary_clock.set_session (s);
118 secondary_clock.set_session (s);
119 big_clock.set_session (s);
120 preroll_clock.set_session (s);
121 postroll_clock.set_session (s);
123 /* Clocks are on by default after we are connected to a session, so show that here.
126 connect_dependents_to_session (s);
128 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
129 restore their modes or are explicitly set, we will cause the "new" mode to be saved
130 back to the session XML ("extra") state.
133 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
138 transport_stopped ();
140 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
141 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
142 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
146 ARDOUR_UI::unload_session ()
148 if (session && session->dirty()) {
149 switch (ask_about_saving_session (_("close"))) {
154 session->save_state ("");
159 second_connection.disconnect ();
160 point_one_second_connection.disconnect ();
161 point_zero_one_second_connection.disconnect();
163 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
165 rec_button.set_sensitive (false);
166 shuttle_box.set_sensitive (false);
171 /* drop everything attached to the blink signal */
175 primary_clock.set_session (0);
176 secondary_clock.set_session (0);
177 big_clock.set_session (0);
178 preroll_clock.set_session (0);
179 postroll_clock.set_session (0);
182 option_editor->set_session (0);
192 update_buffer_load ();
198 ARDOUR_UI::create_connection_editor ()
201 if (connection_editor == 0) {
202 connection_editor = new ConnectionEditor ();
203 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
207 connection_editor->set_session (session);
215 ARDOUR_UI::toggle_connection_editor ()
217 if (create_connection_editor()) {
222 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
224 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
226 if (tact->get_active()) {
227 connection_editor->show_all ();
228 connection_editor->present ();
230 connection_editor->hide ();
237 ARDOUR_UI::toggle_big_clock_window ()
239 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
241 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
243 if (tact->get_active()) {
244 big_clock_window->show_all ();
245 big_clock_window->present ();
247 big_clock_window->hide ();
253 ARDOUR_UI::toggle_options_window ()
255 if (option_editor == 0) {
256 option_editor = new OptionEditor (*this, *editor, *mixer);
257 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
258 option_editor->set_session (session);
261 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
263 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
265 if (tact->get_active()) {
266 option_editor->show_all ();
267 option_editor->present ();
269 option_editor->hide ();
275 ARDOUR_UI::create_location_ui ()
277 if (location_ui == 0) {
278 location_ui = new LocationUI ();
279 location_ui->set_session (session);
280 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
286 ARDOUR_UI::toggle_location_window ()
288 if (create_location_ui()) {
292 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
294 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
296 if (tact->get_active()) {
297 location_ui->show_all ();
298 location_ui->present ();
300 location_ui->hide ();
306 ARDOUR_UI::toggle_color_manager ()
308 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleColorManager"));
310 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
312 if (tact->get_active()) {
313 color_manager->show_all ();
314 color_manager->present ();
316 color_manager->hide ();
322 ARDOUR_UI::create_route_params ()
324 if (route_params == 0) {
325 route_params = new RouteParams_UI (*engine);
326 route_params->set_session (session);
327 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
333 ARDOUR_UI::toggle_route_params_window ()
335 if (create_route_params ()) {
339 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
341 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
343 if (tact->get_active()) {
344 route_params->show_all ();
345 route_params->present ();
347 route_params->hide ();
353 ARDOUR_UI::handle_locations_change (Location* ignored)
356 if (session->locations()->num_range_markers()) {
357 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
359 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);