Use a dedicated Canvas Group for MRV

This fixes rendering of opaque MIDI regions (previously
MIDI regions were always transparent). This change provides a
way to "flatten" layered MIDI regions, while still allowing
to show the note-line and grid behind the regions.
This commit is contained in:
Robin Gareus 2022-12-09 01:36:15 +01:00
parent 1efa5e9a55
commit f003bee985
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
6 changed files with 24 additions and 12 deletions

View file

@ -1992,7 +1992,7 @@ RegionMoveDrag::finished_no_copy (
No need to do anything for copies as they are fake regions which will be deleted. No need to do anything for copies as they are fake regions which will be deleted.
*/ */
rv->get_canvas_group()->reparent (dest_rtv->view()->canvas_item()); rv->get_canvas_group()->reparent (dest_rtv->view()->region_canvas());
rv->get_canvas_group()->set_y_position (i->initial_y); rv->get_canvas_group()->set_y_position (i->initial_y);
rv->drag_end (); rv->drag_end ();
@ -2190,7 +2190,7 @@ RegionMotionDrag::aborted (bool)
TimeAxisView* tv = &(rv->get_time_axis_view ()); TimeAxisView* tv = &(rv->get_time_axis_view ());
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv); RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
assert (rtv); assert (rtv);
rv->get_canvas_group()->reparent (rtv->view()->canvas_item()); rv->get_canvas_group()->reparent (rtv->view()->region_canvas());
rv->get_canvas_group()->set_y_position (0); rv->get_canvas_group()->set_y_position (0);
rv->drag_end (); rv->drag_end ();
rv->move (-_total_x_delta, 0); rv->move (-_total_x_delta, 0);
@ -2248,7 +2248,7 @@ RegionInsertDrag::finished (GdkEvent * event, bool)
RouteTimeAxisView* dest_rtv = dynamic_cast<RouteTimeAxisView*> (_time_axis_views[pos]); RouteTimeAxisView* dest_rtv = dynamic_cast<RouteTimeAxisView*> (_time_axis_views[pos]);
_primary->get_canvas_group()->reparent (dest_rtv->view()->canvas_item()); _primary->get_canvas_group()->reparent (dest_rtv->view()->region_canvas());
_primary->get_canvas_group()->set_y_position (0); _primary->get_canvas_group()->set_y_position (0);
boost::shared_ptr<Playlist> playlist = dest_rtv->playlist(); boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();

View file

@ -208,7 +208,7 @@ MidiGhostRegion::MidiGhostRegion(MidiRegionView& rv,
TimeAxisView& source_tv, TimeAxisView& source_tv,
double initial_unit_pos) double initial_unit_pos)
: GhostRegion (rv, : GhostRegion (rv,
msv.midi_underlay_group, msv.midi_underlay(),
msv.trackview(), msv.trackview(),
source_tv, source_tv,
initial_unit_pos) initial_unit_pos)

View file

@ -3687,9 +3687,9 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo
uint32_t uint32_t
MidiRegionView::get_fill_color() const MidiRegionView::get_fill_color() const
{ {
const std::string mod_name = (_dragging ? "dragging region" : const std::string mod_name = _dragging ? "dragging region" :
trackview.editor().internal_editing() ? "editable region" : trackview.editor().internal_editing() ? "editable region" :
"midi frame base"); (_region->opaque() && !_region->muted ()) ? "opaque region base" : "transparent region base";
if (_selected) { if (_selected) {

View file

@ -74,9 +74,15 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv)
, _note_lines (0) , _note_lines (0)
, _updates_suspended (false) , _updates_suspended (false)
{ {
/* use a group dedicated to MIDI underlays. Audio underlays are not in this group. */ /* use a group dedicated to MIDI underlays. Audio underlays are not in this group. */
midi_underlay_group = new ArdourCanvas::Container (_canvas_group); _midi_underlay = new ArdourCanvas::Container (_canvas_group);
midi_underlay_group->lower_to_bottom(); _midi_underlay->lower_to_bottom();
/* use a dedicated group for MIDI regions (on top of the grid and lines) */
_region_group = new ArdourCanvas::Container (_canvas_group);
_region_group->raise_to_top ();
_region_group->set_render_with_alpha (UIConfiguration::instance().modifier ("region alpha").a());
/* put the note lines in the timeaxisview's group, so it /* put the note lines in the timeaxisview's group, so it
can be put below ghost regions from MIDI underlays can be put below ghost regions from MIDI underlays
@ -117,11 +123,11 @@ MidiStreamView::create_region_view (boost::shared_ptr<Region> r, bool /*wfd*/, b
RegionView* region_view = NULL; RegionView* region_view = NULL;
if (recording) { if (recording) {
region_view = new MidiRegionView ( region_view = new MidiRegionView (
_canvas_group, _trackview, region, _region_group, _trackview, region,
_samples_per_pixel, region_color, recording, _samples_per_pixel, region_color, recording,
TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame)); TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame));
} else { } else {
region_view = new MidiRegionView (_canvas_group, _trackview, region, region_view = new MidiRegionView (_region_group, _trackview, region,
_samples_per_pixel, region_color); _samples_per_pixel, region_color);
} }
@ -579,6 +585,7 @@ MidiStreamView::setup_rec_box ()
void void
MidiStreamView::color_handler () MidiStreamView::color_handler ()
{ {
_region_group->set_render_with_alpha (UIConfiguration::instance().modifier ("region alpha").a());
draw_note_lines (); draw_note_lines ();
if (_trackview.is_midi_track()) { if (_trackview.is_midi_track()) {

View file

@ -72,7 +72,6 @@ public:
}; };
Gtk::Adjustment note_range_adjustment; Gtk::Adjustment note_range_adjustment;
ArdourCanvas::Container* midi_underlay_group;
void set_note_range(VisibleNoteRange r); void set_note_range(VisibleNoteRange r);
@ -114,10 +113,16 @@ public:
void suspend_updates (); void suspend_updates ();
void resume_updates (); void resume_updates ();
ArdourCanvas::Container* midi_underlay () const { return _midi_underlay; }
ArdourCanvas::Container* region_canvas () const { return _region_group; }
protected: protected:
void setup_rec_box (); void setup_rec_box ();
void update_rec_box (); void update_rec_box ();
ArdourCanvas::Container* _midi_underlay;
ArdourCanvas::Container* _region_group;
private: private:
RegionView* add_region_view_internal ( RegionView* add_region_view_internal (

View file

@ -86,7 +86,7 @@ public:
virtual bool can_change_layer_display() const { return true; } virtual bool can_change_layer_display() const { return true; }
LayerDisplay layer_display () const { return _layer_display; } LayerDisplay layer_display () const { return _layer_display; }
ArdourCanvas::Container* canvas_item() { return _canvas_group; } virtual ArdourCanvas::Container* region_canvas () const { return _canvas_group; }
enum ColorTarget { enum ColorTarget {
RegionColor, RegionColor,