Cleanup of region drag code to be a bit more efficient and shorter. Fixes crashes when dragging regions to the wrong track type.

git-svn-id: svn://localhost/ardour2/branches/3.0@7744 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-09-06 12:34:11 +00:00
parent 1206b2973d
commit ea2648503b
14 changed files with 327 additions and 606 deletions

View File

@ -26,7 +26,7 @@ bool
CanvasHit::on_event(GdkEvent* ev)
{
if (!CanvasNoteEvent::on_event (ev)) {
return _region.get_trackview().editor().canvas_note_event (ev, this);
return _region.get_time_axis_view().editor().canvas_note_event (ev, this);
}
return true;
}

View File

@ -23,7 +23,7 @@ bool
CanvasNote::on_event(GdkEvent* ev)
{
if (!CanvasNoteEvent::on_event (ev)) {
return _region.get_trackview().editor().canvas_note_event (ev, this);
return _region.get_time_axis_view().editor().canvas_note_event (ev, this);
}
return true;

View File

@ -80,7 +80,7 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, Gnome::Canvas::CanvasNoteEve
table->attach (_time_clock, 1, 2, r, r + 1);
++r;
_time_clock.set_session (_region_view->get_trackview().session ());
_time_clock.set_session (_region_view->get_time_axis_view().session ());
_time_clock.set_mode (AudioClock::BBT);
_time_clock.set (_region_view->time_converter().to (ev->note()->time ()), true);
@ -90,7 +90,7 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, Gnome::Canvas::CanvasNoteEve
table->attach (_length_clock, 1, 2, r, r + 1);
++r;
_length_clock.set_session (_region_view->get_trackview().session ());
_length_clock.set_session (_region_view->get_time_axis_view().session ());
_length_clock.set_mode (AudioClock::BBT);
_length_clock.set (_region_view->time_converter().to (ev->note()->length ()), true);

File diff suppressed because it is too large Load Diff

View File

@ -221,11 +221,18 @@ private:
nframes64_t _last_pointer_frame; ///< adjusted_frame the last time a motion occurred
};
class RegionDrag;
/** Container for details about a region being dragged */
struct DraggingView
{
DraggingView (RegionView* v);
DraggingView (RegionView *, RegionDrag *);
RegionView* view; ///< the view
/** index into RegionDrag::_time_axis_views of the view that this region is currently beind displayed on */
int time_axis_view;
/** layer that this region is currently being displayed on */
ARDOUR::layer_t layer;
double initial_y; ///< the initial y position of the view before any reparenting
boost::shared_ptr<ARDOUR::Playlist> initial_playlist;
};
@ -242,7 +249,17 @@ protected:
RegionView* _primary; ///< the view that was clicked on (or whatever) to start the drag
std::list<DraggingView> _views; ///< information about all views that are being dragged
/** a list of the non-hidden TimeAxisViews sorted by editor order key */
std::vector<TimeAxisView*> _time_axis_views;
int find_time_axis_view (TimeAxisView *) const;
int _visible_y_low;
int _visible_y_high;
friend class DraggingView;
private:
void region_going_away (RegionView *);
PBD::ScopedConnection death_connection;
};
@ -267,33 +284,15 @@ public:
virtual bool regions_came_from_canvas () const = 0;
protected:
struct TimeAxisViewSummary {
TimeAxisViewSummary () : height_list(512) {}
std::bitset<512> tracks;
std::vector<int32_t> height_list;
int visible_y_low;
int visible_y_high;
};
void copy_regions (GdkEvent *);
bool y_movement_disallowed (int, int, int, TimeAxisViewSummary const &) const;
std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > find_time_axis_views_and_layers ();
double compute_x_delta (GdkEvent const *, nframes64_t *);
bool compute_y_delta (
TimeAxisView const *, TimeAxisView*, int32_t, int32_t, TimeAxisViewSummary const &,
int32_t *, int32_t *, int32_t *
);
bool y_movement_allowed (int, ARDOUR::layer_t) const;
TimeAxisViewSummary get_time_axis_view_summary ();
bool x_move_allowed () const;
TimeAxisView* _dest_trackview;
ARDOUR::layer_t _dest_layer;
bool check_possible (RouteTimeAxisView **, ARDOUR::layer_t *);
bool _brushing;
nframes64_t _last_frame_position; ///< last position of the thing being dragged
double _total_x_delta;
int _last_pointer_time_axis_view;
ARDOUR::layer_t _last_pointer_layer;
};
@ -323,14 +322,12 @@ private:
typedef std::set<boost::shared_ptr<ARDOUR::Playlist> > PlaylistSet;
void finished_no_copy (
std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > const &,
bool const,
bool const,
ARDOUR::framecnt_t const
);
void finished_copy (
std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > const &,
bool const,
bool const,
ARDOUR::framecnt_t const

View File

@ -4131,7 +4131,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
}
}
TimeAxisView* tv = &(*x)->get_trackview();
TimeAxisView* tv = &(*x)->get_time_axis_view();
vector<PlaylistMapping>::iterator z;
for (z = pmap.begin(); z != pmap.end(); ++z) {
@ -4154,7 +4154,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
continue;
}
TimeAxisView& tv = (*x)->get_trackview();
TimeAxisView& tv = (*x)->get_time_axis_view();
boost::shared_ptr<Playlist> npl;
RegionSelection::iterator tmp;

View File

