lincoln's patch that makes us pay attention to region copies w.r.t the region list...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 21 Sep 2010 03:02:30 +0000 (03:02 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 21 Sep 2010 03:02:30 +0000 (03:02 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7817 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/canvas-note-event.cc
gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_ops.cc
gtk2_ardour/editor_regions.cc
gtk2_ardour/editor_regions.h
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h

index 80275d93622a71bd801f67aa69d3983be11c84d1..739019b31e3bf88535f2e5aa1904e1915529ec0b 100644 (file)
@@ -239,6 +239,14 @@ CanvasNoteEvent::on_event(GdkEvent* ev)
                _region.note_left (this);
                break;
 
+        case GDK_MOTION_NOTIFY:
+                double ix, iy;
+                ix = ev->motion.x;
+                iy = ev->motion.y;
+                _item->w2i (ix, iy);
+                cerr << "note motion at " << ix << ',' << iy << endl;
+                break;
+
        case GDK_BUTTON_PRESS:
                if (ev->button.button == 3 && Keyboard::no_modifiers_active (ev->button.state)) {
                         show_channel_selector();
index 37f71c60266b176dda24daea7c839f5f347772f2..f8047868f4e338fbd5f65ecae0375e458ff800ec 100644 (file)
@@ -366,7 +366,8 @@ RegionDrag::RegionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<Re
                }
        }
 
-       assert (!v.empty ());
+        /* the list of views can be empty at this point if this is a region list-insert drag
+         */
        
        for (list<RegionView*>::const_iterator i = v.begin(); i != v.end(); ++i) {
                _views.push_back (DraggingView (*i, this));
@@ -692,7 +693,7 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
                        MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(rv);
 
                        const boost::shared_ptr<const Region> original = rv->region();
-                       boost::shared_ptr<Region> region_copy = RegionFactory::create (original);
+                       boost::shared_ptr<Region> region_copy = RegionFactory::create (original, true);
                        region_copy->set_position (original->position(), this);
                        
                        RegionView* nrv;
@@ -915,7 +916,7 @@ RegionMoveDrag::finished_no_copy (
                        /* insert into new playlist */
 
                        RegionView* new_view = insert_region_into_playlist (
-                               RegionFactory::create (rv->region ()), dest_rtv, dest_layer, where, modified_playlists
+                               RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where, modified_playlists
                                );
 
                        if (new_view == 0) {
index 426e42ced2522143c484d37041a5a9cf3d615c7a..abd319583b0f66894c0394b08e6655b1f2e33a2d 100644 (file)
@@ -2218,7 +2218,7 @@ Editor::insert_region_list_drag (boost::shared_ptr<Region> region, int x, int y)
 
        begin_reversible_command (_("insert dragged region"));
         playlist->clear_changes ();
-       playlist->add_region (RegionFactory::create (region), where, 1.0);
+       playlist->add_region (RegionFactory::create (region, true), where, 1.0);
        _session->add_command(new StatefulDiffCommand (playlist));
        commit_reversible_command ();
 }
@@ -2297,7 +2297,7 @@ Editor::insert_region_list_selection (float times)
 
        begin_reversible_command (_("insert region"));
         playlist->clear_changes ();
-       playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times);
+       playlist->add_region ((RegionFactory::create (region, true)), get_preferred_edit_position(), times);
        _session->add_command(new StatefulDiffCommand (playlist));
        commit_reversible_command ();
 }
@@ -3106,7 +3106,7 @@ Editor::region_fill_track ()
                }
 
                 pl->clear_changes ();
-               pl->add_region (RegionFactory::create (region), region->last_frame(), times);
+               pl->add_region (RegionFactory::create (region, true), region->last_frame(), times);
                _session->add_command (new StatefulDiffCommand (pl));
        }
 
@@ -3150,7 +3150,7 @@ Editor::region_fill_selection ()
                }
 
                 playlist->clear_changes ();
-               playlist->add_region (RegionFactory::create (region), start, times);
+               playlist->add_region (RegionFactory::create (region, true), start, times);
                _session->add_command (new StatefulDiffCommand (playlist));
        }
 
index a66282a7ef9d0bf7969667a04041f726dc540d30..0cc8926371fb8f8c3e60e93fd5f6a053772c22a9 100644 (file)
@@ -25,7 +25,6 @@
 
 #include "pbd/basename.h"
 #include "pbd/enumwriter.h"
-#include "pbd/stacktrace.h"
 
 #include "ardour/audioregion.h"
 #include "ardour/audiofilesource.h"
