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();
115 /* Create the config directory so that we have somewhere to put the
116 been_here_before file.
119 sys::create_directories (user_config_directory ());
121 catch (const sys::filesystem_error& ex) {
122 error << "Could not create user configuration directory" << endmsg;
125 /* "touch" the file */
126 ofstream fout (been_here_before.to_string().c_str());
127 setup_new_user_page ();
128 setup_first_time_config_page ();
129 setup_monitoring_choice_page ();
130 setup_monitor_section_choice_page ();
132 if (need_audio_setup) {
138 if (need_audio_setup) {
142 setup_initial_choice_page ();
145 setup_session_page ();
146 setup_more_options_page ();
155 ArdourStartup::~ArdourStartup ()
160 ArdourStartup::setup_alpha_page ()
162 VBox* vbox = manage (new VBox);
163 Label* label = manage (new Label);
164 label->set_markup (_("<b>Welcome to this ALPHA release of Ardour 3.0</b>\n\n\
165 There are still many issues and bugs to be worked on,\n\
166 as well as general workflow improvements, before this can be considered\n\
167 release software. So, a few guidelines:\n\
169 1) Please do <b>NOT</b> use this software with the expectation that it is stable or reliable\n\
170 though it may be so, depending on your workflow.\n\
171 2) Please see http://ardour.org/a3_features for a guide to new features.\n\
172 3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n\
173 4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to report issues\n\
174 making sure to note the product version number as 3.0-alpha.\n\
175 5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and pass on comments.\n\
176 6) Please <b>DO</b> join us on IRC for real time discussions about ardour3. You\n\
177 can get there directly from Ardour via the Help->Chat menu option.\n\
179 Full information on all the above can be found on the support page at\n\
181 http://ardour.org/support\n\
184 vbox->set_border_width (12);
185 vbox->pack_start (*label, false, false, 12);
189 set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
190 set_page_title (*vbox, _("This is an ALPHA RELEASE"));
191 set_page_complete (*vbox, true);
195 ArdourStartup::set_new_only (bool yn)
207 ArdourStartup::set_load_template (string load_template)
209 use_template_button.set_active (false);
210 load_template_override = load_template;
214 ArdourStartup::use_session_template ()
216 if (!load_template_override.empty()) {
220 if (use_template_button.get_active()) {
221 return template_chooser.get_active_row_number() > 0;
223 return !session_template_chooser.get_filename().empty();
228 ArdourStartup::session_template_name ()
230 if (!load_template_override.empty()) {
231 string the_path = (ARDOUR::user_template_directory()/ (load_template_override + ".template")).to_string();
235 if (ic_existing_session_button.get_active()) {
239 if (use_template_button.get_active()) {
240 TreeModel::iterator iter = template_chooser.get_active ();
241 TreeModel::Row row = (*iter);
242 string s = row[session_template_columns.path];
245 return session_template_chooser.get_filename();
251 ArdourStartup::session_name (bool& should_be_new)
253 if (ic_new_session_button.get_active()) {
254 should_be_new = true;
255 string val = new_name_entry.get_text ();
256 strip_whitespace_edges (val);
258 } else if (_existing_session_chooser_used) {
259 /* existing session chosen from file chooser */
260 should_be_new = false;
261 return existing_session_chooser.get_filename ();
263 /* existing session chosen from recent list */
264 should_be_new = false;
266 TreeIter iter = recent_session_display.get_selection()->get_selected();
269 return (*iter)[recent_session_columns.visible_name];
277 ArdourStartup::session_folder ()
279 if (ic_new_session_button.get_active()) {
280 std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
281 return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
282 } else if (_existing_session_chooser_used) {
283 /* existing session chosen from file chooser */
284 return existing_session_chooser.get_current_folder ();
286 /* existing session chosen from recent list */
287 TreeIter iter = recent_session_display.get_selection()->get_selected();
290 return (*iter)[recent_session_columns.fullpath];
297 ArdourStartup::setup_audio_page ()
299 engine_dialog = manage (new EngineControl);
301 engine_dialog->set_border_width (12);
303 engine_dialog->show_all ();
305 audio_page_index = append_page (*engine_dialog);
306 set_page_type (*engine_dialog, ASSISTANT_PAGE_CONTENT);
307 set_page_title (*engine_dialog, _("Audio / MIDI Setup"));
309 /* the default parameters should work, so the page is potentially complete */
311 set_page_complete (*engine_dialog, true);
315 ArdourStartup::setup_new_user_page ()
317 Label* foomatic = manage (new Label);
319 foomatic->set_markup (string_compose (_("\
320 <span size=\"larger\">%1 is a digital audio workstation. You can use it to\n\
321 record, edit and mix multi-track audio. You can produce your\n\
322 own CDs, mix video soundtracks, or just experiment with new\n\
323 ideas about music and sound.\n\
325 There are a few things that need to configured before you start\n\
326 using the program.</span>\
329 HBox* hbox = manage (new HBox);
330 HBox* vbox = manage (new HBox);
332 vbox->set_border_width (24);
334 hbox->pack_start (*foomatic, true, true);
335 vbox->pack_start (*hbox, true, true);
341 new_user_page_index = append_page (*vbox);
342 set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
343 set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
344 set_page_header_image (*vbox, icon_pixbuf);
345 set_page_complete (*vbox, true);
349 ArdourStartup::default_dir_changed ()
351 Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
356 ArdourStartup::config_changed ()
358 config_modified = true;
362 ArdourStartup::setup_first_time_config_page ()
364 default_dir_chooser = manage (new FileChooserButton (string_compose (_("Default folder for %1 sessions"), PROGRAM_NAME),
365 FILE_CHOOSER_ACTION_SELECT_FOLDER));
366 Gtk::Label* txt = manage (new Label);
367 HBox* hbox = manage (new HBox);
368 VBox* vbox = manage (new VBox);
370 txt->set_markup (string_compose (_("\
371 Each project that you work on with %1 has its own folder.\n\
372 These can require a lot of disk space if you are recording audio.\n\
374 Where would you like new %1 sessions to be stored by default?\n\n\
375 <i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
376 txt->set_alignment (0.0, 0.0);
378 vbox->set_spacing (18);
379 vbox->set_border_width (24);
381 hbox->pack_start (*default_dir_chooser, false, true, 8);
382 vbox->pack_start (*txt, false, false);
383 vbox->pack_start (*hbox, false, true);
385 default_dir_chooser->set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
386 default_dir_chooser->signal_current_folder_changed().connect (sigc::mem_fun (*this, &ArdourStartup::default_dir_changed));
387 default_dir_chooser->show ();
391 default_folder_page_index = append_page (*vbox);
392 set_page_title (*vbox, _("Default folder for new sessions"));
393 set_page_header_image (*vbox, icon_pixbuf);
394 set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
396 /* user can just skip all these settings if they want to */
398 set_page_complete (*vbox, true);
402 ArdourStartup::setup_monitoring_choice_page ()
404 mon_vbox.set_spacing (18);
405 mon_vbox.set_border_width (24);
407 HBox* hbox = manage (new HBox);
408 VBox* vbox = manage (new VBox);
409 RadioButton::Group g (monitor_via_hardware_button.get_group());
410 monitor_via_ardour_button.set_group (g);
412 monitor_label.set_markup(_("\
413 While recording instruments or vocals, you probably want to listen to the\n\
414 signal as well as record it. This is called \"monitoring\". There are\n\
415 different ways to do this depending on the equipment you have and the\n\
416 configuration of that equipment. The two most common are presented here.\n\
417 Please choose whichever one is right for your setup.\n\n\
418 <i>(You can change this preference at any time, via the Preferences dialog)</i>"));
419 monitor_label.set_alignment (0.0, 0.0);
421 vbox->set_spacing (6);
423 vbox->pack_start (monitor_via_hardware_button, false, true);
424 vbox->pack_start (monitor_via_ardour_button, false, true);
425 hbox->pack_start (*vbox, true, true, 8);
426 mon_vbox.pack_start (monitor_label, false, false);
427 mon_vbox.pack_start (*hbox, false, false);
429 mon_vbox.show_all ();
431 monitoring_page_index = append_page (mon_vbox);
432 set_page_title (mon_vbox, _("Monitoring Choices"));
433 set_page_header_image (mon_vbox, icon_pixbuf);
435 /* user could just click on "Forward" if default
439 set_page_complete (mon_vbox, true);
443 ArdourStartup::setup_monitor_section_choice_page ()
445 mon_sec_vbox.set_spacing (18);
446 mon_sec_vbox.set_border_width (24);
448 HBox* hbox = manage (new HBox);
449 VBox* main_vbox = manage (new VBox);
451 Label* l = manage (new Label);
453 main_vbox->set_spacing (32);
455 no_monitor_section_button.set_label (_("Use a Master bus directly"));
456 l->set_alignment (0.0, 1.0);
457 l->set_markup(_("Connect the Master bus directly to your hardware outputs.\n\
458 <i>Preferable for simple use</i>."));
460 vbox = manage (new VBox);
461 vbox->set_spacing (6);
462 vbox->pack_start (no_monitor_section_button, false, true);
463 vbox->pack_start (*l, false, true);
465 main_vbox->pack_start (*vbox, false, false);
467 use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
468 l = manage (new Label);
469 l->set_alignment (0.0, 1.0);
470 l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
471 greater control in monitoring without affecting the mix."));
473 vbox = manage (new VBox);
474 vbox->set_spacing (6);
475 vbox->pack_start (use_monitor_section_button, false, true);
476 vbox->pack_start (*l, false, true);
478 main_vbox->pack_start (*vbox, false, false);
480 RadioButton::Group g (use_monitor_section_button.get_group());
481 no_monitor_section_button.set_group (g);
483 if (Config->get_use_monitor_bus()) {
484 use_monitor_section_button.set_active (true);
486 no_monitor_section_button.set_active (true);
489 use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
490 no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
492 monitor_section_label.set_markup(_("<i><small>(You can change this preference at any time, via the Preferences dialog)</small></i>"));
493 monitor_section_label.set_alignment (0.0, 0.0);
495 hbox->pack_start (*main_vbox, true, true, 8);
496 mon_sec_vbox.pack_start (*hbox, false, false);
497 mon_sec_vbox.pack_start (monitor_section_label, false, false);
499 mon_sec_vbox.show_all ();
501 monitor_section_page_index = append_page (mon_sec_vbox);
502 set_page_title (mon_sec_vbox, _("Monitor Section"));
503 set_page_header_image (mon_sec_vbox, icon_pixbuf);
505 /* user could just click on "Forward" if default
509 set_page_complete (mon_sec_vbox, true);
513 ArdourStartup::setup_initial_choice_page ()
515 ic_vbox.set_spacing (6);
516 ic_vbox.set_border_width (24);
518 RadioButton::Group g (ic_new_session_button.get_group());
519 ic_existing_session_button.set_group (g);
521 HBox* centering_hbox = manage (new HBox);
522 VBox* centering_vbox = manage (new VBox);
524 centering_vbox->set_spacing (6);
526 centering_vbox->pack_start (ic_new_session_button, false, true);
527 centering_vbox->pack_start (ic_existing_session_button, false, true);
529 ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
530 ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
532 ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
533 ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
535 centering_hbox->pack_start (*centering_vbox, true, true);
537 ic_vbox.pack_start (*centering_hbox, true, true);
541 initial_choice_index = append_page (ic_vbox);
542 set_page_title (ic_vbox, _("What would you like to do ?"));
543 set_page_header_image (ic_vbox, icon_pixbuf);
545 /* user could just click on "Forward" if default
549 set_page_complete (ic_vbox, true);
553 ArdourStartup::initial_button_press (GdkEventButton *event)
555 if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
556 set_current_page(session_page_index);
564 ArdourStartup::initial_button_activated ()
566 set_current_page(session_page_index);
570 ArdourStartup::setup_session_page ()
572 session_vbox.set_border_width (24);
574 session_vbox.pack_start (session_hbox, true, true);
575 session_vbox.show_all ();
577 session_page_index = append_page (session_vbox);
578 /* initial setting */
579 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
583 ArdourStartup::setup_final_page ()
585 final_page.set_text (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
587 final_page_index = append_page (final_page);
588 set_page_complete (final_page, true);
589 set_page_header_image (final_page, icon_pixbuf);
590 set_page_type (final_page, ASSISTANT_PAGE_CONFIRM);
594 ArdourStartup::on_cancel ()
596 _response = RESPONSE_CANCEL;
601 ArdourStartup::on_delete_event (GdkEventAny*)
603 _response = RESPONSE_CLOSE;
609 ArdourStartup::on_apply ()
612 engine_dialog->setup_engine ();
615 if (config_modified) {
617 if (default_dir_chooser) {
618 Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
621 if (monitor_via_hardware_button.get_active()) {
622 Config->set_monitoring_model (ExternalMonitoring);
623 } else if (monitor_via_ardour_button.get_active()) {
624 Config->set_monitoring_model (SoftwareMonitoring);
627 Config->set_use_monitor_bus (use_monitor_section_button.get_active());
629 Config->save_state ();
632 _response = RESPONSE_OK;
637 ArdourStartup::on_prepare (Gtk::Widget* page)
639 if (page == &session_vbox) {
641 if (ic_new_session_button.get_active()) {
642 /* new session requested */
643 setup_new_session_page ();
645 /* existing session requested */
646 setup_existing_session_page ();
650 /* HACK HACK HACK ... change the "Apply" button label
654 Gtk::Widget* tl = session_vbox.get_toplevel();
656 if ((win = dynamic_cast<Gtk::Window*>(tl)) != 0) {
657 /* ::get_default_widget() is not wrapped in gtkmm */
658 Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj()));
660 if ((button = dynamic_cast<Gtk::Button*>(def)) != 0) {
661 button->set_label (_("Open"));
668 ArdourStartup::populate_session_templates ()
670 vector<TemplateInfo> templates;
672 find_session_templates (templates);
674 template_model->clear ();
676 for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
679 row = *(template_model->append ());
681 row[session_template_columns.name] = (*x).name;
682 row[session_template_columns.path] = (*x).path;
687 lost_name_entry_focus (GdkEventFocus*)
689 cerr << "lost focus\n";
694 ArdourStartup::setup_new_session_page ()
696 if (!session_hbox.get_children().empty()) {
697 session_hbox.remove (**session_hbox.get_children().begin());
700 session_new_vbox.set_spacing (18);
702 if (session_new_vbox.get_children().empty()) {
703 VBox *vbox1 = manage (new VBox);
704 HBox* hbox1 = manage (new HBox);
705 Label* label1 = manage (new Label);
707 vbox1->set_spacing (6);
709 hbox1->set_spacing (6);
710 hbox1->pack_start (*label1, false, false);
711 hbox1->pack_start (new_name_entry, true, true);
713 label1->set_text (_("Session name:"));
716 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
717 new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
718 /* name provided - they can move right along */
719 set_page_complete (session_vbox, true);
722 new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed));
723 new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now));
725 vbox1->pack_start (*hbox1, true, true);
729 HBox* hbox2 = manage (new HBox);
730 Label* label2 = manage (new Label);
732 hbox2->set_spacing (6);
733 hbox2->pack_start (*label2, false, false);
734 hbox2->pack_start (new_folder_chooser, true, true);
736 label2->set_text (_("Create session folder in:"));
738 if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
739 new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
741 new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
743 new_folder_chooser.set_title (_("Select folder for session"));
746 new_folder_chooser.add_shortcut_folder ("/Volumes");
749 vbox1->pack_start (*hbox2, false, false);
751 session_new_vbox.pack_start (*vbox1, false, false);
755 VBox *vbox2 = manage (new VBox);
756 HBox* hbox3 = manage (new HBox);
757 Label* label3 = manage (new Label);
758 template_model = ListStore::create (session_template_columns);
759 populate_session_templates ();
761 vbox2->set_spacing (6);
763 label3->set_markup (_("<b>Options</b>"));
764 label3->set_alignment (0.0, 0.0);
766 vbox2->pack_start (*label3, false, true);
768 VBox *vbox3 = manage (new VBox);
770 vbox3->set_spacing (6);
772 if (!template_model->children().empty()) {
774 HBox* hbox4a = manage (new HBox);
775 use_template_button.set_label (_("Use this template"));
777 TreeModel::Row row = *template_model->prepend ();
778 row[session_template_columns.name] = (_("no template"));
779 row[session_template_columns.path] = string();
781 hbox4a->set_spacing (6);
782 hbox4a->pack_start (use_template_button, false, false);
783 hbox4a->pack_start (template_chooser, true, true);
785 template_chooser.set_model (template_model);
787 Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
788 text_renderer->property_editable() = false;
790 template_chooser.pack_start (*text_renderer);
791 template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
792 template_chooser.set_active (0);
794 use_template_button.show();
795 template_chooser.show ();
797 vbox3->pack_start (*hbox4a, false, false);
803 session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
805 HBox* hbox4b = manage (new HBox);
806 use_session_as_template_button.set_label (_("Use an existing session as a template:"));
808 hbox4b->set_spacing (6);
809 hbox4b->pack_start (use_session_as_template_button, false, false);
810 hbox4b->pack_start (session_template_chooser, true, true);
812 use_session_as_template_button.show ();
813 session_template_chooser.show ();
815 Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter));
816 session_filter->add_pattern (X_("*.ardour"));
817 session_template_chooser.set_filter (*session_filter);
818 session_template_chooser.set_title (_("Select template"));
820 vbox3->pack_start (*hbox4b, false, false);
825 HBox* hbox5 = manage (new HBox);
827 hbox5->set_spacing (6);
828 hbox5->pack_start (more_new_session_options_button, false, false);
830 more_new_session_options_button.show ();
831 more_new_session_options_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked));
833 vbox3->pack_start (*hbox5, false, false);
834 hbox3->pack_start (*vbox3, true, true, 8);
835 vbox2->pack_start (*hbox3, false, false);
839 session_new_vbox.pack_start (*vbox2, false, false);
842 session_new_vbox.show_all ();
843 session_hbox.pack_start (session_new_vbox, true, true);
844 set_page_title (session_vbox, _("New Session"));
845 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
847 new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped));
848 new_name_entry.signal_focus_out_event().connect (sigc::ptr_fun (lost_name_entry_focus));
852 ArdourStartup::new_name_mapped ()
854 cerr << "Grab new name focus\n";
855 new_name_entry.grab_focus ();
859 ArdourStartup::new_name_changed ()
861 if (!new_name_entry.get_text().empty()) {
862 set_page_complete (session_vbox, true);
864 set_page_complete (session_vbox, false);
869 ArdourStartup::redisplay_recent_sessions ()
871 std::vector<sys::path> session_directories;
872 RecentSessionsSorter cmp;
874 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
875 recent_session_model->clear ();
877 ARDOUR::RecentSessions rs;
878 ARDOUR::read_recent_sessions (rs);
881 recent_session_display.set_model (recent_session_model);
885 // sort them alphabetically
886 sort (rs.begin(), rs.end(), cmp);
888 for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
889 session_directories.push_back ((*i).second);
892 for (vector<sys::path>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
894 std::vector<sys::path> state_file_paths;
896 // now get available states for this session
898 get_state_files_in_directory (*i, state_file_paths);
900 vector<string*>* states;
901 vector<const gchar*> item;
902 string fullpath = (*i).to_string();
904 /* remove any trailing / */
906 if (fullpath[fullpath.length()-1] == '/') {
907 fullpath = fullpath.substr (0, fullpath.length()-1);
910 /* check whether session still exists */
911 if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) {
912 /* session doesn't exist */
916 /* now get available states for this session */
918 if ((states = Session::possible_states (fullpath)) == 0) {
923 std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
925 Gtk::TreeModel::Row row = *(recent_session_model->append());
927 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
928 row[recent_session_columns.fullpath] = fullpath;
930 if (state_file_names.size() > 1) {
934 for (std::vector<std::string>::iterator i2 = state_file_names.begin();
935 i2 != state_file_names.end(); ++i2)
938 Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
940 child_row[recent_session_columns.visible_name] = *i2;
941 child_row[recent_session_columns.fullpath] = fullpath;
946 recent_session_display.set_model (recent_session_model);
951 ArdourStartup::recent_session_row_selected ()
953 if (recent_session_display.get_selection()->count_selected_rows() > 0) {
954 set_page_complete (session_vbox, true);
956 set_page_complete (session_vbox, false);
961 ArdourStartup::setup_existing_session_page ()
963 recent_session_model = TreeStore::create (recent_session_columns);
964 redisplay_recent_sessions ();
966 if (!session_hbox.get_children().empty()) {
967 session_hbox.remove (**session_hbox.get_children().begin());
970 if (session_existing_vbox.get_children().empty()) {
972 recent_session_display.set_model (recent_session_model);
973 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
974 recent_session_display.set_headers_visible (false);
975 recent_session_display.get_selection()->set_mode (SELECTION_BROWSE);
977 recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected));
979 recent_scroller.add (recent_session_display);
980 recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
981 recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
983 recent_session_display.show();
985 recent_scroller.show();
986 int cnt = redisplay_recent_sessions ();
987 recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
990 recent_scroller.set_size_request (-1, 300);
993 session_existing_vbox.set_spacing (8);
994 session_existing_vbox.pack_start (recent_scroller, true, true);
996 existing_session_chooser.set_title (_("Select session file"));
997 existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
1000 existing_session_chooser.add_shortcut_folder ("/Volumes");
1003 HBox* hbox = manage (new HBox);
1004 hbox->set_spacing (4);
1005 hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK);
1006 hbox->pack_start (existing_session_chooser);
1007 session_existing_vbox.pack_start (*hbox, false, false);
1011 session_existing_vbox.show_all ();
1012 session_hbox.pack_start (session_existing_vbox, true, true);
1014 set_page_title (session_vbox, _("Select a session"));
1015 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
1019 ArdourStartup::more_new_session_options_button_clicked ()
1021 if (more_new_session_options_button.get_active()) {
1022 more_options_vbox.show_all ();
1023 set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM);
1024 set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
1026 set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
1027 more_options_vbox.hide ();
1032 ArdourStartup::setup_more_options_page ()
1034 more_options_vbox.set_border_width (24);
1036 _output_limit_count.set_adjustment (_output_limit_count_adj);
1037 _input_limit_count.set_adjustment (_input_limit_count_adj);
1038 _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj);
1040 chan_count_label_1.set_text (_("channels"));
1041 chan_count_label_3.set_text (_("channels"));
1042 chan_count_label_4.set_text (_("channels"));
1044 chan_count_label_1.set_alignment(0,0.5);
1045 chan_count_label_1.set_padding(0,0);
1046 chan_count_label_1.set_line_wrap(false);
1048 chan_count_label_3.set_alignment(0,0.5);
1049 chan_count_label_3.set_padding(0,0);
1050 chan_count_label_3.set_line_wrap(false);
1052 chan_count_label_4.set_alignment(0,0.5);
1053 chan_count_label_4.set_padding(0,0);
1054 chan_count_label_4.set_line_wrap(false);
1056 bus_label.set_markup (_("<b>Busses</b>"));
1057 input_label.set_markup (_("<b>Inputs</b>"));
1058 output_label.set_markup (_("<b>Outputs</b>"));
1060 _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
1061 _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1062 _master_bus_channel_count.set_numeric(true);
1063 _master_bus_channel_count.set_digits(0);
1064 _master_bus_channel_count.set_wrap(false);
1066 _create_master_bus.set_label (_("Create master bus"));
1067 _create_master_bus.set_flags(Gtk::CAN_FOCUS);
1068 _create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
1069 _create_master_bus.set_mode(true);
1070 _create_master_bus.set_active(true);
1071 _create_master_bus.set_border_width(0);
1073 advanced_table.set_row_spacings(0);
1074 advanced_table.set_col_spacings(0);
1076 _connect_inputs.set_label (_("Automatically connect to physical_inputs"));
1077 _connect_inputs.set_flags(Gtk::CAN_FOCUS);
1078 _connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
1079 _connect_inputs.set_mode(true);
1080 _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect);
1081 _connect_inputs.set_border_width(0);
1083 _limit_input_ports.set_label (_("Use only"));
1084 _limit_input_ports.set_flags(Gtk::CAN_FOCUS);
1085 _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
1086 _limit_input_ports.set_mode(true);
1087 _limit_input_ports.set_sensitive(true);
1088 _limit_input_ports.set_border_width(0);
1090 _input_limit_count.set_flags(Gtk::CAN_FOCUS);
1091 _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1092 _input_limit_count.set_numeric(true);
1093 _input_limit_count.set_digits(0);
1094 _input_limit_count.set_wrap(false);
1095 _input_limit_count.set_sensitive(false);
1097 bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
1099 bus_label.set_alignment(0, 0.5);
1100 bus_label.set_padding(0,0);
1101 bus_label.set_line_wrap(false);
1102 bus_label.set_selectable(false);
1103 bus_label.set_use_markup(true);
1104 bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
1105 bus_frame.set_label_align(0,0.5);
1106 bus_frame.add(bus_hbox);
1107 bus_frame.set_label_widget(bus_label);
1109 bus_table.set_row_spacings (0);
1110 bus_table.set_col_spacings (0);
1111 bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1112 bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
1113 bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
1115 input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
1116 input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
1117 input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
1118 input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
1119 input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
1120 input_table.set_row_spacings(0);
1121 input_table.set_col_spacings(0);
1122 input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
1124 input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
1126 input_label.set_alignment(0, 0.5);
1127 input_label.set_padding(0,0);
1128 input_label.set_line_wrap(false);
1129 input_label.set_selectable(false);
1130 input_label.set_use_markup(true);
1131 input_frame.set_shadow_type(Gtk::SHADOW_NONE);
1132 input_frame.set_label_align(0,0.5);
1133 input_frame.add(input_hbox);
1134 input_frame.set_label_widget(input_label);
1136 _connect_outputs.set_label (_("Automatically connect outputs"));
1137 _connect_outputs.set_flags(Gtk::CAN_FOCUS);
1138 _connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
1139 _connect_outputs.set_mode(true);
1140 _connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect);
1141 _connect_outputs.set_border_width(0);
1142 _limit_output_ports.set_label (_("Use only"));
1143 _limit_output_ports.set_flags(Gtk::CAN_FOCUS);
1144 _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
1145 _limit_output_ports.set_mode(true);
1146 _limit_output_ports.set_sensitive(true);
1147 _limit_output_ports.set_border_width(0);
1148 _output_limit_count.set_flags(Gtk::CAN_FOCUS);
1149 _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
1150 _output_limit_count.set_numeric(false);
1151 _output_limit_count.set_digits(0);
1152 _output_limit_count.set_wrap(false);
1153 _output_limit_count.set_sensitive(false);
1154 output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
1155 output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
1156 output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
1158 _connect_outputs_to_master.set_label (_("... to master bus"));
1159 _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
1160 _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
1161 _connect_outputs_to_master.set_mode(true);
1162 _connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster);
1163 _connect_outputs_to_master.set_border_width(0);
1165 _connect_outputs_to_master.set_group (connect_outputs_group);
1166 _connect_outputs_to_physical.set_group (connect_outputs_group);
1168 _connect_outputs_to_physical.set_label (_("... to physical outputs"));
1169 _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
1170 _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
1171 _connect_outputs_to_physical.set_mode(true);
1172 _connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical);
1173 _connect_outputs_to_physical.set_border_width(0);
1175 output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
1176 output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
1177 output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
1178 output_vbox.set_border_width(6);
1180 output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
1182 output_vbox.pack_start(output_conn_vbox);
1183 output_vbox.pack_start(output_port_vbox);
1185 output_label.set_alignment(0, 0.5);
1186 output_label.set_padding(0,0);
1187 output_label.set_line_wrap(false);
1188 output_label.set_selectable(false);
1189 output_label.set_use_markup(true);
1190 output_frame.set_shadow_type(Gtk::SHADOW_NONE);
1191 output_frame.set_label_align(0,0.5);
1193 output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
1195 output_frame.add(output_hbox);
1196 output_frame.set_label_widget(output_label);
1198 more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
1199 more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
1200 more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
1201 more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
1205 _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_inputs_clicked));
1206 _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_outputs_clicked));
1207 _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_inputs_clicked));
1208 _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_outputs_clicked));
1209 _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::master_bus_button_clicked));
1211 /* note that more_options_vbox is NOT visible by
1212 * default. this is entirely by design - this page
1213 * should be skipped unless explicitly requested.
1216 session_options_page_index = append_page (more_options_vbox);
1217 set_page_title (more_options_vbox, _("Advanced Session Options"));
1218 set_page_complete (more_options_vbox, true);
1222 ArdourStartup::create_master_bus() const
1224 return _create_master_bus.get_active();
1228 ArdourStartup::master_channel_count() const
1230 return _master_bus_channel_count.get_value_as_int();
1234 ArdourStartup::connect_inputs() const
1236 return _connect_inputs.get_active();
1240 ArdourStartup::limit_inputs_used_for_connection() const
1242 return _limit_input_ports.get_active();
1246 ArdourStartup::input_limit_count() const
1248 return _input_limit_count.get_value_as_int();
1252 ArdourStartup::connect_outputs() const
1254 return _connect_outputs.get_active();
1258 ArdourStartup::limit_outputs_used_for_connection() const
1260 return _limit_output_ports.get_active();
1264 ArdourStartup::output_limit_count() const
1266 return _output_limit_count.get_value_as_int();
1270 ArdourStartup::connect_outs_to_master() const
1272 return _connect_outputs_to_master.get_active();
1276 ArdourStartup::connect_outs_to_physical() const
1278 return _connect_outputs_to_physical.get_active();
1282 ArdourStartup::connect_inputs_clicked ()
1284 _limit_input_ports.set_sensitive(_connect_inputs.get_active());
1286 if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
1287 _input_limit_count.set_sensitive(true);
1289 _input_limit_count.set_sensitive(false);
1294 ArdourStartup::connect_outputs_clicked ()
1296 _limit_output_ports.set_sensitive(_connect_outputs.get_active());
1298 if (_connect_outputs.get_active() && _limit_output_ports.get_active()) {
1299 _output_limit_count.set_sensitive(true);
1301 _output_limit_count.set_sensitive(false);
1306 ArdourStartup::limit_inputs_clicked ()
1308 _input_limit_count.set_sensitive(_limit_input_ports.get_active());
1312 ArdourStartup::limit_outputs_clicked ()
1314 _output_limit_count.set_sensitive(_limit_output_ports.get_active());
1318 ArdourStartup::master_bus_button_clicked ()
1320 bool yn = _create_master_bus.get_active();
1322 _master_bus_channel_count.set_sensitive(yn);
1326 ArdourStartup::move_along_now ()
1328 gint cur = get_current_page ();
1330 if (cur == session_page_index) {
1331 if (more_new_session_options_button.get_active()) {
1332 set_current_page (session_options_page_index);
1340 ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
1342 set_page_complete (session_vbox, true);
1347 ArdourStartup::existing_session_selected ()
1349 _existing_session_chooser_used = true;
1351 set_page_complete (session_vbox, true);