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 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 /* can't be auditioning here */
131 primary_clock.set_session (s);
132 secondary_clock.set_session (s);
133 big_clock.set_session (s);
134 preroll_clock.set_session (s);
135 postroll_clock.set_session (s);
137 /* Clocks are on by default after we are connected to a session, so show that here.
140 connect_dependents_to_session (s);
142 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
143 restore their modes or are explicitly set, we will cause the "new" mode to be saved
144 back to the session XML ("extra") state.
147 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
152 transport_stopped ();
154 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
155 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
156 // point_oh_five_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_oh_five_seconds), 50);
157 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
161 ARDOUR_UI::unload_session ()
163 if (session && session->dirty()) {
164 switch (ask_about_saving_session (_("close"))) {
169 session->save_state ("");
174 second_connection.disconnect ();
175 point_one_second_connection.disconnect ();
176 point_oh_five_second_connection.disconnect ();
177 point_zero_one_second_connection.disconnect();
179 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
181 rec_button.set_sensitive (false);
182 shuttle_box.set_sensitive (false);
187 /* drop everything attached to the blink signal */
191 primary_clock.set_session (0);
192 secondary_clock.set_session (0);
193 big_clock.set_session (0);
194 preroll_clock.set_session (0);
195 postroll_clock.set_session (0);
198 option_editor->set_session (0);
208 update_buffer_load ();
214 ARDOUR_UI::create_connection_editor ()
217 if (connection_editor == 0) {
218 connection_editor = new ConnectionEditor ();
219 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
223 connection_editor->set_session (session);
231 ARDOUR_UI::toggle_connection_editor ()
233 if (create_connection_editor()) {
238 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
240 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
242 if (tact->get_active()) {
243 connection_editor->show_all ();
244 connection_editor->present ();
246 connection_editor->hide ();
253 ARDOUR_UI::toggle_big_clock_window ()
255 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
257 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
259 if (tact->get_active()) {
260 big_clock_window->show_all ();
261 big_clock_window->present ();
263 big_clock_window->hide ();
269 ARDOUR_UI::toggle_options_window ()
271 if (option_editor == 0) {
272 option_editor = new OptionEditor (*this, *editor, *mixer);
273 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
274 option_editor->set_session (session);
277 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
279 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
281 if (tact->get_active()) {
282 option_editor->show_all ();
283 option_editor->present ();
285 option_editor->hide ();
291 ARDOUR_UI::create_location_ui ()
293 if (location_ui == 0) {
294 location_ui = new LocationUI ();
295 location_ui->set_session (session);
296 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
302 ARDOUR_UI::toggle_location_window ()
304 if (create_location_ui()) {
308 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
310 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
312 if (tact->get_active()) {
313 location_ui->show_all ();
314 location_ui->present ();
316 location_ui->hide ();
322 ARDOUR_UI::toggle_color_manager ()
324 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleColorManager"));
326 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
328 if (tact->get_active()) {
329 color_manager->show_all ();
330 color_manager->present ();
332 color_manager->hide ();
338 ARDOUR_UI::create_route_params ()
340 if (route_params == 0) {
341 route_params = new RouteParams_UI ();
342 route_params->set_session (session);
343 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
349 ARDOUR_UI::toggle_route_params_window ()
351 if (create_route_params ()) {
355 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
357 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
359 if (tact->get_active()) {
360 route_params->show_all ();
361 route_params->present ();
363 route_params->hide ();
369 ARDOUR_UI::handle_locations_change (Location* ignored)
372 if (session->locations()->num_range_markers()) {
373 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
375 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);