remove beta page from startup wizard; use dbl-click to activate "what would you like...
[ardour.git] / gtk2_ardour / startup.cc
index 18770df69e0b1fa2e5b87ba6c9cbd48f42ca229a..f341fceb912bef10d3edb6e39a920c80445dacba 100644 (file)
@@ -39,6 +39,7 @@
 #include "ardour/session_state_utils.h"
 #include "ardour/template_utils.h"
 
+#include "ardour_ui.h"
 #include "startup.h"
 #include "opts.h"
 #include "engine_dialog.h"
@@ -81,7 +82,7 @@ Ardour will play NO role in monitoring"))
        new_user_page_index = -1;
        default_folder_page_index = -1;
        monitoring_page_index = -1;
-       new_session_page_index = -1;
+       session_page_index = -1;
        final_page_index = -1;
        session_options_page_index = -1;
        new_only = false;
@@ -125,7 +126,7 @@ Ardour will play NO role in monitoring"))
 
        bool need_audio_setup = !EngineControl::engine_running();
 
-        setup_prerelease_page ();
+        // setup_prerelease_page ();
 
        if (new_user) {
 
@@ -148,6 +149,8 @@ Ardour will play NO role in monitoring"))
                        setup_audio_page ();
                }
 
+               ic_new_session_button.set_active (true); // always create new session on first run
+
        } else {
 
                if (need_audio_setup) {
@@ -157,7 +160,7 @@ Ardour will play NO role in monitoring"))
                setup_initial_choice_page ();
        }
 
-       setup_new_session_page ();
+       setup_session_page ();
        setup_more_options_page ();
 
        if (new_user) {
@@ -366,6 +369,8 @@ void
 ArdourStartup::default_dir_changed ()
 {
        Config->set_default_session_parent_dir (default_dir_chooser->get_filename());
+       // make new session folder chooser point to the new default
+       new_folder_chooser.set_current_folder (Config->get_default_session_parent_dir());       
        config_changed ();
 }
 
@@ -506,7 +511,7 @@ greater control in monitoring without affecting the mix."));
        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>You can change this preference at any time, via the Preferences dialog). You can also add or remove the monitor section to/from any session.</i>\n\n\
+       monitor_section_label.set_markup(_("<i>You can change this preference at any time via the Preferences dialog.\nYou can also add or remove the monitor section to/from any session.</i>\n\n\
 <i>If you do not understand what this is about, just accept the default.</i>"));
        monitor_section_label.set_alignment (0.0, 0.0);
 
@@ -530,10 +535,6 @@ greater control in monitoring without affecting the mix."));
 void
 ArdourStartup::setup_initial_choice_page ()
 {
-       initial_choice_index = append_page (ic_vbox);
-       set_page_title (ic_vbox, _("What would you like to do ?"));
-       set_page_header_image (ic_vbox, icon_pixbuf);
-
        ic_vbox.set_spacing (6);
        ic_vbox.set_border_width (24);
 
@@ -548,57 +549,10 @@ ArdourStartup::setup_initial_choice_page ()
        centering_vbox->pack_start (ic_new_session_button, false, true);
        centering_vbox->pack_start (ic_existing_session_button, false, true);
 
-       recent_session_model = TreeStore::create (recent_session_columns);
-       redisplay_recent_sessions ();
-               
-       if (!new_session_hbox.get_children().empty()) {
-               new_session_hbox.remove (**new_session_hbox.get_children().begin());
-       }
-               
-       if (session_existing_vbox.get_children().empty()) {
-                       
-               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);
-               }
-
-               centering_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);
-               centering_vbox->pack_start (*hbox, false, false);
-               hbox->show_all ();
-       }
-
-       ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
+       ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false);
        ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
 
-       ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false);
+       ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false);
        ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
 
        centering_hbox->pack_start (*centering_vbox, true, true);
@@ -607,6 +561,10 @@ ArdourStartup::setup_initial_choice_page ()
 
        ic_vbox.show_all ();
 
