diff --git a/gtk2_ardour/canvas-note-event.cc b/gtk2_ardour/canvas-note-event.cc index 80275d9362..739019b31e 100644 --- a/gtk2_ardour/canvas-note-event.cc +++ b/gtk2_ardour/canvas-note-event.cc @@ -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(); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 37f71c6026..f8047868f4 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -366,7 +366,8 @@ RegionDrag::RegionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list::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(rv); const boost::shared_ptr original = rv->region(); - boost::shared_ptr region_copy = RegionFactory::create (original); + boost::shared_ptr 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) { diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 426e42ced2..abd319583b 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2218,7 +2218,7 @@ Editor::insert_region_list_drag (boost::shared_ptr 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)); } diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc index a66282a7ef..0cc8926371 100644 --- a/gtk2_ardour/editor_regions.cc +++ b/gtk2_ardour/editor_regions.cc @@ -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 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 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 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 r, const PropertyChange ++i; } - } if (what_changed.contains (ARDOUR::Properties::hidden)) { @@ -438,8 +459,11 @@ EditorRegions::selection_changed () boost::shared_ptr 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 r ((*iter)->region()); for (i = rows.begin(); i != rows.end(); ++i) { @@ -509,6 +535,7 @@ EditorRegions::set_selected_in_subrow (boost::shared_ptr 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 >::iterator r = tmp_region_list.begin(); r != tmp_region_list.end(); ++r) { add_region (*r); } diff --git a/gtk2_ardour/editor_regions.h b/gtk2_ardour/editor_regions.h index f899b00c55..8e41327c37 100644 --- a/gtk2_ardour/editor_regions.h +++ b/gtk2_ardour/editor_regions.h @@ -40,16 +40,20 @@ public: void reset_sort_type (Editing::RegionListSortType, bool); void set_selected (RegionSelection &); void selection_mapover (sigc::slot >); + boost::shared_ptr get_dragged_region (); boost::shared_ptr 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, PBD::PropertyChange const &); void selection_changed (); + sigc::connection _change_connection; + bool set_selected_in_subrow (boost::shared_ptr, Gtk::TreeModel::Row const &, int); bool selection_filter (const Glib::RefPtr& 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 &); diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 6f582b3518..20b93b71e5 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -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 src) { diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 53b8c1ef0b..c66c6dc220 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -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);