13
0

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
Signed by: rgareus
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.
*/
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->drag_end ();
@ -2190,7 +2190,7 @@ RegionMotionDrag::aborted (bool)
TimeAxisView* tv = &(rv->get_time_axis_view ());
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tv);
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->drag_end ();
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]);
_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);
boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();

View File

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

View File

@ -3687,9 +3687,9 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo
uint32_t
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" :
"midi frame base");
(_region->opaque() && !_region->muted ()) ? "opaque region base" : "transparent region base";
if (_selected) {

View File

@ -74,9 +74,15 @@ MidiStreamView::MidiStreamView (MidiTimeAxisView& tv)
, _note_lines (0)
, _updates_suspended (false)
{
/* use a group dedicated to MIDI underlays. Audio underlays are not in this group. */
midi_underlay_group = new ArdourCanvas::Container (_canvas_group);
midi_underlay_group->lower_to_bottom();
_midi_underlay = new ArdourCanvas::Container (_canvas_group);
_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
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;
if (recording) {
region_view = new MidiRegionView (
_canvas_group, _trackview, region,
_region_group, _trackview, region,
_samples_per_pixel, region_color, recording,
TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame));
} else {
region_view = new MidiRegionView (_canvas_group, _trackview, region,
region_view = new MidiRegionView (_region_group, _trackview, region,
_samples_per_pixel, region_color);
}
@ -579,6 +585,7 @@ MidiStreamView::setup_rec_box ()
void
MidiStreamView::color_handler ()
{
_region_group->set_render_with_alpha (UIConfiguration::instance().modifier ("region alpha").a());
draw_note_lines ();
if (_trackview.is_midi_track()) {

View File

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

View File

@ -86,7 +86,7 @@ public:
virtual bool can_change_layer_display() const { return true; }
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 {
RegionColor,