Use UTF8 instead of ASCII in CFString conversion.
[ardour.git] / gtk2_ardour / regionview.h
1 /*
2     Copyright (C) 2001-2004 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18     $Id$
19 */
20
21 #ifndef __gtk_ardour_region_view_h__
22 #define __gtk_ardour_region_view_h__
23
24 #include <vector>
25
26 #include <libgnomecanvasmm.h>
27 #include <libgnomecanvasmm/polygon.h>
28 #include <sigc++/signal.h>
29 #include <ardour/region.h>
30
31 #include "time_axis_view_item.h"
32 #include "automation_line.h"
33 #include "enums.h"
34 #include "waveview.h"
35 #include "canvas.h"
36 #include "color.h"
37
38 namespace ARDOUR {
39         class AudioRegion;
40         class PeakData;
41 };
42
43 class AudioTimeAxisView;
44 class AudioRegionGainLine;
45 class AudioRegionEditor;
46 class GhostRegion;
47 class AutomationTimeAxisView;
48
49 class AudioRegionView : public TimeAxisViewItem
50 {
51   public:
52         AudioRegionView (ArdourCanvas::Group *, 
53                          AudioTimeAxisView&,
54                          ARDOUR::AudioRegion&,
55                          double initial_samples_per_unit,
56                          Gdk::Color& basic_color);
57
58         ~AudioRegionView ();
59         
60         virtual void init (double amplitude_above_axis, Gdk::Color& base_color, bool wait_for_waves);
61     
62     ARDOUR::AudioRegion& region;  // ok, let 'em have it
63     bool is_valid() const { return valid; }
64     void set_valid (bool yn) { valid = yn; }
65
66     void set_height (double);
67     void set_samples_per_unit (double);
68     bool set_duration (jack_nframes_t, void*);
69
70     void set_amplitude_above_axis (gdouble spp);
71
72     void move (double xdelta, double ydelta);
73
74     void raise ();
75     void raise_to_top ();
76     void lower ();
77     void lower_to_bottom ();
78
79     bool set_position(jack_nframes_t pos, void* src, double* delta = 0);
80     
81     void temporarily_hide_envelope (); // dangerous
82     void unhide_envelope (); // dangerous
83
84     void set_envelope_visible (bool);
85     void set_waveform_visible (bool yn);
86     void set_waveform_shape (WaveformShape);
87
88     bool waveform_rectified() const { return _flags & WaveformRectified; }
89     bool waveform_visible() const { return _flags & WaveformVisible; }
90     bool envelope_visible() const { return _flags & EnvelopeVisible; }
91     
92     void show_region_editor ();
93     void hide_region_editor();
94
95     void add_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event);
96     void remove_gain_point_event (ArdourCanvas::Item *item, GdkEvent *event);
97
98     AudioRegionGainLine* get_gain_line() const { return gain_line; }
99
100     void region_changed (ARDOUR::Change);
101     void envelope_active_changed ();
102
103     static sigc::signal<void,AudioRegionView*> AudioRegionViewGoingAway;
104     sigc::signal<void> GoingAway;
105
106     GhostRegion* add_ghost (AutomationTimeAxisView&);
107     void remove_ghost (GhostRegion*);
108
109     void reset_fade_in_shape_width (jack_nframes_t);
110     void reset_fade_out_shape_width (jack_nframes_t);
111     void set_fade_in_active (bool);
112     void set_fade_out_active (bool);
113
114     uint32_t get_fill_color ();
115
116     virtual void entered ();
117     virtual void exited ();
118
119   protected:
120
121     /* this constructor allows derived types
122        to specify their visibility requirements
123        to the TimeAxisViewItem parent class
124     */
125     
126     AudioRegionView (ArdourCanvas::Group *, 
127                      AudioTimeAxisView&,
128                      ARDOUR::AudioRegion&,
129                      double initial_samples_per_unit,
130                      Gdk::Color& basic_color,
131                      TimeAxisViewItem::Visibility);
132     
133     enum Flags {
134             EnvelopeVisible = 0x1,
135             WaveformVisible = 0x4,
136             WaveformRectified = 0x8
137     };
138
139     vector<ArdourCanvas::WaveView *> waves; /* waveviews */
140     vector<ArdourCanvas::WaveView *> tmp_waves; /* see ::create_waves()*/
141     ArdourCanvas::Polygon* sync_mark; /* polgyon for sync position */
142     ArdourCanvas::Text* no_wave_msg; /* text */
143     ArdourCanvas::SimpleLine* zero_line; /* simpleline */
144     ArdourCanvas::Polygon* fade_in_shape; /* polygon */
145     ArdourCanvas::Polygon* fade_out_shape; /* polygon */
146     ArdourCanvas::SimpleRect* fade_in_handle; /* simplerect */
147     ArdourCanvas::SimpleRect* fade_out_handle; /* simplerect */
148
149     AudioRegionGainLine* gain_line;
150     AudioRegionEditor *editor;
151
152     vector<ControlPoint *> control_points;
153     double _amplitude_above_axis;
154     double current_visible_sync_position;
155
156     uint32_t _flags;
157     uint32_t fade_color;
158     bool     valid; /* see StreamView::redisplay_diskstream() */
159     double _pixel_width;
160     double _height;
161     bool    in_destructor;
162     bool    wait_for_waves;
163     sigc::connection peaks_ready_connection;
164
165     void reset_fade_shapes ();
166     void reset_fade_in_shape ();
167     void reset_fade_out_shape ();
168     void fade_in_changed ();
169     void fade_out_changed ();
170     void fade_in_active_changed ();
171     void fade_out_active_changed ();
172
173     void region_resized (ARDOUR::Change);
174     void region_moved (void *);
175     void region_muted ();
176     void region_locked ();
177     void region_opacity ();
178     void region_layered ();
179     void region_renamed ();
180     void region_sync_changed ();
181     void region_scale_amplitude_changed ();
182
183     static gint _lock_toggle (ArdourCanvas::Item*, GdkEvent*, void*);
184     void lock_toggle ();
185
186     void create_waves ();
187     void create_one_wave (uint32_t, bool);
188     void manage_zero_line ();
189     void peaks_ready_handler (uint32_t);
190     void reset_name (gdouble width);
191     void set_flags (XMLNode *);
192     void store_flags ();
193
194     void set_colors ();
195     void compute_colors (Gdk::Color&);
196     virtual void set_frame_color ();
197     void reset_width_dependent_items (double pixel_width);
198     void set_waveview_data_src();
199
200     vector<GnomeCanvasWaveViewCache*> wave_caches;
201     vector<GhostRegion*> ghosts;
202     
203     void color_handler (ColorID, uint32_t);
204 };
205
206 #endif /* __gtk_ardour_region_view_h__ */