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"
38 #include "keyeditor.h"
42 using namespace ARDOUR;
46 using namespace Gtkmm2ext;
49 ARDOUR_UI::connect_to_session (Session *s)
53 session->HaltOnXrun.connect (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
54 session->RecordStateChanged.connect (mem_fun (*this, &ARDOUR_UI::record_state_changed));
56 /* sensitize menu bar options that are now valid */
58 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
60 if (session->locations()->num_range_markers()) {
61 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
63 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
66 if (!session->control_out()) {
67 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
69 act->set_sensitive (false);
73 /* allow wastebasket flush again */
75 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
77 act->set_sensitive (true);
80 /* there are never any selections on startup */
82 ActionManager::set_sensitive (ActionManager::region_selection_sensitive_actions, false);
83 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
84 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
85 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
86 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
87 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
89 session->locations()->added.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
90 session->locations()->removed.connect (mem_fun (*this, &ARDOUR_UI::handle_locations_change));
92 rec_button.set_sensitive (true);
93 shuttle_box.set_sensitive (true);
95 if (connection_editor) {
96 connection_editor->set_session (s);
100 location_ui->set_session(s);
104 route_params->set_session (s);
108 option_editor->set_session (s);
111 setup_session_options ();
113 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
114 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
115 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
117 /* these are all need to be handled in an RT-safe and MT way, so don't
118 do any GUI work, just queue it for handling by the GUI thread.
121 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
123 /* alert the user to these things happening */
125 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
126 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
128 solo_alert_button.set_active (session->soloing());
130 /* update autochange callback on dirty state changing */
132 session->DirtyChanged.connect (mem_fun(*this, &ARDOUR_UI::update_autosave));
134 /* can't be auditioning here */
136 primary_clock.set_session (s);
137 secondary_clock.set_session (s);
138 big_clock.set_session (s);
139 preroll_clock.set_session (s);
140 postroll_clock.set_session (s);
142 /* Clocks are on by default after we are connected to a session, so show that here.
145 connect_dependents_to_session (s);
147 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
148 restore their modes or are explicitly set, we will cause the "new" mode to be saved
149 back to the session XML ("extra") state.
152 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
154 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
159 transport_stopped ();
161 second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
162 point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
163 point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
167 ARDOUR_UI::unload_session (bool hide_stuff)
169 if (session && session->dirty()) {
170 switch (ask_about_saving_session (_("close"))) {
176 session->save_state ("");
186 second_connection.disconnect ();
187 point_one_second_connection.disconnect ();
188 point_oh_five_second_connection.disconnect ();
189 point_zero_one_second_connection.disconnect();
191 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
193 rec_button.set_sensitive (false);
194 shuttle_box.set_sensitive (false);
199 /* drop everything attached to the blink signal */
203 primary_clock.set_session (0);
204 secondary_clock.set_session (0);
205 big_clock.set_session (0);
206 preroll_clock.set_session (0);
207 postroll_clock.set_session (0);
210 option_editor->set_session (0);
216 update_buffer_load ();
222 ARDOUR_UI::create_connection_editor ()
225 if (connection_editor == 0) {
226 connection_editor = new ConnectionEditor ();
227 connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
231 connection_editor->set_session (session);
239 ARDOUR_UI::toggle_connection_editor ()
241 if (create_connection_editor()) {
246 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
248 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
250 if (tact->get_active()) {
251 connection_editor->show_all ();
252 connection_editor->present ();
254 connection_editor->hide ();
261 ARDOUR_UI::toggle_big_clock_window ()
263 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
265 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
267 if (tact->get_active()) {
268 big_clock_window->show_all ();
269 big_clock_window->present ();
271 big_clock_window->hide ();
277 ARDOUR_UI::toggle_options_window ()
279 if (option_editor == 0) {
280 option_editor = new OptionEditor (*this, *editor, *mixer);
281 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
282 option_editor->set_session (session);
285 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
287 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
289 if (tact->get_active()) {
290 option_editor->show_all ();
291 option_editor->present ();
293 option_editor->hide ();
299 ARDOUR_UI::create_location_ui ()
301 if (location_ui == 0) {
302 location_ui = new LocationUI ();
303 location_ui->set_session (session);
304 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
310 ARDOUR_UI::toggle_location_window ()
312 if (create_location_ui()) {
316 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
318 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
320 if (tact->get_active()) {
321 location_ui->show_all ();
322 location_ui->present ();
324 location_ui->hide ();
330 ARDOUR_UI::toggle_key_editor ()
332 if (key_editor == 0) {
333 key_editor = new KeyEditor;
334 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
337 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
339 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
341 if (tact->get_active()) {
342 key_editor->show_all ();
343 key_editor->present ();
351 ARDOUR_UI::toggle_theme_manager ()
353 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
355 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
357 if (tact->get_active()) {
358 theme_manager->show_all ();
359 theme_manager->present ();
361 theme_manager->hide ();
367 ARDOUR_UI::create_route_params ()
369 if (route_params == 0) {
370 route_params = new RouteParams_UI ();
371 route_params->set_session (session);
372 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
378 ARDOUR_UI::toggle_route_params_window ()
380 if (create_route_params ()) {
384 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
386 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
388 if (tact->get_active()) {
389 route_params->show_all ();
390 route_params->present ();
392 route_params->hide ();
398 ARDOUR_UI::handle_locations_change (Location* ignored)
401 if (session->locations()->num_range_markers()) {
402 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
404 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);