Prevent note creation drags with no movement of the pointer. May fix #3159.
[ardour.git] / gtk2_ardour / editor_audio_import.cc
index c70832182a13363b8881fa582e4673bea26a2f50..2145b24352ba4a48c34fddb48072ab355b96c491 100644 (file)
@@ -29,6 +29,7 @@
 #include "pbd/pthread_utils.h"
 #include "pbd/basename.h"
 #include "pbd/shortpath.h"
+#include "pbd/stateful_diff_command.h"
 
 #include <gtkmm2ext/choice.h>
 
@@ -46,6 +47,7 @@
 #include "ardour/region_factory.h"
 #include "ardour/source_factory.h"
 #include "ardour/session.h"
+#include "ardour/smf_source.h"
 #include "pbd/memento_command.h"
 
 #include "ardour_ui.h"
@@ -57,6 +59,7 @@
 #include "session_import_dialog.h"
 #include "utils.h"
 #include "gui_thread.h"
+#include "interthread_progress_window.h"
 
 #include "i18n.h"
 
@@ -325,9 +328,11 @@ Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mod
        vector<ustring> to_import;
        int nth = 0;
 
-       if (interthread_progress_window == 0) {
-               build_interthread_progress_window ();
-       }
+       current_interthread_info = &import_status;
+       import_status.current = 1;
+       import_status.total = paths.size ();
+
+       ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import"));
 
        if (chns == Editing::ImportMergeFiles) {
 
@@ -345,47 +350,69 @@ Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mod
                }
 
                if (!cancel) {
-                       import_sndfiles (paths, mode, quality, pos, 1, 1, track, false, paths.size());
+                       import_sndfiles (paths, mode, quality, pos, 1, 1, track, false);
                }
 
        } else {
 
-               for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
-
-                       int const check = check_whether_and_how_to_import (*a, true);
-
-                       if (check != 2) {
-                               to_import.push_back (*a);
-                       }
-               }
-
+                bool replace = false;
                bool ok = true;
 
-               switch (chns) {
-               case Editing::ImportDistinctFiles:
+               for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
 
-                       if (mode == Editing::ImportToTrack) {
-                               track = get_nth_selected_audio_track (nth++);
+                        const int check = check_whether_and_how_to_import (*a, true);
+                        
+                       switch (check) {
+                       case 2:
+                               // user said skip
+                               continue;
+                       case 0:
+                               fatal << "Updating existing sources should be disabled!" << endmsg;
+                               /* NOTREACHED*/
+                               break;
+                       case 1:
+                               replace = false;
+                               break;
+                       default:
+                               fatal << "Illegal return " << check <<  " from check_whether_and_how_to_import()!" << endmsg;
+                               /* NOTREACHED*/
                        }
 
-                       ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, false, to_import.size()) == 0);
-                       break;
-
-               case Editing::ImportDistinctChannels:
-                       ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, false, to_import.size()) == 0);
-                       break;
+                        switch (chns) {
+                        case Editing::ImportDistinctFiles:
+                                
+                                to_import.clear ();
+                                to_import.push_back (*a);
+                                
+                                if (mode == Editing::ImportToTrack) {
+                                        track = get_nth_selected_audio_track (nth++);
+                                }
+                       
+                                ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0);
+                                break;
+                               
+                        case Editing::ImportDistinctChannels:
+                               
+                                to_import.clear ();
+                                to_import.push_back (*a);
+                               
+                                ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0);
+                                break;
+                               
+                        case Editing::ImportSerializeFiles:
+                               
+                                to_import.clear ();
+                                to_import.push_back (*a);
 
-               case Editing::ImportSerializeFiles:
-                       ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, false, to_import.size()) == 0);
-                       break;
+                                ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace) == 0);
+                                break;
 
-               case Editing::ImportMergeFiles:
-                       // Not entered, handled in earlier if() branch
-                       break;
-               }
+                        case Editing::ImportMergeFiles:
+                                // Not entered, handled in earlier if() branch
+                                break;
+                        }
+                }
        }
-
-       interthread_progress_window->hide_all ();
 }
 
 void
@@ -431,7 +458,7 @@ Editor::do_embed (vector<ustring> paths, ImportDisposition chns, ImportMode mode
                if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) {
                        goto out;
                }
-       break;
+                break;
 
        case Editing::ImportSerializeFiles:
                for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
