implement region marker deletion

This commit is contained in:
Paul Davis 2021-05-18 18:01:38 -06:00
parent bd2d8b8c87
commit 60a972a7de
7 changed files with 62 additions and 8 deletions

View file

@ -48,6 +48,7 @@
#include "gui_thread.h" #include "gui_thread.h"
#include "actions.h" #include "actions.h"
#include "editor_drag.h" #include "editor_drag.h"
#include "region_view.h"
#include "pbd/i18n.h" #include "pbd/i18n.h"
@ -791,7 +792,21 @@ gint
Editor::really_remove_region_marker (ArdourMarker* marker) Editor::really_remove_region_marker (ArdourMarker* marker)
{ {
begin_reversible_command (_("remove region 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 (); commit_reversible_command ();
return FALSE; return FALSE;
} }

View file

@ -71,7 +71,7 @@ void ArdourMarker::setup_sizes(const double timebar_height)
} }
ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, guint32 rgba, const string& annotation, 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) : editor (ed)
, _parent (&parent) , _parent (&parent)
@ -88,7 +88,7 @@ ArdourMarker::ArdourMarker (PublicEditor& ed, ArdourCanvas::Container& parent, g
, _right_label_limit (DBL_MAX) , _right_label_limit (DBL_MAX)
, _label_offset (0) , _label_offset (0)
, _line_height (-1) , _line_height (-1)
, _region_view (rv)
{ {
const double MH = marker_height - .5; const double MH = marker_height - .5;

View file

@ -41,6 +41,7 @@ namespace ARDOUR {
} }
class PublicEditor; class PublicEditor;
class RegionView;
/** Location Marker /** Location Marker
* *
@ -66,7 +67,7 @@ public:
ArdourMarker (PublicEditor& editor, ArdourCanvas::Container &, guint32 rgba, const std::string& text, Type, 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 (); virtual ~ArdourMarker ();
@ -106,6 +107,10 @@ public:
bool label_on_left () const; 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: protected:
PublicEditor& editor; PublicEditor& editor;
@ -137,6 +142,8 @@ protected:
double _label_offset; double _label_offset;
double _line_height; double _line_height;
RegionView* _region_view;
void reposition (); void reposition ();
void setup_line_x (); void setup_line_x ();
void setup_name_display (); void setup_name_display ();

View file

@ -590,7 +590,7 @@ RegionView::update_cue_markers ()
/* Create a new ViewCueMarker */ /* 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_points_color (color);
mark->set_show_line (true); mark->set_show_line (true);
/* make sure the line has a clean end, before the frame /* 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 (); (*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 */
}

View file

@ -133,6 +133,8 @@ public:
void update_visibility (); void update_visibility ();
ARDOUR::CueMarker find_model_cue_marker (ArdourMarker*);
protected: protected:
/** Allows derived types to specify their visibility requirements /** Allows derived types to specify their visibility requirements

View file

@ -375,6 +375,8 @@ public:
} }
void get_cue_markers (CueMarkers&, bool abs = false) const; void get_cue_markers (CueMarkers&, bool abs = false) const;
void remove_cue_marker (CueMarker&);
void clear_cue_markers ();
protected: protected:
virtual XMLNode& state (); virtual XMLNode& state ();

View file

@ -1925,8 +1925,8 @@ void
Region::get_cue_markers (CueMarkers& cues, bool abs) const Region::get_cue_markers (CueMarkers& cues, bool abs) const
{ {
bool was_empty = cues.empty (); bool was_empty = cues.empty ();
for (SourceList::const_iterator i = _sources.begin (); i != _sources.end(); ++i) { for (SourceList::const_iterator s = _sources.begin (); s != _sources.end(); ++s) {
CueMarkers const& x = (*i)->cue_markers (); CueMarkers const& x = (*s)->cue_markers ();
for (CueMarkers::const_iterator p = x.begin (); p != x.end (); ++p) { for (CueMarkers::const_iterator p = x.begin (); p != x.end (); ++p) {
if (abs) { if (abs) {
cues.insert (*p); 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 void
Region::drop_sources () Region::drop_sources ()
{ {