clean up patch change/sysex headers.
[ardour.git] / gtk2_ardour / session_dialog.cc
index a7a0f0be263279209bce21a09266b68b504fc1c1..3205e11d53893d1fc2876e2594a3e49d3be07a82 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <gtkmm/filechooser.h>
 
+#include "pbd/basename.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/file_utils.h"
 #include "pbd/replace_all.h"
@@ -39,6 +40,9 @@
 #include "pbd/stl_delete.h"
 #include "pbd/openuri.h"
 
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/keyboard.h"
+
 #include "ardour/audioengine.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/recent_sessions.h"
@@ -51,7 +55,7 @@
 #include "session_dialog.h"
 #include "opts.h"
 #include "engine_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 #include "tooltips.h"
 #include "ui_config.h"
 #include "utils.h"
@@ -84,6 +88,7 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
        open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT);
 
        back_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::back_button_pressed), false);
+       open_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::open_button_pressed), false);
 
        open_button->set_sensitive (false);
        back_button->set_sensitive (false);
@@ -133,6 +138,8 @@ SessionDialog::SessionDialog (bool require_new, const std::string& session_name,
 
                        if (cnt > 4) {
                                recent_scroller.set_size_request (-1, 300);
+                       } else {
+                               recent_scroller.set_size_request (-1, 80);
                        }
                } else {
                        recent_scroller.hide();
@@ -175,12 +182,16 @@ SessionDialog::SessionDialog ()
 
        get_vbox()->pack_start (recent_scroller, true, true);
        get_vbox()->show_all ();
+
        recent_scroller.show();
 
        int cnt = redisplay_recent_sessions ();
        if (cnt > 4) {
                recent_scroller.set_size_request (-1, 300);
+       } else {
+               recent_scroller.set_size_request (-1, 80);
        }
+
 }
 
 
@@ -242,6 +253,10 @@ SessionDialog::session_name (bool& should_be_new)
 
        if (iter) {
                should_be_new = false;
+               string s = (*iter)[recent_session_columns.fullpath];
+               if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+                       return PBD::basename_nosuffix (s);
+               }
                return (*iter)[recent_session_columns.visible_name];
        }
 
@@ -309,6 +324,7 @@ SessionDialog::setup_recent_sessions ()
 
        recent_session_display.show();
        recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &SessionDialog::recent_row_activated));
+       recent_session_display.signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::recent_button_press), false);
 }
 
 void
@@ -335,7 +351,10 @@ SessionDialog::setup_initial_choice_box ()
 
        string image_path;
 
-       if (find_file (ardour_data_search_path(), "small-splash.png", image_path)) {
+       Searchpath rc (ARDOUR::ardour_data_search_path());
+       rc.add_subdirectory_to_paths ("resources");
+
+       if (find_file (rc, PROGRAM_NAME "-small-splash.png", image_path)) {
                Gtk::Image* image;
                if ((image = manage (new Gtk::Image (image_path))) != 0) {
                        hbox->pack_start (*image, false, false);
@@ -393,11 +412,15 @@ SessionDialog::setup_initial_choice_box ()
        session_filter.add_pattern (string_compose(X_("*%1"), ARDOUR::statefile_suffix));
        session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
        existing_session_chooser.add_filter (session_filter);
+
+       FileFilter archive_filter;
+       archive_filter.add_pattern (X_("*.tar.xz"));
+       archive_filter.set_name (_("Session Archives"));
+       existing_session_chooser.add_filter (archive_filter);
+
        existing_session_chooser.set_filter (session_filter);
 
-#ifdef GTKOSX
-       existing_session_chooser.add_shortcut_folder ("/Volumes");
-#endif
+       Gtkmm2ext::add_volume_shortcuts (existing_session_chooser);
 
        Label* browse_label = manage (new Label);
        browse_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", _("Other Sessions")));
@@ -405,6 +428,17 @@ SessionDialog::setup_initial_choice_box ()
        centering_vbox->pack_start (*browse_label, false, false, 12);
        centering_vbox->pack_start (existing_session_chooser, false, false);
 
+       /* --disable plugins UI */
+
+       _disable_plugins.set_label (_("Safe Mode: Disable all Plugins"));
+       _disable_plugins.set_flags (Gtk::CAN_FOCUS);
+       _disable_plugins.set_relief (Gtk::RELIEF_NORMAL);
+       _disable_plugins.set_mode (true);
+       _disable_plugins.set_active (ARDOUR::Session::get_disable_all_loaded_plugins());
+       _disable_plugins.set_border_width(0);
+       _disable_plugins.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::disable_plugins_clicked));
+       centering_vbox->pack_start (_disable_plugins, false, false);
+
        /* pack it all up */
 
        centering_hbox->pack_start (*centering_vbox, true, true);
@@ -453,6 +487,16 @@ SessionDialog::back_button_pressed (GdkEventButton*)
        return true;
 }
 
