2 Copyright (C) 2010 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.
21 #include "gtk2ardour-config.h"
27 #include <gtkmm/main.h>
28 #include <gtkmm/filechooser.h>
30 #include "pbd/failed_constructor.h"
31 #include "pbd/file_utils.h"
32 #include "pbd/filesystem.h"
33 #include "pbd/replace_all.h"
34 #include "pbd/whitespace.h"
36 #include "ardour/filesystem_paths.h"
37 #include "ardour/recent_sessions.h"
38 #include "ardour/session.h"
39 #include "ardour/session_state_utils.h"
40 #include "ardour/template_utils.h"
44 #include "engine_dialog.h"
53 using namespace ARDOUR;
55 ArdourStartup* ArdourStartup::the_startup = 0;
57 static string poor_mans_glob (string path)
60 replace_all (copy, "~", Glib::get_home_dir());
65 ArdourStartup::ArdourStartup ()
66 : _response (RESPONSE_OK)
67 , ic_new_session_button (_("Open a new session"))
68 , ic_existing_session_button (_("Open an existing session"))
69 , monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\
70 Ardour will play NO role in monitoring"))
71 , monitor_via_ardour_button (string_compose (_("Ask %1 to playback material as it is being recorded"), PROGRAM_NAME))
72 , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
73 , more_new_session_options_button (_("I'd like more options for this session"))
74 , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
75 , _input_limit_count_adj (1, 0, 100, 1, 10, 0)
76 , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
77 , _existing_session_chooser_used (false)
79 audio_page_index = -1;
80 initial_choice_index = -1;
81 new_user_page_index = -1;
82 default_folder_page_index = -1;
83 monitoring_page_index = -1;
84 session_page_index = -1;
85 final_page_index = -1;
86 session_options_page_index = -1;
90 config_modified = false;
91 default_dir_chooser = 0;
93 use_template_button.set_group (session_template_group);
94 use_session_as_template_button.set_group (session_template_group);
96 set_keep_above (true);
97 set_resizable (false);
98 set_position (WIN_POS_CENTER);
99 set_border_width (12);
101 if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
102 throw failed_constructor();
105 sys::path been_here_before = user_config_directory();
106 been_here_before /= ".a3"; // XXXX use more specific version so we can catch upgrades
107 new_user = !exists (been_here_before);
109 bool need_audio_setup = !EngineControl::engine_running();
112 /* "touch" the file */
113 ofstream fout (been_here_before.to_string().c_str());
114 setup_new_user_page ();
115 setup_first_time_config_page ();
116 setup_monitoring_choice_page ();
117 setup_monitor_section_choice_page ();
119 if (need_audio_setup) {
125 if (need_audio_setup) {
129 setup_initial_choice_page ();
132 setup_session_page ();
133 setup_more_options_page ();
142 ArdourStartup::~ArdourStartup ()
147 ArdourStartup::set_new_only (bool yn)
159 ArdourStartup::set_load_template( string load_template )
161 use_template_button.set_active( false );
162 load_template_override = load_template;
166 ArdourStartup::use_session_template ()
168 if (!load_template_override.empty())
171 if (use_template_button.get_active()) {
172 return template_chooser.get_active_row_number() > 0;
174 return !session_template_chooser.get_filename().empty();
179 ArdourStartup::session_template_name ()
181 if (!load_template_override.empty()) {
182 string the_path = (ARDOUR::user_template_directory()/ (load_template_override + ".template")).to_string();
186 if (ic_existing_session_button.get_active()) {
190 if (use_template_button.get_active()) {
191 TreeModel::iterator iter = template_chooser.get_active ();
192 TreeModel::Row row = (*iter);
193 string s = row[session_template_columns.path];
196 return session_template_chooser.get_filename();
202 ArdourStartup::session_name (bool& should_be_new)
204 if (ic_new_session_button.get_active()) {
205 should_be_new = true;
206 string val = new_name_entry.get_text ();
207 strip_whitespace_edges (val);
209 } else if (_existing_session_chooser_used) {
210 /* existing session chosen from file chooser */
211 should_be_new = false;
212 return existing_session_chooser.get_filename ();
214 /* existing session chosen from recent list */
215 should_be_new = false;
217 TreeIter iter = recent_session_display.get_selection()->get_selected();
220 return (*iter)[recent_session_columns.visible_name];
228 ArdourStartup::session_folder ()
230 if (ic_new_session_button.get_active()) {
231 std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
232 return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
233 } else if (_existing_session_chooser_used) {
234 /* existing session chosen from file chooser */
235 return existing_session_chooser.get_current_folder ();
237 /* existing session chosen from recent list */
238 TreeIter iter = recent_session_display.get_selection()->get_selected();
241 return (*iter)[recent_session_columns.fullpath];
248 ArdourStartup::setup_audio_page ()
250 engine_dialog = manage (new EngineControl);
252 engine_dialog->set_border_width (12);
254 engine_dialog->show_all ();
256 audio_page_index = append_page (*engine_dialog);
257 set_page_type (*engine_dialog, ASSISTANT_PAGE_CONTENT);
258 set_page_title (*engine_dialog, _("Audio / MIDI Setup"));
260 /* the default parameters should work, so the page is potentially complete */
262 set_page_complete (*engine_dialog, true);
266 ArdourStartup::setup_new_user_page ()
268 Label* foomatic = manage (new Label);
270 foomatic->set_markup (string_compose (_("\
271 <span size=\"larger\">%1 is a digital audio workstation. You can use it to\n\
272 record, edit and mix multi-track audio. You can produce your\n\
273 own CDs, mix video soundtracks, or just experiment with new\n\
274 ideas about music and sound.\n\
276 There are a few things that need to configured before you start\n\
277 using the program.</span>\
280 HBox* hbox = manage (new HBox);
281 HBox* vbox = manage (new HBox);
283 vbox->set_border_width (24);
285 hbox->pack_start (*foomatic, true, true);
286 vbox->pack_start (*hbox, true, true);
292 new_user_page_index = append_page (*vbox);
293 set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
294 set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
295 set_page_header_image (*vbox, icon_pixbuf);
296 set_page_complete (*vbox, true);
300 ArdourStartup::default_dir_changed ()
302 Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
307 ArdourStartup::config_changed ()
309 config_modified = true;
313 ArdourStartup::setup_first_time_config_page ()
315 default_dir_chooser = manage (new FileChooserButton (string_compose (_("Default folder for %1 sessions"), PROGRAM_NAME),
316 FILE_CHOOSER_ACTION_SELECT_FOLDER));
317 Gtk::Label* txt = manage (new Label);
318 HBox* hbox = manage (new HBox);
319 VBox* vbox = manage (new VBox);
321 txt->set_markup (string_compose (_("\
322 Each project that you work on with %1 has its own folder.\n\
323 These can require a lot of disk space if you are recording audio.\n\
325 Where would you like new %1 sessions to be stored by default?\n\n\
326 <i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
327 txt->set_alignment (0.0, 0.0);
329 vbox->set_spacing (18);
330 vbox->set_border_width (24);
332 hbox->pack_start (*default_dir_chooser, false, true, 8);
333 vbox->pack_start (*txt, false, false);
334 vbox->pack_start (*hbox, false, true);
336 default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
337 default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &ArdourStartup::default_dir_changed));
338 default_dir_chooser->show ();
342 default_folder_page_index = append_page (*vbox);
343 set_page_title (*vbox, _("Default folder for new sessions"));
344 set_page_header_image (*vbox, icon_pixbuf);
345 set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
347 /* user can just skip all these settings if they want to */
349 set_page_complete (*vbox, true);
353 ArdourStartup::setup_monitoring_choice_page ()
355 mon_vbox.set_spacing (18);
356 mon_vbox.set_border_width (24);
358 HBox* hbox = manage (new HBox);
359 VBox* vbox = manage (new VBox);
360 RadioButton::Group g (monitor_via_hardware_button.get_group());
361 monitor_via_ardour_button.set_group (g);
363 monitor_label.set_markup(_("\
364 While recording instruments or vocals, you probably want to listen to the\n\
365 signal as well as record it. This is called \"monitoring\". There are\n\
366 different ways to do this depending on the equipment you have and the\n\
367 configuration of that equipment. The two most common are presented here.\n\
368 Please choose whichever one is right for your setup.\n\n\
369 <i>(You can change this preference at any time, via the Preferences dialog)</i>"));
370 monitor_label.set_alignment (0.0, 0.0);
372 vbox->set_spacing (6);
374 vbox->pack_start (monitor_via_hardware_button, false, true);
375 vbox->pack_start (monitor_via_ardour_button, false, true);
376 hbox->pack_start (*vbox, true, true, 8);
377 mon_vbox.pack_start (monitor_label, false, false);
378 mon_vbox.pack_start (*hbox, false, false);
380 mon_vbox.show_all ();
382 monitoring_page_index = append_page (mon_vbox);
383 set_page_title (mon_vbox, _("Monitoring Choices"));
384 set_page_header_image (mon_vbox, icon_pixbuf);
386 /* user could just click on "Forward" if default
390 set_page_complete (mon_vbox, true);
394 ArdourStartup::setup_monitor_section_choice_page ()
396 mon_sec_vbox.set_spacing (18);
397 mon_sec_vbox.set_border_width (24);
399 HBox* hbox = manage (new HBox);
400 VBox* main_vbox = manage (new VBox);
402 Label* l = manage (new Label);
404 main_vbox->set_spacing (32);
406 no_monitor_section_button.set_label (_("Use a Master bus directly"));
407 l->set_alignment (0.0, 1.0);
408 l->set_markup(_("Connect the Master bus directly to your hardware outputs.\n\
409 <i>Preferable for simple use</i>."));
411 vbox = manage (new VBox);
412 vbox->set_spacing (6);
413 vbox->pack_start (no_monitor_section_button, false, true);
414 vbox->pack_start (*l, false, true);
416 main_vbox->pack_start (*vbox, false, false);
418 use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
419 l = manage (new Label);
420 l->set_alignment (0.0, 1.0);
421 l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
422 greater control in monitoring without affecting the mix."));
424 vbox = manage (new VBox);
425 vbox->set_spacing (6);
426 vbox->pack_start (use_monitor_section_button, false, true);
427 vbox->pack_start (*l, false, true);
429 main_vbox->pack_start (*vbox, false, false);
431 RadioButton::Group g (use_monitor_section_button.get_group());
432 no_monitor_section_button.set_group (g);
434 if (Config->get_use_monitor_bus()) {
435 use_monitor_section_button.set_active (true);
437 no_monitor_section_button.set_active (true);
440 use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
441 no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
443 monitor_section_label.set_markup(_("<i><small>(You can change this preference at any time, via the Preferences dialog)</small></i>"));
444 monitor_section_label.set_alignment (0.0, 0.0);
446 hbox->pack_start (*main_vbox, true, true, 8);
447 mon_sec_vbox.pack_start (*hbox, false, false);
448 mon_sec_vbox.pack_start (monitor_section_label, false, false);
450 mon_sec_vbox.show_all ();
452 monitor_section_page_index = append_page (mon_sec_vbox);
453 set_page_title (mon_sec_vbox, _("Monitor Section"));
454 set_page_header_image (mon_sec_vbox, icon_pixbuf);
456 /* user could just click on "Forward" if default
460 set_page_complete (mon_sec_vbox, true);
464 ArdourStartup::setup_initial_choice_page ()
466 ic_vbox.set_spacing (6);
467 ic_vbox.set_border_width (24);
469 RadioButton::Group g (ic_new_session_button.get_group());
470 ic_existing_session_button.set_group (g);
472 HBox* centering_hbox = manage (new HBox);
473 VBox* centering_vbox = manage (new VBox);
475 centering_vbox->set_spacing (6);
477 centering_vbox->pack_start (ic_new_session_button, false, true);
478 centering_vbox->pack_start (ic_existing_session_button, false, true);
480 ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
481 ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
483 ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
484 ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
486 centering_hbox->pack_start (*centering_vbox, true, true);
488 ic_vbox.pack_start (*centering_hbox, true, true);
492 initial_choice_index = append_page (ic_vbox);
493 set_page_title (ic_vbox, _("What would you like to do ?"));
494 set_page_header_image (ic_vbox, icon_pixbuf);
496 /* user could just click on "Forward" if default
500 set_page_complete (ic_vbox, true);
504 ArdourStartup::initial_button_press (GdkEventButton *event)
506 if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
507 set_current_page(session_page_index);
515 ArdourStartup::initial_button_activated ()
517 set_current_page(session_page_index);
521 ArdourStartup::setup_session_page ()
523 session_vbox.set_border_width (24);
525 session_vbox.pack_start (session_hbox, true, true);
526 session_vbox.show_all ();
528 session_page_index = append_page (session_vbox);
529 /* initial setting */
530 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
534 ArdourStartup::setup_final_page ()
536 final_page.set_text (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
538 final_page_index = append_page (final_page);
539 set_page_complete (final_page, true);
540 set_page_header_image (final_page, icon_pixbuf);
541 set_page_type (final_page, ASSISTANT_PAGE_CONFIRM);
545 ArdourStartup::on_cancel ()
547 _response = RESPONSE_CANCEL;
552 ArdourStartup::on_delete_event (GdkEventAny*)
554 _response = RESPONSE_CLOSE;
560 ArdourStartup::on_apply ()
563 engine_dialog->setup_engine ();
566 if (config_modified) {
568 if (default_dir_chooser) {
569 Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
572 if (monitor_via_hardware_button.get_active()) {
573 Config->set_monitoring_model (ExternalMonitoring);
574 } else if (monitor_via_ardour_button.get_active()) {
575 Config->set_monitoring_model (SoftwareMonitoring);
578 Config->set_use_monitor_bus (use_monitor_section_button.get_active());
580 Config->save_state ();
583 _response = RESPONSE_OK;
588 ArdourStartup::on_prepare (Gtk::Widget* page)
590 if (page == &session_vbox) {
592 if (ic_new_session_button.get_active()) {
593 /* new session requested */
594 setup_new_session_page ();
596 /* existing session requested */
597 setup_existing_session_page ();
603 ArdourStartup::populate_session_templates ()
605 vector<TemplateInfo> templates;
607 find_session_templates (templates);
609 template_model->clear ();
611 for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
614 row = *(template_model->append ());
616 row[session_template_columns.name] = (*x).name;
617 row[session_template_columns.path] = (*x).path;
622 lost_name_entry_focus (GdkEventFocus*)
624 cerr << "lost focus\n";
629 ArdourStartup::setup_new_session_page ()
631 if (!session_hbox.get_children().empty()) {
632 session_hbox.remove (**session_hbox.get_children().begin());
635 session_new_vbox.set_spacing (18);
637 if (session_new_vbox.get_children().empty()) {
638 VBox *vbox1 = manage (new VBox);
639 HBox* hbox1 = manage (new HBox);
640 Label* label1 = manage (new Label);
642 vbox1->set_spacing (6);
644 hbox1->set_spacing (6);
645 hbox1->pack_start (*label1, false, false);
646 hbox1->pack_start (new_name_entry, true, true);
648 label1->set_text (_("Session name:"));
651 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
652 new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
653 /* name provided - they can move right along */
654 set_page_complete (session_vbox, true);
657 new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed));
658 new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now));
660 vbox1->pack_start (*hbox1, true, true);
664 HBox* hbox2 = manage (new HBox);
665 Label* label2 = manage (new Label);
667 hbox2->set_spacing (6);
668 hbox2->pack_start (*label2, false, false);
669 hbox2->pack_start (new_folder_chooser, true, true);
671 label2->set_text (_("Create session folder in:"));
673 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
674 new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
676 new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
678 new_folder_chooser.set_title (_("Select folder for session"));
681 new_folder_chooser.add_shortcut_folder ("/Volumes");
684 vbox1->pack_start (*hbox2, false, false);
686 session_new_vbox.pack_start (*vbox1, false, false);
690 VBox *vbox2 = manage (new VBox);
691 HBox* hbox3 = manage (new HBox);
692 Label* label3 = manage (new Label);
693 template_model = ListStore::create (session_template_columns);
694 populate_session_templates ();
696 vbox2->set_spacing (6);
698 label3->set_markup (_("<b>Options</b>"));
699 label3->set_alignment (0.0, 0.0);
701 vbox2->pack_start (*label3, false, true);
703 VBox *vbox3 = manage (new VBox);
705 vbox3->set_spacing (6);
707 if (!template_model->children().empty()) {
709 HBox* hbox4a = manage (new HBox);
710 use_template_button.set_label (_("Use this template"));
712 TreeModel::Row row = *template_model->prepend ();
713 row[session_template_columns.name] = (_("no template"));
714 row[session_template_columns.path] = string();
716 hbox4a->set_spacing (6);
717 hbox4a->pack_start (use_template_button, false, false);
718 hbox4a->pack_start (template_chooser, true, true);
720 template_chooser.set_model (template_model);
722 Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
723 text_renderer->property_editable() = false;
725 template_chooser.pack_start (*text_renderer);
726 template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
727 template_chooser.set_active (0);
729 use_template_button.show();
730 template_chooser.show ();
732 vbox3->pack_start (*hbox4a, false, false);
738 session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
740 HBox* hbox4b = manage (new HBox);
741 use_session_as_template_button.set_label (_("Use an existing session as a template:"));
743 hbox4b->set_spacing (6);
744 hbox4b->pack_start (use_session_as_template_button, false, false);
745 hbox4b->pack_start (session_template_chooser, true, true);
747 use_session_as_template_button.show ();
748 session_template_chooser.show ();
750 Gtk::FileFilter* template_filter = manage (new (Gtk::FileFilter));
751 template_filter->add_pattern(X_("*.template"));
752 session_template_chooser.set_filter (*template_filter);
753 session_template_chooser.set_title (_("Select template"));
755 vbox3->pack_start (*hbox4b, false, false);
760 HBox* hbox5 = manage (new HBox);
762 hbox5->set_spacing (6);
763 hbox5->pack_start (more_new_session_options_button, false, false);
765 more_new_session_options_button.show ();
766 more_new_session_options_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked));
768 vbox3->pack_start (*hbox5, false, false);
769 hbox3->pack_start (*vbox3, true, true, 8);
770 vbox2->pack_start (*hbox3, false, false);
774 session_new_vbox.pack_start (*vbox2, false, false);
777 session_new_vbox.show_all ();
778 session_hbox.pack_start (session_new_vbox, true, true);
779 set_page_title (session_vbox, _("New Session"));
780 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
782 new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped));
783 new_name_entry.signal_focus_out_event().connect (sigc::ptr_fun (lost_name_entry_focus));
787 ArdourStartup::new_name_mapped ()
789 cerr << "Grab new name focus\n";
790 new_name_entry.grab_focus ();
794 ArdourStartup::new_name_changed ()
796 if (!new_name_entry.get_text().empty()) {
797 set_page_complete (session_vbox, true);
799 set_page_complete (session_vbox, false);
804 ArdourStartup::redisplay_recent_sessions ()
806 std::vector<sys::path> session_directories;
807 RecentSessionsSorter cmp;
809 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
810 recent_session_model->clear ();
812 ARDOUR::RecentSessions rs;
813 ARDOUR::read_recent_sessions (rs);
816 recent_session_display.set_model (recent_session_model);
820 // sort them alphabetically
821 sort (rs.begin(), rs.end(), cmp);
823 for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
824 session_directories.push_back ((*i).second);
827 for (vector<sys::path>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
829 std::vector<sys::path> state_file_paths;
831 // now get available states for this session
833 get_state_files_in_directory (*i, state_file_paths);
835 vector<string*>* states;
836 vector<const gchar*> item;
837 string fullpath = (*i).to_string();
839 /* remove any trailing / */
841 if (fullpath[fullpath.length()-1] == '/') {
842 fullpath = fullpath.substr (0, fullpath.length()-1);
845 /* check whether session still exists */
846 if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) {
847 /* session doesn't exist */
851 /* now get available states for this session */
853 if ((states = Session::possible_states (fullpath)) == 0) {
858 std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
860 Gtk::TreeModel::Row row = *(recent_session_model->append());
862 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
863 row[recent_session_columns.fullpath] = fullpath;
865 if (state_file_names.size() > 1) {
869 for (std::vector<std::string>::iterator i2 = state_file_names.begin();
870 i2 != state_file_names.end(); ++i2)
873 Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
875 child_row[recent_session_columns.visible_name] = *i2;
876 child_row[recent_session_columns.fullpath] = fullpath;
881 recent_session_display.set_model (recent_session_model);
886 ArdourStartup::recent_session_row_selected ()
888 if (recent_session_display.get_selection()->count_selected_rows() > 0) {
889 set_page_complete (session_vbox, true);
891 set_page_complete (session_vbox, false);
896 ArdourStartup::setup_existing_session_page ()
898 recent_session_model = TreeStore::create (recent_session_columns);
899 redisplay_recent_sessions ();
901 if (!session_hbox.get_children().empty()) {
902 session_hbox.remove (**session_hbox.get_children().begin());
905 if (session_existing_vbox.get_children().empty()) {
907 recent_session_display.set_model (recent_session_model);
908 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
909 recent_session_display.set_headers_visible (false);
910 recent_session_display.get_selection()->set_mode (SELECTION_BROWSE);
912 recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected));
914 recent_scroller.add (recent_session_display);
915 recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
916 recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
918 recent_session_display.show();
920 recent_scroller.show();
921 int cnt = redisplay_recent_sessions ();
922 recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
925 recent_scroller.set_size_request (-1, 300);
928 session_existing_vbox.set_spacing (8);
929 session_existing_vbox.pack_start (recent_scroller, true, true);
931 existing_session_chooser.set_title (_("Select session file"));
932 existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
935 existing_session_chooser.add_shortcut_folder ("/Volumes");
938 HBox* hbox = manage (new HBox);
939 hbox->set_spacing (4);
940 hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK);
941 hbox->pack_start (existing_session_chooser);
942 session_existing_vbox.pack_start (*hbox);
946 session_existing_vbox.show_all ();
947 session_hbox.pack_start (session_existing_vbox, true, true);
949 set_page_title (session_vbox, _("Select a session"));
950 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
954 ArdourStartup::more_new_session_options_button_clicked ()
956 if (more_new_session_options_button.get_active()) {
957 more_options_vbox.show_all ();
958 set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM);
959 set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
961 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
962 more_options_vbox.hide ();
967 ArdourStartup::setup_more_options_page ()
969 more_options_vbox.set_border_width (24);
971 _output_limit_count.set_adjustment (_output_limit_count_adj);
972 _input_limit_count.set_adjustment (_input_limit_count_adj);
973 _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj);
975 chan_count_label_1.set_text (_("channels"));
976 chan_count_label_3.set_text (_("channels"));
977 chan_count_label_4.set_text (_("channels"));
979 chan_count_label_1.set_alignment(0,0.5);
980 chan_count_label_1.set_padding(0,0);
981 chan_count_label_1.set_line_wrap(false);
983 chan_count_label_3.set_alignment(0,0.5);
984 chan_count_label_3.set_padding(0,0);
985 chan_count_label_3.set_line_wrap(false);
987 chan_count_label_4.set_alignment(0,0.5);
988 chan_count_label_4.set_padding(0,0);
989 chan_count_label_4.set_line_wrap(false);
991 bus_label.set_markup (_("<b>Busses</b>"));
992 input_label.set_markup (_("<b>Inputs</b>"));
993 output_label.set_markup (_("<b>Outputs</b>"));
995 _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
996 _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
997 _master_bus_channel_count.set_numeric(true);
998 _master_bus_channel_count.set_digits(0);
999 _master_bus_channel_count.set_wrap(false);
1001 _create_master_bus.set_label (_("Create master bus"));
1002 _create_master_bus.set_flags(Gtk::CAN_FOCUS);
1003 _create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
1004 _create_master_bus.set_mode(true);
1005 _create_master_bus.set_active(true);
1006 _create_master_bus.set_border_width(0);
1008 advanced_table.set_row_spacings(0);
1009 advanced_table.set_col_spacings(0);
1011 _connect_inputs.set_label (_("Automatically connect to physical_inputs"));
1012 _connect_inputs.set_flags(Gtk::CAN_FOCUS);
1013 _connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
1014 _connect_inputs.set_mode(true);
1015 _connect_inputs.set_active(true);
1016 _connect_inputs.set_border_width(0);
1018 _limit_input_ports.set_label (_("Use only"));
1019 _limit_input_ports.set_flags(Gtk::CAN_FOCUS);
1020 _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
1021 _limit_input_ports.set_mode(true);
1022 _limit_input_ports.set_sensitive(true);
1023 _limit_input_ports.set_border_width(0);
1025 _input_limit_count.set_flags(Gtk::CAN_FOCUS);
1026 _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1027 _input_limit_count.set_numeric(true);
1028 _input_limit_count.set_digits(0);
1029 _input_limit_count.set_wrap(false);
1030 _input_limit_count.set_sensitive(false);
1032 bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
1034 bus_label.set_alignment(0, 0.5);
1035 bus_label.set_padding(0,0);
1036 bus_label.set_line_wrap(false);
1037 bus_label.set_selectable(false);
1038 bus_label.set_use_markup(true);
1039 bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
1040 bus_frame.set_label_align(0,0.5);
1041 bus_frame.add(bus_hbox);
1042 bus_frame.set_label_widget(bus_label);
1044 bus_table.set_row_spacings (0);
1045 bus_table.set_col_spacings (0);
1046 bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1047 bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1048 bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
1050 input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
1051 input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
1052 input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
1053 input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
1054 input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
1055 input_table.set_row_spacings(0);
1056 input_table.set_col_spacings(0);
1057 input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
1059 input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
1061 input_label.set_alignment(0, 0.5);
1062 input_label.set_padding(0,0);
1063 input_label.set_line_wrap(false);
1064 input_label.set_selectable(false);
1065 input_label.set_use_markup(true);
1066 input_frame.set_shadow_type(Gtk::SHADOW_NONE);
1067 input_frame.set_label_align(0,0.5);
1068 input_frame.add(input_hbox);
1069 input_frame.set_label_widget(input_label);
1071 _connect_outputs.set_label (_("Automatically connect outputs"));
1072 _connect_outputs.set_flags(Gtk::CAN_FOCUS);
1073 _connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
1074 _connect_outputs.set_mode(true);
1075 _connect_outputs.set_active(true);
1076 _connect_outputs.set_border_width(0);
1077 _limit_output_ports.set_label (_("Use only"));
1078 _limit_output_ports.set_flags(Gtk::CAN_FOCUS);
1079 _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
1080 _limit_output_ports.set_mode(true);
1081 _limit_output_ports.set_sensitive(true);
1082 _limit_output_ports.set_border_width(0);
1083 _output_limit_count.set_flags(Gtk::CAN_FOCUS);
1084 _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1085 _output_limit_count.set_numeric(false);
1086 _output_limit_count.set_digits(0);
1087 _output_limit_count.set_wrap(false);
1088 _output_limit_count.set_sensitive(false);
1089 output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
1090 output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
1091 output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
1093 _connect_outputs_to_master.set_label (_("... to master bus"));
1094 _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
1095 _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
1096 _connect_outputs_to_master.set_mode(true);
1097 _connect_outputs_to_master.set_active(false);
1098 _connect_outputs_to_master.set_border_width(0);
1100 _connect_outputs_to_master.set_group (connect_outputs_group);
1101 _connect_outputs_to_physical.set_group (connect_outputs_group);
1103 _connect_outputs_to_physical.set_label (_("... to physical outputs"));
1104 _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
1105 _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
1106 _connect_outputs_to_physical.set_mode(true);
1107 _connect_outputs_to_physical.set_active(false);
1108 _connect_outputs_to_physical.set_border_width(0);
1110 output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
1111 output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
1112 output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
1113 output_vbox.set_border_width(6);
1115 output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
1117 output_vbox.pack_start(output_conn_vbox);
1118 output_vbox.pack_start(output_port_vbox);
1120 output_label.set_alignment(0, 0.5);
1121 output_label.set_padding(0,0);
1122 output_label.set_line_wrap(false);
1123 output_label.set_selectable(false);
1124 output_label.set_use_markup(true);
1125 output_frame.set_shadow_type(Gtk::SHADOW_NONE);
1126 output_frame.set_label_align(0,0.5);
1128 output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
1130 output_frame.add(output_hbox);
1131 output_frame.set_label_widget(output_label);
1133 more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
1134 more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
1135 more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
1136 more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
1140 _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_inputs_clicked));
1141 _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_outputs_clicked));
1142 _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_inputs_clicked));
1143 _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_outputs_clicked));
1144 _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::master_bus_button_clicked));
1146 /* note that more_options_vbox is NOT visible by
1147 * default. this is entirely by design - this page
1148 * should be skipped unless explicitly requested.
1151 session_options_page_index = append_page (more_options_vbox);
1152 set_page_title (more_options_vbox, _("Advanced Session Options"));
1153 set_page_complete (more_options_vbox, true);
1157 ArdourStartup::create_master_bus() const
1159 return _create_master_bus.get_active();
1163 ArdourStartup::master_channel_count() const
1165 return _master_bus_channel_count.get_value_as_int();
1169 ArdourStartup::connect_inputs() const
1171 return _connect_inputs.get_active();
1175 ArdourStartup::limit_inputs_used_for_connection() const
1177 return _limit_input_ports.get_active();
1181 ArdourStartup::input_limit_count() const
1183 return _input_limit_count.get_value_as_int();
1187 ArdourStartup::connect_outputs() const
1189 return _connect_outputs.get_active();
1193 ArdourStartup::limit_outputs_used_for_connection() const
1195 return _limit_output_ports.get_active();
1199 ArdourStartup::output_limit_count() const
1201 return _output_limit_count.get_value_as_int();
1205 ArdourStartup::connect_outs_to_master() const
1207 return _connect_outputs_to_master.get_active();
1211 ArdourStartup::connect_outs_to_physical() const
1213 return _connect_outputs_to_physical.get_active();
1217 ArdourStartup::connect_inputs_clicked ()
1219 _limit_input_ports.set_sensitive(_connect_inputs.get_active());
1221 if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
1222 _input_limit_count.set_sensitive(true);
1224 _input_limit_count.set_sensitive(false);
1229 ArdourStartup::connect_outputs_clicked ()
1231 _limit_output_ports.set_sensitive(_connect_outputs.get_active());
1233 if (_connect_outputs.get_active() && _limit_output_ports.get_active()) {
1234 _output_limit_count.set_sensitive(true);
1236 _output_limit_count.set_sensitive(false);
1241 ArdourStartup::limit_inputs_clicked ()
1243 _input_limit_count.set_sensitive(_limit_input_ports.get_active());
1247 ArdourStartup::limit_outputs_clicked ()
1249 _output_limit_count.set_sensitive(_limit_output_ports.get_active());
1253 ArdourStartup::master_bus_button_clicked ()
1255 bool yn = _create_master_bus.get_active();
1257 _master_bus_channel_count.set_sensitive(yn);
1261 ArdourStartup::move_along_now ()
1263 gint cur = get_current_page ();
1265 if (cur == session_page_index) {
1266 if (more_new_session_options_button.get_active()) {
1267 set_current_page (session_options_page_index);
1275 ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
1277 set_page_complete (session_vbox, true);
1282 ArdourStartup::existing_session_selected ()
1284 _existing_session_chooser_used = true;
1286 set_page_complete (session_vbox, true);