diff options
author | David Robillard <d@drobilla.net> | 2014-11-13 21:32:08 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-11-13 21:32:08 -0500 |
commit | 589cc3162bb1bcae4d140f1314fc7b4138eaac98 (patch) | |
tree | 628a3106cd4053a7d7dad54979d410fe2ce9ef48 /gtk2_ardour | |
parent | 4ba4677b4538c551e000dcae1289f966a4b07c26 (diff) |
Fix crash when deleting overlapped regions.
Use RegionSelection for MIDI regions as well, since the old dumb stub didn't do
some things correctly. There's probably no reason to have a separate class for
this at all, and some good ones for putting all regions in the same selection,
so we should probably do that. For now they are still separate in the
selection but use the same base class.
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 6 | ||||
-rw-r--r-- | gtk2_ardour/midi_selection.cc | 26 | ||||
-rw-r--r-- | gtk2_ardour/midi_selection.h | 11 | ||||
-rw-r--r-- | gtk2_ardour/region_view.cc | 4 |
5 files changed, 35 insertions, 32 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index aa37467f2c..1f400310ae 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -1967,7 +1967,10 @@ NoteResizeDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*ignored*/) MidiRegionSelection::iterator next; next = r; ++next; - (*r)->begin_resizing (at_front); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->begin_resizing (at_front); + } r = next; } } @@ -1979,7 +1982,10 @@ NoteResizeDrag::motion (GdkEvent* /*event*/, bool /*first_move*/) for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) { NoteBase* nb = reinterpret_cast<NoteBase*> (_item->get_data ("notebase")); assert (nb); - (*r)->update_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->update_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + } } } @@ -1990,7 +1996,10 @@ NoteResizeDrag::finished (GdkEvent*, bool /*movement_occurred*/) for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) { NoteBase* nb = reinterpret_cast<NoteBase*> (_item->get_data ("notebase")); assert (nb); - (*r)->commit_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->commit_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative); + } } } @@ -1999,7 +2008,10 @@ NoteResizeDrag::aborted (bool) { MidiRegionSelection& ms (_editor->get_selection().midi_regions); for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) { - (*r)->abort_resizing (); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r); + if (mrv) { + mrv->abort_resizing (); + } } } diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 1f23aa4319..6dbbb4073f 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -4000,8 +4000,10 @@ void Editor::cut_copy_midi (CutCopyOp op) { for (MidiRegionSelection::iterator i = selection->midi_regions.begin(); i != selection->midi_regions.end(); ++i) { - MidiRegionView* mrv = *i; - mrv->cut_copy_clear (op); + MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i); + if (mrv) { + mrv->cut_copy_clear (op); + } } } diff --git a/gtk2_ardour/midi_selection.cc b/gtk2_ardour/midi_selection.cc index bf9b88899b..f98f696444 100644 --- a/gtk2_ardour/midi_selection.cc +++ b/gtk2_ardour/midi_selection.cc @@ -17,29 +17,19 @@ */ -#include "gtkmm2ext/gui_thread.h" -#include "midi_region_view.h" #include "midi_selection.h" -#include "region_view.h" MidiRegionSelection::MidiRegionSelection () -{ - RegionView::RegionViewGoingAway.connect (_death_connection, MISSING_INVALIDATOR, boost::bind (&MidiRegionSelection::remove_it, this, _1), gui_context()); -} + : RegionSelection () +{} -/** Copy constructor. - * @param other MidiRegionSelection to copy. - */ MidiRegionSelection::MidiRegionSelection (MidiRegionSelection const & other) - : std::list<MidiRegionView*> (other) -{ - RegionView::RegionViewGoingAway.connect (_death_connection, MISSING_INVALIDATOR, boost::bind (&MidiRegionSelection::remove_it, this, _1), gui_context()); -} - + : RegionSelection (other) +{} -void -MidiRegionSelection::remove_it (RegionView* rv) +MidiRegionSelection& +MidiRegionSelection::operator= (const MidiRegionSelection& other) { - MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (rv); - remove (mrv); + RegionSelection::operator=(other); + return *this; } diff --git a/gtk2_ardour/midi_selection.h b/gtk2_ardour/midi_selection.h index f2c2d3fc60..2aa04356d7 100644 --- a/gtk2_ardour/midi_selection.h +++ b/gtk2_ardour/midi_selection.h @@ -20,22 +20,19 @@ #ifndef __ardour_gtk_midi_selection_h__ #define __ardour_gtk_midi_selection_h__ -#include <list> -#include "pbd/signals.h" +#include "region_selection.h" class MidiRegionView; class MidiCutBuffer; class RegionView; -class MidiRegionSelection : public std::list<MidiRegionView*> +class MidiRegionSelection : public RegionSelection { public: MidiRegionSelection (); - MidiRegionSelection (MidiRegionSelection const &); + MidiRegionSelection (const MidiRegionSelection&); -private: - void remove_it (RegionView *); - PBD::ScopedConnection _death_connection; + MidiRegionSelection& operator= (const MidiRegionSelection&); }; struct MidiNoteSelection : std::list<MidiCutBuffer*> {}; diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index d4604b265d..fcdde48487 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -225,7 +225,9 @@ RegionView::~RegionView () bool RegionView::canvas_group_event (GdkEvent* event) { - return trackview.editor().canvas_region_view_event (event, group, this); + if (!in_destructor) { + return trackview.editor().canvas_region_view_event (event, group, this); + } } void |