summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ghostregion.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-02-10 18:16:25 +0000
committerDavid Robillard <d@drobilla.net>2008-02-10 18:16:25 +0000
commit1b657585572298d1a69a7b43e611f59b7e185df3 (patch)
tree5b0ca4e1f222357499f97165a13308ac070c5ddc /gtk2_ardour/ghostregion.cc
parente76b028ffdf054775cb697174d00cd0222d675c6 (diff)
Committed underlay support (from Audun).
git-svn-id: svn://localhost/ardour2/branches/3.0@3037 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/ghostregion.cc')
-rw-r--r--gtk2_ardour/ghostregion.cc259
1 files changed, 230 insertions, 29 deletions
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<WaveView*>::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<AutomationTimeAxisView*>(&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<WaveView*>::iterator i = waves.begin(); i != waves.end(); ++i) {
+ (*i)->property_samples_per_unit() = spu;
+ }
+}
+
+void
+AudioGhostRegion::set_height ()
{
gdouble ht;
vector<WaveView*>::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<MidiTimeAxisView*>(&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<MidiGhostRegion::Note*>(*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<MidiGhostRegion::Note*>(*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();
}