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 "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;
}

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,
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;

View File

@ -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 ();

View File

@ -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 */
}

View File

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

View File

@ -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 ();

View File

@ -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 ()
{