+       initial_choice_index = append_page (ic_vbox);
+       set_page_title (ic_vbox, _("What would you like to do ?"));
+       set_page_header_image (ic_vbox, icon_pixbuf);
+
        /* user could just click on "Forward" if default
         * choice is correct.
         */
@@ -615,20 +573,34 @@ ArdourStartup::setup_initial_choice_page ()
 }
 
 bool
-ArdourStartup::initial_button_press (GdkEventButton *event)
+ArdourStartup::initial_button_clicked (GdkEventButton* ev)
 {
-       if (event && event->type == GDK_2BUTTON_PRESS && new_session_page_index != -1) {
-               set_current_page (new_session_page_index);
-               return true;
-       } else {
-               return false;
+       if (ev->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
+               set_current_page(session_page_index);
        }
+
+       return false;
 }
 
 void
 ArdourStartup::initial_button_activated ()
 {
-       set_current_page (new_session_page_index);
+       if (session_page_index != -1) {
+               set_current_page(session_page_index);
+       }
+}
+
+void
+ArdourStartup::setup_session_page ()
+{
+       session_vbox.set_border_width (24);
+
+       session_vbox.pack_start (session_hbox, true, true);
+       session_vbox.show_all ();
+
+       session_page_index = append_page (session_vbox);
+       /* initial setting */
+       set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
 }
 
 void
@@ -691,13 +663,22 @@ ArdourStartup::on_apply ()
 void
 ArdourStartup::on_prepare (Gtk::Widget* page)
 {
-       if (page == &new_session_vbox) {
+       if (page == &session_vbox) {
+
+               if (ic_new_session_button.get_active()) {
+                       /* new session requested */
+                       setup_new_session_page ();
+               } else {
+                       /* existing session requested */
+                       setup_existing_session_page ();
+
+               }
 
                /* HACK HACK HACK ... change the "Apply" button label
                   to say "Open"
                */
 
-               Gtk::Widget* tl = new_session_vbox.get_toplevel();
+               Gtk::Widget* tl = session_vbox.get_toplevel();
                Gtk::Window* win;
                if ((win = dynamic_cast<Gtk::Window*>(tl)) != 0) {
                        /* ::get_default_widget() is not wrapped in gtkmm */
@@ -736,15 +717,15 @@ ArdourStartup::populate_session_templates ()
 static bool
 lost_name_entry_focus (GdkEventFocus*)
 {
-       cerr << "lost focus\n";
+       // cerr << "lost focus\n";
        return false;
 }
 
 void
 ArdourStartup::setup_new_session_page ()
 {
-       if (!new_session_hbox.get_children().empty()) {
-               new_session_hbox.remove (**new_session_hbox.get_children().begin());
+       if (!session_hbox.get_children().empty()) {
+               session_hbox.remove (**session_hbox.get_children().begin());
        }
 
        session_new_vbox.set_spacing (18);
@@ -762,10 +743,11 @@ ArdourStartup::setup_new_session_page ()
 
                label1->set_text (_("Session name:"));
 
+
                if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
                        new_name_entry.set_text  (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
                        /* name provided - they can move right along */
-                       set_page_complete (new_session_vbox, true);
+                       set_page_complete (session_vbox, true);
                }
 
                new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed));
@@ -786,6 +768,13 @@ ArdourStartup::setup_new_session_page ()
 
                if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
                        new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
+               } else if (ARDOUR_UI::instance()->session_loaded) {
+                       // point the new session file chooser at the parent directory of the current session
+                       string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path());
+                       string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
+                       session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
+                       new_folder_chooser.set_current_folder (session_parent_dir);
+                       new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
                } else {
                        new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
                }
@@ -889,18 +878,12 @@ ArdourStartup::setup_new_session_page ()
        }
 
        session_new_vbox.show_all ();
-       new_session_hbox.pack_start (session_new_vbox, true, true);
-
-       new_session_vbox.set_border_width (24);
-       new_session_vbox.pack_start (new_session_hbox, true, true);
-       new_session_vbox.show_all ();
-       new_session_page_index = append_page (new_session_vbox);
-       /* initial setting */
-       set_page_type (new_session_vbox, ASSISTANT_PAGE_CONFIRM);
-       set_page_title (new_session_vbox, _("New Session"));
+       session_hbox.pack_start (session_new_vbox, true, true);
+       set_page_title (session_vbox, _("New Session"));
+       set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
 
        if (more_new_session_options_button.get_active()) {
-               set_page_type (new_session_vbox, ASSISTANT_PAGE_CONTENT);
+               set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
        }
 
        new_name_entry.signal_map().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_mapped));
