2 Copyright (C) 2005 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 #include <pbd/error.h>
22 #include <ardour/recent_sessions.h>
23 #include <ardour/session.h>
24 #include <ardour/profile.h>
26 #include <gtkmm/entry.h>
27 #include <gtkmm/filechooserbutton.h>
28 #include <gtkmm/spinbutton.h>
29 #include <gtkmm/checkbutton.h>
30 #include <gtkmm/radiobutton.h>
31 #include <gtkmm/filefilter.h>
32 #include <gtkmm/stock.h>
33 #include <gdkmm/cursor.h>
35 #include <gtkmm2ext/window_title.h>
38 using namespace Gtkmm2ext
;
44 #include "new_session_dialog.h"
46 NewSessionDialog::NewSessionDialog()
47 : ArdourDialog ("session control")
49 in_destructor
= false;
50 session_name_label
= new Gtk::Label(_("Name :"));
51 last_name_page
= NewPage
;
52 m_name
= new Gtk::Entry();
53 m_name
->set_text(ARDOUR_COMMAND_LINE::session_name
);
55 chan_count_label_1
= new Gtk::Label(_("channels"));
56 chan_count_label_2
= new Gtk::Label(_("channels"));
57 chan_count_label_3
= new Gtk::Label(_("channels"));
58 chan_count_label_4
= new Gtk::Label(_("channels"));
60 chan_count_label_1
->set_alignment(0,0.5);
61 chan_count_label_1
->set_padding(0,0);
62 chan_count_label_1
->set_line_wrap(false);
64 chan_count_label_2
->set_alignment(0,0.5);
65 chan_count_label_2
->set_padding(0,0);
66 chan_count_label_2
->set_line_wrap(false);
68 chan_count_label_3
->set_alignment(0,0.5);
69 chan_count_label_3
->set_padding(0,0);
70 chan_count_label_3
->set_line_wrap(false);
72 chan_count_label_4
->set_alignment(0,0.5);
73 chan_count_label_4
->set_padding(0,0);
74 chan_count_label_4
->set_line_wrap(false);
76 bus_label
= new Gtk::Label(_("<b>Busses</b>"));
77 input_label
= new Gtk::Label(_("<b>Inputs</b>"));
78 output_label
= new Gtk::Label(_("<b>Outputs</b>"));
80 session_location_label
= new Gtk::Label(_("Create Folder In :"));
81 m_folder
= new Gtk::FileChooserButton(Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER
);
82 session_template_label
= new Gtk::Label(_("Template :"));
83 m_template
= new Gtk::FileChooserButton();
84 m_create_control_bus
= new Gtk::CheckButton(_("Create Monitor Bus"));
86 Gtk::Adjustment
*m_control_bus_channel_count_adj
= Gtk::manage(new Gtk::Adjustment(2, 0, 100, 1, 10));
87 m_control_bus_channel_count
= new Gtk::SpinButton(*m_control_bus_channel_count_adj
, 1, 0);
89 Gtk::Adjustment
*m_master_bus_channel_count_adj
= Gtk::manage(new Gtk::Adjustment(2, 0, 100, 1, 10));
90 m_master_bus_channel_count
= new Gtk::SpinButton(*m_master_bus_channel_count_adj
, 1, 0);
91 m_create_master_bus
= new Gtk::CheckButton(_("Create Master Bus"));
92 advanced_table
= new Gtk::Table(2, 2, true);
93 m_connect_inputs
= new Gtk::CheckButton(_("Automatically Connect to Physical Inputs"));
94 m_limit_input_ports
= new Gtk::CheckButton(_("Use only"));
96 Gtk::Adjustment
*m_input_limit_count_adj
= Gtk::manage(new Gtk::Adjustment(1, 0, 100, 1, 10));
97 m_input_limit_count
= new Gtk::SpinButton(*m_input_limit_count_adj
, 1, 0);
98 input_port_limit_hbox
= new Gtk::HBox(false, 0);
99 input_port_vbox
= new Gtk::VBox(false, 0);
100 input_table
= new Gtk::Table(2, 2, false);
102 bus_frame
= new Gtk::Frame();
103 bus_table
= new Gtk::Table (2, 3, false);
105 input_frame
= new Gtk::Frame();
106 m_connect_outputs
= new Gtk::CheckButton(_("Automatically Connect Outputs"));
107 m_limit_output_ports
= new Gtk::CheckButton(_("Use only"));
109 Gtk::Adjustment
*m_output_limit_count_adj
= Gtk::manage(new Gtk::Adjustment(1, 0, 100, 1, 10));
110 m_output_limit_count
= new Gtk::SpinButton(*m_output_limit_count_adj
, 1, 0);
111 output_port_limit_hbox
= new Gtk::HBox(false, 0);
112 output_port_vbox
= new Gtk::VBox(false, 0);
114 Gtk::RadioButton::Group _RadioBGroup_m_connect_outputs_to_master
;
115 m_connect_outputs_to_master
= new Gtk::RadioButton(_RadioBGroup_m_connect_outputs_to_master
, _("... to Master Bus"));
116 m_connect_outputs_to_physical
= new Gtk::RadioButton(_RadioBGroup_m_connect_outputs_to_master
, _("... to Physical Outputs"));
117 output_conn_vbox
= new Gtk::VBox(false, 0);
118 output_vbox
= new Gtk::VBox(false, 0);
120 output_frame
= new Gtk::Frame();
121 advanced_vbox
= new Gtk::VBox(false, 0);
122 advanced_label
= new Gtk::Label(_("Advanced Options"));
123 advanced_expander
= new Gtk::Expander();
124 new_session_table
= new Gtk::Table(2, 2, false);
125 m_open_filechooser
= new Gtk::FileChooserButton();
126 open_session_hbox
= new Gtk::HBox(false, 0);
127 m_treeview
= new Gtk::TreeView();
128 recent_scrolledwindow
= new Gtk::ScrolledWindow();
130 recent_sesion_label
= new Gtk::Label(_("Recent:"));
131 recent_frame
= new Gtk::Frame();
132 open_session_vbox
= new Gtk::VBox(false, 0);
133 m_notebook
= new Gtk::Notebook();
134 session_name_label
->set_alignment(0, 0.5);
135 session_name_label
->set_padding(6,0);
136 session_name_label
->set_line_wrap(false);
137 session_name_label
->set_selectable(false);
138 m_name
->set_editable(true);
139 m_name
->set_max_length(0);
140 m_name
->set_has_frame(true);
141 m_name
->set_activates_default(true);
142 m_name
->set_width_chars (40);
143 session_location_label
->set_alignment(0,0.5);
144 session_location_label
->set_padding(6,0);
145 session_location_label
->set_line_wrap(false);
146 session_location_label
->set_selectable(false);
147 session_template_label
->set_alignment(0,0.5);
148 session_template_label
->set_padding(6,0);
149 session_template_label
->set_line_wrap(false);
150 session_template_label
->set_selectable(false);
151 m_create_control_bus
->set_flags(Gtk::CAN_FOCUS
);
152 m_create_control_bus
->set_relief(Gtk::RELIEF_NORMAL
);
153 m_create_control_bus
->set_mode(true);
154 m_create_control_bus
->set_active(false);
155 m_create_control_bus
->set_border_width(0);
156 m_control_bus_channel_count
->set_flags(Gtk::CAN_FOCUS
);
157 m_control_bus_channel_count
->set_update_policy(Gtk::UPDATE_ALWAYS
);
158 m_control_bus_channel_count
->set_numeric(true);
159 m_control_bus_channel_count
->set_digits(0);
160 m_control_bus_channel_count
->set_wrap(false);
161 m_control_bus_channel_count
->set_sensitive(false);
162 m_master_bus_channel_count
->set_flags(Gtk::CAN_FOCUS
);
163 m_master_bus_channel_count
->set_update_policy(Gtk::UPDATE_ALWAYS
);
164 m_master_bus_channel_count
->set_numeric(true);
165 m_master_bus_channel_count
->set_digits(0);
166 m_master_bus_channel_count
->set_wrap(false);
167 open_session_file_label
= new Gtk::Label(_("Browse:"));
168 open_session_file_label
->set_alignment(0, 0.5);
169 m_create_master_bus
->set_flags(Gtk::CAN_FOCUS
);
170 m_create_master_bus
->set_relief(Gtk::RELIEF_NORMAL
);
171 m_create_master_bus
->set_mode(true);
172 m_create_master_bus
->set_active(true);
173 m_create_master_bus
->set_border_width(0);
174 advanced_table
->set_row_spacings(0);
175 advanced_table
->set_col_spacings(0);
177 m_connect_inputs
->set_flags(Gtk::CAN_FOCUS
);
178 m_connect_inputs
->set_relief(Gtk::RELIEF_NORMAL
);
179 m_connect_inputs
->set_mode(true);
180 m_connect_inputs
->set_active(true);
181 m_connect_inputs
->set_border_width(0);
183 m_limit_input_ports
->set_flags(Gtk::CAN_FOCUS
);
184 m_limit_input_ports
->set_relief(Gtk::RELIEF_NORMAL
);
185 m_limit_input_ports
->set_mode(true);
186 m_limit_input_ports
->set_sensitive(true);
187 m_limit_input_ports
->set_border_width(0);
188 m_input_limit_count
->set_flags(Gtk::CAN_FOCUS
);
189 m_input_limit_count
->set_update_policy(Gtk::UPDATE_ALWAYS
);
190 m_input_limit_count
->set_numeric(true);
191 m_input_limit_count
->set_digits(0);
192 m_input_limit_count
->set_wrap(false);
193 m_input_limit_count
->set_sensitive(false);
195 bus_hbox
= new Gtk::HBox (false, 0);
196 bus_hbox
->pack_start (*bus_table
, Gtk::PACK_SHRINK
, 18);
198 bus_label
->set_alignment(0, 0.5);
199 bus_label
->set_padding(0,0);
200 bus_label
->set_line_wrap(false);
201 bus_label
->set_selectable(false);
202 bus_label
->set_use_markup(true);
203 bus_frame
->set_shadow_type(Gtk::SHADOW_NONE
);
204 bus_frame
->set_label_align(0,0.5);
205 bus_frame
->add(*bus_hbox
);
206 bus_frame
->set_label_widget(*bus_label
);
208 bus_table
->set_row_spacings (0);
209 bus_table
->set_col_spacings (0);
210 bus_table
->attach (*m_create_master_bus
, 0, 1, 0, 1, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 0, 0);
211 bus_table
->attach (*m_master_bus_channel_count
, 1, 2, 0, 1, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 0, 0);
212 bus_table
->attach (*chan_count_label_1
, 2, 3, 0, 1, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 6, 0);
213 bus_table
->attach (*m_create_control_bus
, 0, 1, 1, 2, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 0, 0);
214 bus_table
->attach (*m_control_bus_channel_count
, 1, 2, 1, 2, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 0, 0);
215 bus_table
->attach (*chan_count_label_2
, 2, 3, 1, 2, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 6, 0);
217 input_port_limit_hbox
->pack_start(*m_limit_input_ports
, Gtk::PACK_SHRINK
, 6);
218 input_port_limit_hbox
->pack_start(*m_input_limit_count
, Gtk::PACK_SHRINK
, 0);
219 input_port_limit_hbox
->pack_start(*chan_count_label_3
, Gtk::PACK_SHRINK
, 6);
220 input_port_vbox
->pack_start(*m_connect_inputs
, Gtk::PACK_SHRINK
, 0);
221 input_port_vbox
->pack_start(*input_port_limit_hbox
, Gtk::PACK_EXPAND_PADDING
, 0);
222 input_table
->set_row_spacings(0);
223 input_table
->set_col_spacings(0);
224 input_table
->attach(*input_port_vbox
, 0, 1, 0, 1, Gtk::EXPAND
|Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 6, 6);
226 input_hbox
= new Gtk::HBox (false, 0);
227 input_hbox
->pack_start (*input_table
, Gtk::PACK_SHRINK
, 18);
229 input_label
->set_alignment(0, 0.5);
230 input_label
->set_padding(0,0);
231 input_label
->set_line_wrap(false);
232 input_label
->set_selectable(false);
233 input_label
->set_use_markup(true);
234 input_frame
->set_shadow_type(Gtk::SHADOW_NONE
);
235 input_frame
->set_label_align(0,0.5);
236 input_frame
->add(*input_hbox
);
237 input_frame
->set_label_widget(*input_label
);
239 m_connect_outputs
->set_flags(Gtk::CAN_FOCUS
);
240 m_connect_outputs
->set_relief(Gtk::RELIEF_NORMAL
);
241 m_connect_outputs
->set_mode(true);
242 m_connect_outputs
->set_active(true);
243 m_connect_outputs
->set_border_width(0);
244 m_limit_output_ports
->set_flags(Gtk::CAN_FOCUS
);
245 m_limit_output_ports
->set_relief(Gtk::RELIEF_NORMAL
);
246 m_limit_output_ports
->set_mode(true);
247 m_limit_output_ports
->set_sensitive(true);
248 m_limit_output_ports
->set_border_width(0);
249 m_output_limit_count
->set_flags(Gtk::CAN_FOCUS
);
250 m_output_limit_count
->set_update_policy(Gtk::UPDATE_ALWAYS
);
251 m_output_limit_count
->set_numeric(false);
252 m_output_limit_count
->set_digits(0);
253 m_output_limit_count
->set_wrap(false);
254 m_output_limit_count
->set_sensitive(false);
255 output_port_limit_hbox
->pack_start(*m_limit_output_ports
, Gtk::PACK_SHRINK
, 6);
256 output_port_limit_hbox
->pack_start(*m_output_limit_count
, Gtk::PACK_SHRINK
, 0);
257 output_port_limit_hbox
->pack_start(*chan_count_label_4
, Gtk::PACK_SHRINK
, 6);
258 m_connect_outputs_to_master
->set_flags(Gtk::CAN_FOCUS
);
259 m_connect_outputs_to_master
->set_relief(Gtk::RELIEF_NORMAL
);
260 m_connect_outputs_to_master
->set_mode(true);
261 m_connect_outputs_to_master
->set_active(false);
262 m_connect_outputs_to_master
->set_border_width(0);
263 m_connect_outputs_to_physical
->set_flags(Gtk::CAN_FOCUS
);
264 m_connect_outputs_to_physical
->set_relief(Gtk::RELIEF_NORMAL
);
265 m_connect_outputs_to_physical
->set_mode(true);
266 m_connect_outputs_to_physical
->set_active(false);
267 m_connect_outputs_to_physical
->set_border_width(0);
268 output_conn_vbox
->pack_start(*m_connect_outputs
, Gtk::PACK_SHRINK
, 0);
269 output_conn_vbox
->pack_start(*m_connect_outputs_to_master
, Gtk::PACK_SHRINK
, 0);
270 output_conn_vbox
->pack_start(*m_connect_outputs_to_physical
, Gtk::PACK_SHRINK
, 0);
271 output_vbox
->set_border_width(6);
273 output_port_vbox
->pack_start(*output_port_limit_hbox
, Gtk::PACK_SHRINK
, 0);
275 output_vbox
->pack_start(*output_conn_vbox
);
276 output_vbox
->pack_start(*output_port_vbox
);
278 output_label
->set_alignment(0, 0.5);
279 output_label
->set_padding(0,0);
280 output_label
->set_line_wrap(false);
281 output_label
->set_selectable(false);
282 output_label
->set_use_markup(true);
283 output_frame
->set_shadow_type(Gtk::SHADOW_NONE
);
284 output_frame
->set_label_align(0,0.5);
286 output_hbox
= new Gtk::HBox (false, 0);
287 output_hbox
->pack_start (*output_vbox
, Gtk::PACK_SHRINK
, 18);
289 output_frame
->add(*output_hbox
);
290 output_frame
->set_label_widget(*output_label
);
292 advanced_vbox
->pack_start(*advanced_table
, Gtk::PACK_SHRINK
, 0);
293 advanced_vbox
->pack_start(*bus_frame
, Gtk::PACK_SHRINK
, 6);
294 advanced_vbox
->pack_start(*input_frame
, Gtk::PACK_SHRINK
, 6);
295 advanced_vbox
->pack_start(*output_frame
, Gtk::PACK_SHRINK
, 0);
296 advanced_label
->set_padding(0,0);
297 advanced_label
->set_line_wrap(false);
298 advanced_label
->set_selectable(false);
299 advanced_label
->set_alignment(0, 0.5);
300 advanced_expander
->set_flags(Gtk::CAN_FOCUS
);
301 advanced_expander
->set_border_width(0);
302 advanced_expander
->set_expanded(false);
303 advanced_expander
->set_spacing(0);
304 advanced_expander
->add(*advanced_vbox
);
305 advanced_expander
->set_label_widget(*advanced_label
);
306 new_session_table
->set_border_width(12);
307 new_session_table
->set_row_spacings(6);
308 new_session_table
->set_col_spacings(0);
309 new_session_table
->attach(*session_name_label
, 0, 1, 0, 1, Gtk::FILL
, Gtk::FILL
, 0, 0);
310 new_session_table
->attach(*m_name
, 1, 2, 0, 1, Gtk::EXPAND
|Gtk::FILL
, Gtk::FILL
, 0, 0);
311 new_session_table
->attach(*session_location_label
, 0, 1, 1, 2, Gtk::FILL
, Gtk::FILL
, 0, 0);
312 new_session_table
->attach(*m_folder
, 1, 2, 1, 2, Gtk::EXPAND
|Gtk::FILL
, Gtk::FILL
, 0, 0);
313 new_session_table
->attach(*session_template_label
, 0, 1, 2, 3, Gtk::FILL
, Gtk::FILL
, 0, 0);
314 new_session_table
->attach(*m_template
, 1, 2, 2, 3, Gtk::EXPAND
|Gtk::FILL
, Gtk::FILL
, 0, 0);
316 if (!ARDOUR::Profile
->get_sae()) {
317 new_session_table
->attach(*advanced_expander
, 0, 2, 3, 4, Gtk::FILL
, Gtk::EXPAND
|Gtk::FILL
, 0, 6);
320 open_session_hbox
->pack_start(*open_session_file_label
, false, false, 12);
321 open_session_hbox
->pack_start(*m_open_filechooser
, true, true, 12);
322 m_treeview
->set_flags(Gtk::CAN_FOCUS
);
323 m_treeview
->set_headers_visible(true);
324 m_treeview
->set_rules_hint(false);
325 m_treeview
->set_reorderable(false);
326 m_treeview
->set_enable_search(true);
327 m_treeview
->set_fixed_height_mode(false);
328 m_treeview
->set_hover_selection(false);
329 m_treeview
->set_size_request(-1, 150);
330 recent_scrolledwindow
->set_flags(Gtk::CAN_FOCUS
);
331 recent_scrolledwindow
->set_border_width(6);
332 recent_scrolledwindow
->set_shadow_type(Gtk::SHADOW_IN
);
333 recent_scrolledwindow
->set_policy(Gtk::POLICY_AUTOMATIC
, Gtk::POLICY_AUTOMATIC
);
334 recent_scrolledwindow
->property_window_placement().set_value(Gtk::CORNER_TOP_LEFT
);
335 recent_scrolledwindow
->add(*m_treeview
);
337 recent_sesion_label
->set_padding(0,0);
338 recent_sesion_label
->set_line_wrap(false);
339 recent_sesion_label
->set_selectable(false);
340 recent_frame
->set_border_width(12);
341 recent_frame
->set_shadow_type(Gtk::SHADOW_NONE
);
342 recent_frame
->add(*recent_scrolledwindow
);
343 recent_frame
->set_label_widget(*recent_sesion_label
);
344 open_session_vbox
->pack_start(*recent_frame
, Gtk::PACK_EXPAND_WIDGET
, 0);
345 open_session_vbox
->pack_start(*open_session_hbox
, Gtk::PACK_SHRINK
, 12);
347 m_notebook
->set_flags(Gtk::CAN_FOCUS
);
348 m_notebook
->set_scrollable(true);
350 get_vbox()->set_homogeneous(false);
351 get_vbox()->set_spacing(0);
352 get_vbox()->pack_start(*m_notebook
, Gtk::PACK_SHRINK
, 0);
355 icon setting is done again in the editor (for the whole app),
356 but its all chickens and eggs at this point.
359 list
<Glib::RefPtr
<Gdk::Pixbuf
> > window_icons
;
360 Glib::RefPtr
<Gdk::Pixbuf
> icon
;
362 if ((icon
= ::get_icon ("ardour_icon_16px")) != 0) {
363 window_icons
.push_back (icon
);
365 if ((icon
= ::get_icon ("ardour_icon_22px")) != 0) {
366 window_icons
.push_back (icon
);
368 if ((icon
= ::get_icon ("ardour_icon_32px")) != 0) {
369 window_icons
.push_back (icon
);
371 if ((icon
= ::get_icon ("ardour_icon_48px")) != 0) {
372 window_icons
.push_back (icon
);
374 if (!window_icons
.empty()) {
375 set_icon_list (window_icons
);
378 set_title(_("Session Control"));
380 set_position (Gtk::WIN_POS_MOUSE
);
381 set_resizable(false);
382 set_has_separator(false);
383 add_button(Gtk::Stock::QUIT
, Gtk::RESPONSE_CANCEL
);
384 add_button(Gtk::Stock::CLEAR
, Gtk::RESPONSE_NONE
);
385 m_okbutton
= add_button(Gtk::Stock::NEW
, Gtk::RESPONSE_OK
);
387 recent_model
= Gtk::TreeStore::create (recent_columns
);
388 m_treeview
->set_model (recent_model
);
389 m_treeview
->append_column (_("Recent Sessions"), recent_columns
.visible_name
);
390 m_treeview
->set_headers_visible (false);
391 m_treeview
->get_selection()->set_mode (Gtk::SELECTION_SINGLE
);
393 std::string path
= ARDOUR::get_user_ardour_path();
396 path
= ARDOUR::get_system_data_path();
399 const char * const template_dir_name
= X_("templates");
401 //if SYSTEM template folder exists, add it to the file chooser
402 const std::string sys_templates_path
= ARDOUR::get_system_data_path() + "/" + template_dir_name
;
404 if (Glib::file_test(sys_templates_path
, Glib::FILE_TEST_IS_DIR
))
406 m_template
->add_shortcut_folder(sys_templates_path
);
407 m_template
->set_current_folder (sys_templates_path
);
410 //if USER template folder exists, add it to the file chooser
411 const std::string user_template_path
= ARDOUR::get_user_ardour_path() + template_dir_name
;
412 bool utp_exists
= true;
414 if (!Glib::file_test(user_template_path
, Glib::FILE_TEST_IS_DIR
)) {
415 if (g_mkdir_with_parents (user_template_path
.c_str(), 0755)) {
421 m_template
->add_shortcut_folder(user_template_path
);
422 m_template
->set_current_folder (user_template_path
);
425 m_template
->set_title(_("select template"));
426 Gtk::FileFilter
* session_filter
= manage (new (Gtk::FileFilter
));
427 session_filter
->add_pattern(X_("*.ardour"));
428 session_filter
->add_pattern(X_("*.ardour.bak"));
429 m_open_filechooser
->set_filter (*session_filter
);
430 m_open_filechooser
->set_current_folder(getenv ("HOME"));
431 m_open_filechooser
->set_title(_("select session file"));
433 Gtk::FileFilter
* template_filter
= manage (new (Gtk::FileFilter
));
434 template_filter
->add_pattern(X_("*.ardour"));
435 template_filter
->add_pattern(X_("*.ardour.bak"));
436 template_filter
->add_pattern(X_("*.template"));
437 m_template
->set_filter (*template_filter
);
439 m_folder
->set_current_folder(getenv ("HOME"));
440 m_folder
->set_title(_("select directory"));
443 m_folder
->add_shortcut_folder("/Volumes");
444 m_open_filechooser
->add_shortcut_folder("/Volumes");
447 on_new_session_page
= true;
448 m_notebook
->set_current_page(0);
450 m_notebook
->show_all_children();
452 engine_page_session_folder
= X_("");
453 engine_page_session_name
= X_("");
455 set_default_response (Gtk::RESPONSE_OK
);
456 if (!ARDOUR_COMMAND_LINE::session_name
.length()) {
457 set_response_sensitive (Gtk::RESPONSE_OK
, false);
458 set_response_sensitive (Gtk::RESPONSE_NONE
, false);
460 set_response_sensitive (Gtk::RESPONSE_OK
, true);
461 set_response_sensitive (Gtk::RESPONSE_NONE
, true);
464 ///@ connect some signals
466 m_connect_inputs
->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::connect_inputs_clicked
));
467 m_connect_outputs
->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::connect_outputs_clicked
));
468 m_limit_input_ports
->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::limit_inputs_clicked
));
469 m_limit_output_ports
->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::limit_outputs_clicked
));
470 m_create_master_bus
->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::master_bus_button_clicked
));
471 m_create_control_bus
->signal_clicked().connect (mem_fun (*this, &NewSessionDialog::monitor_bus_button_clicked
));
472 m_name
->signal_changed().connect(mem_fun (*this, &NewSessionDialog::on_new_session_name_entry_changed
));
473 m_notebook
->signal_switch_page().connect (mem_fun (*this, &NewSessionDialog::notebook_page_changed
));
474 m_treeview
->get_selection()->signal_changed().connect (mem_fun (*this, &NewSessionDialog::treeview_selection_changed
));
475 m_treeview
->signal_row_activated().connect (mem_fun (*this, &NewSessionDialog::recent_row_activated
));
476 m_open_filechooser
->signal_selection_changed ().connect (mem_fun (*this, &NewSessionDialog::file_chosen
));
477 m_template
->signal_selection_changed ().connect (mem_fun (*this, &NewSessionDialog::template_chosen
));
479 page_set
= Pages (0);
482 NewSessionDialog::~NewSessionDialog()
484 in_destructor
= true;
488 NewSessionDialog::run ()
491 /* nothing to display */
492 return Gtk::RESPONSE_OK
;
494 if (!(page_set
& NewPage
) && !(page_set
& OpenPage
)) {
495 set_response_sensitive (Gtk::RESPONSE_OK
, true);
497 return ArdourDialog::run ();
501 NewSessionDialog::set_have_engine (bool yn
)
504 m_notebook
->remove_page (engine_control
);
505 page_set
= Pages (page_set
& ~EnginePage
);
509 engine_control
.discover_servers ();
511 if (engine_control
.interface_chosen()) {
512 m_notebook
->append_page (engine_control
, _("Audio Setup"));
513 m_notebook
->show_all_children();
514 page_set
= Pages (page_set
| EnginePage
);
516 m_notebook
->prepend_page (engine_control
, _("Audio Setup"));
517 page_set
= Pages (page_set
| EnginePage
);
519 /* no interface ever selected - make it the first and only page */
520 if (page_set
& NewPage
) {
521 m_notebook
->remove_page (*new_session_table
);
522 page_set
= Pages (page_set
& ~NewPage
);
524 if (page_set
& OpenPage
) {
525 m_notebook
->remove_page (*open_session_vbox
);
526 page_set
= Pages (page_set
& ~OpenPage
);
528 m_notebook
->show_all_children();
534 NewSessionDialog::set_existing_session (bool yn
)
538 if (page_set
& NewPage
) {
539 m_notebook
->remove_page (*new_session_table
);
540 page_set
= Pages (page_set
& ~NewPage
);
543 if (page_set
& OpenPage
) {
544 m_notebook
->remove_page (*open_session_vbox
);
545 page_set
= Pages (page_set
& ~OpenPage
);
549 if (!(page_set
& NewPage
)) {
550 m_notebook
->append_page(*new_session_table
, _("New Session"));
551 m_notebook
->pages().back().set_tab_label_packing(false, true, Gtk::PACK_START
);
552 page_set
= Pages (page_set
| NewPage
);
554 if (!(page_set
& OpenPage
)) {
555 m_notebook
->append_page(*open_session_vbox
, _("Open Session"));
556 m_notebook
->pages().back().set_tab_label_packing(false, true, Gtk::PACK_START
);
557 page_set
= Pages (page_set
| OpenPage
);
560 m_notebook
->show_all_children();
565 NewSessionDialog::set_session_name (const Glib::ustring
& name
)
567 m_name
->set_text (name
);
568 engine_page_session_name
= name
;
572 NewSessionDialog::set_session_folder(const Glib::ustring
& dir
)
574 Glib::ustring realdir
= dir
;
576 /* this little tangled mess is a result of 4 things:
578 1) GtkFileChooser vomits when given a non-absolute directory
579 argument to set_current_folder()
580 2) canonicalize_file_name() doesn't exist on OS X
581 3) linux man page for realpath() says "do not use this function"
582 4) canonicalize_file_name() & realpath() have entirely
583 different semantics on OS X and Linux when given
586 as result of all this, we take two distinct pathways through the code.
594 if(realpath (dir
.c_str(), buf
) != 0) {
595 if (!Glib::file_test (dir
, Glib::FILE_TEST_IS_DIR
)) {
596 realdir
= Glib::path_get_dirname (realdir
);
598 m_folder
->set_current_folder (realdir
);
599 engine_page_session_folder
= realdir
;
605 if (!Glib::file_test (dir
, Glib::FILE_TEST_IS_DIR
)) {
606 realdir
= Glib::path_get_dirname (realdir
);
609 if ((res
= canonicalize_file_name (realdir
.c_str())) != 0) {
610 m_folder
->set_current_folder (res
);
611 engine_page_session_folder
= res
;
620 NewSessionDialog::session_name() const
622 std::string str
= Glib::filename_from_utf8 (m_open_filechooser
->get_filename());
623 std::string::size_type position
= str
.find_last_of (G_DIR_SEPARATOR
);
624 str
= str
.substr (position
+1);
625 position
= str
.find_last_of ('.');
626 str
= str
.substr (0, position
);
629 XXX what to do if it's a .bak file?
630 load_session doesn't allow it!
632 if ((position = str.rfind(".bak")) != string::npos) {
633 str = str.substr (0, position);
637 switch (which_page()) {
639 return Glib::filename_from_utf8(m_name
->get_text());
642 if (!(page_set
& (OpenPage
|NewPage
))) {
643 return engine_page_session_name
;
644 } else if (last_name_page
== NewPage
) {
645 return Glib::filename_from_utf8(m_name
->get_text());
647 /* relax and use the open page stuff at the end */
655 if (m_treeview
->get_selection()->count_selected_rows() == 0) {
656 return Glib::filename_from_utf8(str
);
659 Gtk::TreeModel::iterator i
= m_treeview
->get_selection()->get_selected();
660 return (*i
)[recent_columns
.visible_name
];
664 NewSessionDialog::session_folder() const
666 switch (which_page()) {
668 return Glib::filename_from_utf8(m_folder
->get_filename());
671 if (!(page_set
& (OpenPage
|NewPage
))) {
672 return Glib::filename_from_utf8(engine_page_session_folder
);
673 } else if (last_name_page
== NewPage
) {
674 /* use m_folder since it should be set */
675 return Glib::filename_from_utf8(m_folder
->get_filename());
677 /* relax and use the open page stuff at the end */
685 if (m_treeview
->get_selection()->count_selected_rows() == 0) {
686 const string
filename(Glib::filename_from_utf8(m_open_filechooser
->get_filename()));
687 return Glib::path_get_dirname(filename
);
690 Gtk::TreeModel::iterator i
= m_treeview
->get_selection()->get_selected();
691 return (*i
)[recent_columns
.fullpath
];
695 NewSessionDialog::use_session_template() const
697 if(m_template
->get_filename().empty() && (which_page() == NewPage
)) return false;
702 NewSessionDialog::session_template_name() const
704 return Glib::filename_from_utf8(m_template
->get_filename());
708 NewSessionDialog::create_master_bus() const
710 return m_create_master_bus
->get_active();
714 NewSessionDialog::master_channel_count() const
716 return m_master_bus_channel_count
->get_value_as_int();
720 NewSessionDialog::create_control_bus() const
722 return m_create_control_bus
->get_active();
726 NewSessionDialog::control_channel_count() const
728 return m_control_bus_channel_count
->get_value_as_int();
732 NewSessionDialog::connect_inputs() const
734 return m_connect_inputs
->get_active();
738 NewSessionDialog::limit_inputs_used_for_connection() const
740 return m_limit_input_ports
->get_active();
744 NewSessionDialog::input_limit_count() const
746 return m_input_limit_count
->get_value_as_int();
750 NewSessionDialog::connect_outputs() const
752 return m_connect_outputs
->get_active();
756 NewSessionDialog::limit_outputs_used_for_connection() const
758 return m_limit_output_ports
->get_active();
762 NewSessionDialog::output_limit_count() const
764 return m_output_limit_count
->get_value_as_int();
768 NewSessionDialog::connect_outs_to_master() const
770 return m_connect_outputs_to_master
->get_active();
774 NewSessionDialog::connect_outs_to_physical() const
776 return m_connect_outputs_to_physical
->get_active();
780 NewSessionDialog::get_current_page()
782 return m_notebook
->get_current_page();
785 NewSessionDialog::Pages
786 NewSessionDialog::which_page () const
788 int num
= m_notebook
->get_current_page();
790 if (page_set
== NewPage
) {
793 } else if (page_set
== OpenPage
) {
796 } else if (page_set
== EnginePage
) {
799 } else if (page_set
== (NewPage
|OpenPage
)) {
807 } else if (page_set
== (NewPage
|EnginePage
)) {
808 if (engine_control
.interface_chosen()) {
824 } else if (page_set
== (NewPage
|EnginePage
|OpenPage
)) {
825 if (engine_control
.interface_chosen()) {
845 } else if (page_set
== (OpenPage
|EnginePage
)) {
846 if (engine_control
.interface_chosen()) {
863 return NewPage
; /* shouldn't get here */
867 NewSessionDialog::set_current_page(int page
)
869 return m_notebook
->set_current_page (page
);
873 NewSessionDialog::reset_name()
875 m_name
->set_text("");
876 set_response_sensitive (Gtk::RESPONSE_OK
, false);
881 NewSessionDialog::on_new_session_name_entry_changed ()
883 if (m_name
->get_text() != "") {
884 set_response_sensitive (Gtk::RESPONSE_OK
, true);
885 set_response_sensitive (Gtk::RESPONSE_NONE
, true);
887 set_response_sensitive (Gtk::RESPONSE_OK
, false);
892 NewSessionDialog::notebook_page_changed (GtkNotebookPage
* np
, uint pagenum
)
898 switch (which_page()) {
900 on_new_session_page
= false;
901 m_okbutton
->set_label(_("Open"));
902 m_okbutton
->set_image (*(manage (new Gtk::Image (Gtk::Stock::OPEN
, Gtk::ICON_SIZE_BUTTON
))));
903 set_response_sensitive (Gtk::RESPONSE_NONE
, false);
904 if (m_treeview
->get_selection()->count_selected_rows() == 0) {
905 set_response_sensitive (Gtk::RESPONSE_OK
, false);
907 set_response_sensitive (Gtk::RESPONSE_OK
, true);
909 last_name_page
= OpenPage
;
913 on_new_session_page
= false;
914 if (!engine_control
.interface_chosen()) {
915 m_okbutton
->set_label(_("Start Audio Engine"));
917 m_okbutton
->set_label(_("Start"));
919 m_okbutton
->set_image (*(manage (new Gtk::Image (Gtk::Stock::OPEN
, Gtk::ICON_SIZE_BUTTON
))));
920 set_response_sensitive (Gtk::RESPONSE_NONE
, false);
921 set_response_sensitive (Gtk::RESPONSE_OK
, true);
925 on_new_session_page
= true;
926 m_okbutton
->set_label(_("New"));
927 m_okbutton
->set_image (*(new Gtk::Image (Gtk::Stock::NEW
, Gtk::ICON_SIZE_BUTTON
)));
928 if (m_name
->get_text() == "") {
929 set_response_sensitive (Gtk::RESPONSE_OK
, false);
930 m_name
->grab_focus();
932 set_response_sensitive (Gtk::RESPONSE_OK
, true);
934 last_name_page
= NewPage
;
940 NewSessionDialog::treeview_selection_changed ()
942 if (m_treeview
->get_selection()->count_selected_rows() == 0) {
943 if (!m_open_filechooser
->get_filename().empty()) {
944 set_response_sensitive (Gtk::RESPONSE_OK
, true);
946 set_response_sensitive (Gtk::RESPONSE_OK
, false);
949 set_response_sensitive (Gtk::RESPONSE_OK
, true);
954 NewSessionDialog::file_chosen ()
956 switch (which_page()) {
964 m_treeview
->get_selection()->unselect_all();
966 Glib::RefPtr
<Gdk::Window
> win (get_window());
969 win
->set_cursor(Gdk::Cursor(Gdk::WATCH
));
972 if (!m_open_filechooser
->get_filename().empty()) {
973 set_response_sensitive (Gtk::RESPONSE_OK
, true);
974 response (Gtk::RESPONSE_OK
);
976 set_response_sensitive (Gtk::RESPONSE_OK
, false);
981 NewSessionDialog::template_chosen ()
983 if (m_template
->get_filename() != "" ) {;
984 set_response_sensitive (Gtk::RESPONSE_NONE
, true);
986 set_response_sensitive (Gtk::RESPONSE_NONE
, false);
991 NewSessionDialog::recent_row_activated (const Gtk::TreePath
& path
, Gtk::TreeViewColumn
* col
)
993 response (Gtk::RESPONSE_OK
);
997 NewSessionDialog::connect_inputs_clicked ()
999 m_limit_input_ports
->set_sensitive(m_connect_inputs
->get_active());
1001 if (m_connect_inputs
->get_active() && m_limit_input_ports
->get_active()) {
1002 m_input_limit_count
->set_sensitive(true);
1004 m_input_limit_count
->set_sensitive(false);
1009 NewSessionDialog::connect_outputs_clicked ()
1011 m_limit_output_ports
->set_sensitive(m_connect_outputs
->get_active());
1013 if (m_connect_outputs
->get_active() && m_limit_output_ports
->get_active()) {
1014 m_output_limit_count
->set_sensitive(true);
1016 m_output_limit_count
->set_sensitive(false);
1021 NewSessionDialog::limit_inputs_clicked ()
1023 m_input_limit_count
->set_sensitive(m_limit_input_ports
->get_active());
1027 NewSessionDialog::limit_outputs_clicked ()
1029 m_output_limit_count
->set_sensitive(m_limit_output_ports
->get_active());
1033 NewSessionDialog::master_bus_button_clicked ()
1035 m_master_bus_channel_count
->set_sensitive(m_create_master_bus
->get_active());
1039 NewSessionDialog::monitor_bus_button_clicked ()
1041 m_control_bus_channel_count
->set_sensitive(m_create_control_bus
->get_active());
1045 NewSessionDialog::reset_template()
1047 m_template
->unselect_all ();
1051 NewSessionDialog::reset_recent()
1053 /* Shamelessly ripped from ardour_ui.cc */
1054 std::vector
<string
*> *sessions
;
1055 std::vector
<string
*>::iterator i
;
1056 RecentSessionsSorter cmp
;
1058 recent_model
->clear ();
1060 ARDOUR::RecentSessions rs
;
1061 ARDOUR::read_recent_sessions (rs
);
1063 /* sort them alphabetically */
1064 sort (rs
.begin(), rs
.end(), cmp
);
1065 sessions
= new std::vector
<std::string
*>;
1067 for (ARDOUR::RecentSessions::iterator i
= rs
.begin(); i
!= rs
.end(); ++i
) {
1068 sessions
->push_back (new string ((*i
).second
));
1071 for (i
= sessions
->begin(); i
!= sessions
->end(); ++i
) {
1073 std::vector
<std::string
*>* states
;
1074 std::vector
<const gchar
*> item
;
1075 std::string fullpath
= *(*i
);
1077 /* remove any trailing separator */
1079 if (fullpath
[fullpath
.length()-1] == G_DIR_SEPARATOR
) {
1080 fullpath
= fullpath
.substr (0, fullpath
.length()-1);
1083 /* check whether session still exists */
1084 if (!Glib::file_test(fullpath
, Glib::FILE_TEST_EXISTS
)) {
1085 /* session doesn't exist */
1089 /* now get available states for this session */
1091 if ((states
= ARDOUR::Session::possible_states (fullpath
)) == 0) {
1092 /* no state file? */
1096 Gtk::TreeModel::Row row
= *(recent_model
->append());
1098 row
[recent_columns
.visible_name
] = Glib::path_get_basename (fullpath
);
1099 row
[recent_columns
.fullpath
] = fullpath
;
1101 if (states
->size()) {
1103 /* add the children */
1105 for (std::vector
<std::string
*>::iterator i2
= states
->begin(); i2
!= states
->end(); ++i2
) {
1107 Gtk::TreeModel::Row child_row
= *(recent_model
->append (row
.children()));
1109 child_row
[recent_columns
.visible_name
] = **i2
;
1110 child_row
[recent_columns
.fullpath
] = fullpath
;
1122 NewSessionDialog::reset()
1126 set_response_sensitive (Gtk::RESPONSE_NONE
, false);