use stringcr_t and gain 1/1000 binary size reduction. not thaat much...
[ardour.git] / gtk2_ardour / ardour_ui_dialogs.cc
1 /*
2     Copyright (C) 2000 Paul Davis 
3
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.
8
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.
13
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.
17
18 */
19
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.
24 */
25
26 #include <ardour/session.h>
27
28 #include "actions.h"
29 #include "ardour_ui.h"
30 #include "connection_editor.h"
31 #include "location_ui.h"
32 #include "mixer_ui.h"
33 #include "option_editor.h"
34 #include "public_editor.h"
35 #include "route_params_ui.h"
36 #include "sfdb_ui.h"
37
38 #include "i18n.h"
39
40 using namespace ARDOUR;
41 using namespace Glib;
42 using namespace Gtk;
43 using namespace Gtkmm2ext;
44
45 void
46 ARDOUR_UI::connect_to_session (Session *s)
47 {
48         session = s;
49
50         session->HaltOnXrun.connect (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
51
52         /* sensitize menu bar options that are now valid */
53
54         ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
55
56         rec_button.set_sensitive (true);
57         shuttle_box.set_sensitive (true);
58         
59         if (session->n_diskstreams() == 0) {
60                 session->DiskStreamAdded.connect (mem_fun(*this, &ARDOUR_UI::diskstream_added));
61         }
62
63         if (connection_editor) {
64                 connection_editor->set_session (s);
65         }
66
67         if (location_ui) {
68                 location_ui->set_session(s);
69         }
70
71         if (route_params) {
72                 route_params->set_session (s);
73         }
74
75         if (option_editor) {
76                 option_editor->set_session (s);
77         }
78
79
80         Blink.connect (mem_fun(*this, &ARDOUR_UI::transport_rec_enable_blink));
81         Blink.connect (mem_fun(*this, &ARDOUR_UI::solo_blink));
82         Blink.connect (mem_fun(*this, &ARDOUR_UI::audition_blink));
83
84         /* these are all need to be handled in an RT-safe and MT way, so don't
85            do any GUI work, just queue it for handling by the GUI thread.
86         */
87
88         session->TransportStateChange.connect (mem_fun(*this, &ARDOUR_UI::queue_transport_change));
89         session->ControlChanged.connect (mem_fun(*this, &ARDOUR_UI::queue_map_control_change));
90
91         /* alert the user to these things happening */
92
93         session->AuditionActive.connect (mem_fun(*this, &ARDOUR_UI::auditioning_changed));
94         session->SoloActive.connect (mem_fun(*this, &ARDOUR_UI::soloing_changed));
95
96         solo_alert_button.set_active (session->soloing());
97
98         /* can't be auditioning here */
99
100         primary_clock.set_session (s);
101         secondary_clock.set_session (s);
102         big_clock.set_session (s);
103         preroll_clock.set_session (s);
104         postroll_clock.set_session (s);
105
106         /* Clocks are on by default after we are connected to a session, so show that here.
107         */
108         
109         map_button_state ();
110
111         connect_dependents_to_session (s);
112         
113         start_clocking ();
114         start_blinking ();
115
116         if (editor) {
117                 editor->present();
118         }
119
120         transport_stopped ();
121
122         second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_second), 1000);
123         point_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_one_seconds), 100);
124         point_zero_one_second_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::every_point_zero_one_seconds), 40);
125 }
126
127 int
128 ARDOUR_UI::unload_session ()
129 {
130         if (session && session->dirty()) {
131                 switch (ask_about_saving_session (_("close session"))) {
132                 case -1:
133                         return 1;
134                         
135                 case 1:
136                         session->save_state ("");
137                         break;
138                 }
139         }
140
141         second_connection.disconnect ();
142         point_one_second_connection.disconnect ();
143         point_zero_one_second_connection.disconnect();
144
145         ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
146         
147         rec_button.set_sensitive (false);
148         shuttle_box.set_sensitive (false);
149
150         stop_blinking ();
151         stop_clocking ();
152
153         /* drop everything attached to the blink signal */
154
155         Blink.clear ();
156
157         primary_clock.set_session (0);
158         secondary_clock.set_session (0);
159         big_clock.set_session (0);
160         preroll_clock.set_session (0);
161         postroll_clock.set_session (0);
162
163         if (option_editor) {
164                 option_editor->set_session (0);
165         }
166
167         if (mixer) {
168                 mixer->hide_all ();
169         }
170
171         delete session;
172         session = 0;
173
174         update_buffer_load ();
175         // update_disk_rate ();
176
177         return 0;
178 }
179
180 int
181 ARDOUR_UI::create_connection_editor ()
182 {
183         if (connection_editor == 0) {
184 //              connection_editor = new ConnectionEditor ();
185 //              connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
186         }
187
188         if (session) {
189 //              connection_editor->set_session (session);
190         }
191
192         return 0;
193 }
194
195 void
196 ARDOUR_UI::toggle_connection_editor ()
197 {
198         if (create_connection_editor()) {
199                 return;
200         }
201
202         //GTK2FIX
203 #if 0
204
205         if (connection_editor_check->get_active()){
206                 connection_editor->present();
207         } else {
208                 connection_editor->hide_all();
209         }
210 #endif
211 }
212
213 void
214 ARDOUR_UI::toggle_big_clock_window ()
215 {
216         if (big_clock_window->is_visible()) {
217                 big_clock_window->hide ();
218         } else {
219                 big_clock_window->show_all ();
220                 big_clock_window->present ();
221         }
222 }
223
224 void
225 ARDOUR_UI::toggle_options_window ()
226 {
227         if (option_editor == 0) {
228                 option_editor = new OptionEditor (*this, *editor, *mixer);
229                 option_editor->signal_unmap().connect(sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleOptionsEditor")));
230                 option_editor->set_session (session);
231         } 
232
233         if (option_editor->is_visible()) {
234                 option_editor->hide ();
235         } else {
236                 option_editor->present ();
237         }
238 }
239
240 void
241 ARDOUR_UI::toggle_auto_input ()
242
243 {
244         toggle_some_session_state (auto_input_button,
245                                    &Session::get_auto_input,
246                                    &Session::set_auto_input);
247 }
248
249 int
250 ARDOUR_UI::create_location_ui ()
251 {
252         if (location_ui == 0) {
253                 location_ui = new LocationUI ();
254                 location_ui->set_session (session);
255                 location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
256         }
257         return 0;
258 }
259
260 void
261 ARDOUR_UI::toggle_location_window ()
262 {
263         if (create_location_ui()) {
264                 return;
265         }
266
267         if (location_ui->is_visible()) {
268                 location_ui->hide();
269         } else {
270                 location_ui->present();
271         }
272 }
273
274 int
275 ARDOUR_UI::create_route_params ()
276 {
277         if (route_params == 0) {
278                 route_params = new RouteParams_UI (*engine);
279                 route_params->set_session (session);
280                 route_params->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleInspector")));
281         }
282         return 0;
283 }
284
285 void
286 ARDOUR_UI::toggle_route_params_window ()
287 {
288         if (create_route_params ()) {
289                 return;
290         }
291
292         if (route_params->is_visible ()) {
293                 route_params->hide ();
294         } else {
295                 route_params->present ();
296         }
297 }
298
299 int
300 ARDOUR_UI::create_sound_file_browser ()
301 {
302         if (sfdb == 0) {
303                 sfdb = new SoundFileBrowser (_("Sound File Browser"));
304                 sfdb->set_session (session);
305                 sfdb->signal_unmap().connect (sigc::bind(sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleSoundFileBrowser")));
306         }
307         return 0;
308 }
309         
310 void
311 ARDOUR_UI::toggle_sound_file_browser ()
312 {
313         if (create_sound_file_browser()) {
314                 return;
315         }
316
317         RefPtr<Action> act = ActionManager::ui_manager->get_action (X_("<Actions>/Common/ToggleSoundFileBrowser"));
318         if (act) {
319                 RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
320         
321                 if (tact->get_active()) {
322                         sfdb->present();
323                 } else {
324                         sfdb->hide ();
325                 }
326         }
327 }