@@ -456,14 +483,8 @@ Editor::do_embed (vector<ustring> paths, ImportDisposition chns, ImportMode mode
 
 int
 Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality quality, nframes64_t& pos,
-                        int target_regions, int target_tracks, boost::shared_ptr<Track> track, bool replace, uint32_t total)
+                        int target_regions, int target_tracks, boost::shared_ptr<Track>& track, bool replace)
 {
-       interthread_progress_window->set_title (string_compose (_("Importing %1"), paths.front()));
-       interthread_progress_window->set_position (Gtk::WIN_POS_MOUSE);
-       interthread_progress_bar.set_fraction (0.0f);
-       interthread_cancel_label.set_text (_("Cancel Import"));
-       current_interthread_info = &import_status;
-
        import_status.paths = paths;
        import_status.done = false;
        import_status.cancel = false;
@@ -471,7 +492,6 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
        import_status.done = 0.0;
        import_status.quality = quality;
        import_status.replace_existing_source = replace;
-       import_status.total = total;
 
        import_status.mode = mode;
        import_status.pos = pos;
@@ -479,8 +499,6 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
        import_status.target_regions = target_regions;
        import_status.track = track;
        import_status.replace = replace;
-       interthread_progress_connection = Glib::signal_timeout().connect
-               (sigc::bind (sigc::mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 500);
 
        track_canvas->get_window()->set_cursor (Gdk::Cursor (Gdk::WATCH));
        gdk_flush ();
@@ -497,9 +515,7 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
                gtk_main_iteration ();
        }
 
-       interthread_progress_window->hide ();
        import_status.done = true;
-       interthread_progress_connection.disconnect ();
 
        if (!import_status.cancel && !import_status.sources.empty()) {
                if (add_sources (import_status.paths,
@@ -508,7 +524,7 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
                                 import_status.mode,
                                 import_status.target_regions,
                                 import_status.target_tracks,
-                                import_status.track, false) == 0) {
+                                track, false) == 0) {
                        _session->save_state ("");
                }
 
@@ -706,13 +722,14 @@ Editor::add_sources (vector<Glib::ustring> paths, SourceList& sources, nframes64
                if (sources[0]->natural_position() != 0) {
                        pos = sources[0]->natural_position();
                } else {
-                       pos = get_preferred_edit_position ();
+                       pos = _session->current_start_frame();
                }
        }
 
        // kludge (for MIDI we're abusing "channel" for "track" here)
-       if (paths.front().rfind(".mid") != Glib::ustring::npos)
+       if (SMFSource::safe_midi_file_extension (paths.front())) {
                target_regions = -1;
+       }
 
        if (target_regions == 1) {
 
@@ -837,12 +854,12 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                        }
                }
 
-               boost::shared_ptr<Playlist> playlist = existing_track->diskstream()->playlist();
-               boost::shared_ptr<Region> copy (RegionFactory::create (region));
+               boost::shared_ptr<Playlist> playlist = existing_track->playlist();
+               boost::shared_ptr<Region> copy (RegionFactory::create (region, region->properties()));
                begin_reversible_command (_("insert file"));
-               XMLNode &before = playlist->get_state();
+                playlist->clear_history ();
                playlist->add_region (copy, pos);
-               _session->add_command (new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
+               _session->add_command (new StatefulDiffCommand (playlist));
                commit_reversible_command ();
                break;
        }
@@ -872,7 +889,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                }
 
                boost::shared_ptr<Region> copy (RegionFactory::create (region));
-               existing_track->diskstream()->playlist()->add_region (copy, pos);
+               existing_track->playlist()->add_region (copy, pos);
                break;
        }
 
@@ -886,7 +903,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
                if (!at.empty()) {
                        boost::shared_ptr<Region> copy (RegionFactory::create (region));
                        at.front()->set_name (basename_nosuffix (copy->name()));
-                       at.front()->diskstream()->playlist()->add_region (copy, pos);
+                       at.front()->playlist()->add_region (copy, pos);
                }
                break;
        }
@@ -912,43 +929,3 @@ Editor::import_thread ()
        /*NOTREACHED*/
        return 0;
 }
-
-gint
-Editor::import_progress_timeout (void */*arg*/)
-{
-       bool reset = false;
-
-       if (!interthread_progress_window->is_visible()) {
-               interthread_progress_window->show_all ();
-               reset = true;
-       }
-
-       interthread_progress_label.set_text (import_status.doing_what);
-
-       if (import_status.freeze) {
-               interthread_cancel_button.set_sensitive(false);
-       } else {
-               interthread_cancel_button.set_sensitive(true);
-       }
-
-       if (import_status.doing_what == "building peak files") {
-               interthread_progress_bar.pulse ();
-               return FALSE;
-       } else {
-               float val = import_status.progress;
-               interthread_progress_bar.set_fraction (min (max (0.0f, val), 1.0f));
-       }
-
-       if (reset) {
-
-               /* the window is now visible, speed up the updates */
-
-               interthread_progress_connection.disconnect ();
-               interthread_progress_connection = Glib::signal_timeout().connect
-                       (sigc::bind (sigc::mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 100);
-               return false;
-       } else {
-               return !(import_status.done || import_status.cancel);
-       }
-}
-