update drobilla's fascistic dir-locals.el to force emacs users into whitespace submis...
[ardour.git] / gtk2_ardour / startup.cc
index f8e871f70bbae44ee22413f6905352e259f32b77..35021eea03af0806040ac3d633f99e252c645bc0 100644 (file)
 
 */
 
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
 #include <fstream>
 #include <algorithm>
 
@@ -27,6 +31,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"
@@ -38,6 +43,7 @@
 #include "opts.h"
 #include "engine_dialog.h"
 #include "i18n.h"
+#include "utils.h"
 
 using namespace std;
 using namespace Gtk;
@@ -63,7 +69,6 @@ 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))
-       , _have_setup_existing_session_page (false)
        , 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)
@@ -93,17 +98,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();
        }
 
@@ -113,6 +108,8 @@ Ardour will play NO role in monitoring"))
 
        bool need_audio_setup = !EngineControl::engine_running();
 
+        setup_alpha_page ();
+
        if (new_user) {
                /* "touch" the file */
                ofstream fout (been_here_before.to_string().c_str());
@@ -148,6 +145,41 @@ ArdourStartup::~ArdourStartup ()
 {
 }
 
+void
+ArdourStartup::setup_alpha_page ()
+{
+        VBox* vbox = manage (new VBox);
+        Label* label = manage (new Label);
+        label->set_markup (_("<b>Welcome to this ALPHA release of Ardour 3.0</b>\n\n\
+There are still many issues and bugs to be worked on,\n\
+as well as general workflow improvements, before this can be considered\n\
+release software. So, a few guidelines:\n\
+\n\
+1) Please do <b>NOT</b> use this software with the expectation that it is stable or reliable\n\
+   though it may be so, depending on your workflow.\n\
+2) Please see http://ardour.org/a3_features for a guide to new features.\n\
+3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n\
+4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to report issues\n\
+   making sure to note the product version number as 3.0-alpha.\n\
+5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and pass on comments.\n\
+6) Please <b>DO</b> join us on IRC for real time discussions about ardour3. You\n\
+   can get there directly from Ardour via the Help->Chat menu option.\n\
+\n\
+Full information on all the above can be found on the support page at\n\
+\n\
+                http://ardour.org/support\n\
+"));
+
+        vbox->set_border_width (12);
+        vbox->pack_start (*label, false, false, 12);
+        vbox->show_all ();
+
+        append_page (*vbox);
+        set_page_type (*vbox, ASSISTANT_PAGE_CONTENT);
+        set_page_title (*vbox, _("This is an ALPHA RELEASE"));
+       set_page_complete (*vbox, true);
+}
+
 void
 ArdourStartup::set_new_only (bool yn)
 {
@@ -161,17 +193,18 @@ ArdourStartup::set_new_only (bool yn)
 }
 
 void
-ArdourStartup::set_load_template( string load_template )
+ArdourStartup::set_load_template (string load_template)
 {
-    use_template_button.set_active( false );
-    load_template_override = 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 (!load_template_override.empty()) {
+               return true;
+       }
 
        if (use_template_button.get_active()) {
                return template_chooser.get_active_row_number() > 0;
@@ -180,16 +213,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 (!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()) {
@@ -203,12 +236,14 @@ 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;
@@ -227,11 +262,11 @@ 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 */
@@ -303,7 +338,7 @@ void
 ArdourStartup::default_dir_changed ()
 {
        Config->set_default_session_parent_dir (default_dir_chooser->get_current_folder());
-        config_changed ();
+       config_changed ();
 }
 
 void
@@ -363,13 +398,13 @@ ArdourStartup::setup_monitoring_choice_page ()
        RadioButton::Group g (monitor_via_hardware_button.get_group());
        monitor_via_ardour_button.set_group (g);
 
-       monitor_label.set_markup("\
+       monitor_label.set_markup(_("\
 While recording instruments or vocals, you probably want to listen to the\n\
 signal as well as record it. This is called \"monitoring\". There are\n\
 different ways to do this depending on the equipment you have and the\n\
 configuration of that equipment. The two most common are presented here.\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>");
+<i>(You can change this preference at any time, via the Preferences dialog)</i>"));
        monitor_label.set_alignment (0.0, 0.0);
 
        vbox->set_spacing (6);
@@ -402,47 +437,47 @@ ArdourStartup::setup_monitor_section_choice_page ()
        HBox* hbox = manage (new HBox);
        VBox* main_vbox = manage (new VBox);
        VBox* vbox;
-        Label* l = manage (new Label);
+       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\
+       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 = 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);
+       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\
+       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 = 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);
+       main_vbox->pack_start (*vbox, false, false);
 
        RadioButton::Group g (use_monitor_section_button.get_group());
        no_monitor_section_button.set_group (g);
 
-        if (Config->get_use_monitor_bus()) {
-                use_monitor_section_button.set_active (true);
-        } else {
-                no_monitor_section_button.set_active (true);
-        }
+       if (Config->get_use_monitor_bus()) {
+               use_monitor_section_button.set_active (true);
+       } else {
+               no_monitor_section_button.set_active (true);
+       }
+
+       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));
 
