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 "location_ui.h"
32 #include "option_editor.h"
33 #include "public_editor.h"
34 #include "route_params_ui.h"
36 #include "theme_manager.h"
37 #include "bundle_manager.h"
38 #include "keyeditor.h"
42 using namespace ARDOUR;
46 using namespace Gtkmm2ext;
49 ARDOUR_UI::connect_to_session (Session *s)
53 session->Xrun.connect (mem_fun(*this, &ARDOUR_UI::xrun_handler));
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::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);
95 location_ui->set_session(s);
99 route_params->set_session (s);
103 option_editor->set_session (s);
106 setup_session_options ();
108 Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
109 Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
110 Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
112 /* these are all need to be handled in an RT-safe and MT way, so don't
113 do any GUI work, just queue it for handling by the GUI thread.
116 session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
118 /* alert the user to these things happening */
120 session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
121 session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
123 solo_alert_button.set_active (session->soloing());
125 /* update autochange callback on dirty state changing */
127 session->DirtyChanged.connect (mem_fun(*this, &ARDOUR_UI::update_autosave));
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 (bool hide_stuff)
164 if (session && session->dirty()) {
165 switch (ask_about_saving_session (_("close"))) {
171 session->save_state ("");
179 theme_manager->hide ();
182 second_connection.disconnect ();
183 point_one_second_connection.disconnect ();
184 point_oh_five_second_connection.disconnect ();
185 point_zero_one_second_connection.disconnect();
187 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
189 rec_button.set_sensitive (false);
190 shuttle_box.set_sensitive (false);
195 /* drop everything attached to the blink signal */
199 primary_clock.set_session (0);
200 secondary_clock.set_session (0);
201 big_clock.set_session (0);
202 preroll_clock.set_session (0);
203 postroll_clock.set_session (0);
206 option_editor->set_session (0);
212 update_buffer_load ();
218 ARDOUR_UI::toggle_big_clock_window ()
220 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
222 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
224 if (tact->get_active()) {
225 big_clock_window->show_all ();
226 big_clock_window->present ();
228 big_clock_window->hide ();
234 ARDOUR_UI::toggle_options_window ()
236 if (option_editor == 0) {
237 option_editor = new OptionEditor (*this, *editor, *mixer);
238 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
239 option_editor->set_session (session);
242 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
244 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
246 if (tact->get_active()) {
247 option_editor->show_all ();
248 option_editor->present ();
250 option_editor->hide ();
256 ARDOUR_UI::create_location_ui ()
258 if (location_ui == 0) {
259 location_ui = new LocationUI ();
260 location_ui->set_session (session);
261 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
267 ARDOUR_UI::toggle_location_window ()
269 if (create_location_ui()) {
273 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
275 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
277 if (tact->get_active()) {
278 location_ui->show_all ();
279 location_ui->present ();
281 location_ui->hide ();
287 ARDOUR_UI::toggle_key_editor ()
289 if (key_editor == 0) {
290 key_editor = new KeyEditor;
291 key_editor->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleKeyEditor")));
294 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleKeyEditor"));
296 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
298 if (tact->get_active()) {
299 key_editor->show_all ();
300 key_editor->present ();
308 ARDOUR_UI::toggle_theme_manager ()
310 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleThemeManager"));
312 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
314 if (tact->get_active()) {
315 theme_manager->show_all ();
316 theme_manager->present ();
318 theme_manager->hide ();
324 ARDOUR_UI::create_bundle_manager ()
326 if (bundle_manager == 0) {
327 bundle_manager = new BundleManager (*session);
328 bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
333 ARDOUR_UI::toggle_bundle_manager ()
335 create_bundle_manager ();
337 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBundleManager"));
339 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
341 if (tact->get_active()) {
342 bundle_manager->show_all ();
343 bundle_manager->present ();
345 bundle_manager->hide ();
351 ARDOUR_UI::create_route_params ()
353 if (route_params == 0) {
354 route_params = new RouteParams_UI ();
355 route_params->set_session (session);
356 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
362 ARDOUR_UI::toggle_route_params_window ()
364 if (create_route_params ()) {
368 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
370 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
372 if (tact->get_active()) {
373 route_params->show_all ();
374 route_params->present ();
376 route_params->hide ();
382 ARDOUR_UI::handle_locations_change (Location* ignored)
385 if (session->locations()->num_range_markers()) {
386 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
388 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
394 ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window_was_editor)
396 if (window_was_editor) {
398 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
399 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
400 float_big_clock (editor);
405 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
406 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
407 float_big_clock (mixer);