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 list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
106 Glib::RefPtr<Gdk::Pixbuf> icon;
108 if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
109 window_icons.push_back (icon);
111 if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
112 window_icons.push_back (icon);
114 if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
115 window_icons.push_back (icon);
117 if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
118 window_icons.push_back (icon);
120 if (!window_icons.empty ()) {
121 set_default_icon_list (window_icons);
124 sys::path been_here_before = user_config_directory();
125 been_here_before /= ".a3"; // XXXX use more specific version so we can catch upgrades
126 new_user = !exists (been_here_before);
128 bool need_audio_setup = !EngineControl::engine_running();
134 /* Create the config directory so that we have somewhere to put the
135 been_here_before file.
138 sys::create_directories (user_config_directory ());
140 catch (const sys::filesystem_error& ex) {
141 error << "Could not create user configuration directory" << endmsg;
144 /* "touch" the file */
145 ofstream fout (been_here_before.to_string().c_str());
146 setup_new_user_page ();
147 setup_first_time_config_page ();
148 setup_monitoring_choice_page ();
149 setup_monitor_section_choice_page ();
151 if (need_audio_setup) {
157 if (need_audio_setup) {
161 setup_initial_choice_page ();
164 setup_session_page ();
165 setup_more_options_page ();
174 ArdourStartup::~ArdourStartup ()
179 ArdourStartup::setup_alpha_page ()
181 VBox* vbox = manage (new VBox);
182 Label* label = manage (new Label);
183 label->set_markup (_("<b>Welcome to this ALPHA release of Ardour 3.0</b>\n\n\
184 There are still many issues and bugs to be worked on,\n\
185 as well as general workflow improvements, before this can be considered\n\
186 release software. So, a few guidelines:\n\
188 1) Please do <b>NOT</b> use this software with the expectation that it is stable or reliable\n\
189 though it may be so, depending on your workflow.\n\
190 2) Please see http://ardour.org/a3_features for a guide to new features.\n\
191 3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n\
192 4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to report issues\n\
193 making sure to note the product version number as 3.0-alpha.\n\
194 5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and pass on comments.\n\
195 6) Please <b>DO</b> join us on IRC for real time discussions about ardour3. You\n\
196 can get there directly from Ardour via the Help->Chat menu option.\n\
198 Full information on all the above can be found on the support page at\n\
200 http://ardour.org/support\n\
203 vbox->set_border_width (12);
204 vbox->pack_start (*label, false, false, 12);
208 set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
209 set_page_title (*vbox, _("This is an ALPHA RELEASE"));
210 set_page_complete (*vbox, true);
214 ArdourStartup::set_new_only (bool yn)
226 ArdourStartup::set_load_template (string load_template)
228 use_template_button.set_active (false);
229 load_template_override = load_template;
233 ArdourStartup::use_session_template ()
235 if (!load_template_override.empty()) {
239 if (use_template_button.get_active()) {
240 return template_chooser.get_active_row_number() > 0;
242 return !session_template_chooser.get_filename().empty();
247 ArdourStartup::session_template_name ()
249 if (!load_template_override.empty()) {
250 string the_path = (ARDOUR::user_template_directory()/ (load_template_override + ".template")).to_string();
254 if (ic_existing_session_button.get_active()) {
258 if (use_template_button.get_active()) {
259 TreeModel::iterator iter = template_chooser.get_active ();
260 TreeModel::Row row = (*iter);
261 string s = row[session_template_columns.path];
264 return session_template_chooser.get_filename();
270 ArdourStartup::session_name (bool& should_be_new)
272 if (ic_new_session_button.get_active()) {
273 should_be_new = true;
274 string val = new_name_entry.get_text ();
275 strip_whitespace_edges (val);
277 } else if (_existing_session_chooser_used) {
278 /* existing session chosen from file chooser */
279 should_be_new = false;
280 return existing_session_chooser.get_filename ();
282 /* existing session chosen from recent list */
283 should_be_new = false;
285 TreeIter iter = recent_session_display.get_selection()->get_selected();
288 return (*iter)[recent_session_columns.visible_name];
296 ArdourStartup::session_folder ()
298 if (ic_new_session_button.get_active()) {
299 std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
300 return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
301 } else if (_existing_session_chooser_used) {
302 /* existing session chosen from file chooser */
303 return existing_session_chooser.get_current_folder ();
305 /* existing session chosen from recent list */
306 TreeIter iter = recent_session_display.get_selection()->get_selected();
309 return (*iter)[recent_session_columns.fullpath];
316 ArdourStartup::setup_audio_page ()
318 engine_dialog = manage (new EngineControl);
320 engine_dialog->set_border_width (12);
322 engine_dialog->show_all ();
324 audio_page_index = append_page (*engine_dialog);
325 set_page_type (*engine_dialog, ASSISTANT_PAGE_CONTENT);
326 set_page_title (*engine_dialog, _("Audio / MIDI Setup"));
328 /* the default parameters should work, so the page is potentially complete */
330 set_page_complete (*engine_dialog, true);
334 ArdourStartup::setup_new_user_page ()
336 Label* foomatic = manage (new Label);
338 foomatic->set_markup (string_compose (_("\
339 <span size=\"larger\">%1 is a digital audio workstation. You can use it to\n\
340 record, edit and mix multi-track audio. You can produce your\n\
341 own CDs, mix video soundtracks, or just experiment with new\n\
342 ideas about music and sound.\n\
344 There are a few things that need to configured before you start\n\
345 using the program.</span>\
348 HBox* hbox = manage (new HBox);
349 HBox* vbox = manage (new HBox);
351 vbox->set_border_width (24);
353 hbox->pack_start (*foomatic, true, true);
354 vbox->pack_start (*hbox, true, true);
360 new_user_page_index = append_page (*vbox);
361 set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
362 set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
363 set_page_header_image (*vbox, icon_pixbuf);
364 set_page_complete (*vbox, true);
368 ArdourStartup::default_dir_changed ()
370 Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
375 ArdourStartup::config_changed ()
377 config_modified = true;
381 ArdourStartup::setup_first_time_config_page ()
383 default_dir_chooser = manage (new FileChooserButton (string_compose (_("Default folder for %1 sessions"), PROGRAM_NAME),
384 FILE_CHOOSER_ACTION_SELECT_FOLDER));
385 Gtk::Label* txt = manage (new Label);
386 HBox* hbox = manage (new HBox);
387 VBox* vbox = manage (new VBox);
389 txt->set_markup (string_compose (_("\
390 Each project that you work on with %1 has its own folder.\n\
391 These can require a lot of disk space if you are recording audio.\n\
393 Where would you like new %1 sessions to be stored by default?\n\n\
394 <i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
395 txt->set_alignment (0.0, 0.0);
397 vbox->set_spacing (18);
398 vbox->set_border_width (24);
400 hbox->pack_start (*default_dir_chooser, false, true, 8);
401 vbox->pack_start (*txt, false, false);
402 vbox->pack_start (*hbox, false, true);
404 default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
405 default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &ArdourStartup::default_dir_changed));
406 default_dir_chooser->show ();
410 default_folder_page_index = append_page (*vbox);
411 set_page_title (*vbox, _("Default folder for new sessions"));
412 set_page_header_image (*vbox, icon_pixbuf);
413 set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
415 /* user can just skip all these settings if they want to */
417 set_page_complete (*vbox, true);
421 ArdourStartup::setup_monitoring_choice_page ()
423 mon_vbox.set_spacing (18);
424 mon_vbox.set_border_width (24);
426 HBox* hbox = manage (new HBox);
427 VBox* vbox = manage (new VBox);
428 RadioButton::Group g (monitor_via_hardware_button.get_group());
429 monitor_via_ardour_button.set_group (g);
431 monitor_label.set_markup(_("\
432 While recording instruments or vocals, you probably want to listen to the\n\
433 signal as well as record it. This is called \"monitoring\". There are\n\
434 different ways to do this depending on the equipment you have and the\n\
435 configuration of that equipment. The two most common are presented here.\n\
436 Please choose whichever one is right for your setup.\n\n\
437 <i>(You can change this preference at any time, via the Preferences dialog)</i>"));
438 monitor_label.set_alignment (0.0, 0.0);
440 vbox->set_spacing (6);
442 vbox->pack_start (monitor_via_hardware_button, false, true);
443 vbox->pack_start (monitor_via_ardour_button, false, true);
444 hbox->pack_start (*vbox, true, true, 8);
445 mon_vbox.pack_start (monitor_label, false, false);
446 mon_vbox.pack_start (*hbox, false, false);
448 mon_vbox.show_all ();
450 monitoring_page_index = append_page (mon_vbox);
451 set_page_title (mon_vbox, _("Monitoring Choices"));
452 set_page_header_image (mon_vbox, icon_pixbuf);
454 /* user could just click on "Forward" if default
458 set_page_complete (mon_vbox, true);
462 ArdourStartup::setup_monitor_section_choice_page ()
464 mon_sec_vbox.set_spacing (18);
465 mon_sec_vbox.set_border_width (24);
467 HBox* hbox = manage (new HBox);
468 VBox* main_vbox = manage (new VBox);
470 Label* l = manage (new Label);
472 main_vbox->set_spacing (32);
474 no_monitor_section_button.set_label (_("Use a Master bus directly"));
475 l->set_alignment (0.0, 1.0);
476 l->set_markup(_("Connect the Master bus directly to your hardware outputs.\n\
477 <i>Preferable for simple use</i>."));
479 vbox = manage (new VBox);
480 vbox->set_spacing (6);
481 vbox->pack_start (no_monitor_section_button, false, true);
482 vbox->pack_start (*l, false, true);
484 main_vbox->pack_start (*vbox, false, false);
486 use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
487 l = manage (new Label);
488 l->set_alignment (0.0, 1.0);
489 l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
490 greater control in monitoring without affecting the mix."));
492 vbox = manage (new VBox);
493 vbox->set_spacing (6);
494 vbox->pack_start (use_monitor_section_button, false, true);
495 vbox->pack_start (*l, false, true);
497 main_vbox->pack_start (*vbox, false, false);
499 RadioButton::Group g (use_monitor_section_button.get_group());
500 no_monitor_section_button.set_group (g);
502 if (Config->get_use_monitor_bus()) {
503 use_monitor_section_button.set_active (true);
505 no_monitor_section_button.set_active (true);
508 use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
509 no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
511 monitor_section_label.set_markup(_("<i><small>(You can change this preference at any time, via the Preferences dialog)</small></i>"));
512 monitor_section_label.set_alignment (0.0, 0.0);
514 hbox->pack_start (*main_vbox, true, true, 8);
515 mon_sec_vbox.pack_start (*hbox, false, false);
516 mon_sec_vbox.pack_start (monitor_section_label, false, false);
518 mon_sec_vbox.show_all ();
520 monitor_section_page_index = append_page (mon_sec_vbox);
521 set_page_title (mon_sec_vbox, _("Monitor Section"));
522 set_page_header_image (mon_sec_vbox, icon_pixbuf);
524 /* user could just click on "Forward" if default
528 set_page_complete (mon_sec_vbox, true);
532 ArdourStartup::setup_initial_choice_page ()
534 ic_vbox.set_spacing (6);
535 ic_vbox.set_border_width (24);
537 RadioButton::Group g (ic_new_session_button.get_group());
538 ic_existing_session_button.set_group (g);
540 HBox* centering_hbox = manage (new HBox);
541 VBox* centering_vbox = manage (new VBox);
543 centering_vbox->set_spacing (6);
545 centering_vbox->pack_start (ic_new_session_button, false, true);
546 centering_vbox->pack_start (ic_existing_session_button, false, true);
548 ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
549 ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
551 ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
552 ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
554 centering_hbox->pack_start (*centering_vbox, true, true);
556 ic_vbox.pack_start (*centering_hbox, true, true);
560 initial_choice_index = append_page (ic_vbox);
561 set_page_title (ic_vbox, _("What would you like to do ?"));
562 set_page_header_image (ic_vbox, icon_pixbuf);
564 /* user could just click on "Forward" if default
568 set_page_complete (ic_vbox, true);
572 ArdourStartup::initial_button_press (GdkEventButton *event)
574 if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
575 set_current_page(session_page_index);
583 ArdourStartup::initial_button_activated ()
585 set_current_page(session_page_index);
589 ArdourStartup::setup_session_page ()
591 session_vbox.set_border_width (24);
593 session_vbox.pack_start (session_hbox, true, true);
594 session_vbox.show_all ();
596 session_page_index = append_page (session_vbox);
597 /* initial setting */
598 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
602 ArdourStartup::setup_final_page ()
604 final_page.set_text (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
606 final_page_index = append_page (final_page);
607 set_page_complete (final_page, true);
608 set_page_header_image (final_page, icon_pixbuf);
609 set_page_type (final_page, ASSISTANT_PAGE_CONFIRM);
613 ArdourStartup::on_cancel ()
615 _response = RESPONSE_CANCEL;
620 ArdourStartup::on_delete_event (GdkEventAny*)
622 _response = RESPONSE_CLOSE;
628 ArdourStartup::on_apply ()
631 engine_dialog->setup_engine ();
634 if (config_modified) {
636 if (default_dir_chooser) {
637 Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
640 if (monitor_via_hardware_button.get_active()) {
641 Config->set_monitoring_model (ExternalMonitoring);
642 } else if (monitor_via_ardour_button.get_active()) {
643 Config->set_monitoring_model (SoftwareMonitoring);
646 Config->set_use_monitor_bus (use_monitor_section_button.get_active());
648 Config->save_state ();
651 _response = RESPONSE_OK;
656 ArdourStartup::on_prepare (Gtk::Widget* page)
658 if (page == &session_vbox) {
660 if (ic_new_session_button.get_active()) {
661 /* new session requested */
662 setup_new_session_page ();
664 /* existing session requested */
665 setup_existing_session_page ();
669 /* HACK HACK HACK ... change the "Apply" button label
673 Gtk::Widget* tl = session_vbox.get_toplevel();
675 if ((win = dynamic_cast<Gtk::Window*>(tl)) != 0) {
676 /* ::get_default_widget() is not wrapped in gtkmm */
677 Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj()));
679 if ((button = dynamic_cast<Gtk::Button*>(def)) != 0) {
680 if (more_new_session_options_button.get_active()) {
681 button->set_label (_("Forward"));
683 button->set_label (_("Open"));
691 ArdourStartup::populate_session_templates ()
693 vector<TemplateInfo> templates;
695 find_session_templates (templates);
697 template_model->clear ();
699 for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
702 row = *(template_model->append ());
704 row[session_template_columns.name] = (*x).name;
705 row[session_template_columns.path] = (*x).path;
710 lost_name_entry_focus (GdkEventFocus*)
712 cerr << "lost focus\n";
717 ArdourStartup::setup_new_session_page ()
719 if (!session_hbox.get_children().empty()) {
720 session_hbox.remove (**session_hbox.get_children().begin());
723 session_new_vbox.set_spacing (18);
725 if (session_new_vbox.get_children().empty()) {
726 VBox *vbox1 = manage (new VBox);
727 HBox* hbox1 = manage (new HBox);
728 Label* label1 = manage (new Label);
730 vbox1->set_spacing (6);
732 hbox1->set_spacing (6);
733 hbox1->pack_start (*label1, false, false);
734 hbox1->pack_start (new_name_entry, true, true);
736 label1->set_text (_("Session name:"));
739 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
740 new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
741 /* name provided - they can move right along */
742 set_page_complete (session_vbox, true);
745 new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed));
746 new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now));
748 vbox1->pack_start (*hbox1, true, true);
752 HBox* hbox2 = manage (new HBox);
753 Label* label2 = manage (new Label);
755 hbox2->set_spacing (6);
756 hbox2->pack_start (*label2, false, false);
757 hbox2->pack_start (new_folder_chooser, true, true);
759 label2->set_text (_("Create session folder in:"));
761 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
762 new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
764 new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
766 new_folder_chooser.set_title (_("Select folder for session"));
769 new_folder_chooser.add_shortcut_folder ("/Volumes");
772 vbox1->pack_start (*hbox2, false, false);
774 session_new_vbox.pack_start (*vbox1, false, false);
778 VBox *vbox2 = manage (new VBox);
779 HBox* hbox3 = manage (new HBox);
780 Label* label3 = manage (new Label);
781 template_model = ListStore::create (session_template_columns);
782 populate_session_templates ();
784 vbox2->set_spacing (6);
786 label3->set_markup (_("<b>Options</b>"));
787 label3->set_alignment (0.0, 0.0);
789 vbox2->pack_start (*label3, false, true);
791 VBox *vbox3 = manage (new VBox);
793 vbox3->set_spacing (6);
795 if (!template_model->children().empty()) {
797 HBox* hbox4a = manage (new HBox);
798 use_template_button.set_label (_("Use this template"));
800 TreeModel::Row row = *template_model->prepend ();
801 row[session_template_columns.name] = (_("no template"));
802 row[session_template_columns.path] = string();
804 hbox4a->set_spacing (6);
805 hbox4a->pack_start (use_template_button, false, false);
806 hbox4a->pack_start (template_chooser, true, true);
808 template_chooser.set_model (template_model);
810 Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
811 text_renderer->property_editable() = false;
813 template_chooser.pack_start (*text_renderer);
814 template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
815 template_chooser.set_active (0);
817 use_template_button.show();
818 template_chooser.show ();
820 vbox3->pack_start (*hbox4a, false, false);
826 session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
828 HBox* hbox4b = manage (new HBox);
829 use_session_as_template_button.set_label (_("Use an existing session as a template:"));
831 hbox4b->set_spacing (6);
832 hbox4b->pack_start (use_session_as_template_button, false, false);
833 hbox4b->pack_start (session_template_chooser, true, true);
835 use_session_as_template_button.show ();
836 session_template_chooser.show ();
838 Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter));
839 session_filter->add_pattern (X_("*.ardour"));
840 session_template_chooser.set_filter (*session_filter);
841 session_template_chooser.set_title (_("Select template"));
843 vbox3->pack_start (*hbox4b, false, false);
848 HBox* hbox5 = manage (new HBox);
850 hbox5->set_spacing (6);
851 hbox5->pack_start (more_new_session_options_button, false, false);
853 more_new_session_options_button.show ();
854 more_new_session_options_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked));
856 vbox3->pack_start (*hbox5, false, false);
857 hbox3->pack_start (*vbox3, true, true, 8);
858 vbox2->pack_start (*hbox3, false, false);
862 session_new_vbox.pack_start (*vbox2, false, false);
865 session_new_vbox.show_all ();
866 session_hbox.pack_start (session_new_vbox, true, true);
867 set_page_title (session_vbox, _("New Session"));
868 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
870 if (more_new_session_options_button.get_active()) {
871 set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
874 new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped));
875 new_name_entry.signal_focus_out_event().connect (sigc::ptr_fun (lost_name_entry_focus));
879 ArdourStartup::new_name_mapped ()
881 cerr << "Grab new name focus\n";
882 new_name_entry.grab_focus ();
886 ArdourStartup::new_name_changed ()
888 if (!new_name_entry.get_text().empty()) {
889 set_page_complete (session_vbox, true);
891 set_page_complete (session_vbox, false);
896 ArdourStartup::redisplay_recent_sessions ()
898 std::vector<sys::path> session_directories;
899 RecentSessionsSorter cmp;
901 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
902 recent_session_model->clear ();
904 ARDOUR::RecentSessions rs;
905 ARDOUR::read_recent_sessions (rs);
908 recent_session_display.set_model (recent_session_model);
912 // sort them alphabetically
913 sort (rs.begin(), rs.end(), cmp);
915 for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
916 session_directories.push_back ((*i).second);
919 for (vector<sys::path>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
921 std::vector<sys::path> state_file_paths;
923 // now get available states for this session
925 get_state_files_in_directory (*i, state_file_paths);
927 vector<string*>* states;
928 vector<const gchar*> item;
929 string fullpath = (*i).to_string();
931 /* remove any trailing / */
933 if (fullpath[fullpath.length()-1] == '/') {
934 fullpath = fullpath.substr (0, fullpath.length()-1);
937 /* check whether session still exists */
938 if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) {
939 /* session doesn't exist */
943 /* now get available states for this session */
945 if ((states = Session::possible_states (fullpath)) == 0) {
950 std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
952 Gtk::TreeModel::Row row = *(recent_session_model->append());
954 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
955 row[recent_session_columns.fullpath] = fullpath;
957 if (state_file_names.size() > 1) {
961 for (std::vector<std::string>::iterator i2 = state_file_names.begin();
962 i2 != state_file_names.end(); ++i2)
965 Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
967 child_row[recent_session_columns.visible_name] = *i2;
968 child_row[recent_session_columns.fullpath] = fullpath;
973 recent_session_display.set_model (recent_session_model);
978 ArdourStartup::recent_session_row_selected ()
980 if (recent_session_display.get_selection()->count_selected_rows() > 0) {
981 set_page_complete (session_vbox, true);
983 set_page_complete (session_vbox, false);
988 ArdourStartup::setup_existing_session_page ()
990 recent_session_model = TreeStore::create (recent_session_columns);
991 redisplay_recent_sessions ();
993 if (!session_hbox.get_children().empty()) {
994 session_hbox.remove (**session_hbox.get_children().begin());
997 if (session_existing_vbox.get_children().empty()) {
999 recent_session_display.set_model (recent_session_model);
1000 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
1001 recent_session_display.set_headers_visible (false);
1002 recent_session_display.get_selection()->set_mode (SELECTION_BROWSE);
1004 recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected));
1006 recent_scroller.add (recent_session_display);
1007 recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1008 recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
1010 recent_session_display.show();
1012 recent_scroller.show();
1013 int cnt = redisplay_recent_sessions ();
1014 recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
1017 recent_scroller.set_size_request (-1, 300);
1020 session_existing_vbox.set_spacing (8);
1021 session_existing_vbox.pack_start (recent_scroller, true, true);
1023 existing_session_chooser.set_title (_("Select session file"));
1024 existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
1027 existing_session_chooser.add_shortcut_folder ("/Volumes");
1030 HBox* hbox = manage (new HBox);
1031 hbox->set_spacing (4);
1032 hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK);
1033 hbox->pack_start (existing_session_chooser);
1034 session_existing_vbox.pack_start (*hbox, false, false);
1038 session_existing_vbox.show_all ();
1039 session_hbox.pack_start (session_existing_vbox, true, true);
1041 set_page_title (session_vbox, _("Select a session"));
1042 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
1046 ArdourStartup::more_new_session_options_button_clicked ()
1048 if (more_new_session_options_button.get_active()) {
1049 more_options_vbox.show_all ();
1050 set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM);
1051 set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
1053 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
1054 more_options_vbox.hide ();
1059 ArdourStartup::setup_more_options_page ()
1061 more_options_vbox.set_border_width (24);
1063 _output_limit_count.set_adjustment (_output_limit_count_adj);
1064 _input_limit_count.set_adjustment (_input_limit_count_adj);
1065 _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj);
1067 chan_count_label_1.set_text (_("channels"));
1068 chan_count_label_3.set_text (_("channels"));
1069 chan_count_label_4.set_text (_("channels"));
1071 chan_count_label_1.set_alignment(0,0.5);
1072 chan_count_label_1.set_padding(0,0);
1073 chan_count_label_1.set_line_wrap(false);
1075 chan_count_label_3.set_alignment(0,0.5);
1076 chan_count_label_3.set_padding(0,0);
1077 chan_count_label_3.set_line_wrap(false);
1079 chan_count_label_4.set_alignment(0,0.5);
1080 chan_count_label_4.set_padding(0,0);
1081 chan_count_label_4.set_line_wrap(false);
1083 bus_label.set_markup (_("<b>Busses</b>"));
1084 input_label.set_markup (_("<b>Inputs</b>"));
1085 output_label.set_markup (_("<b>Outputs</b>"));
1087 _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
1088 _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1089 _master_bus_channel_count.set_numeric(true);
1090 _master_bus_channel_count.set_digits(0);
1091 _master_bus_channel_count.set_wrap(false);
1093 _create_master_bus.set_label (_("Create master bus"));
1094 _create_master_bus.set_flags(Gtk::CAN_FOCUS);
1095 _create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
1096 _create_master_bus.set_mode(true);
1097 _create_master_bus.set_active(true);
1098 _create_master_bus.set_border_width(0);
1100 advanced_table.set_row_spacings(0);
1101 advanced_table.set_col_spacings(0);
1103 _connect_inputs.set_label (_("Automatically connect to physical_inputs"));
1104 _connect_inputs.set_flags(Gtk::CAN_FOCUS);
1105 _connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
1106 _connect_inputs.set_mode(true);
1107 _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect);
1108 _connect_inputs.set_border_width(0);
1110 _limit_input_ports.set_label (_("Use only"));
1111 _limit_input_ports.set_flags(Gtk::CAN_FOCUS);
1112 _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
1113 _limit_input_ports.set_mode(true);
1114 _limit_input_ports.set_sensitive(true);
1115 _limit_input_ports.set_border_width(0);
1117 _input_limit_count.set_flags(Gtk::CAN_FOCUS);
1118 _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1119 _input_limit_count.set_numeric(true);
1120 _input_limit_count.set_digits(0);
1121 _input_limit_count.set_wrap(false);
1122 _input_limit_count.set_sensitive(false);
1124 bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
1126 bus_label.set_alignment(0, 0.5);
1127 bus_label.set_padding(0,0);
1128 bus_label.set_line_wrap(false);
1129 bus_label.set_selectable(false);
1130 bus_label.set_use_markup(true);
1131 bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
1132 bus_frame.set_label_align(0,0.5);
1133 bus_frame.add(bus_hbox);
1134 bus_frame.set_label_widget(bus_label);
1136 bus_table.set_row_spacings (0);
1137 bus_table.set_col_spacings (0);
1138 bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1139 bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1140 bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
1142 input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
1143 input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
1144 input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
1145 input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
1146 input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
1147 input_table.set_row_spacings(0);
1148 input_table.set_col_spacings(0);
1149 input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
1151 input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
1153 input_label.set_alignment(0, 0.5);
1154 input_label.set_padding(0,0);
1155 input_label.set_line_wrap(false);
1156 input_label.set_selectable(false);
1157 input_label.set_use_markup(true);
1158 input_frame.set_shadow_type(Gtk::SHADOW_NONE);
1159 input_frame.set_label_align(0,0.5);
1160 input_frame.add(input_hbox);
1161 input_frame.set_label_widget(input_label);
1163 _connect_outputs.set_label (_("Automatically connect outputs"));
1164 _connect_outputs.set_flags(Gtk::CAN_FOCUS);
1165 _connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
1166 _connect_outputs.set_mode(true);
1167 _connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect);
1168 _connect_outputs.set_border_width(0);
1169 _limit_output_ports.set_label (_("Use only"));
1170 _limit_output_ports.set_flags(Gtk::CAN_FOCUS);
1171 _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
1172 _limit_output_ports.set_mode(true);
1173 _limit_output_ports.set_sensitive(true);
1174 _limit_output_ports.set_border_width(0);
1175 _output_limit_count.set_flags(Gtk::CAN_FOCUS);
1176 _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1177 _output_limit_count.set_numeric(false);
1178 _output_limit_count.set_digits(0);
1179 _output_limit_count.set_wrap(false);
1180 _output_limit_count.set_sensitive(false);
1181 output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
1182 output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
1183 output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
1185 _connect_outputs_to_master.set_label (_("... to master bus"));
1186 _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
1187 _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
1188 _connect_outputs_to_master.set_mode(true);
1189 _connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster);
1190 _connect_outputs_to_master.set_border_width(0);
1192 _connect_outputs_to_master.set_group (connect_outputs_group);
1193 _connect_outputs_to_physical.set_group (connect_outputs_group);
1195 _connect_outputs_to_physical.set_label (_("... to physical outputs"));
1196 _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
1197 _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
1198 _connect_outputs_to_physical.set_mode(true);
1199 _connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical);
1200 _connect_outputs_to_physical.set_border_width(0);
1202 output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
1203 output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
1204 output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
1205 output_vbox.set_border_width(6);
1207 output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
1209 output_vbox.pack_start(output_conn_vbox);
1210 output_vbox.pack_start(output_port_vbox);
1212 output_label.set_alignment(0, 0.5);
1213 output_label.set_padding(0,0);
1214 output_label.set_line_wrap(false);
1215 output_label.set_selectable(false);
1216 output_label.set_use_markup(true);
1217 output_frame.set_shadow_type(Gtk::SHADOW_NONE);
1218 output_frame.set_label_align(0,0.5);
1220 output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
1222 output_frame.add(output_hbox);
1223 output_frame.set_label_widget(output_label);
1225 more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
1226 more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
1227 more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
1228 more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
1232 _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_inputs_clicked));
1233 _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_outputs_clicked));
1234 _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_inputs_clicked));
1235 _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_outputs_clicked));
1236 _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::master_bus_button_clicked));
1238 /* note that more_options_vbox is NOT visible by
1239 * default. this is entirely by design - this page
1240 * should be skipped unless explicitly requested.
1243 session_options_page_index = append_page (more_options_vbox);
1244 set_page_title (more_options_vbox, _("Advanced Session Options"));
1245 set_page_complete (more_options_vbox, true);
1249 ArdourStartup::create_master_bus() const
1251 return _create_master_bus.get_active();
1255 ArdourStartup::master_channel_count() const
1257 return _master_bus_channel_count.get_value_as_int();
1261 ArdourStartup::connect_inputs() const
1263 return _connect_inputs.get_active();
1267 ArdourStartup::limit_inputs_used_for_connection() const
1269 return _limit_input_ports.get_active();
1273 ArdourStartup::input_limit_count() const
1275 return _input_limit_count.get_value_as_int();
1279 ArdourStartup::connect_outputs() const
1281 return _connect_outputs.get_active();
1285 ArdourStartup::limit_outputs_used_for_connection() const
1287 return _limit_output_ports.get_active();
1291 ArdourStartup::output_limit_count() const
1293 return _output_limit_count.get_value_as_int();
1297 ArdourStartup::connect_outs_to_master() const
1299 return _connect_outputs_to_master.get_active();
1303 ArdourStartup::connect_outs_to_physical() const
1305 return _connect_outputs_to_physical.get_active();
1309 ArdourStartup::connect_inputs_clicked ()
1311 _limit_input_ports.set_sensitive(_connect_inputs.get_active());
1313 if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
1314 _input_limit_count.set_sensitive(true);
1316 _input_limit_count.set_sensitive(false);
1321 ArdourStartup::connect_outputs_clicked ()
1323 _limit_output_ports.set_sensitive(_connect_outputs.get_active());
1325 if (_connect_outputs.get_active() && _limit_output_ports.get_active()) {
1326 _output_limit_count.set_sensitive(true);
1328 _output_limit_count.set_sensitive(false);
1333 ArdourStartup::limit_inputs_clicked ()
1335 _input_limit_count.set_sensitive(_limit_input_ports.get_active());
1339 ArdourStartup::limit_outputs_clicked ()
1341 _output_limit_count.set_sensitive(_limit_output_ports.get_active());
1345 ArdourStartup::master_bus_button_clicked ()
1347 bool yn = _create_master_bus.get_active();
1349 _master_bus_channel_count.set_sensitive(yn);
1353 ArdourStartup::move_along_now ()
1355 gint cur = get_current_page ();
1357 if (cur == session_page_index) {
1358 if (more_new_session_options_button.get_active()) {
1359 set_current_page (session_options_page_index);
1367 ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
1369 set_page_complete (session_vbox, true);
1374 ArdourStartup::existing_session_selected ()
1376 _existing_session_chooser_used = true;
1378 set_page_complete (session_vbox, true);