X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fghostregion.cc;h=6f4b56eed91572d1b56784c945b176dd9c7baac0;hb=0038820f473664a9a4fb524537cd846a9e024661;hp=f75982cc768fa0930e8a8f2651ebaa1cf490ef78;hpb=59076a7e4c66db12bbbfbf01f012ca2f6ba4bf56;p=ardour.git diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index f75982cc76..6f4b56eed9 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -18,7 +18,8 @@ */ #include "evoral/Note.hpp" -#include "canvas/group.h" +#include "canvas/container.h" +#include "canvas/polygon.h" #include "canvas/rectangle.h" #include "canvas/wave_view.h" #include "canvas/debug.h" @@ -30,6 +31,7 @@ #include "midi_time_axis.h" #include "rgb_macros.h" #include "note.h" +#include "hit.h" using namespace std; using namespace Editing; @@ -38,20 +40,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 = new ArdourCanvas::Container (parent); CANVAS_DEBUG_NAME (group, "ghost region"); group->set_position (ArdourCanvas::Duple (initial_pos, 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); + base_rect->set_y0 (1.0); base_rect->set_y1 (trackview.current_height()); - base_rect->set_outline_what (0); + base_rect->set_outline (false); if (!is_automation_ghost()) { base_rect->hide(); @@ -87,8 +89,7 @@ void GhostRegion::set_colors () { if (is_automation_ghost()) { - base_rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackBase()); - base_rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackBase()); + base_rect->set_fill_color (ARDOUR_UI::config()->color_mod ("ghost track base", "ghost track base")); } } @@ -142,17 +143,17 @@ AudioGhostRegion::set_colors () guint fill_color; if (is_automation_ghost()) { - fill_color = ARDOUR_UI::config()->get_canvasvar_GhostTrackWaveFill(); + fill_color = ARDOUR_UI::config()->color ("ghost track wave fill"); } else { fill_color = source_track_color(200); } for (uint32_t n=0; n < waves.size(); ++n) { - waves[n]->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackWave()); + waves[n]->set_outline_color (ARDOUR_UI::config()->color ("ghost track wave")); 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()); + waves[n]->set_clip_color (ARDOUR_UI::config()->color ("ghost track wave clip")); + waves[n]->set_zero_color (ARDOUR_UI::config()->color ("ghost track zero line")); } } @@ -191,17 +192,27 @@ MidiGhostRegion::~MidiGhostRegion() clear_events (); } -MidiGhostRegion::GhostEvent::GhostEvent (NoteBase* e, ArdourCanvas::Group* g) +MidiGhostRegion::GhostEvent::GhostEvent (NoteBase* e, ArdourCanvas::Container* g) : event (e) { - rect = new ArdourCanvas::Rectangle (g, ArdourCanvas::Rect (e->x0(), e->y0(), e->x1(), e->y1())); - CANVAS_DEBUG_NAME (rect, "ghost note rect"); + Hit* hit = NULL; + if (dynamic_cast(e)) { + item = new ArdourCanvas::Rectangle( + g, ArdourCanvas::Rect(e->x0(), e->y0(), e->x1(), e->y1())); + } else if ((hit = dynamic_cast(e))) { + ArdourCanvas::Polygon* poly = new ArdourCanvas::Polygon(g); + poly->set(Hit::points(e->y1() - e->y0())); + poly->set_position(hit->position()); + item = poly; + } + + CANVAS_DEBUG_NAME (item, "ghost note item"); } MidiGhostRegion::GhostEvent::~GhostEvent () { /* event is not ours to delete */ - delete rect; + delete item; } void @@ -231,16 +242,33 @@ MidiGhostRegion::set_height () void MidiGhostRegion::set_colors() { - guint fill = source_track_color(200); - GhostRegion::set_colors(); for (EventList::iterator it = events.begin(); it != events.end(); ++it) { - (*it)->rect->set_fill_color (fill); - (*it)->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackMidiOutline()); + (*it)->item->set_fill_color (ARDOUR_UI::config()->color_mod((*it)->event->base_color(), "ghost track midi fill")); + (*it)->item->set_outline_color (ARDOUR_UI::config()->color ("ghost track midi outline")); } } +static double +note_height(TimeAxisView& trackview, MidiStreamView* mv) +{ + const double tv_height = trackview.current_height(); + const double note_range = mv->contents_note_range(); + + return std::max(1.0, floor(tv_height / note_range - 1.0)); +} + +static double +note_y(TimeAxisView& trackview, MidiStreamView* mv, uint8_t note_num) +{ + const double tv_height = trackview.current_height(); + const double note_range = mv->contents_note_range(); + const double s = tv_height / note_range; + + return tv_height - (note_num + 1 - mv->lowest_note()) * s; +} + void MidiGhostRegion::update_range () { @@ -250,18 +278,27 @@ MidiGhostRegion::update_range () return; } - double const h = trackview.current_height() / double (mv->contents_note_range ()); + double const h = note_height(trackview, mv); for (EventList::iterator it = events.begin(); it != events.end(); ++it) { uint8_t const note_num = (*it)->event->note()->note(); if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { - (*it)->rect->hide(); + (*it)->item->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); + (*it)->item->show(); + double const y = note_y(trackview, mv, note_num); + ArdourCanvas::Rectangle* rect = NULL; + ArdourCanvas::Polygon* poly = NULL; + if ((rect = dynamic_cast((*it)->item))) { + rect->set_y0 (y); + rect->set_y1 (y + h); + } else if ((poly = dynamic_cast((*it)->item))) { + Duple position = poly->position(); + position.y = y; + poly->set_position(position); + poly->set(Hit::points(h)); + } } } } @@ -272,20 +309,30 @@ MidiGhostRegion::add_note (NoteBase* n) GhostEvent* event = new GhostEvent (n, group); events.push_back (event); - event->rect->set_fill_color (source_track_color(200)); - event->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_GhostTrackMidiOutline()); + event->item->set_fill_color (ARDOUR_UI::config()->color_mod(n->base_color(), "ghost track midi fill")); + event->item->set_outline_color (ARDOUR_UI::config()->color ("ghost track midi outline")); MidiStreamView* mv = midi_view(); if (mv) { - const uint8_t note_num = n->note()->note(); + uint8_t const note_num = n->note()->note(); + double const h = note_height(trackview, mv); + double const y = note_y(trackview, mv, note_num); if (note_num < mv->lowest_note() || note_num > mv->highest_note()) { - event->rect->hide(); + event->item->hide(); } else { - const double y = mv->note_to_y(note_num); - event->rect->set_y0 (y); - event->rect->set_y1 (y + mv->note_height()); + ArdourCanvas::Rectangle* rect = NULL; + ArdourCanvas::Polygon* poly = NULL; + if ((rect = dynamic_cast(event->item))) { + rect->set_y0 (y); + rect->set_y1 (y + h); + } else if ((poly = dynamic_cast(event->item))) { + Duple position = poly->position(); + position.y = y; + poly->set_position(position); + poly->set(Hit::points(h)); + } } } } @@ -312,10 +359,25 @@ MidiGhostRegion::update_note (NoteBase* parent) return; } - double const x1 = parent->x0 (); - double const x2 = parent->x1 (); - ev->rect->set_x0 (x1); - ev->rect->set_x1 (x2); + Note* note = NULL; + ArdourCanvas::Rectangle* rect = NULL; + Hit* hit = NULL; + ArdourCanvas::Polygon* poly = NULL; + if ((note = dynamic_cast(parent))) { + if ((rect = dynamic_cast(ev->item))) { + double const x1 = parent->x0 (); + double const x2 = parent->x1 (); + rect->set_x0 (x1); + rect->set_x1 (x2); + } + } else if ((hit = dynamic_cast(parent))) { + if ((poly = dynamic_cast(ev->item))) { + ArdourCanvas::Duple ppos = hit->position(); + ArdourCanvas::Duple gpos = poly->position(); + gpos.x = ppos.x; + poly->set_position(gpos); + } + } } void