Fix confusion about the 'done' variable in InterThreadInfo during import. 'done...
[ardour.git] / gtk2_ardour / startup.cc
index fb3e950ba2d84c744a008d35348c7fc04a420b05..186608e5961292be82a05641d5b176bdeac69ebf 100644 (file)
@@ -1,3 +1,22 @@
+/*
+    Copyright (C) 2010 Paul Davis
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
 #include <fstream>
 #include <algorithm>
 
@@ -8,6 +27,7 @@
 #include "pbd/file_utils.h"
 #include "pbd/filesystem.h"
 #include "pbd/replace_all.h"
+#include "pbd/whitespace.h"
 
 #include "ardour/filesystem_paths.h"
 #include "ardour/recent_sessions.h"
@@ -19,6 +39,7 @@
 #include "opts.h"
 #include "engine_dialog.h"
 #include "i18n.h"
+#include "utils.h"
 
 using namespace std;
 using namespace Gtk;
@@ -44,14 +65,12 @@ ArdourStartup::ArdourStartup ()
        , monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\
 Ardour will play NO role in monitoring"))
        , monitor_via_ardour_button (string_compose (_("Ask %1 to playback material as it is being recorded"), PROGRAM_NAME))
-        , use_monitor_section_button (_("Use a monitor bus in new sessions (more complex, more control)"))
-        , no_monitor_section_button (_("Just use the master out bus (simpler, less control)"))
        , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
        , more_new_session_options_button (_("I'd like more options for this session"))
        , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
        , _input_limit_count_adj (1, 0, 100, 1, 10, 0)
        , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
-
+       , _existing_session_chooser_used (false)
 {
        audio_page_index = -1;
        initial_choice_index = -1;
@@ -75,17 +94,7 @@ Ardour will play NO role in monitoring"))
        set_position (WIN_POS_CENTER);
        set_border_width (12);
 
-       sys::path icon_file;
-
-       if (!find_file_in_search_path (ardour_search_path() + system_data_search_path().add_subdirectory_to_paths("icons"), "ardour_icon_48px.png", icon_file)) {
-               throw failed_constructor();
-       }
-
-       try {
-               icon_pixbuf = Gdk::Pixbuf::create_from_file (icon_file.to_string());
-       }
-
-       catch (...) {
+       if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
                throw failed_constructor();
        }
 
@@ -142,9 +151,19 @@ ArdourStartup::set_new_only (bool yn)
        }
 }
 
+void
+ArdourStartup::set_load_template( string load_template )
+{
+    use_template_button.set_active( false );
+    load_template_override = load_template;
+}
+
 bool
 ArdourStartup::use_session_template ()
 {
+        if (!load_template_override.empty())
+                return true;
+
        if (use_template_button.get_active()) {
                return template_chooser.get_active_row_number() > 0;
        } else {
@@ -152,11 +171,16 @@ ArdourStartup::use_session_template ()
        }
 }
 
-Glib::ustring
+std::string
 ArdourStartup::session_template_name ()
 {
+        if (!load_template_override.empty()) {
+            string the_path = (ARDOUR::user_template_directory()/ (load_template_override + ".template")).to_string();
+                return the_path;
+        }
+
        if (ic_existing_session_button.get_active()) {
-               return ustring();
+               return string();
        }
 
        if (use_template_button.get_active()) {
@@ -170,13 +194,20 @@ ArdourStartup::session_template_name ()
        }
 }
 
-Glib::ustring
+std::string
 ArdourStartup::session_name (bool& should_be_new)
 {
        if (ic_new_session_button.get_active()) {
                should_be_new = true;
-               return new_name_entry.get_text ();
+               string val = new_name_entry.get_text ();
+                strip_whitespace_edges (val);
+                return val;
+       } else if (_existing_session_chooser_used) {
+               /* existing session chosen from file chooser */
+               should_be_new = false;
+               return existing_session_chooser.get_filename ();
        } else {
+               /* existing session chosen from recent list */
                should_be_new = false;
 
                TreeIter iter = recent_session_display.get_selection()->get_selected();
@@ -189,13 +220,17 @@ ArdourStartup::session_name (bool& should_be_new)
        }
 }
 