-        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(_("<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);
 
@@ -506,8 +541,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 {
@@ -579,7 +613,7 @@ ArdourStartup::on_apply ()
                        Config->set_monitoring_model (SoftwareMonitoring);
                }
 
-                Config->set_use_monitor_bus (use_monitor_section_button.get_active());
+               Config->set_use_monitor_bus (use_monitor_section_button.get_active());
 
                Config->save_state ();
        }
@@ -623,12 +657,12 @@ ArdourStartup::populate_session_templates ()
 }
 
 static bool
-lost_name_entry_focus (GdkEventFocus* ev)
+lost_name_entry_focus (GdkEventFocus*)
 {
-        cerr << "lost focus\n";
-        return false;
+       cerr << "lost focus\n";
+       return false;
 }
-                
+
 void
 ArdourStartup::setup_new_session_page ()
 {
@@ -682,7 +716,7 @@ ArdourStartup::setup_new_session_page ()
                new_folder_chooser.set_title (_("Select folder for session"));
 
 #ifdef GTKOSX
-                new_folder_chooser->add_shortcut_folder ("/Volumes");
+               new_folder_chooser.add_shortcut_folder ("/Volumes");
 #endif
 
                vbox1->pack_start (*hbox2, false, false);
@@ -751,9 +785,9 @@ ArdourStartup::setup_new_session_page ()
                        use_session_as_template_button.show ();
                        session_template_chooser.show ();
 
-                       Gtk::FileFilter* template_filter = manage (new (Gtk::FileFilter));
-                       template_filter->add_pattern(X_("*.template"));
-                       session_template_chooser.set_filter (*template_filter);
+                       Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter));
+                       session_filter->add_pattern (X_("*.ardour"));
+                       session_template_chooser.set_filter (*session_filter);
                        session_template_chooser.set_title (_("Select template"));
 
                        vbox3->pack_start (*hbox4b, false, false);
@@ -784,13 +818,13 @@ ArdourStartup::setup_new_session_page ()
        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));
+       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";
+       cerr << "Grab new name focus\n";
        new_name_entry.grab_focus ();
 }
 
@@ -825,7 +859,7 @@ ArdourStartup::redisplay_recent_sessions ()
        sort (rs.begin(), rs.end(), cmp);
 
        for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
-               session_directories.push_back ((*i).second);
+               session_directories.push_back ((*i).second);
        }
 
        for (vector<sys::path>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
@@ -902,56 +936,56 @@ ArdourStartup::setup_existing_session_page ()
        recent_session_model = TreeStore::create (recent_session_columns);
        redisplay_recent_sessions ();
 
-       if (_have_setup_existing_session_page) {
-               return;
+       if (!session_hbox.get_children().empty()) {
+               session_hbox.remove (**session_hbox.get_children().begin());
        }
-       
-       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));
+       if (session_existing_vbox.get_children().empty()) {
 
-       if (cnt > 4) {
-               recent_scroller.set_size_request (-1, 300);
-       }
+               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));
+               
+               if (cnt > 4) {
+                       recent_scroller.set_size_request (-1, 300);
+               }
 
-       VBox* vbox = manage (new VBox);
-       vbox->set_spacing (8);
-       vbox->pack_start (recent_scroller, true, true);
+               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));
-       
+               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");
+               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);
-       vbox->pack_start (*hbox);
-       hbox->show_all ();
+               
+               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, false, false);
+               hbox->show_all ();
+       }
        
-       vbox->show_all ();
-       session_hbox.pack_start (*vbox, true, true);
+       session_existing_vbox.show_all ();
+       session_hbox.pack_start (session_existing_vbox, true, true);
 
        set_page_title (session_vbox, _("Select a session"));
        set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
-
-       _have_setup_existing_session_page = true;
 }
 
 void
@@ -1256,7 +1290,7 @@ ArdourStartup::limit_outputs_clicked ()
 void
 ArdourStartup::master_bus_button_clicked ()
 {
-        bool yn = _create_master_bus.get_active();
+       bool yn = _create_master_bus.get_active();
 
        _master_bus_channel_count.set_sensitive(yn);
 }