@@ -910,7 +893,7 @@ ArdourStartup::setup_new_session_page ()
 void
 ArdourStartup::new_name_mapped ()
 {
-       cerr << "Grab new name focus\n";
+       // cerr << "Grab new name focus\n";
        new_name_entry.grab_focus ();
 }
 
@@ -918,9 +901,9 @@ void
 ArdourStartup::new_name_changed ()
 {
        if (!new_name_entry.get_text().empty()) {
-               set_page_complete (new_session_vbox, true);
+               set_page_complete (session_vbox, true);
        } else {
-               set_page_complete (new_session_vbox, false);
+               set_page_complete (session_vbox, false);
        }
 }
 
@@ -1002,6 +985,7 @@ ArdourStartup::redisplay_recent_sessions ()
                }
        }
 
+       recent_session_display.set_tooltip_column(1); // recent_session_columns.fullpath 
        recent_session_display.set_model (recent_session_model);
        return rs.size();
 }
@@ -1010,10 +994,70 @@ void
 ArdourStartup::recent_session_row_selected ()
 {
        if (recent_session_display.get_selection()->count_selected_rows() > 0) {
-               set_page_complete (ic_vbox, true);
+               set_page_complete (session_vbox, true);
        } else {
-               set_page_complete (ic_vbox, false);
+               set_page_complete (session_vbox, false);
+       }
+}
+
+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 (session_existing_vbox.get_children().empty()) {
+
+               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);
+               }
+
+               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));
+               cerr << "Set existing chooser to " << Config->get_default_session_parent_dir() << endl;
+               existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir()));
+
+#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, false, false);
+               hbox->show_all ();
        }
+
+       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);
 }
 
 void
@@ -1022,9 +1066,9 @@ ArdourStartup::more_new_session_options_button_clicked ()
        if (more_new_session_options_button.get_active()) {
                more_options_vbox.show_all ();
                set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM);
-               set_page_type (new_session_vbox, ASSISTANT_PAGE_CONTENT);
+               set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
        } else {
-               set_page_type (new_session_vbox, ASSISTANT_PAGE_CONFIRM);
+               set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
                more_options_vbox.hide ();
        }
 }
@@ -1328,7 +1372,7 @@ ArdourStartup::move_along_now ()
 {
        gint cur = get_current_page ();
 
-       if (cur == new_session_page_index) {
+       if (cur == session_page_index) {
                if (more_new_session_options_button.get_active()) {
                        set_current_page (session_options_page_index);
                } else {
@@ -1340,22 +1384,17 @@ ArdourStartup::move_along_now ()
 void
 ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
 {
-       ic_existing_session_button.set_active (true);
-       ic_new_session_button.set_active (false);
-       set_page_type (ic_vbox, ASSISTANT_PAGE_CONFIRM);
-       set_page_complete (ic_vbox, true);
-       on_apply ();
+       set_page_complete (session_vbox, true);
+       move_along_now ();
 }
 
 void
 ArdourStartup::existing_session_selected ()
 {
-       ic_new_session_button.set_active (false);
-       ic_existing_session_button.set_active (true);
        _existing_session_chooser_used = true;
-       set_page_type (ic_vbox, ASSISTANT_PAGE_CONFIRM);
-       set_page_complete (ic_vbox, true);
-       on_apply ();
+
+       set_page_complete (session_vbox, true);
+       move_along_now ();
 }
 
 sys::path