-Glib::ustring
+std::string
 ArdourStartup::session_folder ()
 {
        if (ic_new_session_button.get_active()) {
-               Glib::ustring legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
+               std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
                return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
+       } else if (_existing_session_chooser_used) {
+               /* existing session chosen from file chooser */
+               return existing_session_chooser.get_current_folder ();
        } else {
+               /* existing session chosen from recent list */
                TreeIter iter = recent_session_display.get_selection()->get_selected();
 
                if (iter) {
@@ -216,7 +251,7 @@ ArdourStartup::setup_audio_page ()
 
        audio_page_index = append_page (*engine_dialog);
        set_page_type (*engine_dialog, ASSISTANT_PAGE_CONTENT);
-       set_page_title (*engine_dialog, _("Audio Setup"));
+       set_page_title (*engine_dialog, _("Audio / MIDI Setup"));
 
        /* the default parameters should work, so the page is potentially complete */
 
@@ -252,7 +287,7 @@ using the program.</span>\
 
        new_user_page_index = append_page (*vbox);
        set_page_type (*vbox, ASSISTANT_PAGE_INTRO);
-       set_page_title (*vbox, _("Welcome to Ardour"));
+       set_page_title (*vbox, string_compose (_("Welcome to %1"), PROGRAM_NAME));
        set_page_header_image (*vbox, icon_pixbuf);
        set_page_complete (*vbox, true);
 }
@@ -279,12 +314,12 @@ ArdourStartup::setup_first_time_config_page ()
        HBox* hbox = manage (new HBox);
        VBox* vbox = manage (new VBox);
 
-       txt->set_markup (_("\
-Each project that you work on with Ardour has its own folder.\n\
+       txt->set_markup (string_compose (_("\
+Each project that you work on with %1 has its own folder.\n\
 These can require a lot of disk space if you are recording audio.\n\
 \n\
-Where would you like new Ardour sessions to be stored by default?\n\n\
-<i>(You can put new sessions anywhere, this is just a default)</i>"));
+Where would you like new %1 sessions to be stored by default?\n\n\
+<i>(You can put new sessions anywhere, this is just a default)</i>"), PROGRAM_NAME));
        txt->set_alignment (0.0, 0.0);
 
        vbox->set_spacing (18);
@@ -358,7 +393,37 @@ ArdourStartup::setup_monitor_section_choice_page ()
        mon_sec_vbox.set_border_width (24);
 
        HBox* hbox = manage (new HBox);
-       VBox* vbox = manage (new VBox);
+       VBox* main_vbox = manage (new VBox);
+       VBox* vbox;
+        Label* l = manage (new Label);
+
+       main_vbox->set_spacing (32);
+
+        no_monitor_section_button.set_label (_("Use a Master bus directly"));
+        l->set_alignment (0.0, 1.0);
+        l->set_markup(_("Connect the Master bus directly to your hardware outputs.\n\
+<i>Preferable for simple use</i>."));
+
+        vbox = manage (new VBox);
+       vbox->set_spacing (6);
+       vbox->pack_start (no_monitor_section_button, false, true);
+       vbox->pack_start (*l, false, true);
+
+        main_vbox->pack_start (*vbox, false, false);
+
+        use_monitor_section_button.set_label (_("Use an additional Monitor bus"));
+        l = manage (new Label);
+        l->set_alignment (0.0, 1.0);
+        l->set_text (_("Use a Monitor bus between Master bus and hardware outputs for \n\
+greater control in monitoring without affecting the mix."));
+
+        vbox = manage (new VBox);
+       vbox->set_spacing (6);
+       vbox->pack_start (use_monitor_section_button, false, true);
+       vbox->pack_start (*l, false, true);
+
+        main_vbox->pack_start (*vbox, false, false);
+
        RadioButton::Group g (use_monitor_section_button.get_group());
        no_monitor_section_button.set_group (g);
 
@@ -371,23 +436,12 @@ ArdourStartup::setup_monitor_section_choice_page ()
         use_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
         no_monitor_section_button.signal_toggled().connect (sigc::mem_fun (*this, &ArdourStartup::config_changed));
         
-       monitor_section_label.set_markup("\
-When connecting speakers to Ardour, would you prefer to use a monitor bus,\n\
-which will offer various kinds of control at the last stage of output\n\
-or would you prefer to just connect directly to the master outs?\n\n\
-Most home studio users will probably want to start <i>without</i> a monitor bus.\n\
-Those with experience of traditional mixing consoles may prefer to use one.\n\
-Please choose whichever one is right for your setup.\n\n\
-<i>(You can change this preference at any time, via the Preferences dialog)</i>");
+       monitor_section_label.set_markup(_("<i><small>(You can change this preference at any time, via the Preferences dialog)</small></i>"));
        monitor_section_label.set_alignment (0.0, 0.0);
 
-       vbox->set_spacing (6);
-
-       vbox->pack_start (no_monitor_section_button, false, true);
-       vbox->pack_start (use_monitor_section_button, false, true);
-       hbox->pack_start (*vbox, true, true, 8);
-       mon_sec_vbox.pack_start (monitor_section_label, false, false);
+       hbox->pack_start (*main_vbox, true, true, 8);
        mon_sec_vbox.pack_start (*hbox, false, false);
+       mon_sec_vbox.pack_start (monitor_section_label, false, false);
 
        mon_sec_vbox.show_all ();
 
@@ -445,8 +499,7 @@ ArdourStartup::setup_initial_choice_page ()
 bool
 ArdourStartup::initial_button_press (GdkEventButton *event)
 {
-       if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1)
-       {
+       if (event && event->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
                set_current_page(session_page_index);
                return true;
        } else {
@@ -561,6 +614,13 @@ ArdourStartup::populate_session_templates ()
        }
 }
 
+static bool
+lost_name_entry_focus (GdkEventFocus*)
+{
+        cerr << "lost focus\n";
+        return false;
+}
+                
 void
 ArdourStartup::setup_new_session_page ()
 {
@@ -613,6 +673,10 @@ ArdourStartup::setup_new_session_page ()
                }
                new_folder_chooser.set_title (_("Select folder for session"));
 
+#ifdef GTKOSX
+                new_folder_chooser->add_shortcut_folder ("/Volumes");
+#endif
+
                vbox1->pack_start (*hbox2, false, false);
 
                session_new_vbox.pack_start (*vbox1, false, false);
@@ -711,6 +775,14 @@ ArdourStartup::setup_new_session_page ()
        set_page_title (session_vbox, _("New Session"));
        set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
 
+       new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped));
+        new_name_entry.signal_focus_out_event().connect (sigc::ptr_fun (lost_name_entry_focus));
+}
+
+void
+ArdourStartup::new_name_mapped ()
+{
+        cerr << "Grab new name focus\n";
        new_name_entry.grab_focus ();
 }
 
@@ -819,36 +891,57 @@ ArdourStartup::recent_session_row_selected ()
 void
 ArdourStartup::setup_existing_session_page ()
 {
+       recent_session_model = TreeStore::create (recent_session_columns);
+       redisplay_recent_sessions ();
+
        if (!session_hbox.get_children().empty()) {
                session_hbox.remove (**session_hbox.get_children().begin());
        }
 
-       if (recent_scroller.get_children().empty()) {
+       if (session_existing_vbox.get_children().empty()) {
 
-               recent_session_model = TreeStore::create (recent_session_columns);
                recent_session_display.set_model (recent_session_model);
                recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
                recent_session_display.set_headers_visible (false);
                recent_session_display.get_selection()->set_mode (SELECTION_BROWSE);
-
+               
                recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected));
-
+               
                recent_scroller.add (recent_session_display);
                recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
                recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
-
+               
                recent_session_display.show();
-       }
-
-       recent_scroller.show();
-       int cnt = redisplay_recent_sessions ();
-       recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
+               
+               recent_scroller.show();
+               int cnt = redisplay_recent_sessions ();
+               recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
+               
+               if (cnt > 4) {
+                       recent_scroller.set_size_request (-1, 300);
+               }
 
-       if (cnt > 4) {
-               recent_scroller.set_size_request (-1, 300);
+               session_existing_vbox.set_spacing (8);
+               session_existing_vbox.pack_start (recent_scroller, true, true);
+
+               existing_session_chooser.set_title (_("Select session file"));
+               existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
+               
+#ifdef GTKOSX
+               existing_session_chooser->add_shortcut_folder ("/Volumes");
+#endif
+               
+               HBox* hbox = manage (new HBox);
+               hbox->set_spacing (4);
+               hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK);
+               hbox->pack_start (existing_session_chooser);
+               session_existing_vbox.pack_start (*hbox);
+               hbox->show_all ();
        }
+       
+       session_existing_vbox.show_all ();
+       session_hbox.pack_start (session_existing_vbox, true, true);
 
-       session_hbox.pack_start (recent_scroller, true, true);
        set_page_title (session_vbox, _("Select a session"));
        set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
 }
@@ -1180,3 +1273,12 @@ ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
        set_page_complete (session_vbox, true);
        move_along_now ();
 }
+
+void
+ArdourStartup::existing_session_selected ()
+{
+       _existing_session_chooser_used = true;
+
+       set_page_complete (session_vbox, true);
+       move_along_now ();
+}