/*
- Copyright (C) 2004 Paul Davis
+ Copyright (C) 2004 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
*/
#ifndef __ardour_gtk_ghost_region_h__
#define __ardour_gtk_ghost_region_h__
#include <vector>
-#include <sigc++/signal_system.h>
-#include <gtk-canvas.h>
+#include "pbd/signals.h"
-class AutomationTimeAxisView;
+namespace ArdourCanvas {
+ class WaveView;
+}
-struct GhostRegion : public SigC::Object
+class NoteBase;
+class Note;
+class Hit;
+class MidiStreamView;
+class TimeAxisView;
+class RegionView;
+
+class GhostRegion : public sigc::trackable
{
- AutomationTimeAxisView& trackview;
- GtkCanvasItem* group;
- GtkCanvasItem* base_rect;
- std::vector<GtkCanvasItem*> waves;
+public:
+ GhostRegion(RegionView& rv,
+ ArdourCanvas::Container* parent,
+ TimeAxisView& tv,
+ TimeAxisView& source_tv,
+ double initial_unit_pos);
+
+ virtual ~GhostRegion();
+
+ virtual void set_samples_per_pixel (double) = 0;
+ virtual void set_height();
+ virtual void set_colors();
+
+ void set_duration(double units);
+
+ guint source_track_color(unsigned char alpha = 0xff);
+ bool is_automation_ghost();
+
+ RegionView& parent_rv;
+ /** TimeAxisView that is the AutomationTimeAxisView that we are on */
+ TimeAxisView& trackview;
+ /** TimeAxisView that we are a ghost for */
+ TimeAxisView& source_trackview;
+ ArdourCanvas::Container* group;
+ ArdourCanvas::Rectangle* base_rect;
+};
+
+class AudioGhostRegion : public GhostRegion {
+public:
+ AudioGhostRegion(RegionView& rv,
+ TimeAxisView& tv,
+ TimeAxisView& source_tv,
+ double initial_unit_pos);
+
+ void set_samples_per_pixel (double);
+ void set_height();
+ void set_colors();
+
+ std::vector<ArdourCanvas::WaveView*> waves;
+};
+
+class MidiGhostRegion : public GhostRegion {
+public:
+ class GhostEvent : public sigc::trackable {
+ public:
+ GhostEvent(::NoteBase *, ArdourCanvas::Container *);
+ virtual ~GhostEvent ();
+
+ NoteBase* event;
+ ArdourCanvas::Item* item;
+ };
+
+ MidiGhostRegion(RegionView& rv,
+ TimeAxisView& tv,
+ TimeAxisView& source_tv,
+ double initial_unit_pos);
+
+ MidiGhostRegion(RegionView& rv,
+ MidiStreamView& msv,
+ TimeAxisView& source_tv,
+ double initial_unit_pos);
+
+ ~MidiGhostRegion();
+
+ MidiStreamView* midi_view();
+
+ void set_height();
+ void set_samples_per_pixel (double spu);
+ void set_colors();
+
+ void update_range();
+
+ void add_note(NoteBase*);
+ void update_note (Note*);
+ void update_hit (Hit*);
+ void remove_note (NoteBase*);
+
+ void clear_events();
- GhostRegion (AutomationTimeAxisView& tv, double initial_unit_pos);
- ~GhostRegion ();
+private:
+ ArdourCanvas::Color _outline;
- void set_samples_per_unit (double spu);
- void set_duration (double units);
- void set_height ();
+ MidiGhostRegion::GhostEvent* find_event (NoteBase*);
- SigC::Signal1<void,GhostRegion*> GoingAway;
+ typedef std::list<MidiGhostRegion::GhostEvent*> EventList;
+ EventList events;
+ EventList::iterator _optimization_iterator;
};
#endif /* __ardour_gtk_ghost_region_h__ */