+bool
+SessionDialog::open_button_pressed (GdkEventButton* ev)
+{
+       if (Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
+               _disable_plugins.set_active();
+       }
+       response (RESPONSE_ACCEPT);
+       return true;
+}
+
 void
 SessionDialog::populate_session_templates ()
 {
@@ -538,9 +582,7 @@ SessionDialog::setup_new_session_page ()
        new_folder_chooser.show ();
        new_folder_chooser.set_title (_("Select folder for session"));
 
-#ifdef __APPLE__
-       new_folder_chooser.add_shortcut_folder ("/Volumes");
-#endif
+       Gtkmm2ext::add_volume_shortcuts (new_folder_chooser);
 
        vbox1->pack_start (*hbox2, false, false);
 
@@ -692,28 +734,41 @@ SessionDialog::redisplay_recent_sessions ()
 
                float sr;
                SampleFormat sf;
-               std::string state_file_basename = state_file_names.front();
+               std::string program_version;
+
+               std::string state_file_basename;
+
+               if (state_file_names.size() > 1) {
+                       state_file_basename = Session::get_snapshot_from_instant (dirname);
+                       std::string s = Glib::build_filename (dirname, state_file_basename + statefile_suffix);
+                       if (!Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+                               state_file_basename = "";
+                       }
+               }
+
+               if (state_file_basename.empty()) {
+                       state_file_basename = state_file_names.front();
+               }
 
                std::string s = Glib::build_filename (dirname, state_file_basename + statefile_suffix);
 
                GStatBuf gsb;
                g_stat (s.c_str(), &gsb);
 
-               row[recent_session_columns.fullpath] = dirname; /* just the dir, but this works too */
-               row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname).c_str();
+               row[recent_session_columns.fullpath] = s;
                row[recent_session_columns.time_modified] = gsb.st_mtime;
 
-               if (Session::get_info_from_path (s, sr, sf) == 0) {
+               if (Session::get_info_from_path (s, sr, sf, program_version) == 0) {
                        row[recent_session_columns.sample_rate] = rate_as_string (sr);
                        switch (sf) {
                        case FormatFloat:
-                               row[recent_session_columns.disk_format] = _("32 bit float");
+                               row[recent_session_columns.disk_format] = _("32-bit float");
                                break;
                        case FormatInt24:
-                               row[recent_session_columns.disk_format] = _("24 bit");
+                               row[recent_session_columns.disk_format] = _("24-bit");
                                break;
                        case FormatInt16:
-                               row[recent_session_columns.disk_format] = _("16 bit");
+                               row[recent_session_columns.disk_format] = _("16-bit");
                                break;
                        }
                } else {
@@ -721,6 +776,12 @@ SessionDialog::redisplay_recent_sessions ()
                        row[recent_session_columns.disk_format] = "--";
                }
 
+               if (program_version.empty()) {
+                       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));
+               }
+
                ++session_snapshot_count;
 
                if (state_file_names.size() > 1) {
@@ -732,6 +793,7 @@ SessionDialog::redisplay_recent_sessions ()
                        int64_t most_recent = 0;
 
                        // add the children
+                       int kidcount = 0;
                        for (std::vector<std::string>::iterator i2 = state_file_names.begin(); i2 != state_file_names.end(); ++i2) {
 
                                s = Glib::build_filename (dirname, *i2 + statefile_suffix);
@@ -739,7 +801,7 @@ SessionDialog::redisplay_recent_sessions ()
 
                                child_row[recent_session_columns.visible_name] = *i2;
                                child_row[recent_session_columns.fullpath] = s;
-                               child_row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname).c_str();
+                               child_row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (dirname);
                                g_stat (s.c_str(), &gsb);
                                child_row[recent_session_columns.time_modified] = gsb.st_mtime;
 
@@ -750,22 +812,36 @@ SessionDialog::redisplay_recent_sessions ()
                                        most_recent = gsb.st_mtime;
                                }
 
