1 /* Ruler.c generated by valac, the Vala compiler
2 * generated from Ruler.vala, do not modify */
4 /* Copyright 2009 Yorba Foundation
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.
11 #include <glib-object.h>
19 #include <pango/pango.h>
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))
29 typedef struct _ViewRuler ViewRuler;
30 typedef struct _ViewRulerClass ViewRulerClass;
31 typedef struct _ViewRulerPrivate ViewRulerPrivate;
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))
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)))
46 GtkDrawingArea parent_instance;
47 ViewRulerPrivate * priv;
50 struct _ViewRulerClass {
51 GtkDrawingAreaClass parent_class;
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);
73 struct _ViewRulerPrivate {
74 ModelTimeSystem* provider;
78 static gpointer view_ruler_parent_class = NULL;
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))
84 VIEW_RULER_DUMMY_PROPERTY
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);
102 #line 14 "Ruler.vala"
103 ViewRuler* view_ruler_construct (GType object_type, ModelTimeSystem* provider, gint height) {
106 #line 14 "Ruler.vala"
107 g_return_val_if_fail (MODEL_IS_TIME_SYSTEM (provider), NULL);
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);
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);
129 #line 20 "Ruler.vala"
130 static gboolean view_ruler_real_expose_event (GtkWidget* base, GdkEventExpose* event) {
133 gboolean result = FALSE;
138 GdkColor _tmp0_ = {0};
139 cairo_antialias_t old_antialias;
141 PangoFontDescription* f;
142 self = VIEW_RULER (base);
143 #line 21 "Ruler.vala"
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"
169 char* display_string;
170 #line 36 "Ruler.vala"
172 #line 36 "Ruler.vala"
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) {
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"
203 #line 53 "Ruler.vala"
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);
210 _g_object_unref0 (layout);
212 #line 59 "Ruler.vala"
213 frame = model_time_system_get_next_position (self->priv->provider, frame);
215 _g_free0 (display_string);
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);
225 _cairo_destroy0 (context);
226 _pango_font_description_free0 (f);
227 #line 64 "Ruler.vala"
233 #line 67 "Ruler.vala"
234 static gboolean view_ruler_real_button_press_event (GtkWidget* base, GdkEventButton* event) {
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);
243 #line 69 "Ruler.vala"
249 #line 72 "Ruler.vala"
250 static gboolean view_ruler_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event) {
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);
264 #line 77 "Ruler.vala"
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);
281 static void view_ruler_instance_init (ViewRuler * self) {
282 self->priv = VIEW_RULER_GET_PRIVATE (self);
286 static void view_ruler_finalize (GObject* obj) {
288 self = VIEW_RULER (obj);
289 G_OBJECT_CLASS (view_ruler_parent_class)->finalize (obj);
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);
301 return view_ruler_type_id__volatile;