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)
|
CanvasHit::on_event(GdkEvent* ev)
|
||||||
{
|
{
|
||||||
if (!CanvasNoteEvent::on_event (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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ bool
|
||||||
CanvasNote::on_event(GdkEvent* ev)
|
CanvasNote::on_event(GdkEvent* ev)
|
||||||
{
|
{
|
||||||
if (!CanvasNoteEvent::on_event (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;
|
return true;
|
||||||
|
|
|
@ -80,7 +80,7 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, Gnome::Canvas::CanvasNoteEve
|
||||||
table->attach (_time_clock, 1, 2, r, r + 1);
|
table->attach (_time_clock, 1, 2, r, r + 1);
|
||||||
++r;
|
++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_mode (AudioClock::BBT);
|
||||||
_time_clock.set (_region_view->time_converter().to (ev->note()->time ()), true);
|
_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);
|
table->attach (_length_clock, 1, 2, r, r + 1);
|
||||||
++r;
|
++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_mode (AudioClock::BBT);
|
||||||
_length_clock.set (_region_view->time_converter().to (ev->note()->length ()), true);
|
_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
|
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
|
struct DraggingView
|
||||||
{
|
{
|
||||||
DraggingView (RegionView* v);
|
DraggingView (RegionView *, RegionDrag *);
|
||||||
|
|
||||||
RegionView* view; ///< the view
|
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
|
double initial_y; ///< the initial y position of the view before any reparenting
|
||||||
boost::shared_ptr<ARDOUR::Playlist> initial_playlist;
|
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
|
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
|
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:
|
private:
|
||||||
|
|
||||||
void region_going_away (RegionView *);
|
void region_going_away (RegionView *);
|
||||||
PBD::ScopedConnection death_connection;
|
PBD::ScopedConnection death_connection;
|
||||||
};
|
};
|
||||||
|
@ -267,33 +284,15 @@ public:
|
||||||
virtual bool regions_came_from_canvas () const = 0;
|
virtual bool regions_came_from_canvas () const = 0;
|
||||||
|
|
||||||
protected:
|
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 *);
|
double compute_x_delta (GdkEvent const *, nframes64_t *);
|
||||||
bool compute_y_delta (
|
bool y_movement_allowed (int, ARDOUR::layer_t) const;
|
||||||
TimeAxisView const *, TimeAxisView*, int32_t, int32_t, TimeAxisViewSummary const &,
|
|
||||||
int32_t *, int32_t *, int32_t *
|
|
||||||
);
|
|
||||||
|
|
||||||
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;
|
bool _brushing;
|
||||||
nframes64_t _last_frame_position; ///< last position of the thing being dragged
|
nframes64_t _last_frame_position; ///< last position of the thing being dragged
|
||||||
double _total_x_delta;
|
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;
|
typedef std::set<boost::shared_ptr<ARDOUR::Playlist> > PlaylistSet;
|
||||||
|
|
||||||
void finished_no_copy (
|
void finished_no_copy (
|
||||||
std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > const &,
|
|
||||||
bool const,
|
bool const,
|
||||||
bool const,
|
bool const,
|
||||||
ARDOUR::framecnt_t const
|
ARDOUR::framecnt_t const
|
||||||
);
|
);
|
||||||
|
|
||||||
void finished_copy (
|
void finished_copy (
|
||||||
std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > const &,
|
|
||||||
bool const,
|
bool const,
|
||||||
bool const,
|
bool const,
|
||||||
ARDOUR::framecnt_t 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;
|
vector<PlaylistMapping>::iterator z;
|
||||||
|
|
||||||
for (z = pmap.begin(); z != pmap.end(); ++z) {
|
for (z = pmap.begin(); z != pmap.end(); ++z) {
|
||||||
|
@ -4154,7 +4154,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeAxisView& tv = (*x)->get_trackview();
|
TimeAxisView& tv = (*x)->get_time_axis_view();
|
||||||
boost::shared_ptr<Playlist> npl;
|
boost::shared_ptr<Playlist> npl;
|
||||||
RegionSelection::iterator tmp;
|
RegionSelection::iterator tmp;
|
||||||
|
|
||||||
|
|
|
@ -430,7 +430,7 @@ Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t, RegionVi
|
||||||
void
|
void
|
||||||
Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions, PBD::PropertyID property) const
|
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 */
|
/* 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 (
|
mapover_tracks (
|
||||||
sigc::bind (sigc::mem_fun (*this, &Editor::mapped_get_equivalent_regions), *i, &eq),
|
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) {
|
for (vector<RegionView*>::iterator j = eq.begin(); j != eq.end(); ++j) {
|
||||||
|
|
|
@ -253,10 +253,10 @@ struct RegionSortByTrack {
|
||||||
|
|
||||||
/* really, track and position */
|
/* 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();
|
return a->region()->position() < b->region()->position();
|
||||||
} else {
|
} 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
|
RegionSelection::involves (const TimeAxisView& tv) const
|
||||||
{
|
{
|
||||||
for (RegionSelection::const_iterator i = begin(); i != end(); ++i) {
|
for (RegionSelection::const_iterator i = begin(); i != end(); ++i) {
|
||||||
if (&(*i)->get_trackview() == &tv) {
|
if (&(*i)->get_time_axis_view() == &tv) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -400,7 +400,7 @@ Selection::add (vector<RegionView*>& v)
|
||||||
if (find (regions.begin(), regions.end(), (*i)) == regions.end()) {
|
if (find (regions.begin(), regions.end(), (*i)) == regions.end()) {
|
||||||
changed = regions.add ((*i));
|
changed = regions.add ((*i));
|
||||||
if (Config->get_link_region_and_track_selection() && changed) {
|
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()) {
|
if (find (regions.begin(), regions.end(), (*i)) == regions.end()) {
|
||||||
changed = regions.add ((*i));
|
changed = regions.add ((*i));
|
||||||
if (Config->get_link_region_and_track_selection() && changed) {
|
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()) {
|
if (find (regions.begin(), regions.end(), r) == regions.end()) {
|
||||||
regions.add (r);
|
regions.add (r);
|
||||||
if (Config->get_link_region_and_track_selection()) {
|
if (Config->get_link_region_and_track_selection()) {
|
||||||
add (&r->get_trackview());
|
add (&r->get_time_axis_view());
|
||||||
}
|
}
|
||||||
RegionsChanged ();
|
RegionsChanged ();
|
||||||
}
|
}
|
||||||
|
@ -452,7 +452,7 @@ Selection::add (MidiRegionView* mrv)
|
||||||
/* XXX should we do this? */
|
/* XXX should we do this? */
|
||||||
#if 0
|
#if 0
|
||||||
if (Config->get_link_region_and_track_selection()) {
|
if (Config->get_link_region_and_track_selection()) {
|
||||||
add (&mrv->get_trackview());
|
add (&mrv->get_time_axis_view());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
MidiRegionsChanged ();
|
MidiRegionsChanged ();
|
||||||
|
@ -610,8 +610,8 @@ Selection::remove (RegionView* r)
|
||||||
RegionsChanged ();
|
RegionsChanged ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_trackview())) {
|
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_time_axis_view())) {
|
||||||
remove (&r->get_trackview());
|
remove (&r->get_time_axis_view());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -627,8 +627,8 @@ Selection::remove (MidiRegionView* mrv)
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* XXX fix this up ? */
|
/* XXX fix this up ? */
|
||||||
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_trackview())) {
|
if (Config->get_link_region_and_track_selection() && !regions.involves (r->get_time_axis_view())) {
|
||||||
remove (&r->get_trackview());
|
remove (&r->get_time_axis_view());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -472,7 +472,7 @@ TimeAxisViewItem::set_should_show_selection (bool yn)
|
||||||
|
|
||||||
/** @return the TimeAxisView that this item is on */
|
/** @return the TimeAxisView that this item is on */
|
||||||
TimeAxisView&
|
TimeAxisView&
|
||||||
TimeAxisViewItem::get_time_axis_view()
|
TimeAxisViewItem::get_time_axis_view () const
|
||||||
{
|
{
|
||||||
return trackview;
|
return trackview;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
|
||||||
virtual void set_should_show_selection (bool yn);
|
virtual void set_should_show_selection (bool yn);
|
||||||
void set_sensitive (bool yn) { _sensitive = yn; }
|
void set_sensitive (bool yn) { _sensitive = yn; }
|
||||||
bool sensitive () const { return _sensitive; }
|
bool sensitive () const { return _sensitive; }
|
||||||
TimeAxisView& get_time_axis_view();
|
TimeAxisView& get_time_axis_view () const;
|
||||||
void set_name_text(const Glib::ustring&);
|
void set_name_text(const Glib::ustring&);
|
||||||
virtual void set_height(double h);
|
virtual void set_height(double h);
|
||||||
void set_y (double);
|
void set_y (double);
|
||||||
|
@ -72,8 +72,6 @@ class TimeAxisViewItem : public Selectable, public PBD::ScopedConnectionList
|
||||||
ArdourCanvas::Item* get_name_highlight();
|
ArdourCanvas::Item* get_name_highlight();
|
||||||
ArdourCanvas::Pixbuf* get_name_pixbuf();
|
ArdourCanvas::Pixbuf* get_name_pixbuf();
|
||||||
|
|
||||||
TimeAxisView& get_trackview() const { return trackview; }
|
|
||||||
|
|
||||||
virtual void set_samples_per_unit(double spu);
|
virtual void set_samples_per_unit(double spu);
|
||||||
|
|
||||||
double get_samples_per_unit();
|
double get_samples_per_unit();
|
||||||
|
|
|
@ -45,6 +45,10 @@ class AudioTrack : public Track
|
||||||
void use_new_diskstream ();
|
void use_new_diskstream ();
|
||||||
void set_diskstream (boost::shared_ptr<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);
|
int export_stuff (BufferSet& bufs, sframes_t start_frame, nframes_t nframes, bool enable_processing = true);
|
||||||
|
|
||||||
void freeze_me (InterThreadInfo&);
|
void freeze_me (InterThreadInfo&);
|
||||||
|
|
|
@ -48,6 +48,10 @@ public:
|
||||||
void set_diskstream (boost::shared_ptr<Diskstream>);
|
void set_diskstream (boost::shared_ptr<Diskstream>);
|
||||||
void set_record_enabled (bool yn, void *src);
|
void set_record_enabled (bool yn, void *src);
|
||||||
|
|
||||||
|
DataType data_type () const {
|
||||||
|
return DataType::MIDI;
|
||||||
|
}
|
||||||
|
|
||||||
void set_latency_delay (nframes_t);
|
void set_latency_delay (nframes_t);
|
||||||
|
|
||||||
int export_stuff (BufferSet& bufs, nframes_t nframes, sframes_t end_frame);
|
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; }
|
bool needs_butler() const { return _needs_butler; }
|
||||||
void toggle_monitor_input ();
|
void toggle_monitor_input ();
|
||||||
|
|
||||||
|
virtual DataType data_type () const = 0;
|
||||||
|
|
||||||
bool can_record();
|
bool can_record();
|
||||||
|
|
||||||
virtual void use_new_diskstream () = 0;
|
virtual void use_new_diskstream () = 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user