summaryrefslogtreecommitdiff
path: root/gtk2_ardour/imageframe_view.h
blob: 71d9268fef358508bef3e69cc530d57df9c48993 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/*
    Copyright (C) 2003 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
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

    $Id$
*/

#ifndef __gtk_ardour_imageframe_view_h__
#define __gtk_ardour_imageframe_view_h__

#include <string>
#include <gdkmm/color.h>
#include <libgnomecanvas/libgnomecanvas.h>
#include <sigc++/signal.h>
#include <list>

#include "canvas.h"
#include "enums.h"
#include "time_axis_view_item.h"
#include "marker_view.h"

class ImageFrameTimeAxis;
class ImageFrameTimeAxisGroup ;

/**
 * An ImageFrameItem to display an image upon the ardour time line
 *
 */
class ImageFrameView : public TimeAxisViewItem
{
	public:
		//---------------------------------------------------------------------------------------//
		// Constructor / Desctructor
		
		/**
		 * Constructs a new ImageFrameView upon the canvas
		 *
		 * @param item_id unique id of this item
		 * @param parent the parent canvas item
		 * @param tv the time axis view that this item is to be placed upon
		 * @param group the ImageFrameGroup that this item is a member of
		 * @param spu the current samples per canvas unit
		 * @param start the start frame ogf this item
		 * @param duration the duration of this item
		 * @param rgb_data the rgb data of the image
		 * @param width the width of the original rgb_data image data
		 * @param height the width of the origianl rgb_data image data
		 * @param num_channels the number of color channels within rgb_data
		 */
		ImageFrameView(const std::string & item_id,
			 ArdourCanvas::Group *parent,
			ImageFrameTimeAxis *tv,
			ImageFrameTimeAxisGroup* group,
			double spu,
		        Gdk::Color& base_color,
			nframes_t start,
			nframes_t duration,
			unsigned char* rgb_data,
			uint32_t width,
			uint32_t height,
			uint32_t num_channels) ;

		/**
		 * Destructor
		 * Reposible for removing and destroying all marker items associated with this item
		 */
		~ImageFrameView() ;
		
		static sigc::signal<void,ImageFrameView*> GoingAway;
    
		//---------------------------------------------------------------------------------------//
		// Position and duration Accessors/Mutators
		
		/**
		 * Set the position of this item to the specified value
		 *
		 * @param pos the new position
		 * @param src the identity of the object that initiated the change
		 * @return true if the position change was a success, false otherwise
		 */
		virtual bool set_position(nframes_t pos, void* src, double* delta = 0) ;
		
		/**
		 * Sets the duration of this item
		 *
		 * @param dur the new duration of this item
		 * @param src the identity of the object that initiated the change
		 * @return true if the duration change was succesful, false otherwise
		 */
		virtual bool set_duration(nframes_t dur, void* src) ;
		
		//---------------------------------------------------------------------------------------//
		// Parent Component Methods
		
		/**
		 * Sets the parent ImageFrameTimeAxisGroup of thie item
		 * each Item must be part of exactly one group (or 'scene') upon the timeline
		 *
		 * @param group the new parent group
		 */
		void set_time_axis_group(ImageFrameTimeAxisGroup* group) ;
		
		/**
		 * Returns the parent group of this item
		 *
		 * @return the parent group of this item
		 */
		ImageFrameTimeAxisGroup* get_time_axis_group() ;
		
		//---------------------------------------------------------------------------------------//
		// ui methods
		
		/**
		 * Set the height of this item
		 *
		 * @param h the new height
		 */
		virtual void set_height(gdouble h) ;
	
		
		//---------------------------------------------------------------------------------------//
		// MarkerView methods

		/**
		 * Adds a markerView to the list of marker views associated with this item
		 *
		 * @param item the marker item to add
		 * @param src the identity of the object that initiated the change
		 */
		void add_marker_view_item(MarkerView* item, void* src) ;
		
		/**
		 * Removes the named marker view from the list of marker view associated with this item
		 * The Marker view is not destroyed on removal, so the caller must handle the item themself
		 *
		 * @param markId the id/name of the item to remove
		 * @param src the identity of the object that initiated the change
		 * @return the removed marker item
		 */
		MarkerView* remove_named_marker_view_item(const std::string & markId, void* src) ;
		
		/**
		 * Removes item from the list of marker views assocaited with this item
		 * This method will do nothing if item if not assiciated with this item
		 * The Marker view is not destroyed on removal, so the caller must handle the item themself
		 *
		 * @param item the item to remove
		 * @param src the identity of the object that initiated the change
		 */
		void remove_marker_view_item(MarkerView* item, void* src) ;
		
		/**
		 * Determines if the named marker is one of those associated with this item
		 *
		 * @param markId the id/name of the item to search for
		 */
		bool has_marker_view_item(const std::string & markId) ;

		
		//---------------------------------------------------------------------------------//
		// Emitted Signals
		
		/** Emitted when a marker Item is added to this Item */
		sigc::signal<void,MarkerView*,void*> MarkerViewAdded ;
		
		/** Emitted when a Marker Item is added to this Item */
		sigc::signal<void,MarkerView*,void*> MarkerViewRemoved ;

	private:
		/** the list of MarkerViews associated with this item */
		typedef std::list<MarkerView*> MarkerViewList ;
		MarkerViewList marker_view_list ;
		
		
		/** The parent group that this item is a member of */
		ImageFrameTimeAxisGroup* the_parent_group ;
		
		// ------- Image data -----------
		
		/** the image data that we display */
		//unsigned char* the_rgb_data ;
		
		/** The width of the image contained within the_rgb_data */
		uint32_t image_data_width ;
		
		/** The height of the image contained within the_rgb_data */
		uint32_t image_data_height ;
		
		/** the number of channels contained in the_rgb_data */
		uint32_t image_data_num_channels ;
		
		
		// ------- Our canvas element -----------
		
		/** the CanvasImageFrame to display the image */
		ArdourCanvas::ImageFrame* imageframe ;
  		
} ; /* class ImageFrameView */

#endif /* __gtk_ardour_imageframe_view_h__ */