From 1b657585572298d1a69a7b43e611f59b7e185df3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 10 Feb 2008 18:16:25 +0000 Subject: Committed underlay support (from Audun). git-svn-id: svn://localhost/ardour2/branches/3.0@3037 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ghostregion.cc | 259 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 230 insertions(+), 29 deletions(-) (limited to 'gtk2_ardour/ghostregion.cc') diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index b14872b357..e57e3b6375 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -20,23 +20,23 @@ #include "simplerect.h" #include "waveview.h" #include "ghostregion.h" +#include "midi_time_axis.h" #include "automation_time_axis.h" +#include "midi_streamview.h" #include "rgb_macros.h" #include "ardour_ui.h" +#include "canvas-hit.h" +#include "canvas-note.h" using namespace Editing; using namespace ArdourCanvas; using namespace ARDOUR; -GhostRegion::GhostRegion (AutomationTimeAxisView& atv, double initial_pos) - : trackview (atv) +GhostRegion::GhostRegion (ArdourCanvas::Group* parent, TimeAxisView& tv, TimeAxisView& source_tv, double initial_pos) + : trackview (tv) + , source_trackview (source_tv) { - //group = gnome_canvas_item_new (GNOME_CANVAS_GROUP(trackview.canvas_display), - // gnome_canvas_group_get_type(), - // "x", initial_pos, - // "y", 0.0, - // NULL); - group = new ArdourCanvas::Group (*trackview.canvas_display); + group = new ArdourCanvas::Group (*parent); group->property_x() = initial_pos; group->property_y() = 0.0; @@ -45,11 +45,16 @@ GhostRegion::GhostRegion (AutomationTimeAxisView& atv, double initial_pos) base_rect->property_y1() = (double) 0.0; base_rect->property_y2() = (double) trackview.height; base_rect->property_outline_what() = (guint32) 0; - base_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackBase.get(); - base_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackBase.get(); - group->lower_to_bottom (); - atv.add_ghost (this); + if(!is_automation_ghost()) { + base_rect->hide(); + } + + GhostRegion::set_colors(); + + /* the parent group of a ghostregion is a dedicated group for ghosts, + so the new ghost would want to get to the top of that group*/ + group->raise_to_top (); } GhostRegion::~GhostRegion () @@ -60,27 +65,62 @@ GhostRegion::~GhostRegion () } void -GhostRegion::set_samples_per_unit (double spu) +GhostRegion::set_duration (double units) { - for (vector::iterator i = waves.begin(); i != waves.end(); ++i) { - (*i)->property_samples_per_unit() = spu; - } + base_rect->property_x2() = units; } void -GhostRegion::set_duration (double units) +GhostRegion::set_height () { - base_rect->property_x2() = units; + base_rect->property_y2() = (double) trackview.height; } void -GhostRegion::set_height () +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(); + } +} + +guint +GhostRegion::source_track_color(unsigned char alpha) { + Gdk::Color color = source_trackview.color(); + unsigned char r,g,b ; + r = color.get_red()/256; + g = color.get_green()/256; + b = color.get_blue()/256; + return RGBA_TO_UINT(r, g, b, alpha); +} + +bool +GhostRegion::is_automation_ghost() { + return (dynamic_cast(&trackview)) != 0; +} + +AudioGhostRegion::AudioGhostRegion(TimeAxisView& tv, TimeAxisView& source_tv, double initial_unit_pos) + : GhostRegion(tv.ghost_group, tv, source_tv, initial_unit_pos) { +} + +void +AudioGhostRegion::set_samples_per_unit (double spu) +{ + for (vector::iterator i = waves.begin(); i != waves.end(); ++i) { + (*i)->property_samples_per_unit() = spu; + } +} + +void +AudioGhostRegion::set_height () { gdouble ht; vector::iterator i; uint32_t n; - base_rect->property_y2() = (double) trackview.height; + GhostRegion::set_height(); + ht = ((trackview.height) / (double) waves.size()); for (n = 0, i = waves.begin(); i != waves.end(); ++i, ++n) { @@ -91,16 +131,177 @@ GhostRegion::set_height () } void -GhostRegion::set_colors () +AudioGhostRegion::set_colors () { - base_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackBase.get(); - base_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackBase.get(); + GhostRegion::set_colors(); + guint fill_color; + + if(is_automation_ghost()) { + fill_color = ARDOUR_UI::config()->canvasvar_GhostTrackWaveFill.get(); + } + 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(); + } +} + +/* + * This is the general constructor, and is called when the destination timeaxisview doesn't have + * a midistreamview. But what to do when positioning the midi ghost here? For example, there is + * no range controller in these tracks. maybe show the whole range. + */ +MidiGhostRegion::MidiGhostRegion(TimeAxisView& tv, TimeAxisView& source_tv, double initial_unit_pos) + : GhostRegion(tv.ghost_group, tv, source_tv, initial_unit_pos) { + + base_rect->lower_to_bottom(); +} + +MidiGhostRegion::MidiGhostRegion(MidiStreamView& msv, TimeAxisView& source_tv, double initial_unit_pos) + : GhostRegion(msv.midi_underlay_group, msv.trackview(), source_tv, initial_unit_pos) { + + base_rect->lower_to_bottom(); +} + +MidiGhostRegion::Event::Event(ArdourCanvas::CanvasMidiEvent* e) + : event(e) { +} + +MidiGhostRegion::Note::Note(ArdourCanvas::CanvasNote* n, ArdourCanvas::Group* g) + : Event(n) { + + rect = new ArdourCanvas::SimpleRect(*g, n->x1(), n->y1(), n->x2(), n->y2()); +} - 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() = ARDOUR_UI::config()->canvasvar_GhostTrackWave.get(); +MidiGhostRegion::Note::~Note() { + delete rect; +} + +void +MidiGhostRegion::Note::x_changed() { + rect->property_x1() = event->x1(); + rect->property_x2() = event->x2(); +} + +MidiGhostRegion::Hit::Hit(ArdourCanvas::CanvasHit* h, ArdourCanvas::Group*) + : Event(h) { + cerr << "Hit ghost item does not work yet" << endl; +} + +MidiGhostRegion::Hit::~Hit() { +} + +void +MidiGhostRegion::Hit::x_changed() { +} + +void +MidiGhostRegion::set_samples_per_unit (double spu) +{ +} + +MidiStreamView* +MidiGhostRegion::midi_view() { + MidiTimeAxisView* mtv; + + if((mtv = dynamic_cast(&trackview)) != 0) { + return mtv->midi_view(); + } + else { + return 0; + } +} + +void +MidiGhostRegion::set_height() { + GhostRegion::set_height(); + update_range(); +} + +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(); + } + } +} + +void +MidiGhostRegion::update_range() { + MidiStreamView* mv = midi_view(); + + if(!mv) { + return; + } + + MidiGhostRegion::Note* note; + uint8_t note_num; + double y; + + for(EventList::iterator it = events.begin(); it != events.end(); ++it) { + if((note = dynamic_cast(*it)) != 0) { + note_num = note->event->note()->note(); + + if(note_num < mv->lowest_note() || note_num > mv->highest_note()) { + note->rect->hide(); + } + else { + note->rect->show(); + y = mv->note_to_y(note_num); + note->rect->property_y1() = y; + note->rect->property_y2() = y + mv->note_height(); + } + } + } +} + +void +MidiGhostRegion::add_note(ArdourCanvas::CanvasNote* n) { + Note* note = new Note(n, group); + events.push_back(note); + + note->rect->property_fill_color_rgba() = source_track_color(200); + note->rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_GhostTrackMidiOutline.get(); + + MidiStreamView* mv = midi_view(); + + if(mv) { + uint8_t note_num = n->note()->note(); + double y; + + if(note_num < mv->lowest_note() || note_num > mv->highest_note()) { + note->rect->hide(); + } + else { + y = mv->note_to_y(note_num); + note->rect->property_y1() = y; + note->rect->property_y2() = y + mv->note_height(); + } + } +} + +void +MidiGhostRegion::add_hit(ArdourCanvas::CanvasHit* h) { + //events.push_back(new Hit(h, group)); +} + +void +MidiGhostRegion::clear_events() { + for(EventList::iterator it = events.begin(); it != events.end(); ++it) { + delete *it; + } - waves[n]->property_clip_color() = ARDOUR_UI::config()->canvasvar_GhostTrackWaveClip.get(); - waves[n]->property_zero_color() = ARDOUR_UI::config()->canvasvar_GhostTrackZeroLine.get(); - } + events.clear(); } -- cgit v1.2.3