-                               if (Session::get_info_from_path (s, sr, sf) == 0) {
-                                       child_row[recent_session_columns.sample_rate] = rate_as_string (sr);
-                                       switch (sf) {
-                                       case FormatFloat:
-                                               child_row[recent_session_columns.disk_format] = _("32 bit float");
-                                               break;
-                                       case FormatInt24:
-                                               child_row[recent_session_columns.disk_format] = _("24 bit");
-                                               break;
-                                       case FormatInt16:
-                                               child_row[recent_session_columns.disk_format] = _("16 bit");
-                                               break;
+                               if (++kidcount < 5) {
+                                       // parse "modified with" for the first 5 snapshots
+                                       if (Session::get_info_from_path (s, sr, sf, program_version) == 0) {
+#if 0
+                                               child_row[recent_session_columns.sample_rate] = rate_as_string (sr);
+                                               switch (sf) {
+                                                       case FormatFloat:
+                                                               child_row[recent_session_columns.disk_format] = _("32-bit float");
+                                                               break;
+                                                       case FormatInt24:
+                                                               child_row[recent_session_columns.disk_format] = _("24-bit");
+                                                               break;
+                                                       case FormatInt16:
+                                                               child_row[recent_session_columns.disk_format] = _("16-bit");
+                                                               break;
+                                               }
+#else
+                                               child_row[recent_session_columns.sample_rate] = "";
+                                               child_row[recent_session_columns.disk_format] = "";
+#endif
+                                       } else {
+                                               child_row[recent_session_columns.sample_rate] = "??";
+                                               child_row[recent_session_columns.disk_format] = "--";
+                                       }
+                                       if (!program_version.empty()) {
+                                               child_row[recent_session_columns.tip] = Gtkmm2ext::markup_escape_text (string_compose (_("Last modified with: %1"), program_version));
                                        }
                                } else {
-                                       child_row[recent_session_columns.sample_rate] = "??";
-                                       child_row[recent_session_columns.disk_format] = "--";
+                                       child_row[recent_session_columns.sample_rate] = "";
+                                       child_row[recent_session_columns.disk_format] = "";
                                }
 
                                ++session_snapshot_count;
@@ -1130,6 +1206,71 @@ SessionDialog::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
        response (RESPONSE_ACCEPT);
 }
 
+bool
+SessionDialog::recent_button_press (GdkEventButton* ev)
+{
+       if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3) ) {
+
+               TreeModel::Path path;
+               TreeViewColumn* column;
+               int cellx, celly;
+               if (recent_session_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
+                       Glib::RefPtr<Gtk::TreeView::Selection> selection = recent_session_display.get_selection();
+                       if (selection) {
+                               selection->unselect_all();
+                               selection->select(path);
+                       }
+               }
+
+               if (recent_session_display.get_selection()->count_selected_rows() > 0) {
+                       recent_context_mennu (ev);
+               }
+       }
+       return false;
+}
+
+void
+SessionDialog::recent_context_mennu (GdkEventButton *ev)
+{
+       using namespace Gtk::Menu_Helpers;
+
+       TreeIter iter = recent_session_display.get_selection()->get_selected();
+       assert (iter);
+       string s = (*iter)[recent_session_columns.fullpath];
+       if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+               s = Glib::path_get_dirname (s);
+       }
+       if (!Glib::file_test (s, Glib::FILE_TEST_IS_DIR)) {
+               return;
+       }
+
+       Gtk::Menu* m = manage (new Menu);
+       MenuList& items = m->items ();
+       items.push_back (MenuElem (s));
+       items.push_back (SeparatorElem());
+       items.push_back (MenuElem (_("Remove from recent"), sigc::mem_fun (*this, &SessionDialog::recent_remove_selected)));
+       m->popup (ev->button, ev->time);
+}
+
+void
+SessionDialog::recent_remove_selected ()
+{
+       TreeIter iter = recent_session_display.get_selection()->get_selected();
+       assert (iter);
+       string s = (*iter)[recent_session_columns.fullpath];
+       if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+               s = Glib::path_get_dirname (s);
+       }
+       ARDOUR::remove_recent_sessions (s);
+       redisplay_recent_sessions ();
+}
+
+void
+SessionDialog::disable_plugins_clicked ()
+{
+       ARDOUR::Session::set_disable_all_loaded_plugins (_disable_plugins.get_active());
+}
+
 void
 SessionDialog::existing_session_selected ()
 {