From 60a972a7de7bfe680470c70a17311a6ed3367652 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 18 May 2021 18:01:38 -0600 Subject: [PATCH] implement region marker deletion --- gtk2_ardour/editor_markers.cc | 17 ++++++++++++++++- gtk2_ardour/marker.cc | 4 ++-- gtk2_ardour/marker.h | 9 ++++++++- gtk2_ardour/region_view.cc | 14 +++++++++++++- gtk2_ardour/region_view.h | 2 ++ libs/ardour/ardour/region.h | 4 +++- libs/ardour/region.cc | 20 ++++++++++++++++++-- 7 files changed, 62 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index f6e9acd677..0153972a42 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -48,6 +48,7 @@ #include "gui_thread.h" #include "actions.h" #include "editor_drag.h" +#include "region_view.h" #include "pbd/i18n.h" @@ -791,7 +792,21 @@ gint Editor::really_remove_region_marker (ArdourMarker* marker) { begin_reversible_command (_("remove region marker")); - cerr << "would remove this region marker\n"; + RegionView* rv = marker->region_view(); + + if (!rv) { + abort_reversible_command (); + return FALSE; + } + + CueMarker cm = rv->find_model_cue_marker (marker); + if (cm.text().empty()) { + abort_reversible_command (); + return FALSE; + } + + rv->region()->remove_cue_marker (cm); + commit_reversible_command (); return FALSE; } diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index b65f8b5d8e..dd225121b0 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -71,7 +71,7 @@ void ArdourMarker::setup_sizes(const double timebar_height) } ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation, - Type type, samplepos_t sample, bool handle_events) + Type type, samplepos_t sample, bool handle_events, RegionView* rv) : editor (ed) , _parent (&parent) @@ -88,7 +88,7 @@ ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, g , _right_label_limit (DBL_MAX) , _label_offset (0) , _line_height (-1) - + , _region_view (rv) { const double MH = marker_height - .5; diff --git a/gtk2_ardour/marker.h b/gtk2_ardour/marker.h index 564eb91f1f..d2dc0c8ebc 100644 --- a/gtk2_ardour/marker.h +++ b/gtk2_ardour/marker.h @@ -41,6 +41,7 @@ namespace ARDOUR { } class PublicEditor; +class RegionView; /** Location Marker * @@ -66,7 +67,7 @@ public: ArdourMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type, - samplepos_t sample = 0, bool handle_events = true); + samplepos_t sample = 0, bool handle_events = true, RegionView* rv = 0); virtual ~ArdourMarker (); @@ -106,6 +107,10 @@ public: bool label_on_left () const; + /* this will be null for all global markers; non-null for region markers */ + + RegionView* region_view() const { return _region_view; } + protected: PublicEditor& editor; @@ -137,6 +142,8 @@ protected: double _label_offset; double _line_height; + RegionView* _region_view; + void reposition (); void setup_line_x (); void setup_name_display (); diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index 372ed73492..0768cc6d1c 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -590,7 +590,7 @@ RegionView::update_cue_markers () /* Create a new ViewCueMarker */ - ArdourMarker* mark = new ArdourMarker (trackview.editor(), *group, color , c->text(), ArdourMarker::RegionCue, c->position() - start, true); + ArdourMarker* mark = new ArdourMarker (trackview.editor(), *group, color , c->text(), ArdourMarker::RegionCue, c->position() - start, true, this); mark->set_points_color (color); mark->set_show_line (true); /* make sure the line has a clean end, before the frame @@ -1204,3 +1204,15 @@ RegionView::maybe_raise_cue_markers () (*v)->view_marker->the_item().raise_to_top (); } } + +CueMarker +RegionView::find_model_cue_marker (ArdourMarker* m) +{ + for (ViewCueMarkers::iterator v = _cue_markers.begin(); v != _cue_markers.end(); ++v) { + if ((*v)->view_marker == m) { + return (*v)->model_marker; + } + } + + return CueMarker (string(), 0); /* empty string signifies invalid */ +} diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h index ee02d08e1c..c3f42061bd 100644 --- a/gtk2_ardour/region_view.h +++ b/gtk2_ardour/region_view.h @@ -133,6 +133,8 @@ public: void update_visibility (); + ARDOUR::CueMarker find_model_cue_marker (ArdourMarker*); + protected: /** Allows derived types to specify their visibility requirements diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index b107ea8be4..a89a3baaf5 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -375,7 +375,9 @@ public: } void get_cue_markers (CueMarkers&, bool abs = false) const; - + void remove_cue_marker (CueMarker&); + void clear_cue_markers (); + protected: virtual XMLNode& state (); diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 371644f9ca..068421f7e3 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -1925,8 +1925,8 @@ void Region::get_cue_markers (CueMarkers& cues, bool abs) const { bool was_empty = cues.empty (); - for (SourceList::const_iterator i = _sources.begin (); i != _sources.end(); ++i) { - CueMarkers const& x = (*i)->cue_markers (); + for (SourceList::const_iterator s = _sources.begin (); s != _sources.end(); ++s) { + CueMarkers const& x = (*s)->cue_markers (); for (CueMarkers::const_iterator p = x.begin (); p != x.end (); ++p) { if (abs) { cues.insert (*p); @@ -1937,6 +1937,22 @@ Region::get_cue_markers (CueMarkers& cues, bool abs) const } } +void +Region::remove_cue_marker (CueMarker& cm) +{ + for (SourceList::iterator s = _sources.begin (); s != _sources.end(); ++s) { + (*s)->remove_cue_marker (cm); + } +} + +void +Region::clear_cue_markers () +{ + for (SourceList::iterator s = _sources.begin (); s != _sources.end(); ++s) { + (*s)->clear_cue_markers (); + } +} + void Region::drop_sources () {