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));
149 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
154 transport_stopped ();
156 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
157 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
158 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
162 ARDOUR_UI::unload_session ()
164 if (session && session->dirty()) {
165 switch (ask_about_saving_session (_("close"))) {
170 session->save_state ("");
175 second_connection.disconnect ();
176 point_one_second_connection.disconnect ();
177 point_oh_five_second_connection.disconnect ();
178 point_zero_one_second_connection.disconnect();
180 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
182 rec_button.set_sensitive (false);
183 shuttle_box.set_sensitive (false);
188 /* drop everything attached to the blink signal */
192 primary_clock.set_session (0);
193 secondary_clock.set_session (0);
194 big_clock.set_session (0);
195 preroll_clock.set_session (0);
196 postroll_clock.set_session (0);
199 option_editor->set_session (0);
209 update_buffer_load ();
215 ARDOUR_UI::create_connection_editor ()
218 if (connection_editor == 0) {
219 connection_editor = new ConnectionEditor ();
220 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
224 connection_editor->set_session (session);
232 ARDOUR_UI::toggle_connection_editor ()
234 if (create_connection_editor()) {
239 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
241 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
243 if (tact->get_active()) {
244 connection_editor->show_all ();
245 connection_editor->present ();
247 connection_editor->hide ();
254 ARDOUR_UI::toggle_big_clock_window ()
256 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
258 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
260 if (tact->get_active()) {
261 big_clock_window->show_all ();
262 big_clock_window->present ();
264 big_clock_window->hide ();
270 ARDOUR_UI::toggle_options_window ()
272 if (option_editor == 0) {
273 option_editor = new OptionEditor (*this, *editor, *mixer);
274 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
275 option_editor->set_session (session);
278 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
280 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
282 if (tact->get_active()) {
283 option_editor->show_all ();
284 option_editor->present ();
286 option_editor->hide ();
292 ARDOUR_UI::create_location_ui ()
294 if (location_ui == 0) {
295 location_ui = new LocationUI ();
296 location_ui->set_session (session);
297 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
303 ARDOUR_UI::toggle_location_window ()
305 if (create_location_ui()) {
309 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
311 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
313 if (tact->get_active()) {
314 location_ui->show_all ();
315 location_ui->present ();
317 location_ui->hide ();
323 ARDOUR_UI::toggle_color_manager ()
325 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleColorManager"));
327 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
329 if (tact->get_active()) {
330 color_manager->show_all ();
331 color_manager->present ();
333 color_manager->hide ();
339 ARDOUR_UI::create_route_params ()
341 if (route_params == 0) {
342 route_params = new RouteParams_UI ();
343 route_params->set_session (session);
344 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
350 ARDOUR_UI::toggle_route_params_window ()
352 if (create_route_params ()) {
356 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
358 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
360 if (tact->get_active()) {
361 route_params->show_all ();
362 route_params->present ();
364 route_params->hide ();
370 ARDOUR_UI::handle_locations_change (Location* ignored)
373 if (session->locations()->num_range_markers()) {
374 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
376 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);