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_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
160 ARDOUR_UI::unload_session ()
162 if (session && session->dirty()) {
163 switch (ask_about_saving_session (_("close"))) {
168 session->save_state ("");
173 second_connection.disconnect ();
174 point_one_second_connection.disconnect ();
175 point_oh_five_second_connection.disconnect ();
176 point_zero_one_second_connection.disconnect();
178 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
180 rec_button.set_sensitive (false);
181 shuttle_box.set_sensitive (false);
186 /* drop everything attached to the blink signal */
190 primary_clock.set_session (0);
191 secondary_clock.set_session (0);
192 big_clock.set_session (0);
193 preroll_clock.set_session (0);
194 postroll_clock.set_session (0);
197 option_editor->set_session (0);
207 update_buffer_load ();
213 ARDOUR_UI::create_connection_editor ()
216 if (connection_editor == 0) {
217 connection_editor = new ConnectionEditor ();
218 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
222 connection_editor->set_session (session);
230 ARDOUR_UI::toggle_connection_editor ()
232 if (create_connection_editor()) {
237 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
239 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
241 if (tact->get_active()) {
242 connection_editor->show_all ();
243 connection_editor->present ();
245 connection_editor->hide ();
252 ARDOUR_UI::toggle_big_clock_window ()
254 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
256 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
258 if (tact->get_active()) {
259 big_clock_window->show_all ();
260 big_clock_window->present ();
262 big_clock_window->hide ();
268 ARDOUR_UI::toggle_options_window ()
270 if (option_editor == 0) {
271 option_editor = new OptionEditor (*this, *editor, *mixer);
272 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
273 option_editor->set_session (session);
276 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
278 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
280 if (tact->get_active()) {
281 option_editor->show_all ();
282 option_editor->present ();
284 option_editor->hide ();
290 ARDOUR_UI::create_location_ui ()
292 if (location_ui == 0) {
293 location_ui = new LocationUI ();
294 location_ui->set_session (session);
295 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
301 ARDOUR_UI::toggle_location_window ()
303 if (create_location_ui()) {
307 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
309 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
311 if (tact->get_active()) {
312 location_ui->show_all ();
313 location_ui->present ();
315 location_ui->hide ();
321 ARDOUR_UI::toggle_color_manager ()
323 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleColorManager"));
325 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
327 if (tact->get_active()) {
328 color_manager->show_all ();
329 color_manager->present ();
331 color_manager->hide ();
337 ARDOUR_UI::create_route_params ()
339 if (route_params == 0) {
340 route_params = new RouteParams_UI ();
341 route_params->set_session (session);
342 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
348 ARDOUR_UI::toggle_route_params_window ()
350 if (create_route_params ()) {
354 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
356 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
358 if (tact->get_active()) {
359 route_params->show_all ();
360 route_params->present ();
362 route_params->hide ();
368 ARDOUR_UI::handle_locations_change (Location* ignored)
371 if (session->locations()->num_range_markers()) {
372 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
374 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);