@ -430,7 +430,7 @@ Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t, RegionVi
void
Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions, PBD::PropertyID property) const
{
mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview(), property);
mapover_tracks (sigc::bind (sigc::mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_time_axis_view(), property);
/* add clicked regionview since we skipped all other regions in the same track as the one it was in */
@ -448,7 +448,7 @@ Editor::get_equivalent_regions (RegionSelection & basis, PBD::PropertyID prop) c
mapover_tracks (
sigc::bind (sigc::mem_fun (*this, &Editor::mapped_get_equivalent_regions), *i, &eq),
&(*i)->get_trackview(), prop
&(*i)->get_time_axis_view(), prop
);
for (vector<RegionView*>::iterator j = eq.begin(); j != eq.end(); ++j) {

View File

@ -253,10 +253,10 @@ struct RegionSortByTrack {
/* really, track and position */
if (a->get_trackview().order() == b->get_trackview().order()) {
if (a->get_time_axis_view().order() == b->get_time_axis_view().order()) {
return a->region()->position() < b->region()->position();
} else {
return a->get_trackview().order() < b->get_trackview().order();
return a->get_time_axis_view().order() < b->get_time_axis_view().order();
}
}
};
@ -298,7 +298,7 @@ bool
RegionSelection::involves (const TimeAxisView& tv) const
{
for (RegionSelection::const_iterator i = begin(); i != end(); ++i) {
if (&(*i)->get_trackview() == &tv) {
if (&(*i)->get_time_axis_view() == &tv) {
return true;
}
}

View File

@ -400,7 +400,7 @@ Selection::add (vector<RegionView*>& v)
if (find (regions.begin(), regions.end(), (*i)) == regions.end()) {
changed = regions.add ((*i));
if (Config->get_link_region_and_track_selection() && changed) {
add (&(*i)->get_trackview());
add (&(*i)->get_time_axis_view());
}
}
}
@ -422,7 +422,7 @@ Selection::add (const RegionSelection& rs)
if (find (regions.begin(), regions.end(), (*i)) == regions.end()) {
changed = regions.add ((*i));
if (Config->get_link_region_and_track_selection() && changed) {
add (&(*i)->get_trackview());
add (&(*i)->get_time_axis_view());
}
}
}
@ -438,7 +438,7 @@ Selection::add (RegionView* r)
if (find (regions.begin(), regions.end(), r) == regions.end()) {
regions.add (r);
if (Config->get_link_region_and_track_selection()) {
add (&r->get_trackview());
add (&r->get_time_axis_view());
}
RegionsChanged ();
}
@ -452,7 +452,7 @@ Selection::add (MidiRegionView* mrv)
/* XXX should we do this? */
#if 0
if (Config->get_link_region_and_track_selection()) {
add (&mrv->get_trackview());
add (&mrv->get_time_axis_view());
}
#endif
MidiRegionsChanged ();
@ -610,8 +610,8 @@ Selection::remove (RegionView* r)
RegionsChanged ();
}
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_trackview())) {
remove (&r->get_trackview());
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_time_axis_view())) {
remove (&r->get_time_axis_view());
}
}
@ -627,8 +627,8 @@ Selection::remove (MidiRegionView* mrv)
#if 0
/* XXX fix this up ? */
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_trackview())) {
remove (&r->get_trackview());
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_time_axis_view())) {
remove (&r->get_time_axis_view());
}
#endif
}

View File

@ -472,7 +472,7 @@ TimeAxisViewItem::set_should_show_selection (bool yn)
/** @return the TimeAxisView that this item is on */
TimeAxisView&
TimeAxisViewItem::get_time_axis_view()
TimeAxisViewItem::get_time_axis_view () const
{
return trackview;
}

View File

@ -61,7 +61,7 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
virtual void set_should_show_selection (bool yn);
void set_sensitive (bool yn) { _sensitive = yn; }
bool sensitive () const { return _sensitive; }
TimeAxisView& get_time_axis_view();
TimeAxisView& get_time_axis_view () const;
void set_name_text(const Glib::ustring&);
virtual void set_height(double h);
void set_y (double);
@ -72,8 +72,6 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
ArdourCanvas::Item* get_name_highlight();
ArdourCanvas::Pixbuf* get_name_pixbuf();
TimeAxisView& get_trackview() const { return trackview; }
virtual void set_samples_per_unit(double spu);
double get_samples_per_unit();

View File

@ -45,6 +45,10 @@ class AudioTrack : public Track
void use_new_diskstream ();
void set_diskstream (boost::shared_ptr<Diskstream>);
DataType data_type () const {
return DataType::AUDIO;
}
int export_stuff (BufferSet& bufs, sframes_t start_frame, nframes_t nframes, bool enable_processing = true);
void freeze_me (InterThreadInfo&);

View File

@ -48,6 +48,10 @@ public:
void set_diskstream (boost::shared_ptr<Diskstream>);
void set_record_enabled (bool yn, void *src);
DataType data_type () const {
return DataType::MIDI;
}
void set_latency_delay (nframes_t);
int export_stuff (BufferSet& bufs, nframes_t nframes, sframes_t end_frame);

View File

@ -60,6 +60,8 @@ class Track : public Route, public PublicDiskstream
bool needs_butler() const { return _needs_butler; }
void toggle_monitor_input ();
virtual DataType data_type () const = 0;
bool can_record();
virtual void use_new_diskstream () = 0;