Initial commit
[fillmore] / src / marina / marina / Ruler.c
1 /* Ruler.c generated by valac, the Vala compiler
2  * generated from Ruler.vala, do not modify */
3
4 /* Copyright 2009 Yorba Foundation
5  *
6  * This software is licensed under the GNU Lesser General Public License
7  * (version 2.1 or later).  See the COPYING file in this distribution. 
8  */
9
10 #include <glib.h>
11 #include <glib-object.h>
12 #include <gtk/gtk.h>
13 #include <float.h>
14 #include <math.h>
15 #include <stdlib.h>
16 #include <string.h>
17 #include <gdk/gdk.h>
18 #include <cairo.h>
19 #include <pango/pango.h>
20
21
22 #define VIEW_TYPE_RULER (view_ruler_get_type ())
23 #define VIEW_RULER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIEW_TYPE_RULER, ViewRuler))
24 #define VIEW_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIEW_TYPE_RULER, ViewRulerClass))
25 #define VIEW_IS_RULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIEW_TYPE_RULER))
26 #define VIEW_IS_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIEW_TYPE_RULER))
27 #define VIEW_RULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIEW_TYPE_RULER, ViewRulerClass))
28
29 typedef struct _ViewRuler ViewRuler;
30 typedef struct _ViewRulerClass ViewRulerClass;
31 typedef struct _ViewRulerPrivate ViewRulerPrivate;
32
33 #define MODEL_TYPE_TIME_SYSTEM (model_time_system_get_type ())
34 #define MODEL_TIME_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TIME_SYSTEM, ModelTimeSystem))
35 #define MODEL_IS_TIME_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TIME_SYSTEM))
36 #define MODEL_TIME_SYSTEM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MODEL_TYPE_TIME_SYSTEM, ModelTimeSystemIface))
37
38 typedef struct _ModelTimeSystem ModelTimeSystem;
39 typedef struct _ModelTimeSystemIface ModelTimeSystemIface;
40 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
41 #define _g_free0(var) (var = (g_free (var), NULL))
42 #define _cairo_destroy0(var) ((var == NULL) ? NULL : (var = (cairo_destroy (var), NULL)))
43 #define _pango_font_description_free0(var) ((var == NULL) ? NULL : (var = (pango_font_description_free (var), NULL)))
44
45 struct _ViewRuler {
46         GtkDrawingArea parent_instance;
47         ViewRulerPrivate * priv;
48 };
49
50 struct _ViewRulerClass {
51         GtkDrawingAreaClass parent_class;
52 };
53
54 struct _ModelTimeSystemIface {
55         GTypeInterface parent_iface;
56         void (*calculate_pixel_step) (ModelTimeSystem* self, float inc, float pixel_min, float pixel_div);
57         gint64 (*xpos_to_time) (ModelTimeSystem* self, gint x);
58         gint64 (*xsize_to_time) (ModelTimeSystem* self, gint x);
59         gint (*time_to_xpos) (ModelTimeSystem* self, gint64 time);
60         gint64 (*get_pixel_snap_time) (ModelTimeSystem* self);
61         gint (*time_to_xsize) (ModelTimeSystem* self, gint64 time);
62         float (*get_pixel_percentage) (ModelTimeSystem* self);
63         gint (*get_start_token) (ModelTimeSystem* self, gint xsize);
64         gint (*get_next_position) (ModelTimeSystem* self, gint token);
65         gint (*get_pixel_height) (ModelTimeSystem* self, gint token);
66         char* (*get_display_string) (ModelTimeSystem* self, gint token);
67         gint (*frame_to_xsize) (ModelTimeSystem* self, gint frame);
68         gint (*xsize_to_frame) (ModelTimeSystem* self, gint xsize);
69         char* (*get_time_string) (ModelTimeSystem* self, gint64 time);
70         char* (*get_time_duration) (ModelTimeSystem* self, gint64 time);
71 };
72
73 struct _ViewRulerPrivate {
74         ModelTimeSystem* provider;
75 };
76
77
78 static gpointer view_ruler_parent_class = NULL;
79
80 GType view_ruler_get_type (void);
81 GType model_time_system_get_type (void);
82 #define VIEW_RULER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIEW_TYPE_RULER, ViewRulerPrivate))
83 enum  {
84         VIEW_RULER_DUMMY_PROPERTY
85 };
86 #define VIEW_RULER_BORDER 4
87 ViewRuler* view_ruler_new (ModelTimeSystem* provider, gint height);
88 ViewRuler* view_ruler_construct (GType object_type, ModelTimeSystem* provider, gint height);
89 gint model_time_system_get_start_token (ModelTimeSystem* self, gint xsize);
90 void parse_color (const char* color, GdkColor* result);
91 gint model_time_system_frame_to_xsize (ModelTimeSystem* self, gint frame);
92 gint model_time_system_get_pixel_height (ModelTimeSystem* self, gint token);
93 char* model_time_system_get_display_string (ModelTimeSystem* self, gint token);
94 gint model_time_system_get_next_position (ModelTimeSystem* self, gint token);
95 static gboolean view_ruler_real_expose_event (GtkWidget* base, GdkEventExpose* event);
96 static gboolean view_ruler_real_button_press_event (GtkWidget* base, GdkEventButton* event);
97 static gboolean view_ruler_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event);
98 static void view_ruler_finalize (GObject* obj);
99
100
101
102 #line 14 "Ruler.vala"
103 ViewRuler* view_ruler_construct (GType object_type, ModelTimeSystem* provider, gint height) {
104 #line 105 "Ruler.c"
105         ViewRuler * self;
106 #line 14 "Ruler.vala"
107         g_return_val_if_fail (MODEL_IS_TIME_SYSTEM (provider), NULL);
108 #line 109 "Ruler.c"
109         self = g_object_newv (object_type, 0, NULL);
110 #line 15 "Ruler.vala"
111         self->priv->provider = provider;
112 #line 16 "Ruler.vala"
113         GTK_WIDGET_SET_FLAGS (GTK_WIDGET (self), GTK_NO_WINDOW);
114 #line 17 "Ruler.vala"
115         gtk_widget_set_size_request (GTK_WIDGET (self), 0, height);
116 #line 117 "Ruler.c"
117         return self;
118 }
119
120
121 #line 14 "Ruler.vala"
122 ViewRuler* view_ruler_new (ModelTimeSystem* provider, gint height) {
123 #line 14 "Ruler.vala"
124         return view_ruler_construct (VIEW_TYPE_RULER, provider, height);
125 #line 126 "Ruler.c"
126 }
127
128
129 #line 20 "Ruler.vala"
130 static gboolean view_ruler_real_expose_event (GtkWidget* base, GdkEventExpose* event) {
131 #line 132 "Ruler.c"
132         ViewRuler * self;
133         gboolean result = FALSE;
134         gint x;
135         gint frame;
136         cairo_t* context;
137         GdkColor _tmp1_;
138         GdkColor _tmp0_ = {0};
139         cairo_antialias_t old_antialias;
140         gint stop;
141         PangoFontDescription* f;
142         self = VIEW_RULER (base);
143 #line 21 "Ruler.vala"
144         x = (*event).area.x;
145 #line 22 "Ruler.vala"
146         frame = model_time_system_get_start_token (self->priv->provider, x);
147 #line 24 "Ruler.vala"
148         context = gdk_cairo_create (GDK_DRAWABLE (GTK_WIDGET (self)->window));
149 #line 26 "Ruler.vala"
150         gdk_cairo_set_source_color (context, (_tmp1_ = (parse_color ("#777", &_tmp0_), _tmp0_), &_tmp1_));
151 #line 27 "Ruler.vala"
152         cairo_rectangle (context, (double) (*event).area.x, (double) (*event).area.y, (double) (*event).area.width, (double) (*event).area.height);
153 #line 28 "Ruler.vala"
154         cairo_fill (context);
155 #line 30 "Ruler.vala"
156         old_antialias = cairo_get_antialias (context);
157 #line 32 "Ruler.vala"
158         cairo_set_antialias (context, CAIRO_ANTIALIAS_NONE);
159 #line 33 "Ruler.vala"
160         cairo_set_source_rgb (context, 1.0, 1.0, 1.0);
161 #line 34 "Ruler.vala"
162         stop = (*event).area.x + (*event).area.width;
163 #line 35 "Ruler.vala"
164         f = pango_font_description_from_string ("Sans 9");
165 #line 36 "Ruler.vala"
166         while (TRUE) {
167 #line 168 "Ruler.c"
168                 gint y;
169                 char* display_string;
170 #line 36 "Ruler.vala"
171                 if (!(x <= stop)) {
172 #line 36 "Ruler.vala"
173                         break;
174 #line 175 "Ruler.c"
175                 }
176 #line 37 "Ruler.vala"
177                 x = model_time_system_frame_to_xsize (self->priv->provider, frame);
178 #line 38 "Ruler.vala"
179                 y = model_time_system_get_pixel_height (self->priv->provider, frame);
180 #line 40 "Ruler.vala"
181                 cairo_move_to (context, (double) (x + VIEW_RULER_BORDER), (double) 0);
182 #line 41 "Ruler.vala"
183                 cairo_line_to (context, (double) (x + VIEW_RULER_BORDER), (double) y);
184 #line 43 "Ruler.vala"
185                 display_string = model_time_system_get_display_string (self->priv->provider, frame);
186 #line 44 "Ruler.vala"
187                 if (display_string != NULL) {
188 #line 189 "Ruler.c"
189                         PangoLayout* layout;
190                         gint w = 0;
191                         gint h = 0;
192                         gint text_pos;
193 #line 45 "Ruler.vala"
194                         layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), display_string);
195 #line 49 "Ruler.vala"
196                         pango_layout_set_font_description (layout, f);
197 #line 50 "Ruler.vala"
198                         pango_layout_get_pixel_size (layout, &w, &h);
199 #line 51 "Ruler.vala"
200                         text_pos = (x - (w / 2)) + VIEW_RULER_BORDER;
201 #line 52 "Ruler.vala"
202                         if (text_pos < 0) {
203 #line 53 "Ruler.vala"
204                                 text_pos = 0;
205 #line 206 "Ruler.c"
206                         }
207 #line 56 "Ruler.vala"
208                         gdk_draw_layout (GDK_DRAWABLE (GTK_WIDGET (self)->window), gtk_widget_get_style (GTK_WIDGET (self))->white_gc, text_pos, 7, layout);
209 #line 210 "Ruler.c"
210                         _g_object_unref0 (layout);
211                 }
212 #line 59 "Ruler.vala"
213                 frame = model_time_system_get_next_position (self->priv->provider, frame);
214 #line 215 "Ruler.c"
215                 _g_free0 (display_string);
216         }
217 #line 61 "Ruler.vala"
218         cairo_set_antialias (context, old_antialias);
219 #line 62 "Ruler.vala"
220         cairo_set_line_width (context, 1.0);
221 #line 63 "Ruler.vala"
222         cairo_stroke (context);
223 #line 224 "Ruler.c"
224         result = TRUE;
225         _cairo_destroy0 (context);
226         _pango_font_description_free0 (f);
227 #line 64 "Ruler.vala"
228         return result;
229 #line 230 "Ruler.c"
230 }
231
232
233 #line 67 "Ruler.vala"
234 static gboolean view_ruler_real_button_press_event (GtkWidget* base, GdkEventButton* event) {
235 #line 236 "Ruler.c"
236         ViewRuler * self;
237         gboolean result = FALSE;
238         self = VIEW_RULER (base);
239 #line 68 "Ruler.vala"
240         g_signal_emit_by_name (self, "position-changed", (gint) (*event).x);
241 #line 242 "Ruler.c"
242         result = FALSE;
243 #line 69 "Ruler.vala"
244         return result;
245 #line 246 "Ruler.c"
246 }
247
248
249 #line 72 "Ruler.vala"
250 static gboolean view_ruler_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event) {
251 #line 252 "Ruler.c"
252         ViewRuler * self;
253         gboolean result = FALSE;
254         self = VIEW_RULER (base);
255 #line 73 "Ruler.vala"
256         if (((*event).state & GDK_BUTTON1_MASK) != 0) {
257 #line 74 "Ruler.vala"
258                 gtk_widget_queue_draw (GTK_WIDGET (self));
259 #line 75 "Ruler.vala"
260                 g_signal_emit_by_name (self, "position-changed", (gint) (*event).x);
261 #line 262 "Ruler.c"
262         }
263         result = FALSE;
264 #line 77 "Ruler.vala"
265         return result;
266 #line 267 "Ruler.c"
267 }
268
269
270 static void view_ruler_class_init (ViewRulerClass * klass) {
271         view_ruler_parent_class = g_type_class_peek_parent (klass);
272         g_type_class_add_private (klass, sizeof (ViewRulerPrivate));
273         GTK_WIDGET_CLASS (klass)->expose_event = view_ruler_real_expose_event;
274         GTK_WIDGET_CLASS (klass)->button_press_event = view_ruler_real_button_press_event;
275         GTK_WIDGET_CLASS (klass)->motion_notify_event = view_ruler_real_motion_notify_event;
276         G_OBJECT_CLASS (klass)->finalize = view_ruler_finalize;
277         g_signal_new ("position_changed", VIEW_TYPE_RULER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
278 }
279
280
281 static void view_ruler_instance_init (ViewRuler * self) {
282         self->priv = VIEW_RULER_GET_PRIVATE (self);
283 }
284
285
286 static void view_ruler_finalize (GObject* obj) {
287         ViewRuler * self;
288         self = VIEW_RULER (obj);
289         G_OBJECT_CLASS (view_ruler_parent_class)->finalize (obj);
290 }
291
292
293 GType view_ruler_get_type (void) {
294         static volatile gsize view_ruler_type_id__volatile = 0;
295         if (g_once_init_enter (&view_ruler_type_id__volatile)) {
296                 static const GTypeInfo g_define_type_info = { sizeof (ViewRulerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) view_ruler_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ViewRuler), 0, (GInstanceInitFunc) view_ruler_instance_init, NULL };
297                 GType view_ruler_type_id;
298                 view_ruler_type_id = g_type_register_static (GTK_TYPE_DRAWING_AREA, "ViewRuler", &g_define_type_info, 0);
299                 g_once_init_leave (&view_ruler_type_id__volatile, view_ruler_type_id);
300         }
301         return view_ruler_type_id__volatile;
302 }
303
304
305
306