Fix playhead smoothing when auditioning.
[ardour.git] / gtk2_ardour / missing_file_dialog.cc
index 66085217d2a0d07cd66950e82cf9661af429d874..89ef01c372eb6e42d5b4de62219e5480d7452e4c 100644 (file)
 #include "pbd/compose.h"
 #include "pbd/replace_all.h"
 #include "pbd/strsplit.h"
+#include "pbd/search_path.h"
 
 #include "ardour/session.h"
+#include "gtkmm2ext/utils.h"
 
 #include "missing_file_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace Gtk;
 using namespace std;
@@ -31,145 +33,162 @@ using namespace ARDOUR;
 using namespace PBD;
 
 MissingFileDialog::MissingFileDialog (Session* s, const std::string& path, DataType type)
-        : ArdourDialog (_("Missing File!"), true, false)
-        , filetype (type)
-        , chooser (_("Select a folder to search"), FILE_CHOOSER_ACTION_SELECT_FOLDER)
-        , use_chosen (_("Add chosen folder to search path, and try again"))
-        , choice_group (use_chosen.get_group())
-        , stop_loading_button (choice_group, _("Stop loading this session"), false)
-        , all_missing_ok (choice_group, _("Skip all missing files"), false)
-        , this_missing_ok (choice_group, _("Skip this file"), false)
+       : ArdourDialog (_("Missing File"), true, false)
+       , filetype (type)
+       , is_absolute_path (Glib::path_is_absolute (path))
+       , chooser (_("Select a folder to search"), FILE_CHOOSER_ACTION_SELECT_FOLDER)
+       , use_chosen (_("Add chosen folder to search path, and try again"))
+       , choice_group (use_chosen.get_group())
+       , stop_loading_button (choice_group, _("Stop loading this session"), false)
+       , all_missing_ok (choice_group, _("Skip all missing files"), false)
+       , this_missing_ok (choice_group, _("Skip this file"), false)
 {
-        set_session (s);
+       /* This dialog is always shown programatically. Center the window.*/
+       set_position (Gtk::WIN_POS_CENTER);
 
-        add_button (_("Done"), RESPONSE_OK);
-        set_default_response (RESPONSE_OK);
+       set_session (s);
 
-        string typestr;
+       add_button (_("Done"), RESPONSE_OK);
+       set_default_response (RESPONSE_OK);
 
-        switch (type) {
-        case DataType::AUDIO:
-                typestr = _("audio");
-                break;
-        case DataType::MIDI:
-                typestr = _("MIDI");
-                break;
-        }
+       string typestr;
 
-        string dirstr;
+       switch (type) {
+               case DataType::AUDIO:
+                       typestr = _("audio");
+                       break;
+               case DataType::MIDI:
+                       typestr = _("MIDI");
+                       break;
+       }
 
-        dirstr = s->source_search_path (type);
-        cerr << "Search path = " << dirstr << endl;
-        replace_all (dirstr, ":", "\n");
+       vector<string> source_dirs = s->source_search_path (type);
+       vector<string>::iterator i = source_dirs.begin();
+       ostringstream oss;
+       oss << *i << endl;
 
-        msg.set_justify (JUSTIFY_CENTER);
-        msg.set_markup (string_compose (_("%1 cannot find the %2 file\n\n<i>%3</i>\n\nin any of these folders:\n\n\
-<tt>%4</tt>\n\n"), PROGRAM_NAME, typestr, path, dirstr));
+       while (++i != source_dirs.end()) {
+               oss << *i << endl;
+       }
 
-        HBox* hbox = manage (new HBox);
-        hbox->pack_start (msg, false, true);
-        hbox->show ();
+       msg.set_justify (JUSTIFY_LEFT);
+       msg.set_markup (string_compose (_("%1 cannot find the %2 file\n\n<i>%3</i>\n\nin any of these folders:\n\n\
+                                       <tt>%4</tt>\n\n"), PROGRAM_NAME, typestr, Gtkmm2ext::markup_escape_text (path), Gtkmm2ext::markup_escape_text (oss.str())));
 
-        get_vbox()->pack_start (*hbox, false, false);
+       HBox* hbox = manage (new HBox);
+       hbox->pack_start (msg, false, true);
+       hbox->show ();
 
-        VBox* button_packer_box = manage (new VBox);
+       get_vbox()->pack_start (*hbox, false, false);
 
-        button_packer_box->set_spacing (6);
-        button_packer_box->set_border_width (12);
+       VBox* button_packer_box = manage (new VBox);
 
-        button_packer_box->pack_start (use_chosen, false, false);
-        button_packer_box->pack_start (this_missing_ok, false, false);
-        button_packer_box->pack_start (all_missing_ok, false, false);
-        button_packer_box->pack_start (stop_loading_button, false, false);
+       button_packer_box->set_spacing (6);
+       button_packer_box->set_border_width (12);
 
-        button_packer_box->show_all ();
+       button_packer_box->pack_start (use_chosen, false, false);
+       button_packer_box->pack_start (this_missing_ok, false, false);
+       button_packer_box->pack_start (all_missing_ok, false, false);
+       button_packer_box->pack_start (stop_loading_button, false, false);
 
-        get_vbox()->set_spacing (6);
-        get_vbox()->set_border_width (25);
-        get_vbox()->set_homogeneous (false);
+       button_packer_box->show_all ();
 
+       get_vbox()->set_spacing (6);
+       get_vbox()->set_border_width (25);
+       get_vbox()->set_homogeneous (false);
 
-        hbox = manage (new HBox);
-        hbox->pack_start (*button_packer_box, false, true);
-        hbox->show ();
 
-        get_vbox()->pack_start (*hbox, false, false);
+       hbox = manage (new HBox);
+       hbox->pack_start (*button_packer_box, false, true);
+       hbox->show ();
 
-        hbox = manage (new HBox);
-        Label* label = manage (new Label);
-        label->set_text (_("Click to choose an additional folder"));
+       get_vbox()->pack_start (*hbox, false, false);
 
-        hbox->set_spacing (6);
-        hbox->set_border_width (12);
-        hbox->pack_start (*label, false, false);
-        hbox->pack_start (chooser, true, true);
-        hbox->show_all ();
+       hbox = manage (new HBox);
+       Label* label = manage (new Label);
+       label->set_text (_("Click to choose an additional folder"));
 
-        get_vbox()->pack_start (*hbox, true, true);
+       hbox->set_spacing (6);
+       hbox->set_border_width (12);
+       hbox->pack_start (*label, false, false);
+       hbox->pack_start (chooser, true, true);
+       hbox->show_all ();
 
-        msg.show ();
+       get_vbox()->pack_start (*hbox, true, true);
 
-        chooser.set_current_folder (Glib::get_home_dir());
-        chooser.set_create_folders (false);
+       msg.show ();
+
+       chooser.set_current_folder (Glib::get_home_dir());
+       chooser.set_create_folders (false);
+}
+
+void
+MissingFileDialog::set_absolute ()
+{
+       _session->set_missing_file_replacement (chooser.get_filename ());
 }
 
 void
 MissingFileDialog::add_chosen ()
 {
-        string str;
-        string newdir;
-        vector<string> dirs;
-
-        switch (filetype) {
-        case DataType::AUDIO:
-                str = _session->config.get_audio_search_path();
-                break;
-        case DataType::MIDI:
-                str = _session->config.get_midi_search_path();
-                break;
-        }
-
-        split (str, dirs, ':');
-
-        newdir = chooser.get_filename ();
-
-        for (vector<string>::iterator d = dirs.begin(); d != dirs.end(); d++) {
-                if (*d == newdir) {
-                        return;
-                }
-        }
-
-        if (!str.empty()) {
-                str += ':';
-        }
-
-        str += newdir;
-
-        switch (filetype) {
-        case DataType::AUDIO:
-                _session->config.set_audio_search_path (str);
-                break;
-        case DataType::MIDI:
-                _session->config.set_midi_search_path (str);
-                break;
-        }
+       string str;
+       string newdir;
+       vector<string> dirs;
+
+       switch (filetype) {
+               case DataType::AUDIO:
+                       str = _session->config.get_audio_search_path();
+                       break;
+               case DataType::MIDI:
+                       str = _session->config.get_midi_search_path();
+                       break;
+       }
+
+       split (str, dirs, G_SEARCHPATH_SEPARATOR);
+
+       newdir = chooser.get_filename ();
+
+       for (vector<string>::iterator d = dirs.begin(); d != dirs.end(); d++) {
+               if (*d == newdir) {
+                       return;
+               }
+       }
+
+       if (!str.empty()) {
+               str += G_SEARCHPATH_SEPARATOR;
+       }
+
+       str += newdir;
+
+       switch (filetype) {
+               case DataType::AUDIO:
+                       _session->config.set_audio_search_path (str);
+                       break;
+               case DataType::MIDI:
+                       _session->config.set_midi_search_path (str);
+                       break;
+       }
 }
 
 int
 MissingFileDialog::get_action ()
 {
-        if (use_chosen.get_active ()) {
-                add_chosen ();
-                return 0;
-        }
-
-        if (this_missing_ok.get_active()) {
-                return -1;
-        }
-
-        if (all_missing_ok.get_active ()) {
-                return 3;
-        }
-
-        return 1;
+       if (use_chosen.get_active ()) {
+               if (is_absolute_path) {
+                       set_absolute ();
+               } else {
+                       add_chosen ();
+               }
+               return 0;
+       }
+
+       if (this_missing_ok.get_active()) {
+               return -1;
+       }
+
+       if (all_missing_ok.get_active ()) {
+               return 3;
+       }
+
+       return 1;
 }