X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fghostregion.cc;h=2f9133803c97b1b19fb1f62aaedf3528af993d3e;hb=b3c78e906c33aa1cdc8e48f9b642f197e356e634;hp=cb4a0d95d3da0a9d09d971e6d5b00481746c9c81;hpb=ed626628b54e67dd9621c08d82a42afaed00c7ac;p=ardour.git diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index cb4a0d95d3..2f9133803c 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -18,15 +18,18 @@ */ #include "evoral/Note.hpp" +#include "canvas/container.h" +#include "canvas/rectangle.h" +#include "canvas/wave_view.h" +#include "canvas/debug.h" + #include "ardour_ui.h" #include "automation_time_axis.h" -#include "canvas-note.h" #include "ghostregion.h" #include "midi_streamview.h" #include "midi_time_axis.h" #include "rgb_macros.h" -#include "simplerect.h" -#include "waveview.h" +#include "note.h" using namespace std; using namespace Editing; @@ -35,19 +38,20 @@ using namespace ARDOUR; PBD::Signal1 GhostRegion::CatchDeletion; -GhostRegion::GhostRegion (ArdourCanvas::Group* parent, TimeAxisView& tv, TimeAxisView& source_tv, double initial_pos) +GhostRegion::GhostRegion (ArdourCanvas::Container* parent, TimeAxisView& tv, TimeAxisView& source_tv, double initial_pos) : trackview (tv) , source_trackview (source_tv) { - group = new ArdourCanvas::Group (*parent); - group->property_x() = initial_pos; - group->property_y() = 0.0; + group = new ArdourCanvas::Container (parent); + CANVAS_DEBUG_NAME (group, "ghost region"); + group->set_position (ArdourCanvas::Duple (initial_pos, 0)); - base_rect = new ArdourCanvas::SimpleRect (*group); - base_rect->property_x1() = (double) 0.0; - base_rect->property_y1() = (double) 0.0; - base_rect->property_y2() = (double) trackview.current_height(); - base_rect->property_outline_what() = (guint32) 0; + base_rect = new ArdourCanvas::Rectangle (group); + CANVAS_DEBUG_NAME (base_rect, "ghost region rect"); + base_rect->set_x0 (0); + base_rect->set_y0 (0.0); + base_rect->set_y1 (trackview.current_height() - 1.0); + base_rect->set_outline_what (ArdourCanvas::Rectangle::What (0)); if (!is_automation_ghost()) { base_rect->hide(); @@ -70,21 +74,21 @@ GhostRegion::~GhostRegion () void GhostRegion::set_duration (double units) { - base_rect->property_x2() = units; + base_rect->set_x1 (units); } void GhostRegion::set_height () { - base_rect->property_y2() = (double) trackview.current_height(); + base_rect->set_y1 (trackview.current_height()); } void GhostRegion::set_colors () { if (is_automation_ghost()) { - base_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackBase.get(); - base_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackBase.get(); + base_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackBase()); + base_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackBase()); } } @@ -108,28 +112,26 @@ AudioGhostRegion::AudioGhostRegion(TimeAxisView& tv, TimeAxisView& source_tv, do } void -AudioGhostRegion::set_samples_per_unit (double spu) +AudioGhostRegion::set_samples_per_pixel (double fpp) { for (vector::iterator i = waves.begin(); i != waves.end(); ++i) { - (*i)->property_samples_per_unit() = spu; + (*i)->set_samples_per_pixel (fpp); } } void AudioGhostRegion::set_height () { - gdouble ht; vector::iterator i; uint32_t n; GhostRegion::set_height(); - ht = ((trackview.current_height()) / (double) waves.size()); + double const ht = ((trackview.current_height()) / (double) waves.size()); for (n = 0, i = waves.begin(); i != waves.end(); ++i, ++n) { - gdouble yoff = n * ht; - (*i)->property_height() = ht; - (*i)->property_y() = yoff; + (*i)->set_height (ht); + (*i)->set_y_position (n * ht); } } @@ -140,17 +142,17 @@ AudioGhostRegion::set_colors () guint fill_color; if (is_automation_ghost()) { - fill_color = ARDOUR_UI::config()->canvasvar_GhostTrackWaveFill.get(); + fill_color = ARDOUR_UI::config()->get_canvasvar_GhostTrackWaveFill(); } else { fill_color = source_track_color(200); } for (uint32_t n=0; n < waves.size(); ++n) { - waves[n]->property_wave_color() = ARDOUR_UI::config()->canvasvar_GhostTrackWave.get(); - waves[n]->property_fill_color() = fill_color; - waves[n]->property_clip_color() = ARDOUR_UI::config()->canvasvar_GhostTrackWaveClip.get(); - waves[n]->property_zero_color() = ARDOUR_UI::config()->canvasvar_GhostTrackZeroLine.get(); + waves[n]->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackWave()); + waves[n]->set_fill_color (fill_color); + waves[n]->set_clip_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackWaveClip()); + waves[n]->set_zero_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackZeroLine()); } } @@ -189,25 +191,21 @@ MidiGhostRegion::~MidiGhostRegion() clear_events (); } -MidiGhostRegion::Event::Event(ArdourCanvas::CanvasNoteEvent* e) - : event(e) -{ - -} - -MidiGhostRegion::Note::Note(ArdourCanvas::CanvasNote* n, ArdourCanvas::Group* g) - : Event(n) +MidiGhostRegion::GhostEvent::GhostEvent (NoteBase* e, ArdourCanvas::Container* g) + : event (e) { - rect = new ArdourCanvas::SimpleRect(*g, n->x1(), n->y1(), n->x2(), n->y2()); + rect = new ArdourCanvas::Rectangle (g, ArdourCanvas::Rect (e->x0(), e->y0(), e->x1(), e->y1())); + CANVAS_DEBUG_NAME (rect, "ghost note rect"); } -MidiGhostRegion::Note::~Note() +MidiGhostRegion::GhostEvent::~GhostEvent () { + /* event is not ours to delete */ delete rect; } void -MidiGhostRegion::set_samples_per_unit (double /*spu*/) +MidiGhostRegion::set_samples_per_pixel (double /*spu*/) { } @@ -233,16 +231,13 @@ MidiGhostRegion::set_height () void MidiGhostRegion::set_colors() { - MidiGhostRegion::Note* note; guint fill = source_track_color(200); GhostRegion::set_colors(); for (EventList::iterator it = events.begin(); it != events.end(); ++it) { - if ((note = dynamic_cast(*it)) != 0) { - note->rect->property_fill_color_rgba() = fill; - note->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); - } + (*it)->rect->set_fill_color (fill); + (*it)->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackMidiOutline()); } } @@ -255,33 +250,30 @@ MidiGhostRegion::update_range () return; } - MidiGhostRegion::Note* note; - double const h = trackview.current_height() / double (mv->contents_note_range ()); + double const h = std::max(1., floor (trackview.current_height() / double (mv->contents_note_range ())) -1); for (EventList::iterator it = events.begin(); it != events.end(); ++it) { - if ((note = dynamic_cast(*it)) != 0) { - uint8_t const note_num = note->event->note()->note(); - - if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { - note->rect->hide(); - } else { - note->rect->show(); - double const y = trackview.current_height() - (note_num + 1 - mv->lowest_note()) * h + 1; - note->rect->property_y1() = y; - note->rect->property_y2() = y + h; - } + uint8_t const note_num = (*it)->event->note()->note(); + + if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { + (*it)->rect->hide(); + } else { + (*it)->rect->show(); + double const y = trackview.current_height() - (note_num + 1 - mv->lowest_note()) * h + 1; + (*it)->rect->set_y0 (y); + (*it)->rect->set_y1 (y + h); } } } void -MidiGhostRegion::add_note(ArdourCanvas::CanvasNote* n) +MidiGhostRegion::add_note (NoteBase* n) { - Note* note = new Note(n, group); - events.push_back(note); + GhostEvent* event = new GhostEvent (n, group); + events.push_back (event); - note->rect->property_fill_color_rgba() = source_track_color(200); - note->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); + event->rect->set_fill_color (source_track_color(200)); + event->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackMidiOutline()); MidiStreamView* mv = midi_view(); @@ -289,11 +281,11 @@ MidiGhostRegion::add_note(ArdourCanvas::CanvasNote* n) const uint8_t note_num = n->note()->note(); if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { - note->rect->hide(); + event->rect->hide(); } else { const double y = mv->note_to_y(note_num); - note->rect->property_y1() = y; - note->rect->property_y2() = y + mv->note_height(); + event->rect->set_y0 (y); + event->rect->set_y1 (y + std::max(1., floor(mv->note_height()) -1)); } } } @@ -306,26 +298,37 @@ MidiGhostRegion::clear_events() } events.clear(); + _optimization_iterator = events.end (); } /** Update the x positions of our representation of a parent's note. * @param parent The CanvasNote from the parent MidiRegionView. */ void -MidiGhostRegion::update_note (ArdourCanvas::CanvasNote* parent) +MidiGhostRegion::update_note (NoteBase* parent) { - Event* ev = find_event (parent); + GhostEvent* ev = find_event (parent); if (!ev) { return; } - Note* note = dynamic_cast (ev); - if (note) { - double const x1 = parent->property_x1 (); - double const x2 = parent->property_x2 (); - note->rect->property_x1 () = x1; - note->rect->property_x2 () = x2; + double const x1 = parent->x0 (); + double const x2 = parent->x1 (); + ev->rect->set_x0 (x1); + ev->rect->set_x1 (x2); +} + +void +MidiGhostRegion::remove_note (NoteBase* note) +{ + GhostEvent* ev = find_event (note); + if (!ev) { + return; } + + events.remove (ev); + delete ev; + _optimization_iterator = events.end (); } /** Given a note in our parent region (ie the actual MidiRegionView), find our @@ -333,8 +336,8 @@ MidiGhostRegion::update_note (ArdourCanvas::CanvasNote* parent) * @return Our Event, or 0 if not found. */ -MidiGhostRegion::Event * -MidiGhostRegion::find_event (ArdourCanvas::CanvasNote* parent) +MidiGhostRegion::GhostEvent * +MidiGhostRegion::find_event (NoteBase* parent) { /* we are using _optimization_iterator to speed up the common case where a caller is going through our notes in order.