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.
23 #include <gtkmm/main.h>
24 #include <gtkmm/filechooser.h>
26 #include "pbd/failed_constructor.h"
27 #include "pbd/file_utils.h"
28 #include "pbd/filesystem.h"
29 #include "pbd/replace_all.h"
30 #include "pbd/whitespace.h"
32 #include "ardour/filesystem_paths.h"
33 #include "ardour/recent_sessions.h"
34 #include "ardour/session.h"
35 #include "ardour/session_state_utils.h"
36 #include "ardour/template_utils.h"
40 #include "engine_dialog.h"
49 using namespace ARDOUR;
51 ArdourStartup* ArdourStartup::the_startup = 0;
53 static string poor_mans_glob (string path)
56 replace_all (copy, "~", Glib::get_home_dir());
61 ArdourStartup::ArdourStartup ()
62 : _response (RESPONSE_OK)
63 , ic_new_session_button (_("Open a new session"))
64 , ic_existing_session_button (_("Open an existing session"))
65 , monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\
66 Ardour will play NO role in monitoring"))
67 , monitor_via_ardour_button (string_compose (_("Ask %1 to playback material as it is being recorded"), PROGRAM_NAME))
68 , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
69 , more_new_session_options_button (_("I'd like more options for this session"))
70 , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
71 , _input_limit_count_adj (1, 0, 100, 1, 10, 0)
72 , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
73 , _existing_session_chooser_used (false)
75 audio_page_index = -1;
76 initial_choice_index = -1;
77 new_user_page_index = -1;
78 default_folder_page_index = -1;
79 monitoring_page_index = -1;
80 session_page_index = -1;
81 final_page_index = -1;
82 session_options_page_index = -1;
86 config_modified = false;
87 default_dir_chooser = 0;
89 use_template_button.set_group (session_template_group);
90 use_session_as_template_button.set_group (session_template_group);
92 set_keep_above (true);
93 set_resizable (false);
94 set_position (WIN_POS_CENTER);
95 set_border_width (12);
97 if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
98 throw failed_constructor();
101 sys::path been_here_before = user_config_directory();
102 been_here_before /= ".a3"; // XXXX use more specific version so we can catch upgrades
103 new_user = !exists (been_here_before);
105 bool need_audio_setup = !EngineControl::engine_running();
108 /* "touch" the file */
109 ofstream fout (been_here_before.to_string().c_str());
110 setup_new_user_page ();
111 setup_first_time_config_page ();
112 setup_monitoring_choice_page ();
113 setup_monitor_section_choice_page ();
115 if (need_audio_setup) {
121 if (need_audio_setup) {
125 setup_initial_choice_page ();
128 setup_session_page ();
129 setup_more_options_page ();
138 ArdourStartup::~ArdourStartup ()
143 ArdourStartup::set_new_only (bool yn)
155 ArdourStartup::set_load_template( string load_template )
157 use_template_button.set_active( false );
158 load_template_override = load_template;
162 ArdourStartup::use_session_template ()
164 if (!load_template_override.empty())
167 if (use_template_button.get_active()) {
168 return template_chooser.get_active_row_number() > 0;
170 return !session_template_chooser.get_filename().empty();
175 ArdourStartup::session_template_name ()
177 if (!load_template_override.empty()) {
178 string the_path = (ARDOUR::user_template_directory()/ (load_template_override + ".template")).to_string();
182 if (ic_existing_session_button.get_active()) {
186 if (use_template_button.get_active()) {
187 TreeModel::iterator iter = template_chooser.get_active ();
188 TreeModel::Row row = (*iter);
189 string s = row[session_template_columns.path];
192 return session_template_chooser.get_filename();
198 ArdourStartup::session_name (bool& should_be_new)
200 if (ic_new_session_button.get_active()) {
201 should_be_new = true;
202 string val = new_name_entry.get_text ();
203 strip_whitespace_edges (val);
205 } else if (_existing_session_chooser_used) {
206 /* existing session chosen from file chooser */
207 should_be_new = false;
208 return existing_session_chooser.get_filename ();
210 /* existing session chosen from recent list */
211 should_be_new = false;
213 TreeIter iter = recent_session_display.get_selection()->get_selected();
216 return (*iter)[recent_session_columns.visible_name];
224 ArdourStartup::session_folder ()
226 if (ic_new_session_button.get_active()) {
227 std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
228 return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
229 } else if (_existing_session_chooser_used) {
230 /* existing session chosen from file chooser */
231 return existing_session_chooser.get_current_folder ();
233 /* existing session chosen from recent list */
234 TreeIter iter = recent_session_display.get_selection()->get_selected();
237 return (*iter)[recent_session_columns.fullpath];
244 ArdourStartup::setup_audio_page ()
246 engine_dialog = manage (new EngineControl);
248 engine_dialog->set_border_width (12);
250 engine_dialog->show_all ();
252 audio_page_index = append_page (*engine_dialog);
253 set_page_type (*engine_dialog, ASSISTANT_PAGE_CONTENT);
254 set_page_title (*engine_dialog, _("Audio / MIDI Setup"));
256 /* the default parameters should work, so the page is potentially complete */
258 set_page_complete (*engine_dialog, true);
262 ArdourStartup::setup_new_user_page ()
264 Label* foomatic = manage (new Label);
266 foomatic->set_markup (string_compose (_("\
267 <span size=\"larger\">%1 is a digital audio workstation. You can use it to\n\
268 record, edit and mix multi-track audio. You can produce your\n\
269 own CDs, mix video soundtracks, or just experiment with new\n\
270 ideas about music and sound.\n\
272 There are a few things that need to configured before you start\n\
273 using the program.</span>\
276 HBox* hbox = manage (new HBox);
277 HBox* vbox = manage (new HBox);
279 vbox->set_border_width (24);
281 hbox->pack_start (*foomatic, true, true);
282 vbox->pack_start (*hbox, true, true);
288 new_user_page_index = append_page (*vbox);
289 set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
290 set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
291 set_page_header_image (*vbox, icon_pixbuf);
292 set_page_complete (*vbox, true);
296 ArdourStartup::default_dir_changed ()
298 Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
303 ArdourStartup::config_changed ()
305 config_modified = true;
309 ArdourStartup::setup_first_time_config_page ()
311 default_dir_chooser = manage (new FileChooserButton (string_compose (_("Default folder for %1 sessions"), PROGRAM_NAME),
312 FILE_CHOOSER_ACTION_SELECT_FOLDER));
313 Gtk::Label* txt = manage (new Label);
314 HBox* hbox = manage (new HBox);
315 VBox* vbox = manage (new VBox);
317 txt->set_markup (string_compose (_("\
318 Each project that you work on with %1 has its own folder.\n\
319 These can require a lot of disk space if you are recording audio.\n\
321 Where would you like new %1 sessions to be stored by default?\n\n\
322 <i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
323 txt->set_alignment (0.0, 0.0);
325 vbox->set_spacing (18);
326 vbox->set_border_width (24);
328 hbox->pack_start (*default_dir_chooser, false, true, 8);
329 vbox->pack_start (*txt, false, false);
330 vbox->pack_start (*hbox, false, true);
332 default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
333 default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &ArdourStartup::default_dir_changed));
334 default_dir_chooser->show ();
338 default_folder_page_index = append_page (*vbox);
339 set_page_title (*vbox, _("Default folder for new sessions"));
340 set_page_header_image (*vbox, icon_pixbuf);
341 set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
343 /* user can just skip all these settings if they want to */
345 set_page_complete (*vbox, true);
349 ArdourStartup::setup_monitoring_choice_page ()
351 mon_vbox.set_spacing (18);
352 mon_vbox.set_border_width (24);
354 HBox* hbox = manage (new HBox);
355 VBox* vbox = manage (new VBox);
356 RadioButton::Group g (monitor_via_hardware_button.get_group());
357 monitor_via_ardour_button.set_group (g);
359 monitor_label.set_markup("\
360 While recording instruments or vocals, you probably want to listen to the\n\
361 signal as well as record it. This is called \"monitoring\". There are\n\
362 different ways to do this depending on the equipment you have and the\n\
363 configuration of that equipment. The two most common are presented here.\n\
364 Please choose whichever one is right for your setup.\n\n\
365 <i>(You can change this preference at any time, via the Preferences dialog)</i>");
366 monitor_label.set_alignment (0.0, 0.0);
368 vbox->set_spacing (6);
370 vbox->pack_start (monitor_via_hardware_button, false, true);
371 vbox->pack_start (monitor_via_ardour_button, false, true);
372 hbox->pack_start (*vbox, true, true, 8);
373 mon_vbox.pack_start (monitor_label, false, false);
374 mon_vbox.pack_start (*hbox, false, false);
376 mon_vbox.show_all ();
378 monitoring_page_index = append_page (mon_vbox);
379 set_page_title (mon_vbox, _("Monitoring Choices"));
380 set_page_header_image (mon_vbox, icon_pixbuf);
382 /* user could just click on "Forward" if default
386 set_page_complete (mon_vbox, true);
390 ArdourStartup::setup_monitor_section_choice_page ()
392 mon_sec_vbox.set_spacing (18);
393 mon_sec_vbox.set_border_width (24);
395 HBox* hbox = manage (new HBox);
396 VBox* main_vbox = manage (new VBox);
398 Label* l = manage (new Label);
400 main_vbox->set_spacing (32);
402 no_monitor_section_button.set_label (_("Use a Master bus directly"));
403 l->set_alignment (0.0, 1.0);
404 l->set_markup(_("Connect the Master bus directly to your hardware outputs.\n\
405 <i>Preferable for simple use</i>."));
407 vbox = manage (new VBox);
408 vbox->set_spacing (6);
409 vbox->pack_start (no_monitor_section_button, false, true);
410 vbox->pack_start (*l, false, true);
412 main_vbox->pack_start (*vbox, false, false);
414 use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
415 l = manage (new Label);
416 l->set_alignment (0.0, 1.0);
417 l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
418 greater control in monitoring without affecting the mix."));
420 vbox = manage (new VBox);
421 vbox->set_spacing (6);
422 vbox->pack_start (use_monitor_section_button, false, true);
423 vbox->pack_start (*l, false, true);
425 main_vbox->pack_start (*vbox, false, false);
427 RadioButton::Group g (use_monitor_section_button.get_group());
428 no_monitor_section_button.set_group (g);
430 if (Config->get_use_monitor_bus()) {
431 use_monitor_section_button.set_active (true);
433 no_monitor_section_button.set_active (true);
436 use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
437 no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
439 monitor_section_label.set_markup(_("<i><small>(You can change this preference at any time, via the Preferences dialog)</small></i>"));
440 monitor_section_label.set_alignment (0.0, 0.0);
442 hbox->pack_start (*main_vbox, true, true, 8);
443 mon_sec_vbox.pack_start (*hbox, false, false);
444 mon_sec_vbox.pack_start (monitor_section_label, false, false);
446 mon_sec_vbox.show_all ();
448 monitor_section_page_index = append_page (mon_sec_vbox);
449 set_page_title (mon_sec_vbox, _("Monitor Section"));
450 set_page_header_image (mon_sec_vbox, icon_pixbuf);
452 /* user could just click on "Forward" if default
456 set_page_complete (mon_sec_vbox, true);
460 ArdourStartup::setup_initial_choice_page ()
462 ic_vbox.set_spacing (6);
463 ic_vbox.set_border_width (24);
465 RadioButton::Group g (ic_new_session_button.get_group());
466 ic_existing_session_button.set_group (g);
468 HBox* centering_hbox = manage (new HBox);
469 VBox* centering_vbox = manage (new VBox);
471 centering_vbox->set_spacing (6);
473 centering_vbox->pack_start (ic_new_session_button, false, true);
474 centering_vbox->pack_start (ic_existing_session_button, false, true);
476 ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
477 ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
479 ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
480 ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
482 centering_hbox->pack_start (*centering_vbox, true, true);
484 ic_vbox.pack_start (*centering_hbox, true, true);
488 initial_choice_index = append_page (ic_vbox);
489 set_page_title (ic_vbox, _("What would you like to do ?"));
490 set_page_header_image (ic_vbox, icon_pixbuf);
492 /* user could just click on "Forward" if default
496 set_page_complete (ic_vbox, true);
500 ArdourStartup::initial_button_press (GdkEventButton *event)
502 if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
503 set_current_page(session_page_index);
511 ArdourStartup::initial_button_activated ()
513 set_current_page(session_page_index);
517 ArdourStartup::setup_session_page ()
519 session_vbox.set_border_width (24);
521 session_vbox.pack_start (session_hbox, true, true);
522 session_vbox.show_all ();
524 session_page_index = append_page (session_vbox);
525 /* initial setting */
526 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
530 ArdourStartup::setup_final_page ()
532 final_page.set_text (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
534 final_page_index = append_page (final_page);
535 set_page_complete (final_page, true);
536 set_page_header_image (final_page, icon_pixbuf);
537 set_page_type (final_page, ASSISTANT_PAGE_CONFIRM);
541 ArdourStartup::on_cancel ()
543 _response = RESPONSE_CANCEL;
548 ArdourStartup::on_delete_event (GdkEventAny*)
550 _response = RESPONSE_CLOSE;
556 ArdourStartup::on_apply ()
559 engine_dialog->setup_engine ();
562 if (config_modified) {
564 if (default_dir_chooser) {
565 Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
568 if (monitor_via_hardware_button.get_active()) {
569 Config->set_monitoring_model (ExternalMonitoring);
570 } else if (monitor_via_ardour_button.get_active()) {
571 Config->set_monitoring_model (SoftwareMonitoring);
574 Config->set_use_monitor_bus (use_monitor_section_button.get_active());
576 Config->save_state ();
579 _response = RESPONSE_OK;
584 ArdourStartup::on_prepare (Gtk::Widget* page)
586 if (page == &session_vbox) {
588 if (ic_new_session_button.get_active()) {
589 /* new session requested */
590 setup_new_session_page ();
592 /* existing session requested */
593 setup_existing_session_page ();
599 ArdourStartup::populate_session_templates ()
601 vector<TemplateInfo> templates;
603 find_session_templates (templates);
605 template_model->clear ();
607 for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
610 row = *(template_model->append ());
612 row[session_template_columns.name] = (*x).name;
613 row[session_template_columns.path] = (*x).path;
618 lost_name_entry_focus (GdkEventFocus*)
620 cerr << "lost focus\n";
625 ArdourStartup::setup_new_session_page ()
627 if (!session_hbox.get_children().empty()) {
628 session_hbox.remove (**session_hbox.get_children().begin());
631 session_new_vbox.set_spacing (18);
633 if (session_new_vbox.get_children().empty()) {
634 VBox *vbox1 = manage (new VBox);
635 HBox* hbox1 = manage (new HBox);
636 Label* label1 = manage (new Label);
638 vbox1->set_spacing (6);
640 hbox1->set_spacing (6);
641 hbox1->pack_start (*label1, false, false);
642 hbox1->pack_start (new_name_entry, true, true);
644 label1->set_text (_("Session name:"));
647 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
648 new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
649 /* name provided - they can move right along */
650 set_page_complete (session_vbox, true);
653 new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed));
654 new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now));
656 vbox1->pack_start (*hbox1, true, true);
660 HBox* hbox2 = manage (new HBox);
661 Label* label2 = manage (new Label);
663 hbox2->set_spacing (6);
664 hbox2->pack_start (*label2, false, false);
665 hbox2->pack_start (new_folder_chooser, true, true);
667 label2->set_text (_("Create session folder in:"));
669 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
670 new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
672 new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
674 new_folder_chooser.set_title (_("Select folder for session"));
677 new_folder_chooser->add_shortcut_folder ("/Volumes");
680 vbox1->pack_start (*hbox2, false, false);
682 session_new_vbox.pack_start (*vbox1, false, false);
686 VBox *vbox2 = manage (new VBox);
687 HBox* hbox3 = manage (new HBox);
688 Label* label3 = manage (new Label);
689 template_model = ListStore::create (session_template_columns);
690 populate_session_templates ();
692 vbox2->set_spacing (6);
694 label3->set_markup (_("<b>Options</b>"));
695 label3->set_alignment (0.0, 0.0);
697 vbox2->pack_start (*label3, false, true);
699 VBox *vbox3 = manage (new VBox);
701 vbox3->set_spacing (6);
703 if (!template_model->children().empty()) {
705 HBox* hbox4a = manage (new HBox);
706 use_template_button.set_label (_("Use this template"));
708 TreeModel::Row row = *template_model->prepend ();
709 row[session_template_columns.name] = (_("no template"));
710 row[session_template_columns.path] = string();
712 hbox4a->set_spacing (6);
713 hbox4a->pack_start (use_template_button, false, false);
714 hbox4a->pack_start (template_chooser, true, true);
716 template_chooser.set_model (template_model);
718 Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
719 text_renderer->property_editable() = false;
721 template_chooser.pack_start (*text_renderer);
722 template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
723 template_chooser.set_active (0);
725 use_template_button.show();
726 template_chooser.show ();
728 vbox3->pack_start (*hbox4a, false, false);
734 session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
736 HBox* hbox4b = manage (new HBox);
737 use_session_as_template_button.set_label (_("Use an existing session as a template:"));
739 hbox4b->set_spacing (6);
740 hbox4b->pack_start (use_session_as_template_button, false, false);
741 hbox4b->pack_start (session_template_chooser, true, true);
743 use_session_as_template_button.show ();
744 session_template_chooser.show ();
746 Gtk::FileFilter* template_filter = manage (new (Gtk::FileFilter));
747 template_filter->add_pattern(X_("*.template"));
748 session_template_chooser.set_filter (*template_filter);
749 session_template_chooser.set_title (_("Select template"));
751 vbox3->pack_start (*hbox4b, false, false);
756 HBox* hbox5 = manage (new HBox);
758 hbox5->set_spacing (6);
759 hbox5->pack_start (more_new_session_options_button, false, false);
761 more_new_session_options_button.show ();
762 more_new_session_options_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked));
764 vbox3->pack_start (*hbox5, false, false);
765 hbox3->pack_start (*vbox3, true, true, 8);
766 vbox2->pack_start (*hbox3, false, false);
770 session_new_vbox.pack_start (*vbox2, false, false);
773 session_new_vbox.show_all ();
774 session_hbox.pack_start (session_new_vbox, true, true);
775 set_page_title (session_vbox, _("New Session"));
776 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
778 new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped));
779 new_name_entry.signal_focus_out_event().connect (sigc::ptr_fun (lost_name_entry_focus));
783 ArdourStartup::new_name_mapped ()
785 cerr << "Grab new name focus\n";
786 new_name_entry.grab_focus ();
790 ArdourStartup::new_name_changed ()
792 if (!new_name_entry.get_text().empty()) {
793 set_page_complete (session_vbox, true);
795 set_page_complete (session_vbox, false);
800 ArdourStartup::redisplay_recent_sessions ()
802 std::vector<sys::path> session_directories;
803 RecentSessionsSorter cmp;
805 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
806 recent_session_model->clear ();
808 ARDOUR::RecentSessions rs;
809 ARDOUR::read_recent_sessions (rs);
812 recent_session_display.set_model (recent_session_model);
816 // sort them alphabetically
817 sort (rs.begin(), rs.end(), cmp);
819 for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
820 session_directories.push_back ((*i).second);
823 for (vector<sys::path>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
825 std::vector<sys::path> state_file_paths;
827 // now get available states for this session
829 get_state_files_in_directory (*i, state_file_paths);
831 vector<string*>* states;
832 vector<const gchar*> item;
833 string fullpath = (*i).to_string();
835 /* remove any trailing / */
837 if (fullpath[fullpath.length()-1] == '/') {
838 fullpath = fullpath.substr (0, fullpath.length()-1);
841 /* check whether session still exists */
842 if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) {
843 /* session doesn't exist */
847 /* now get available states for this session */
849 if ((states = Session::possible_states (fullpath)) == 0) {
854 std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
856 Gtk::TreeModel::Row row = *(recent_session_model->append());
858 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
859 row[recent_session_columns.fullpath] = fullpath;
861 if (state_file_names.size() > 1) {
865 for (std::vector<std::string>::iterator i2 = state_file_names.begin();
866 i2 != state_file_names.end(); ++i2)
869 Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
871 child_row[recent_session_columns.visible_name] = *i2;
872 child_row[recent_session_columns.fullpath] = fullpath;
877 recent_session_display.set_model (recent_session_model);
882 ArdourStartup::recent_session_row_selected ()
884 if (recent_session_display.get_selection()->count_selected_rows() > 0) {
885 set_page_complete (session_vbox, true);
887 set_page_complete (session_vbox, false);
892 ArdourStartup::setup_existing_session_page ()
894 recent_session_model = TreeStore::create (recent_session_columns);
895 redisplay_recent_sessions ();
897 if (!session_hbox.get_children().empty()) {
898 session_hbox.remove (**session_hbox.get_children().begin());
901 if (session_existing_vbox.get_children().empty()) {
903 recent_session_display.set_model (recent_session_model);
904 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
905 recent_session_display.set_headers_visible (false);
906 recent_session_display.get_selection()->set_mode (SELECTION_BROWSE);
908 recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected));
910 recent_scroller.add (recent_session_display);
911 recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
912 recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
914 recent_session_display.show();
916 recent_scroller.show();
917 int cnt = redisplay_recent_sessions ();
918 recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
921 recent_scroller.set_size_request (-1, 300);
924 session_existing_vbox.set_spacing (8);
925 session_existing_vbox.pack_start (recent_scroller, true, true);
927 existing_session_chooser.set_title (_("Select session file"));
928 existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
931 existing_session_chooser->add_shortcut_folder ("/Volumes");
934 HBox* hbox = manage (new HBox);
935 hbox->set_spacing (4);
936 hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK);
937 hbox->pack_start (existing_session_chooser);
938 session_existing_vbox.pack_start (*hbox);
942 session_existing_vbox.show_all ();
943 session_hbox.pack_start (session_existing_vbox, true, true);
945 set_page_title (session_vbox, _("Select a session"));
946 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
950 ArdourStartup::more_new_session_options_button_clicked ()
952 if (more_new_session_options_button.get_active()) {
953 more_options_vbox.show_all ();
954 set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM);
955 set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
957 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
958 more_options_vbox.hide ();
963 ArdourStartup::setup_more_options_page ()
965 more_options_vbox.set_border_width (24);
967 _output_limit_count.set_adjustment (_output_limit_count_adj);
968 _input_limit_count.set_adjustment (_input_limit_count_adj);
969 _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj);
971 chan_count_label_1.set_text (_("channels"));
972 chan_count_label_3.set_text (_("channels"));
973 chan_count_label_4.set_text (_("channels"));
975 chan_count_label_1.set_alignment(0,0.5);
976 chan_count_label_1.set_padding(0,0);
977 chan_count_label_1.set_line_wrap(false);
979 chan_count_label_3.set_alignment(0,0.5);
980 chan_count_label_3.set_padding(0,0);
981 chan_count_label_3.set_line_wrap(false);
983 chan_count_label_4.set_alignment(0,0.5);
984 chan_count_label_4.set_padding(0,0);
985 chan_count_label_4.set_line_wrap(false);
987 bus_label.set_markup (_("<b>Busses</b>"));
988 input_label.set_markup (_("<b>Inputs</b>"));
989 output_label.set_markup (_("<b>Outputs</b>"));
991 _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
992 _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
993 _master_bus_channel_count.set_numeric(true);
994 _master_bus_channel_count.set_digits(0);
995 _master_bus_channel_count.set_wrap(false);
997 _create_master_bus.set_label (_("Create master bus"));
998 _create_master_bus.set_flags(Gtk::CAN_FOCUS);
999 _create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
1000 _create_master_bus.set_mode(true);
1001 _create_master_bus.set_active(true);
1002 _create_master_bus.set_border_width(0);
1004 advanced_table.set_row_spacings(0);
1005 advanced_table.set_col_spacings(0);
1007 _connect_inputs.set_label (_("Automatically connect to physical_inputs"));
1008 _connect_inputs.set_flags(Gtk::CAN_FOCUS);
1009 _connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
1010 _connect_inputs.set_mode(true);
1011 _connect_inputs.set_active(true);
1012 _connect_inputs.set_border_width(0);
1014 _limit_input_ports.set_label (_("Use only"));
1015 _limit_input_ports.set_flags(Gtk::CAN_FOCUS);
1016 _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
1017 _limit_input_ports.set_mode(true);
1018 _limit_input_ports.set_sensitive(true);
1019 _limit_input_ports.set_border_width(0);
1021 _input_limit_count.set_flags(Gtk::CAN_FOCUS);
1022 _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1023 _input_limit_count.set_numeric(true);
1024 _input_limit_count.set_digits(0);
1025 _input_limit_count.set_wrap(false);
1026 _input_limit_count.set_sensitive(false);
1028 bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
1030 bus_label.set_alignment(0, 0.5);
1031 bus_label.set_padding(0,0);
1032 bus_label.set_line_wrap(false);
1033 bus_label.set_selectable(false);
1034 bus_label.set_use_markup(true);
1035 bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
1036 bus_frame.set_label_align(0,0.5);
1037 bus_frame.add(bus_hbox);
1038 bus_frame.set_label_widget(bus_label);
1040 bus_table.set_row_spacings (0);
1041 bus_table.set_col_spacings (0);
1042 bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1043 bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1044 bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
1046 input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
1047 input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
1048 input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
1049 input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
1050 input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
1051 input_table.set_row_spacings(0);
1052 input_table.set_col_spacings(0);
1053 input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
1055 input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
1057 input_label.set_alignment(0, 0.5);
1058 input_label.set_padding(0,0);
1059 input_label.set_line_wrap(false);
1060 input_label.set_selectable(false);
1061 input_label.set_use_markup(true);
1062 input_frame.set_shadow_type(Gtk::SHADOW_NONE);
1063 input_frame.set_label_align(0,0.5);
1064 input_frame.add(input_hbox);
1065 input_frame.set_label_widget(input_label);
1067 _connect_outputs.set_label (_("Automatically connect outputs"));
1068 _connect_outputs.set_flags(Gtk::CAN_FOCUS);
1069 _connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
1070 _connect_outputs.set_mode(true);
1071 _connect_outputs.set_active(true);
1072 _connect_outputs.set_border_width(0);
1073 _limit_output_ports.set_label (_("Use only"));
1074 _limit_output_ports.set_flags(Gtk::CAN_FOCUS);
1075 _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
1076 _limit_output_ports.set_mode(true);
1077 _limit_output_ports.set_sensitive(true);
1078 _limit_output_ports.set_border_width(0);
1079 _output_limit_count.set_flags(Gtk::CAN_FOCUS);
1080 _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1081 _output_limit_count.set_numeric(false);
1082 _output_limit_count.set_digits(0);
1083 _output_limit_count.set_wrap(false);
1084 _output_limit_count.set_sensitive(false);
1085 output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
1086 output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
1087 output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
1089 _connect_outputs_to_master.set_label (_("... to master bus"));
1090 _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
1091 _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
1092 _connect_outputs_to_master.set_mode(true);
1093 _connect_outputs_to_master.set_active(false);
1094 _connect_outputs_to_master.set_border_width(0);
1096 _connect_outputs_to_master.set_group (connect_outputs_group);
1097 _connect_outputs_to_physical.set_group (connect_outputs_group);
1099 _connect_outputs_to_physical.set_label (_("... to physical outputs"));
1100 _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
1101 _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
1102 _connect_outputs_to_physical.set_mode(true);
1103 _connect_outputs_to_physical.set_active(false);
1104 _connect_outputs_to_physical.set_border_width(0);
1106 output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
1107 output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
1108 output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
1109 output_vbox.set_border_width(6);
1111 output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
1113 output_vbox.pack_start(output_conn_vbox);
1114 output_vbox.pack_start(output_port_vbox);
1116 output_label.set_alignment(0, 0.5);
1117 output_label.set_padding(0,0);
1118 output_label.set_line_wrap(false);
1119 output_label.set_selectable(false);
1120 output_label.set_use_markup(true);
1121 output_frame.set_shadow_type(Gtk::SHADOW_NONE);
1122 output_frame.set_label_align(0,0.5);
1124 output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
1126 output_frame.add(output_hbox);
1127 output_frame.set_label_widget(output_label);
1129 more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
1130 more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
1131 more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
1132 more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
1136 _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_inputs_clicked));
1137 _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_outputs_clicked));
1138 _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_inputs_clicked));
1139 _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_outputs_clicked));
1140 _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::master_bus_button_clicked));
1142 /* note that more_options_vbox is NOT visible by
1143 * default. this is entirely by design - this page
1144 * should be skipped unless explicitly requested.
1147 session_options_page_index = append_page (more_options_vbox);
1148 set_page_title (more_options_vbox, _("Advanced Session Options"));
1149 set_page_complete (more_options_vbox, true);
1153 ArdourStartup::create_master_bus() const
1155 return _create_master_bus.get_active();
1159 ArdourStartup::master_channel_count() const
1161 return _master_bus_channel_count.get_value_as_int();
1165 ArdourStartup::connect_inputs() const
1167 return _connect_inputs.get_active();
1171 ArdourStartup::limit_inputs_used_for_connection() const
1173 return _limit_input_ports.get_active();
1177 ArdourStartup::input_limit_count() const
1179 return _input_limit_count.get_value_as_int();
1183 ArdourStartup::connect_outputs() const
1185 return _connect_outputs.get_active();
1189 ArdourStartup::limit_outputs_used_for_connection() const
1191 return _limit_output_ports.get_active();
1195 ArdourStartup::output_limit_count() const
1197 return _output_limit_count.get_value_as_int();
1201 ArdourStartup::connect_outs_to_master() const
1203 return _connect_outputs_to_master.get_active();
1207 ArdourStartup::connect_outs_to_physical() const
1209 return _connect_outputs_to_physical.get_active();
1213 ArdourStartup::connect_inputs_clicked ()
1215 _limit_input_ports.set_sensitive(_connect_inputs.get_active());
1217 if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
1218 _input_limit_count.set_sensitive(true);
1220 _input_limit_count.set_sensitive(false);
1225 ArdourStartup::connect_outputs_clicked ()
1227 _limit_output_ports.set_sensitive(_connect_outputs.get_active());
1229 if (_connect_outputs.get_active() && _limit_output_ports.get_active()) {
1230 _output_limit_count.set_sensitive(true);
1232 _output_limit_count.set_sensitive(false);
1237 ArdourStartup::limit_inputs_clicked ()
1239 _input_limit_count.set_sensitive(_limit_input_ports.get_active());
1243 ArdourStartup::limit_outputs_clicked ()
1245 _output_limit_count.set_sensitive(_limit_output_ports.get_active());
1249 ArdourStartup::master_bus_button_clicked ()
1251 bool yn = _create_master_bus.get_active();
1253 _master_bus_channel_count.set_sensitive(yn);
1257 ArdourStartup::move_along_now ()
1259 gint cur = get_current_page ();
1261 if (cur == session_page_index) {
1262 if (more_new_session_options_button.get_active()) {
1263 set_current_page (session_options_page_index);
1271 ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
1273 set_page_complete (session_vbox, true);
1278 ArdourStartup::existing_session_selected ()
1280 _existing_session_chooser_used = true;
1282 set_page_complete (session_vbox, true);