13
0
livetrax/gtk2_ardour/ghost_event.cc

76 lines
1.7 KiB
C++

#include "canvas/container.h"
#include "canvas/debug.h"
#include "canvas/polygon.h"
#include "ghost_event.h"
#include "hit.h"
#include "note.h"
#include "note_base.h"
GhostEvent::GhostEvent (NoteBase* e, ArdourCanvas::Container* g, ArdourCanvas::Item* i)
: event (e)
, item (i)
, is_hit (false)
{
velocity_while_editing = event->note()->velocity();
if (dynamic_cast<Hit*>(e)) {
is_hit = true;
}
}
GhostEvent::GhostEvent (NoteBase* e, ArdourCanvas::Container* g)
: event (e)
{
if (dynamic_cast<Note*>(e)) {
item = new ArdourCanvas::Rectangle (g, ArdourCanvas::Rect(e->x0(), e->y0(), e->x1(), e->y1()));
is_hit = false;
} else {
Hit* hit = dynamic_cast<Hit*>(e);
if (!hit) {
return;
}
ArdourCanvas::Polygon* poly = new ArdourCanvas::Polygon(g);
poly->set(Hit::points(e->y1() - e->y0()));
poly->set_position(hit->position());
item = poly;
is_hit = true;
}
velocity_while_editing = event->note()->velocity();
CANVAS_DEBUG_NAME (item, "ghost note item");
}
GhostEvent::~GhostEvent ()
{
/* event is not ours to delete */
delete item;
}
/** Given a note in our parent region (ie the actual MidiRegionView), find our
* representation of it.
* @return Our Event, or 0 if not found.
*/
GhostEvent *
GhostEvent::find (std::shared_ptr<GhostEvent::NoteType> parent, EventList& events, EventList::iterator& opti)
{
/* we are using _optimization_iterator to speed up the common case where a caller
is going through our notes in order.
*/
if (opti != events.end()) {
++opti;
if (opti != events.end() && opti->first == parent) {
return opti->second;
}
}
opti = events.find (parent);
if (opti != events.end()) {
return opti->second;
}
return nullptr;
}