X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fstartup.cc;h=8e94ae916789ec0126f39743b40036ee69e60482;hb=af0083b11d0285f8fd529262b66b287ae33d130a;hp=88a576a2310d4990bf8d65f3943da428a00b779d;hpb=c25b921888553517f806da23ed5d9e4b3e9f3bde;p=ardour.git diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 88a576a231..8e94ae9167 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -38,7 +38,9 @@ #include "ardour/session.h" #include "ardour/session_state_utils.h" #include "ardour/template_utils.h" +#include "ardour/filename_extensions.h" +#include "ardour_ui.h" #include "startup.h" #include "opts.h" #include "engine_dialog.h" @@ -65,6 +67,7 @@ static string poor_mans_glob (string path) ArdourStartup::ArdourStartup () : _response (RESPONSE_OK) , ic_new_session_button (_("Create a new session")) + , ic_existing_session_button (_("Open an existing session")) , 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 play back material as it is being recorded"), PROGRAM_NAME)) @@ -80,7 +83,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; @@ -120,11 +123,11 @@ Ardour will play NO role in monitoring")) set_default_icon_list (window_icons); } - new_user = !exists (been_here_before_path ()); + new_user = !Glib::file_test(been_here_before_path().to_string(), Glib::FILE_TEST_EXISTS); bool need_audio_setup = !EngineControl::engine_running(); - setup_prerelease_page (); + // setup_prerelease_page (); if (new_user) { @@ -147,6 +150,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) { @@ -156,7 +161,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) { @@ -242,8 +247,12 @@ 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; + string the_path(ARDOUR::user_template_directory()); + return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); + } + + if (ic_existing_session_button.get_active()) { + return string(); } if (use_template_button.get_active()) { @@ -361,6 +370,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 (); } @@ -501,7 +512,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(_("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.\n\n\ + monitor_section_label.set_markup(_("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.\n\n\ If you do not understand what this is about, just accept the default.")); monitor_section_label.set_alignment (0.0, 0.0); @@ -525,83 +536,36 @@ 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); + RadioButton::Group g (ic_new_session_button.get_group()); + ic_existing_session_button.set_group (g); + HBox* centering_hbox = manage (new HBox); VBox* centering_vbox = manage (new VBox); centering_vbox->set_spacing (6); - ic_new_session_button.set_active (true); centering_vbox->pack_start (ic_new_session_button, false, true); + centering_vbox->pack_start (ic_existing_session_button, false, true); - Gtk::Label* l = manage (new Label); - l->set_markup (_("Open a recent session")); - l->set_alignment (0.0, 0.5); - centering_vbox->pack_start (*l, true, 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); - - l = manage (new Label); - l->set_markup (_("Browse for existing sessions")); - l->set_alignment (0.0, 0.5); - centering_vbox->pack_start (*l, 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 - - centering_vbox->pack_start (existing_session_chooser, true, true); - } - - ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_press), false); - ic_new_session_button.signal_clicked().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked)); + 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_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); ic_vbox.pack_start (*centering_hbox, true, true); 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. */ @@ -609,32 +573,35 @@ ArdourStartup::setup_initial_choice_page () set_page_complete (ic_vbox, true); } -void -ArdourStartup::initial_button_clicked () +bool +ArdourStartup::initial_button_clicked (GdkEventButton* ev) { - if (ic_new_session_button.get_active ()) { - recent_session_display.get_selection()->unselect_all (); + if (ev->type == GDK_2BUTTON_PRESS && session_page_index != -1) { + set_current_page(session_page_index); } + + return false; } - -bool -ArdourStartup::initial_button_press (GdkEventButton *event) + +void +ArdourStartup::initial_button_activated () { - if (event && event->type == GDK_2BUTTON_PRESS && new_session_page_index != -1) { - ic_new_session_button.set_active (true); - recent_session_display.get_selection()->unselect_all (); - set_current_page (new_session_page_index); - return true; - } else { - return false; + if (session_page_index != -1) { + set_current_page(session_page_index); } } void -ArdourStartup::initial_button_activated () +ArdourStartup::setup_session_page () { - recent_session_display.get_selection()->unselect_all (); - set_current_page (new_session_page_index); + 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 @@ -697,19 +664,22 @@ ArdourStartup::on_apply () void ArdourStartup::on_prepare (Gtk::Widget* page) { - if (page == &new_session_vbox) { + if (page == &session_vbox) { - if (recent_session_display.get_selection()->count_selected_rows() > 0) { - /* row selected, use it */ - set_page_type (new_session_vbox, ASSISTANT_PAGE_CONFIRM); - on_apply (); - } + 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(tl)) != 0) { /* ::get_default_widget() is not wrapped in gtkmm */ @@ -748,24 +718,18 @@ 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); - new_session_hbox.pack_start (session_new_vbox, true, true); - new_session_vbox.pack_start (new_session_hbox, true, true); - 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")); if (session_new_vbox.get_children().empty()) { VBox *vbox1 = manage (new VBox); @@ -780,10 +744,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)); @@ -804,6 +769,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())); } @@ -907,12 +879,12 @@ ArdourStartup::setup_new_session_page () } session_new_vbox.show_all (); - - new_session_vbox.set_border_width (24); - new_session_vbox.show_all (); + 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)); @@ -922,7 +894,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 (); } @@ -930,9 +902,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); } } @@ -962,11 +934,11 @@ ArdourStartup::redisplay_recent_sessions () for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) { - std::vector state_file_paths; + std::vector state_file_paths; // now get available states for this session - get_state_files_in_directory (*i, state_file_paths); + get_state_files_in_directory ((*i).to_string (), state_file_paths); vector* states; vector item; @@ -1014,6 +986,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(); } @@ -1022,21 +995,86 @@ void ArdourStartup::recent_session_row_selected () { if (recent_session_display.get_selection()->count_selected_rows() > 0) { - ic_new_session_button.set_active (false); + set_page_complete (session_vbox, true); } else { - ic_new_session_button.set_active (true); + 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)); + existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir())); + + FileFilter session_filter; + session_filter.add_pattern ("*.ardour"); + session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME)); + existing_session_chooser.add_filter (session_filter); + existing_session_chooser.set_filter (session_filter); + +#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 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 (); } } @@ -1340,7 +1378,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 { @@ -1352,18 +1390,17 @@ ArdourStartup::move_along_now () void ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*) { - ic_new_session_button.set_active (false); - set_page_type (ic_vbox, ASSISTANT_PAGE_CONFIRM); - on_apply (); + set_page_complete (session_vbox, true); + move_along_now (); } void ArdourStartup::existing_session_selected () { - ic_new_session_button.set_active (false); _existing_session_chooser_used = true; - set_page_type (ic_vbox, ASSISTANT_PAGE_CONFIRM); - on_apply (); + + set_page_complete (session_vbox, true); + move_along_now (); } sys::path