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:
parent
1206b2973d
commit
ea2648503b
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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&);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user