X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fsession_dialog.cc;h=c415c0d9fc020b5a77378234246b75dfbf6b0c1f;hb=254f22e372ff1155e76bea2c9a6f9c6c85a94868;hp=0164366f746e34dcaf2e2c8d97bf23b955df5a2b;hpb=30b087ab3d28f1585987fa3f6ae006562ae192e3;p=ardour.git diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 0164366f74..c415c0d9fc 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -1,21 +1,25 @@ /* - Copyright (C) 2013 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. - -*/ + * Copyright (C) 2013-2019 Paul Davis + * Copyright (C) 2014-2015 Tim Mayberry + * Copyright (C) 2014-2019 Robin Gareus + * Copyright (C) 2014 Colin Fletcher + * Copyright (C) 2015 Nick Mainsbridge + * Copyright (C) 2017 Ben Loftis + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ #ifdef WAF_BUILD #include "gtk2ardour-config.h" @@ -77,8 +81,6 @@ using namespace ARDOUR_UI_UTILS; SessionDialog::SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name, bool cancel_not_quit) : ArdourDialog (_("Session Setup"), true, true) , new_only (require_new) - , _provided_session_name (session_name) - , _provided_session_path (session_path) , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) , _existing_session_chooser_used (false) { @@ -99,24 +101,24 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, * and invisible most of the time. */ - info_sample.set_shadow_type(SHADOW_ETCHED_OUT); - info_sample.set_no_show_all (true); - info_sample.set_border_width (12); - get_vbox()->pack_start (info_sample, false, false); + info_frame.set_shadow_type(SHADOW_ETCHED_OUT); + info_frame.set_no_show_all (true); + info_frame.set_border_width (12); + get_vbox()->pack_start (info_frame, false, false); + + if (!template_name.empty()) { + load_template_override = template_name; + } setup_new_session_page (); - if (!new_only) { + if (!require_new) { setup_initial_choice_box (); get_vbox()->pack_start (ic_vbox, true, true); } else { get_vbox()->pack_start (session_new_vbox, true, true); } - if (!template_name.empty()) { - load_template_override = template_name; - } - get_vbox()->show_all (); /* fill data models and show/hide accordingly */ @@ -139,26 +141,11 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name, recent_label.hide (); } } - - /* possibly get out of here immediately if everything is ready to go. - We still need to set up the whole dialog because of the way - ARDOUR_UI::get_session_parameters() might skip it on a first - pass then require it for a second pass (e.g. when there - is an error with session loading and we have to ask the user - what to do next). - */ - - if (!session_name.empty() && !require_new) { - response (RESPONSE_OK); - return; - } } SessionDialog::SessionDialog () : ArdourDialog (_("Recent Sessions"), true, true) , new_only (false) - , _provided_session_name ("") - , _provided_session_path ("") , _existing_session_chooser_used (false) // caller must check should_be_new { get_vbox()->set_spacing (6); @@ -183,21 +170,12 @@ SessionDialog::SessionDialog () } - - SessionDialog::~SessionDialog() { } -void -SessionDialog::clear_given () -{ - _provided_session_path = ""; - _provided_session_name = ""; -} - uint32_t -SessionDialog::meta_master_bus_profile (std::string script_path) const +SessionDialog::meta_master_bus_profile (std::string script_path) { if (!Glib::file_test (script_path, Glib::FILE_TEST_EXISTS | Glib::FILE_TEST_IS_REGULAR)) { return UINT32_MAX; @@ -270,10 +248,6 @@ SessionDialog::use_session_template () const return false; } - if (!load_template_override.empty()) { - return true; - } - if (template_chooser.get_selection()->count_selected_rows() > 0) { return true; } @@ -284,11 +258,6 @@ SessionDialog::use_session_template () const std::string SessionDialog::session_template_name () { - if (!load_template_override.empty()) { - string the_path (ARDOUR::user_template_directory()); - return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); - } - if (template_chooser.get_selection()->count_selected_rows() > 0) { TreeIter const iter = template_chooser.get_selection()->get_selected(); @@ -302,14 +271,16 @@ SessionDialog::session_template_name () return string(); } +void +SessionDialog::clear_name () +{ + recent_session_display.get_selection()->unselect_all(); + new_name_entry.set_text (string()); +} + std::string SessionDialog::session_name (bool& should_be_new) { - if (!_provided_session_name.empty() && !new_only) { - should_be_new = false; - return _provided_session_name; - } - /* Try recent session selection */ TreeIter iter = recent_session_display.get_selection()->get_selected(); @@ -338,10 +309,6 @@ SessionDialog::session_name (bool& should_be_new) std::string SessionDialog::session_folder () { - if (!_provided_session_path.empty() && !new_only) { - return _provided_session_path; - } - /* Try recent session selection */ TreeIter iter = recent_session_display.get_selection()->get_selected(); @@ -375,7 +342,7 @@ SessionDialog::setup_recent_sessions () recent_session_display.append_column (_("Session Name"), recent_session_columns.visible_name); recent_session_display.append_column (_("Sample Rate"), recent_session_columns.sample_rate); #ifdef MIXBUS - recent_session_display.append_column (_("Created With"), recent_session_columns.created_with); + recent_session_display.append_column (_("Modified With"), recent_session_columns.modified_with); #else recent_session_display.append_column (_("File Resolution"), recent_session_columns.disk_format); #endif @@ -453,9 +420,9 @@ SessionDialog::setup_initial_choice_box () info_box->pack_start (*updates_button, false, false); - info_sample.add (*info_box); + info_frame.add (*info_box); info_box->show_all (); - info_sample.show (); + info_frame.show (); } /* recent session scroller */ @@ -481,7 +448,7 @@ SessionDialog::setup_initial_choice_box () existing_session_chooser.add_filter (session_filter); FileFilter archive_filter; - archive_filter.add_pattern (X_("*.tar.xz")); + archive_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::session_archive_suffix)); archive_filter.set_name (_("Session Archives")); existing_session_chooser.add_filter (archive_filter); @@ -573,32 +540,28 @@ SessionDialog::populate_session_templates () template_model->clear (); - /* Add Lua Scripts dedicated to session-setup */ - LuaScriptList& ms (LuaScripting::instance ().scripts (LuaScriptInfo::SessionInit)); - for (LuaScriptList::const_iterator s = ms.begin(); s != ms.end(); ++s) { - TreeModel::Row row = *(template_model->append ()); - row[session_template_columns.name] = (*s)->name; - row[session_template_columns.path] = "urn:ardour:" + (*s)->path; - row[session_template_columns.description] = (*s)->description; - row[session_template_columns.created_with_short] = _("{Factory Template}"); - row[session_template_columns.created_with_long] = _("{Factory Template}"); - } + /* Get Lua Scripts dedicated to session-setup */ + LuaScriptList scripts (LuaScripting::instance ().scripts (LuaScriptInfo::SessionInit)); /* Add Lua Action Scripts which can also be used for session-setup */ LuaScriptList& as (LuaScripting::instance ().scripts (LuaScriptInfo::EditorAction)); for (LuaScriptList::const_iterator s = as.begin(); s != as.end(); ++s) { - if (!((*s)->subtype & LuaScriptInfo::SessionSetup)) { - continue; + if ((*s)->subtype & LuaScriptInfo::SessionSetup) { + scripts.push_back (*s); } + } + + std::sort (scripts.begin(), scripts.end(), LuaScripting::Sorter()); + + for (LuaScriptList::const_iterator s = scripts.begin(); s != scripts.end(); ++s) { TreeModel::Row row = *(template_model->append ()); row[session_template_columns.name] = (*s)->name; row[session_template_columns.path] = "urn:ardour:" + (*s)->path; row[session_template_columns.description] = (*s)->description; - row[session_template_columns.created_with_short] = _("{Factory Template}"); - row[session_template_columns.created_with_long] = _("{Factory Template}"); + row[session_template_columns.modified_with_short] = _("{Factory Template}"); + row[session_template_columns.modified_with_long] = _("{Factory Template}"); } - //Add any "template sessions" found in the user's preferences folder for (vector::iterator x = templates.begin(); x != templates.end(); ++x) { TreeModel::Row row; @@ -608,17 +571,17 @@ SessionDialog::populate_session_templates () row[session_template_columns.name] = (*x).name; row[session_template_columns.path] = (*x).path; row[session_template_columns.description] = (*x).description; - row[session_template_columns.created_with_long] = (*x).created_with; - row[session_template_columns.created_with_short] = (*x).created_with.substr(0, (*x).created_with.find(" ")); + row[session_template_columns.modified_with_long] = (*x).modified_with; + row[session_template_columns.modified_with_short] = (*x).modified_with.substr(0, (*x).modified_with.find(" ")); } //Add an explicit 'Empty Template' item TreeModel::Row row = *template_model->prepend (); row[session_template_columns.name] = (_("Empty Template")); row[session_template_columns.path] = string(); - row[session_template_columns.description] = _("An empty session with factory default settings."); - row[session_template_columns.created_with_short] = _(""); - row[session_template_columns.created_with_long] = _(""); + row[session_template_columns.description] = _("An empty session with factory default settings.\n\nSelect this option if you are importing files to mix."); + row[session_template_columns.modified_with_short] = _(""); + row[session_template_columns.modified_with_long] = _(""); //auto-select the first item in the list Gtk::TreeModel::Row first = template_model->children()[0]; @@ -641,12 +604,6 @@ SessionDialog::setup_new_session_page () name_hbox->pack_start (*name_label, false, true); name_hbox->pack_start (new_name_entry, true, true); - //check to see if a session name was provided on command line - if (!ARDOUR_COMMAND_LINE::session_name.empty()) { - new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name)); - open_button->set_sensitive (true); - } - new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::new_name_changed)); new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &SessionDialog::new_name_activated)); @@ -658,10 +615,7 @@ SessionDialog::setup_new_session_page () folder_box->pack_start (*new_folder_label, false, false); folder_box->pack_start (new_folder_chooser, true, true); - //determine the text in the new folder selector - 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) { + if (ARDOUR_UI::instance()->the_session ()) { // 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()); new_folder_chooser.set_current_folder (session_parent_dir); @@ -685,7 +639,7 @@ SessionDialog::setup_new_session_page () HBox* template_hbox = manage (new HBox); //if the "template override" is provided, don't give the user any template selections (?) - if ( load_template_override.empty() ) { + if (load_template_override.empty()) { template_hbox->set_spacing (8); Gtk::ScrolledWindow *template_scroller = manage (new Gtk::ScrolledWindow()); @@ -698,9 +652,9 @@ SessionDialog::setup_new_session_page () template_hbox->pack_start (*template_scroller, true, true); - template_desc_sample.set_name (X_("TextHighlightFrame")); - template_desc_sample.add (*desc_scroller); - template_hbox->pack_start (template_desc_sample, true, true); + template_desc_frame.set_name (X_("TextHighlightFrame")); + template_desc_frame.add (*desc_scroller); + template_hbox->pack_start (template_desc_frame, true, true); } //template_desc is the textview that displays the currently selected template's description @@ -715,13 +669,15 @@ SessionDialog::setup_new_session_page () template_chooser.set_model (template_model); template_chooser.append_column (_("Template"), session_template_columns.name); #ifdef MIXBUS - template_chooser.append_column (_("Created With"), session_template_columns.created_with_short); + template_chooser.append_column (_("Modified With"), session_template_columns.modified_with_short); #endif - template_chooser.set_tooltip_column(4); // created_with_long template_chooser.set_headers_visible (true); template_chooser.get_selection()->set_mode (SELECTION_SINGLE); template_chooser.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::template_row_selected)); template_chooser.set_sensitive (true); + if (UIConfiguration::instance().get_use_tooltips()) { + template_chooser.set_tooltip_column(4); // modified_with_long + } session_new_vbox.pack_start (*template_hbox, true, true); session_new_vbox.pack_start (*folder_box, false, true); @@ -772,8 +728,7 @@ SessionDialog::redisplay_recent_sessions () int session_snapshot_count = 0; - for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) - { + for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) { std::vector state_file_paths; // now get available states for this session @@ -867,7 +822,7 @@ SessionDialog::redisplay_recent_sessions () row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (dirname); } else { row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (dirname + "\n" + string_compose (_("Last modified with: %1"), program_version)); - row[recent_session_columns.created_with] = program_version; + row[recent_session_columns.modified_with] = program_version; } ++session_snapshot_count; @@ -947,7 +902,9 @@ SessionDialog::redisplay_recent_sessions () row[recent_session_columns.time_formatted] = gdt.format ("%F %H:%M"); } - recent_session_display.set_tooltip_column(1); // recent_session_columns.tip + if (UIConfiguration::instance().get_use_tooltips()) { + recent_session_display.set_tooltip_column(1); // recent_session_columns.tip + } recent_session_display.set_model (recent_session_model); // custom sort @@ -1053,7 +1010,7 @@ SessionDialog::recent_context_mennu (GdkEventButton *ev) Gtk::TreeModel::Path tpath = recent_session_model->get_path(iter); const bool is_child = tpath.up () && tpath.up (); - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); items.push_back (MenuElem (s, sigc::bind (sigc::hide_return (sigc::ptr_fun (&PBD::open_folder)), s))); if (!is_child) { @@ -1125,3 +1082,13 @@ SessionDialog::on_delete_event (GdkEventAny* ev) response (RESPONSE_CANCEL); return ArdourDialog::on_delete_event (ev); } + +void +SessionDialog::set_provided_session (string const & name, string const & path) +{ + /* Note: path is required to be the full path to the session file, not + just the folder name + */ + new_name_entry.set_text (name); + existing_session_chooser.set_current_folder (Glib::path_get_dirname (path)); +}