@@ -346,18 +345,41 @@ EditorRegions::region_changed (boost::shared_ptr<Region> r, const PropertyChange
         our_interests.add (ARDOUR::Properties::opaque);
         our_interests.add (ARDOUR::Properties::fade_in);
         our_interests.add (ARDOUR::Properties::fade_out);
+       
+       if (last_row != NULL){
+
+               TreeModel::iterator j = _model->get_iter (last_row.get_path());
+               boost::shared_ptr<Region> c = (*j)[_columns.region];
+
+               if (c == r) {
+                       populate_row (r, (*j));
+                       
+                       if (what_changed.contains (ARDOUR::Properties::hidden)) {
+                               redisplay ();
+                       }
+                       
+                       return;
+               }
+       }
+
 
         if (what_changed.contains (our_interests)) {
 
                /* find the region in our model and update its row */
                TreeModel::Children rows = _model->children ();
                TreeModel::iterator i = rows.begin ();
+               
                while (i != rows.end ()) {
+                       
                        TreeModel::Children children = (*i)->children ();
                        TreeModel::iterator j = children.begin ();
+                       
                        while (j != children.end()) {
+                         
                                boost::shared_ptr<Region> c = (*j)[_columns.region];
+                       
                                if (c == r) {
+                                       last_row = TreeRowReference(_model, TreePath(j));
                                        break;
                                }
                                ++j;
@@ -403,7 +425,6 @@ EditorRegions::region_changed (boost::shared_ptr<Region> r, const PropertyChange
 
                        ++i;
                }
-
        }
 
        if (what_changed.contains (ARDOUR::Properties::hidden)) {
@@ -438,8 +459,11 @@ EditorRegions::selection_changed ()
                                boost::shared_ptr<Region> region = (*iter)[_columns.region];
 
                                 // they could have clicked on a row that is just a placeholder, like "Hidden"
-
                                if (region) {
+                                        
+                                        cerr << "Selected region has use count "
+                                             << _session->playlists->region_use_count (region) 
+                                             << endl;
 
                                        if (region->automatic()) {
 
@@ -464,10 +488,12 @@ EditorRegions::selection_changed ()
 void
 EditorRegions::set_selected (RegionSelection& regions)
 {
+       TreeModel::Children rows = _model->children();
+
        for (RegionSelection::iterator iter = regions.begin(); iter != regions.end(); ++iter) {
 
                TreeModel::iterator i;
-               TreeModel::Children rows = _model->children();
+               
                boost::shared_ptr<Region> r ((*iter)->region());
 
                for (i = rows.begin(); i != rows.end(); ++i) {
@@ -509,6 +535,7 @@ EditorRegions::set_selected_in_subrow (boost::shared_ptr<Region> region, TreeMod
                        }
                }
        }
+       
        return false;
 }
 
@@ -550,9 +577,6 @@ EditorRegions::redisplay ()
                 insert_into_tmp_regionlist (i->second);
         }
 
-        stacktrace (cerr, 22);
-        cerr << "Redisplay with " << tmp_region_list.size() << " regions\n";
-
        for (list<boost::shared_ptr<Region> >::iterator r = tmp_region_list.begin(); r != tmp_region_list.end(); ++r) {
                add_region (*r);
        }
index f899b00c550f5d3d52cabf151d4f2acc5bb035ca..8e41327c377da76ea9ac3705c72669b65e385399 100644 (file)
@@ -40,16 +40,20 @@ public:
        void reset_sort_type (Editing::RegionListSortType, bool);
        void set_selected (RegionSelection &);
        void selection_mapover (sigc::slot<void,boost::shared_ptr<ARDOUR::Region> >);
+       
        boost::shared_ptr<ARDOUR::Region> get_dragged_region ();
        boost::shared_ptr<ARDOUR::Region> get_single_selection ();
+       
        Editing::RegionListSortType sort_type () const {
                return _sort_type;
        }
+       
        void redisplay ();
 
        void suspend_redisplay () {
                _no_redisplay = true;
        }
+       
        void resume_redisplay () {
                _no_redisplay = false;
                redisplay ();
@@ -108,12 +112,17 @@ private:
        };
 
        Columns _columns;
+       
+       Gtk::TreeModel::RowReference last_row;
 
        void region_changed (boost::shared_ptr<ARDOUR::Region>, PBD::PropertyChange const &);
        void selection_changed ();
+       
        sigc::connection _change_connection;
+       
        bool set_selected_in_subrow (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int);
        bool selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
+       
        void name_edit (const std::string&, const std::string&);
        void locked_changed (std::string const &);
        void glued_changed (std::string const &);
index 6f582b351821c7eab7831b445bb7fea4f03730e4..20b93b71e51d5ca67a765ea0c873d6a0a93f84b6 100644 (file)
@@ -2663,6 +2663,12 @@ MidiRegionView::note_left (ArdourCanvas::CanvasNoteEvent* note)
        trackview.editor().hide_verbose_canvas_cursor ();
 }
 
+void
+MidiRegionView::note_motion (float fraction)
+{
+        cerr << "Now at " << fraction << " within note\n";
+}
+
 void
 MidiRegionView::switch_source(boost::shared_ptr<Source> src)
 {
index 53b8c1ef0bb33dda4b58d2170684ef71fa3692a2..c66c6dc220dc5eac7fc0fc9e5cf309b97663d36f 100644 (file)
@@ -192,6 +192,7 @@ class MidiRegionView : public RegionView
 
        void   note_entered(ArdourCanvas::CanvasNoteEvent* ev);
        void   note_left(ArdourCanvas::CanvasNoteEvent* ev);
+       void   note_motion (float fraction);
        void   unique_select(ArdourCanvas::CanvasNoteEvent* ev);
        void   note_selected(ArdourCanvas::CanvasNoteEvent* ev, bool add, bool extend=false);
        void   note_deselected(ArdourCanvas::CanvasNoteEvent* ev);