Initial commit
[fillmore] / src / marina / marina / ui_clip.c
diff --git a/src/marina/marina/ui_clip.c b/src/marina/marina/ui_clip.c
new file mode 100644 (file)
index 0000000..02ec30d
--- /dev/null
@@ -0,0 +1,1334 @@
+/* ui_clip.c generated by valac, the Vala compiler
+ * generated from ui_clip.vala, do not modify */
+
+/* Copyright 2009-2010 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later).  See the COPYING file in this distribution. 
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <float.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pango/pango.h>
+
+
+#define TYPE_GAP_VIEW (gap_view_get_type ())
+#define GAP_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_GAP_VIEW, GapView))
+#define GAP_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_GAP_VIEW, GapViewClass))
+#define IS_GAP_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_GAP_VIEW))
+#define IS_GAP_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_GAP_VIEW))
+#define GAP_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_GAP_VIEW, GapViewClass))
+
+typedef struct _GapView GapView;
+typedef struct _GapViewClass GapViewClass;
+typedef struct _GapViewPrivate GapViewPrivate;
+
+#define MODEL_TYPE_GAP (model_gap_get_type ())
+#define MODEL_GAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_GAP, ModelGap))
+#define MODEL_GAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_GAP, ModelGapClass))
+#define MODEL_IS_GAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_GAP))
+#define MODEL_IS_GAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_GAP))
+#define MODEL_GAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_GAP, ModelGapClass))
+
+typedef struct _ModelGap ModelGap;
+typedef struct _ModelGapClass ModelGapClass;
+#define _model_gap_unref0(var) ((var == NULL) ? NULL : (var = (model_gap_unref (var), NULL)))
+
+#define TYPE_CLIP_VIEW (clip_view_get_type ())
+#define CLIP_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CLIP_VIEW, ClipView))
+#define CLIP_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CLIP_VIEW, ClipViewClass))
+#define IS_CLIP_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CLIP_VIEW))
+#define IS_CLIP_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CLIP_VIEW))
+#define CLIP_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CLIP_VIEW, ClipViewClass))
+
+typedef struct _ClipView ClipView;
+typedef struct _ClipViewClass ClipViewClass;
+typedef struct _ClipViewPrivate ClipViewPrivate;
+
+#define MODEL_TYPE_CLIP (model_clip_get_type ())
+#define MODEL_CLIP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP, ModelClip))
+#define MODEL_CLIP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP, ModelClipClass))
+#define MODEL_IS_CLIP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP))
+#define MODEL_IS_CLIP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP))
+#define MODEL_CLIP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP, ModelClipClass))
+
+typedef struct _ModelClip ModelClip;
+typedef struct _ModelClipClass ModelClipClass;
+
+#define MODEL_TYPE_TIME_SYSTEM (model_time_system_get_type ())
+#define MODEL_TIME_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TIME_SYSTEM, ModelTimeSystem))
+#define MODEL_IS_TIME_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TIME_SYSTEM))
+#define MODEL_TIME_SYSTEM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MODEL_TYPE_TIME_SYSTEM, ModelTimeSystemIface))
+
+typedef struct _ModelTimeSystem ModelTimeSystem;
+typedef struct _ModelTimeSystemIface ModelTimeSystemIface;
+
+#define TYPE_TRANSPORT_DELEGATE (transport_delegate_get_type ())
+#define TRANSPORT_DELEGATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TRANSPORT_DELEGATE, TransportDelegate))
+#define IS_TRANSPORT_DELEGATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TRANSPORT_DELEGATE))
+#define TRANSPORT_DELEGATE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_TRANSPORT_DELEGATE, TransportDelegateIface))
+
+typedef struct _TransportDelegate TransportDelegate;
+typedef struct _TransportDelegateIface TransportDelegateIface;
+
+#define CLIP_VIEW_TYPE_MOTION_MODE (clip_view_motion_mode_get_type ())
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+typedef struct _ModelClipPrivate ModelClipPrivate;
+
+#define MODEL_TYPE_CLIP_FILE (model_clip_file_get_type ())
+#define MODEL_CLIP_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_FILE, ModelClipFile))
+#define MODEL_CLIP_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_FILE, ModelClipFileClass))
+#define MODEL_IS_CLIP_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_FILE))
+#define MODEL_IS_CLIP_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_FILE))
+#define MODEL_CLIP_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_FILE, ModelClipFileClass))
+
+typedef struct _ModelClipFile ModelClipFile;
+typedef struct _ModelClipFileClass ModelClipFileClass;
+
+#define MODEL_TYPE_MEDIA_TYPE (model_media_type_get_type ())
+
+#define LOGGING_TYPE_FACILITY (logging_facility_get_type ())
+
+#define LOGGING_TYPE_LEVEL (logging_level_get_type ())
+#define _g_free0(var) (var = (g_free (var), NULL))
+
+struct _GapView {
+       GtkDrawingArea parent_instance;
+       GapViewPrivate * priv;
+       ModelGap* gap;
+};
+
+struct _GapViewClass {
+       GtkDrawingAreaClass parent_class;
+};
+
+struct _GapViewPrivate {
+       GdkColor fill_color;
+};
+
+struct _ClipView {
+       GtkDrawingArea parent_instance;
+       ClipViewPrivate * priv;
+       ModelClip* clip;
+       gint64 initial_time;
+       gboolean is_selected;
+       gint height;
+};
+
+struct _ClipViewClass {
+       GtkDrawingAreaClass parent_class;
+};
+
+struct _ModelTimeSystemIface {
+       GTypeInterface parent_iface;
+       void (*calculate_pixel_step) (ModelTimeSystem* self, float inc, float pixel_min, float pixel_div);
+       gint64 (*xpos_to_time) (ModelTimeSystem* self, gint x);
+       gint64 (*xsize_to_time) (ModelTimeSystem* self, gint x);
+       gint (*time_to_xpos) (ModelTimeSystem* self, gint64 time);
+       gint64 (*get_pixel_snap_time) (ModelTimeSystem* self);
+       gint (*time_to_xsize) (ModelTimeSystem* self, gint64 time);
+       float (*get_pixel_percentage) (ModelTimeSystem* self);
+       gint (*get_start_token) (ModelTimeSystem* self, gint xsize);
+       gint (*get_next_position) (ModelTimeSystem* self, gint token);
+       gint (*get_pixel_height) (ModelTimeSystem* self, gint token);
+       char* (*get_display_string) (ModelTimeSystem* self, gint token);
+       gint (*frame_to_xsize) (ModelTimeSystem* self, gint frame);
+       gint (*xsize_to_frame) (ModelTimeSystem* self, gint xsize);
+       char* (*get_time_string) (ModelTimeSystem* self, gint64 time);
+       char* (*get_time_duration) (ModelTimeSystem* self, gint64 time);
+};
+
+struct _TransportDelegateIface {
+       GTypeInterface parent_iface;
+       gboolean (*is_playing) (TransportDelegate* self);
+       gboolean (*is_recording) (TransportDelegate* self);
+       gboolean (*is_stopped) (TransportDelegate* self);
+};
+
+typedef enum  {
+       CLIP_VIEW_MOTION_MODE_NONE,
+       CLIP_VIEW_MOTION_MODE_DRAGGING,
+       CLIP_VIEW_MOTION_MODE_LEFT_TRIM,
+       CLIP_VIEW_MOTION_MODE_RIGHT_TRIM
+} ClipViewMotionMode;
+
+struct _ClipViewPrivate {
+       ModelTimeSystem* time_provider;
+       TransportDelegate* transport_delegate;
+       GdkColor color_black;
+       GdkColor color_normal;
+       GdkColor color_selected;
+       gint drag_point;
+       gint snap_amount;
+       gboolean snapped;
+       ClipViewMotionMode motion_mode;
+       gboolean button_down;
+       gboolean pending_selection;
+};
+
+typedef enum  {
+       MODEL_MEDIA_TYPE_AUDIO,
+       MODEL_MEDIA_TYPE_VIDEO
+} ModelMediaType;
+
+struct _ModelClip {
+       GObject parent_instance;
+       ModelClipPrivate * priv;
+       ModelClipFile* clipfile;
+       ModelMediaType type;
+       gboolean is_recording;
+       char* name;
+};
+
+struct _ModelClipClass {
+       GObjectClass parent_class;
+};
+
+typedef enum  {
+       LOGGING_FACILITY_SIGNAL_HANDLERS,
+       LOGGING_FACILITY_DEVELOPER_WARNINGS,
+       LOGGING_FACILITY_GRAPH,
+       LOGGING_FACILITY_LOADING,
+       LOGGING_FACILITY_IMPORT,
+       LOGGING_FACILITY_SINGLEDECODEBIN
+} LoggingFacility;
+
+typedef enum  {
+       LOGGING_LEVEL_CRITICAL,
+       LOGGING_LEVEL_HIGH,
+       LOGGING_LEVEL_MEDIUM,
+       LOGGING_LEVEL_LOW,
+       LOGGING_LEVEL_INFO,
+       LOGGING_LEVEL_VERBOSE
+} LoggingLevel;
+
+
+static gpointer gap_view_parent_class = NULL;
+extern GtkMenu* clip_view_context_menu;
+GtkMenu* clip_view_context_menu = NULL;
+static GdkCursor* clip_view_left_trim_cursor;
+static GdkCursor* clip_view_left_trim_cursor = NULL;
+static GdkCursor* clip_view_right_trim_cursor;
+static GdkCursor* clip_view_right_trim_cursor = NULL;
+static GdkCursor* clip_view_hand_cursor;
+static GdkCursor* clip_view_hand_cursor = NULL;
+static GdkCursor* clip_view_plus_cursor;
+static GdkCursor* clip_view_plus_cursor = NULL;
+static gpointer clip_view_parent_class = NULL;
+
+GType gap_view_get_type (void);
+gpointer model_gap_ref (gpointer instance);
+void model_gap_unref (gpointer instance);
+GParamSpec* model_param_spec_gap (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_gap (GValue* value, gpointer v_object);
+void model_value_take_gap (GValue* value, gpointer v_object);
+gpointer model_value_get_gap (const GValue* value);
+GType model_gap_get_type (void);
+#define GAP_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_GAP_VIEW, GapViewPrivate))
+enum  {
+       GAP_VIEW_DUMMY_PROPERTY
+};
+ModelGap* model_gap_new (gint64 start, gint64 end);
+ModelGap* model_gap_construct (GType object_type, gint64 start, gint64 end);
+GapView* gap_view_new (gint64 start, gint64 length, gint width, gint height);
+GapView* gap_view_construct (GType object_type, gint64 start, gint64 length, gint width, gint height);
+void gap_view_remove (GapView* self);
+void gap_view_unselect (GapView* self);
+void draw_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height);
+static gboolean gap_view_real_expose_event (GtkWidget* base, GdkEventExpose* e);
+static void gap_view_finalize (GObject* obj);
+GType clip_view_get_type (void);
+GType model_clip_get_type (void);
+GType model_time_system_get_type (void);
+GType transport_delegate_get_type (void);
+static GType clip_view_motion_mode_get_type (void) G_GNUC_UNUSED;
+#define CLIP_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_CLIP_VIEW, ClipViewPrivate))
+enum  {
+       CLIP_VIEW_DUMMY_PROPERTY
+};
+#define CLIP_VIEW_MIN_DRAG 5
+#define CLIP_VIEW_TRIM_WIDTH 10
+#define CLIP_VIEW_SNAP_DELTA 10
+void clip_view_on_clip_moved (ClipView* self, ModelClip* clip);
+static void _clip_view_on_clip_moved_model_clip_moved (ModelClip* _sender, ModelClip* clip, gpointer self);
+static void clip_view_on_clip_updated (ClipView* self);
+static void _clip_view_on_clip_updated_model_clip_updated (ModelClip* _sender, ModelClip* clip, gpointer self);
+static void clip_view_get_clip_colors (ClipView* self);
+void clip_view_adjust_size (ClipView* self, gint height);
+ClipView* clip_view_new (TransportDelegate* transport_delegate, ModelClip* clip, ModelTimeSystem* time_provider, gint height);
+ClipView* clip_view_construct (GType object_type, TransportDelegate* transport_delegate, ModelClip* clip, ModelTimeSystem* time_provider, gint height);
+GType model_clip_file_get_type (void);
+GType model_media_type_get_type (void);
+gboolean model_clip_file_is_online (ModelClipFile* self);
+GType logging_facility_get_type (void);
+GType logging_level_get_type (void);
+void logging_emit (GObject* object, LoggingFacility facility, LoggingLevel level, const char* message);
+gint model_time_system_time_to_xpos (ModelTimeSystem* self, gint64 time);
+gint64 model_clip_get_start (ModelClip* self);
+gint64 model_clip_get_duration (ModelClip* self);
+void clip_view_delete_clip (ClipView* self);
+gint64 model_clip_get_media_start (ModelClip* self);
+gint64 model_clip_file_get_length (ModelClipFile* self);
+void draw_left_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height);
+void draw_right_rounded_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x0, gint y0, gint width, gint height);
+void draw_square_rectangle (GdkWindow* window, GdkColor* color, gboolean filled, gint x, gint y, gint width, gint height);
+void clip_view_draw (ClipView* self);
+static gboolean clip_view_real_expose_event (GtkWidget* base, GdkEventExpose* event);
+gboolean transport_delegate_is_stopped (TransportDelegate* self);
+static gboolean clip_view_is_left_trim (ClipView* self, double x, double y);
+static gboolean clip_view_is_right_trim (ClipView* self, double x, double y);
+static gboolean clip_view_real_button_press_event (GtkWidget* base, GdkEventButton* event);
+gint64 model_time_system_xsize_to_time (ModelTimeSystem* self, gint x);
+static gboolean clip_view_real_button_release_event (GtkWidget* base, GdkEventButton* event);
+void model_clip_trim (ModelClip* self, gint64 delta, GdkWindowEdge edge);
+static gboolean clip_view_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event);
+static gboolean clip_view_is_trim_height (ClipView* self, double y);
+void clip_view_select (ClipView* self);
+gint model_time_system_time_to_xsize (ModelTimeSystem* self, gint64 time);
+void clip_view_snap (ClipView* self, gint64 amount);
+static void clip_view_finalize (GObject* obj);
+
+
+static void g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+static void g_cclosure_user_marshal_VOID__OBJECT_INT64 (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+static void g_cclosure_user_marshal_VOID__OBJECT_ENUM (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+
+#line 13 "ui_clip.vala"
+GapView* gap_view_construct (GType object_type, gint64 start, gint64 length, gint width, gint height) {
+#line 305 "ui_clip.c"
+       GapView * self;
+       ModelGap* _tmp0_;
+       self = g_object_newv (object_type, 0, NULL);
+#line 15 "ui_clip.vala"
+       self->gap = (_tmp0_ = model_gap_new (start, start + length), _model_gap_unref0 (self->gap), _tmp0_);
+#line 17 "ui_clip.vala"
+       gdk_color_parse ("#777", &self->priv->fill_color);
+#line 19 "ui_clip.vala"
+       GTK_WIDGET_SET_FLAGS (GTK_WIDGET (self), GTK_NO_WINDOW);
+#line 21 "ui_clip.vala"
+       gtk_widget_set_size_request (GTK_WIDGET (self), width, height);
+#line 317 "ui_clip.c"
+       return self;
+}
+
+
+#line 13 "ui_clip.vala"
+GapView* gap_view_new (gint64 start, gint64 length, gint width, gint height) {
+#line 13 "ui_clip.vala"
+       return gap_view_construct (TYPE_GAP_VIEW, start, length, width, height);
+#line 326 "ui_clip.c"
+}
+
+
+#line 27 "ui_clip.vala"
+void gap_view_remove (GapView* self) {
+#line 27 "ui_clip.vala"
+       g_return_if_fail (IS_GAP_VIEW (self));
+#line 28 "ui_clip.vala"
+       g_signal_emit_by_name (self, "removed", self);
+#line 336 "ui_clip.c"
+}
+
+
+#line 31 "ui_clip.vala"
+void gap_view_unselect (GapView* self) {
+#line 31 "ui_clip.vala"
+       g_return_if_fail (IS_GAP_VIEW (self));
+#line 32 "ui_clip.vala"
+       g_signal_emit_by_name (self, "unselected", self);
+#line 346 "ui_clip.c"
+}
+
+
+#line 35 "ui_clip.vala"
+static gboolean gap_view_real_expose_event (GtkWidget* base, GdkEventExpose* e) {
+#line 352 "ui_clip.c"
+       GapView * self;
+       gboolean result = FALSE;
+       self = GAP_VIEW (base);
+#line 36 "ui_clip.vala"
+       draw_rounded_rectangle (GTK_WIDGET (self)->window, &self->priv->fill_color, TRUE, GTK_WIDGET (self)->allocation.x, GTK_WIDGET (self)->allocation.y, GTK_WIDGET (self)->allocation.width - 1, GTK_WIDGET (self)->allocation.height - 1);
+#line 358 "ui_clip.c"
+       result = TRUE;
+#line 38 "ui_clip.vala"
+       return result;
+#line 362 "ui_clip.c"
+}
+
+
+static void gap_view_class_init (GapViewClass * klass) {
+       gap_view_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (GapViewPrivate));
+       GTK_WIDGET_CLASS (klass)->expose_event = gap_view_real_expose_event;
+       G_OBJECT_CLASS (klass)->finalize = gap_view_finalize;
+       g_signal_new ("removed", TYPE_GAP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TYPE_GAP_VIEW);
+       g_signal_new ("unselected", TYPE_GAP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TYPE_GAP_VIEW);
+}
+
+
+static void gap_view_instance_init (GapView * self) {
+       self->priv = GAP_VIEW_GET_PRIVATE (self);
+}
+
+
+static void gap_view_finalize (GObject* obj) {
+       GapView * self;
+       self = GAP_VIEW (obj);
+       _model_gap_unref0 (self->gap);
+       G_OBJECT_CLASS (gap_view_parent_class)->finalize (obj);
+}
+
+
+GType gap_view_get_type (void) {
+       static volatile gsize gap_view_type_id__volatile = 0;
+       if (g_once_init_enter (&gap_view_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (GapViewClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gap_view_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GapView), 0, (GInstanceInitFunc) gap_view_instance_init, NULL };
+               GType gap_view_type_id;
+               gap_view_type_id = g_type_register_static (GTK_TYPE_DRAWING_AREA, "GapView", &g_define_type_info, 0);
+               g_once_init_leave (&gap_view_type_id__volatile, gap_view_type_id);
+       }
+       return gap_view_type_id__volatile;
+}
+
+
+static GType clip_view_motion_mode_get_type (void) {
+       static volatile gsize clip_view_motion_mode_type_id__volatile = 0;
+       if (g_once_init_enter (&clip_view_motion_mode_type_id__volatile)) {
+               static const GEnumValue values[] = {{CLIP_VIEW_MOTION_MODE_NONE, "CLIP_VIEW_MOTION_MODE_NONE", "none"}, {CLIP_VIEW_MOTION_MODE_DRAGGING, "CLIP_VIEW_MOTION_MODE_DRAGGING", "dragging"}, {CLIP_VIEW_MOTION_MODE_LEFT_TRIM, "CLIP_VIEW_MOTION_MODE_LEFT_TRIM", "left-trim"}, {CLIP_VIEW_MOTION_MODE_RIGHT_TRIM, "CLIP_VIEW_MOTION_MODE_RIGHT_TRIM", "right-trim"}, {0, NULL, NULL}};
+               GType clip_view_motion_mode_type_id;
+               clip_view_motion_mode_type_id = g_enum_register_static ("ClipViewMotionMode", values);
+               g_once_init_leave (&clip_view_motion_mode_type_id__volatile, clip_view_motion_mode_type_id);
+       }
+       return clip_view_motion_mode_type_id__volatile;
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+       return self ? g_object_ref (self) : NULL;
+}
+
+
+#line 132 "ui_clip.vala"
+static void _clip_view_on_clip_moved_model_clip_moved (ModelClip* _sender, ModelClip* clip, gpointer self) {
+#line 420 "ui_clip.c"
+       clip_view_on_clip_moved (self, clip);
+}
+
+
+#line 117 "ui_clip.vala"
+static void _clip_view_on_clip_updated_model_clip_updated (ModelClip* _sender, ModelClip* clip, gpointer self) {
+#line 427 "ui_clip.c"
+       clip_view_on_clip_updated (self);
+}
+
+
+#line 86 "ui_clip.vala"
+ClipView* clip_view_construct (GType object_type, TransportDelegate* transport_delegate, ModelClip* clip, ModelTimeSystem* time_provider, gint height) {
+#line 434 "ui_clip.c"
+       ClipView * self;
+       TransportDelegate* _tmp0_;
+       ModelClip* _tmp1_;
+#line 86 "ui_clip.vala"
+       g_return_val_if_fail (IS_TRANSPORT_DELEGATE (transport_delegate), NULL);
+#line 86 "ui_clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (clip), NULL);
+#line 86 "ui_clip.vala"
+       g_return_val_if_fail (MODEL_IS_TIME_SYSTEM (time_provider), NULL);
+#line 444 "ui_clip.c"
+       self = g_object_newv (object_type, 0, NULL);
+#line 88 "ui_clip.vala"
+       self->priv->transport_delegate = (_tmp0_ = _g_object_ref0 (transport_delegate), _g_object_unref0 (self->priv->transport_delegate), _tmp0_);
+#line 89 "ui_clip.vala"
+       self->clip = (_tmp1_ = _g_object_ref0 (clip), _g_object_unref0 (self->clip), _tmp1_);
+#line 90 "ui_clip.vala"
+       self->priv->time_provider = time_provider;
+#line 91 "ui_clip.vala"
+       self->height = height;
+#line 92 "ui_clip.vala"
+       self->is_selected = FALSE;
+#line 94 "ui_clip.vala"
+       g_signal_connect_object (clip, "moved", (GCallback) _clip_view_on_clip_moved_model_clip_moved, self, 0);
+#line 95 "ui_clip.vala"
+       g_signal_connect_object (clip, "updated", (GCallback) _clip_view_on_clip_updated_model_clip_updated, self, 0);
+#line 97 "ui_clip.vala"
+       gdk_color_parse ("000", &self->priv->color_black);
+#line 98 "ui_clip.vala"
+       clip_view_get_clip_colors (self);
+#line 100 "ui_clip.vala"
+       GTK_WIDGET_SET_FLAGS (GTK_WIDGET (self), GTK_NO_WINDOW);
+#line 102 "ui_clip.vala"
+       clip_view_adjust_size (self, height);
+#line 468 "ui_clip.c"
+       return self;
+}
+
+
+#line 86 "ui_clip.vala"
+ClipView* clip_view_new (TransportDelegate* transport_delegate, ModelClip* clip, ModelTimeSystem* time_provider, gint height) {
+#line 86 "ui_clip.vala"
+       return clip_view_construct (TYPE_CLIP_VIEW, transport_delegate, clip, time_provider, height);
+#line 477 "ui_clip.c"
+}
+
+
+#line 105 "ui_clip.vala"
+static void clip_view_get_clip_colors (ClipView* self) {
+#line 105 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 106 "ui_clip.vala"
+       if (model_clip_file_is_online (self->clip->clipfile)) {
+#line 487 "ui_clip.c"
+               const char* _tmp0_;
+               const char* _tmp1_;
+               _tmp0_ = NULL;
+#line 107 "ui_clip.vala"
+               if (self->clip->type == MODEL_MEDIA_TYPE_VIDEO) {
+#line 107 "ui_clip.vala"
+                       _tmp0_ = "#d82";
+#line 495 "ui_clip.c"
+               } else {
+#line 107 "ui_clip.vala"
+                       _tmp0_ = "#84a";
+#line 499 "ui_clip.c"
+               }
+#line 107 "ui_clip.vala"
+               gdk_color_parse (_tmp0_, &self->priv->color_selected);
+#line 503 "ui_clip.c"
+               _tmp1_ = NULL;
+#line 109 "ui_clip.vala"
+               if (self->clip->type == MODEL_MEDIA_TYPE_VIDEO) {
+#line 109 "ui_clip.vala"
+                       _tmp1_ = "#da5";
+#line 509 "ui_clip.c"
+               } else {
+#line 109 "ui_clip.vala"
+                       _tmp1_ = "#b9d";
+#line 513 "ui_clip.c"
+               }
+#line 109 "ui_clip.vala"
+               gdk_color_parse (_tmp1_, &self->priv->color_normal);
+#line 517 "ui_clip.c"
+       } else {
+#line 112 "ui_clip.vala"
+               gdk_color_parse ("red", &self->priv->color_selected);
+#line 113 "ui_clip.vala"
+               gdk_color_parse ("#AA0000", &self->priv->color_normal);
+#line 523 "ui_clip.c"
+       }
+}
+
+
+#line 117 "ui_clip.vala"
+static void clip_view_on_clip_updated (ClipView* self) {
+#line 117 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 118 "ui_clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_updated");
+#line 119 "ui_clip.vala"
+       clip_view_get_clip_colors (self);
+#line 120 "ui_clip.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self));
+#line 538 "ui_clip.c"
+}
+
+
+#line 126 "ui_clip.vala"
+void clip_view_adjust_size (ClipView* self, gint height) {
+#line 544 "ui_clip.c"
+       gint width;
+#line 126 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 127 "ui_clip.vala"
+       width = model_time_system_time_to_xpos (self->priv->time_provider, model_clip_get_start (self->clip) + model_clip_get_duration (self->clip)) - model_time_system_time_to_xpos (self->priv->time_provider, model_clip_get_start (self->clip));
+#line 129 "ui_clip.vala"
+       gtk_widget_set_size_request (GTK_WIDGET (self), width + 1, height);
+#line 552 "ui_clip.c"
+}
+
+
+#line 132 "ui_clip.vala"
+void clip_view_on_clip_moved (ClipView* self, ModelClip* clip) {
+#line 132 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 132 "ui_clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 133 "ui_clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_moved");
+#line 134 "ui_clip.vala"
+       clip_view_adjust_size (self, self->height);
+#line 135 "ui_clip.vala"
+       g_signal_emit_by_name (self, "clip-moved", self);
+#line 568 "ui_clip.c"
+}
+
+
+#line 138 "ui_clip.vala"
+void clip_view_delete_clip (ClipView* self) {
+#line 138 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 139 "ui_clip.vala"
+       g_signal_emit_by_name (self, "clip-deleted", self->clip);
+#line 578 "ui_clip.c"
+}
+
+
+#line 142 "ui_clip.vala"
+void clip_view_draw (ClipView* self) {
+#line 584 "ui_clip.c"
+       GdkColor _tmp0_ = {0};
+       GdkColor fill;
+       gboolean _tmp1_ = FALSE;
+       gboolean left_trimmed;
+       gboolean _tmp2_ = FALSE;
+       gboolean right_trimmed;
+       gboolean _tmp3_ = FALSE;
+       GdkGC* gc;
+       GdkRectangle _tmp6_ = {0};
+       GdkRectangle r;
+       PangoLayout* layout;
+       gint width = 0;
+       gint height = 0;
+#line 142 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 143 "ui_clip.vala"
+       if (self->is_selected) {
+#line 143 "ui_clip.vala"
+               _tmp0_ = self->priv->color_selected;
+#line 604 "ui_clip.c"
+       } else {
+#line 143 "ui_clip.vala"
+               _tmp0_ = self->priv->color_normal;
+#line 608 "ui_clip.c"
+       }
+#line 143 "ui_clip.vala"
+       fill = _tmp0_;
+#line 145 "ui_clip.vala"
+       if (model_clip_get_media_start (self->clip) != 0) {
+#line 145 "ui_clip.vala"
+               _tmp1_ = !self->clip->is_recording;
+#line 616 "ui_clip.c"
+       } else {
+#line 145 "ui_clip.vala"
+               _tmp1_ = FALSE;
+#line 620 "ui_clip.c"
+       }
+#line 145 "ui_clip.vala"
+       left_trimmed = _tmp1_;
+#line 147 "ui_clip.vala"
+       if (model_clip_file_is_online (self->clip->clipfile)) {
+#line 148 "ui_clip.vala"
+               _tmp2_ = (model_clip_get_media_start (self->clip) + model_clip_get_duration (self->clip)) != model_clip_file_get_length (self->clip->clipfile);
+#line 628 "ui_clip.c"
+       } else {
+#line 148 "ui_clip.vala"
+               _tmp2_ = FALSE;
+#line 632 "ui_clip.c"
+       }
+#line 147 "ui_clip.vala"
+       right_trimmed = _tmp2_;
+#line 150 "ui_clip.vala"
+       if (!left_trimmed) {
+#line 150 "ui_clip.vala"
+               _tmp3_ = !right_trimmed;
+#line 640 "ui_clip.c"
+       } else {
+#line 150 "ui_clip.vala"
+               _tmp3_ = FALSE;
+#line 644 "ui_clip.c"
+       }
+#line 150 "ui_clip.vala"
+       if (_tmp3_) {
+#line 151 "ui_clip.vala"
+               draw_rounded_rectangle (GTK_WIDGET (self)->window, &fill, TRUE, GTK_WIDGET (self)->allocation.x + 1, GTK_WIDGET (self)->allocation.y + 1, GTK_WIDGET (self)->allocation.width - 2, GTK_WIDGET (self)->allocation.height - 2);
+#line 153 "ui_clip.vala"
+               draw_rounded_rectangle (GTK_WIDGET (self)->window, &self->priv->color_black, FALSE, GTK_WIDGET (self)->allocation.x, GTK_WIDGET (self)->allocation.y, GTK_WIDGET (self)->allocation.width - 1, GTK_WIDGET (self)->allocation.height - 1);
+#line 652 "ui_clip.c"
+       } else {
+               gboolean _tmp4_ = FALSE;
+#line 156 "ui_clip.vala"
+               if (!left_trimmed) {
+#line 156 "ui_clip.vala"
+                       _tmp4_ = right_trimmed;
+#line 659 "ui_clip.c"
+               } else {
+#line 156 "ui_clip.vala"
+                       _tmp4_ = FALSE;
+#line 663 "ui_clip.c"
+               }
+#line 156 "ui_clip.vala"
+               if (_tmp4_) {
+#line 157 "ui_clip.vala"
+                       draw_left_rounded_rectangle (GTK_WIDGET (self)->window, &fill, TRUE, GTK_WIDGET (self)->allocation.x + 1, GTK_WIDGET (self)->allocation.y + 1, GTK_WIDGET (self)->allocation.width - 2, GTK_WIDGET (self)->allocation.height - 2);
+#line 159 "ui_clip.vala"
+                       draw_left_rounded_rectangle (GTK_WIDGET (self)->window, &self->priv->color_black, FALSE, GTK_WIDGET (self)->allocation.x, GTK_WIDGET (self)->allocation.y, GTK_WIDGET (self)->allocation.width - 1, GTK_WIDGET (self)->allocation.height - 1);
+#line 671 "ui_clip.c"
+               } else {
+                       gboolean _tmp5_ = FALSE;
+#line 162 "ui_clip.vala"
+                       if (left_trimmed) {
+#line 162 "ui_clip.vala"
+                               _tmp5_ = !right_trimmed;
+#line 678 "ui_clip.c"
+                       } else {
+#line 162 "ui_clip.vala"
+                               _tmp5_ = FALSE;
+#line 682 "ui_clip.c"
+                       }
+#line 162 "ui_clip.vala"
+                       if (_tmp5_) {
+#line 163 "ui_clip.vala"
+                               draw_right_rounded_rectangle (GTK_WIDGET (self)->window, &fill, TRUE, GTK_WIDGET (self)->allocation.x + 1, GTK_WIDGET (self)->allocation.y + 1, GTK_WIDGET (self)->allocation.width - 2, GTK_WIDGET (self)->allocation.height - 2);
+#line 165 "ui_clip.vala"
+                               draw_right_rounded_rectangle (GTK_WIDGET (self)->window, &self->priv->color_black, FALSE, GTK_WIDGET (self)->allocation.x, GTK_WIDGET (self)->allocation.y, GTK_WIDGET (self)->allocation.width - 1, GTK_WIDGET (self)->allocation.height - 1);
+#line 690 "ui_clip.c"
+                       } else {
+#line 169 "ui_clip.vala"
+                               draw_square_rectangle (GTK_WIDGET (self)->window, &fill, TRUE, GTK_WIDGET (self)->allocation.x + 1, GTK_WIDGET (self)->allocation.y + 1, GTK_WIDGET (self)->allocation.width - 2, GTK_WIDGET (self)->allocation.height - 2);
+#line 171 "ui_clip.vala"
+                               draw_square_rectangle (GTK_WIDGET (self)->window, &self->priv->color_black, FALSE, GTK_WIDGET (self)->allocation.x, GTK_WIDGET (self)->allocation.y, GTK_WIDGET (self)->allocation.width - 1, GTK_WIDGET (self)->allocation.height - 1);
+#line 696 "ui_clip.c"
+                       }
+               }
+       }
+#line 175 "ui_clip.vala"
+       gc = gdk_gc_new (GDK_DRAWABLE (GTK_WIDGET (self)->window));
+#line 176 "ui_clip.vala"
+       r = (_tmp6_.x = 0, _tmp6_.y = 0, _tmp6_.width = 0, _tmp6_.height = 0, _tmp6_);
+#line 179 "ui_clip.vala"
+       r.x = GTK_WIDGET (self)->allocation.x;
+#line 180 "ui_clip.vala"
+       r.y = GTK_WIDGET (self)->allocation.y;
+#line 181 "ui_clip.vala"
+       r.width = GTK_WIDGET (self)->allocation.width;
+#line 182 "ui_clip.vala"
+       r.height = GTK_WIDGET (self)->allocation.height;
+#line 184 "ui_clip.vala"
+       gdk_gc_set_clip_rectangle (gc, &r);
+#line 714 "ui_clip.c"
+       layout = NULL;
+#line 187 "ui_clip.vala"
+       if (self->clip->is_recording) {
+#line 718 "ui_clip.c"
+               PangoLayout* _tmp7_;
+#line 188 "ui_clip.vala"
+               layout = (_tmp7_ = gtk_widget_create_pango_layout (GTK_WIDGET (self), "Recording"), _g_object_unref0 (layout), _tmp7_);
+#line 722 "ui_clip.c"
+       } else {
+#line 189 "ui_clip.vala"
+               if (!model_clip_file_is_online (self->clip->clipfile)) {
+#line 726 "ui_clip.c"
+                       PangoLayout* _tmp9_;
+                       char* _tmp8_;
+#line 190 "ui_clip.vala"
+                       layout = (_tmp9_ = gtk_widget_create_pango_layout (GTK_WIDGET (self), _tmp8_ = g_strdup_printf ("%s (Offline)", self->clip->name)), _g_object_unref0 (layout), _tmp9_);
+#line 731 "ui_clip.c"
+                       _g_free0 (_tmp8_);
+               } else {
+                       PangoLayout* _tmp11_;
+                       char* _tmp10_;
+#line 193 "ui_clip.vala"
+                       layout = (_tmp11_ = gtk_widget_create_pango_layout (GTK_WIDGET (self), _tmp10_ = g_strdup_printf ("%s", self->clip->name)), _g_object_unref0 (layout), _tmp11_);
+#line 738 "ui_clip.c"
+                       _g_free0 (_tmp10_);
+               }
+       }
+#line 196 "ui_clip.vala"
+       pango_layout_get_pixel_size (layout, &width, &height);
+#line 197 "ui_clip.vala"
+       gdk_draw_layout (GDK_DRAWABLE (GTK_WIDGET (self)->window), gc, GTK_WIDGET (self)->allocation.x + 10, GTK_WIDGET (self)->allocation.y + height, layout);
+#line 746 "ui_clip.c"
+       _g_object_unref0 (gc);
+       _g_object_unref0 (layout);
+}
+
+
+#line 200 "ui_clip.vala"
+static gboolean clip_view_real_expose_event (GtkWidget* base, GdkEventExpose* event) {
+#line 754 "ui_clip.c"
+       ClipView * self;
+       gboolean result = FALSE;
+       self = CLIP_VIEW (base);
+#line 201 "ui_clip.vala"
+       clip_view_draw (self);
+#line 760 "ui_clip.c"
+       result = TRUE;
+#line 202 "ui_clip.vala"
+       return result;
+#line 764 "ui_clip.c"
+}
+
+
+#line 205 "ui_clip.vala"
+static gboolean clip_view_real_button_press_event (GtkWidget* base, GdkEventButton* event) {
+#line 770 "ui_clip.c"
+       ClipView * self;
+       gboolean result = FALSE;
+       gboolean primary_press;
+       gboolean extend_selection;
+       self = CLIP_VIEW (base);
+#line 206 "ui_clip.vala"
+       if (!transport_delegate_is_stopped (self->priv->transport_delegate)) {
+#line 778 "ui_clip.c"
+               result = TRUE;
+#line 207 "ui_clip.vala"
+               return result;
+#line 782 "ui_clip.c"
+       }
+#line 210 "ui_clip.vala"
+       (*event).x = (*event).x - ((double) GTK_WIDGET (self)->allocation.x);
+#line 211 "ui_clip.vala"
+       primary_press = (*event).button == 1;
+#line 212 "ui_clip.vala"
+       if (primary_press) {
+#line 213 "ui_clip.vala"
+               self->priv->button_down = TRUE;
+#line 214 "ui_clip.vala"
+               self->priv->drag_point = (gint) (*event).x;
+#line 215 "ui_clip.vala"
+               self->priv->snap_amount = 0;
+#line 216 "ui_clip.vala"
+               self->priv->snapped = FALSE;
+#line 798 "ui_clip.c"
+       }
+#line 219 "ui_clip.vala"
+       extend_selection = ((*event).state & GDK_CONTROL_MASK) != 0;
+#line 223 "ui_clip.vala"
+       if (clip_view_is_left_trim (self, (*event).x, (*event).y)) {
+#line 224 "ui_clip.vala"
+               g_signal_emit_by_name (self, "selection-request", self, FALSE);
+#line 225 "ui_clip.vala"
+               if (primary_press) {
+#line 226 "ui_clip.vala"
+                       g_signal_emit_by_name (self, "trim-begin", self, GDK_WINDOW_EDGE_WEST);
+#line 227 "ui_clip.vala"
+                       self->priv->motion_mode = CLIP_VIEW_MOTION_MODE_LEFT_TRIM;
+#line 812 "ui_clip.c"
+               }
+       } else {
+#line 229 "ui_clip.vala"
+               if (clip_view_is_right_trim (self, (*event).x, (*event).y)) {
+#line 230 "ui_clip.vala"
+                       g_signal_emit_by_name (self, "selection-request", self, FALSE);
+#line 231 "ui_clip.vala"
+                       if (primary_press) {
+#line 232 "ui_clip.vala"
+                               g_signal_emit_by_name (self, "trim-begin", self, GDK_WINDOW_EDGE_EAST);
+#line 233 "ui_clip.vala"
+                               self->priv->motion_mode = CLIP_VIEW_MOTION_MODE_RIGHT_TRIM;
+#line 825 "ui_clip.c"
+                       }
+               } else {
+#line 236 "ui_clip.vala"
+                       if (!self->is_selected) {
+#line 237 "ui_clip.vala"
+                               self->priv->pending_selection = FALSE;
+#line 238 "ui_clip.vala"
+                               g_signal_emit_by_name (self, "selection-request", self, extend_selection);
+#line 834 "ui_clip.c"
+                       } else {
+#line 240 "ui_clip.vala"
+                               self->priv->pending_selection = TRUE;
+#line 838 "ui_clip.c"
+                       }
+               }
+       }
+#line 244 "ui_clip.vala"
+       if ((*event).button == 3) {
+#line 245 "ui_clip.vala"
+               gtk_menu_shell_select_first (GTK_MENU_SHELL (clip_view_context_menu), TRUE);
+#line 246 "ui_clip.vala"
+               gtk_menu_popup (clip_view_context_menu, NULL, NULL, NULL, NULL, (*event).button, (*event).time);
+#line 848 "ui_clip.c"
+       } else {
+#line 248 "ui_clip.vala"
+               gtk_menu_popdown (clip_view_context_menu);
+#line 852 "ui_clip.c"
+       }
+       result = TRUE;
+#line 251 "ui_clip.vala"
+       return result;
+#line 857 "ui_clip.c"
+}
+
+
+#line 254 "ui_clip.vala"
+static gboolean clip_view_real_button_release_event (GtkWidget* base, GdkEventButton* event) {
+#line 863 "ui_clip.c"
+       ClipView * self;
+       gboolean result = FALSE;
+       self = CLIP_VIEW (base);
+#line 255 "ui_clip.vala"
+       if (!transport_delegate_is_stopped (self->priv->transport_delegate)) {
+#line 869 "ui_clip.c"
+               result = TRUE;
+#line 256 "ui_clip.vala"
+               return result;
+#line 873 "ui_clip.c"
+       }
+#line 259 "ui_clip.vala"
+       (*event).x = (*event).x - ((double) GTK_WIDGET (self)->allocation.x);
+#line 260 "ui_clip.vala"
+       self->priv->button_down = FALSE;
+#line 261 "ui_clip.vala"
+       if ((*event).button == 1) {
+#line 262 "ui_clip.vala"
+               switch (self->priv->motion_mode) {
+#line 883 "ui_clip.c"
+                       case CLIP_VIEW_MOTION_MODE_NONE:
+                       {
+                               {
+#line 264 "ui_clip.vala"
+                                       if (self->priv->pending_selection) {
+#line 265 "ui_clip.vala"
+                                               g_signal_emit_by_name (self, "selection-request", self, TRUE);
+#line 891 "ui_clip.c"
+                                       }
+                               }
+#line 268 "ui_clip.vala"
+                               break;
+#line 896 "ui_clip.c"
+                       }
+                       case CLIP_VIEW_MOTION_MODE_DRAGGING:
+                       {
+                               {
+                                       gint64 delta;
+#line 270 "ui_clip.vala"
+                                       delta = model_time_system_xsize_to_time (self->priv->time_provider, ((gint) (*event).x) - self->priv->drag_point);
+#line 271 "ui_clip.vala"
+                                       if (self->priv->motion_mode == CLIP_VIEW_MOTION_MODE_DRAGGING) {
+#line 272 "ui_clip.vala"
+                                               g_signal_emit_by_name (self, "move-commit", self, delta);
+#line 908 "ui_clip.c"
+                                       }
+                               }
+#line 275 "ui_clip.vala"
+                               break;
+#line 913 "ui_clip.c"
+                       }
+                       case CLIP_VIEW_MOTION_MODE_LEFT_TRIM:
+                       {
+#line 277 "ui_clip.vala"
+                               g_signal_emit_by_name (self, "trim-commit", self, GDK_WINDOW_EDGE_WEST);
+#line 278 "ui_clip.vala"
+                               break;
+#line 921 "ui_clip.c"
+                       }
+                       case CLIP_VIEW_MOTION_MODE_RIGHT_TRIM:
+                       {
+#line 280 "ui_clip.vala"
+                               g_signal_emit_by_name (self, "trim-commit", self, GDK_WINDOW_EDGE_EAST);
+#line 281 "ui_clip.vala"
+                               break;
+#line 929 "ui_clip.c"
+                       }
+               }
+       }
+#line 284 "ui_clip.vala"
+       self->priv->motion_mode = CLIP_VIEW_MOTION_MODE_NONE;
+#line 935 "ui_clip.c"
+       result = TRUE;
+#line 285 "ui_clip.vala"
+       return result;
+#line 939 "ui_clip.c"
+}
+
+
+#line 288 "ui_clip.vala"
+static gboolean clip_view_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event) {
+#line 945 "ui_clip.c"
+       ClipView * self;
+       gboolean result = FALSE;
+       gint delta_pixels;
+       gint64 delta_time;
+       self = CLIP_VIEW (base);
+#line 289 "ui_clip.vala"
+       if (!transport_delegate_is_stopped (self->priv->transport_delegate)) {
+#line 953 "ui_clip.c"
+               result = TRUE;
+#line 290 "ui_clip.vala"
+               return result;
+#line 957 "ui_clip.c"
+       }
+#line 293 "ui_clip.vala"
+       (*event).x = (*event).x - ((double) GTK_WIDGET (self)->allocation.x);
+#line 294 "ui_clip.vala"
+       delta_pixels = ((gint) ((*event).x - self->priv->drag_point)) - self->priv->snap_amount;
+#line 295 "ui_clip.vala"
+       if (self->priv->snapped) {
+#line 296 "ui_clip.vala"
+               self->priv->snap_amount = self->priv->snap_amount + delta_pixels;
+#line 297 "ui_clip.vala"
+               if (abs (self->priv->snap_amount) < CLIP_VIEW_SNAP_DELTA) {
+#line 969 "ui_clip.c"
+                       result = TRUE;
+#line 298 "ui_clip.vala"
+                       return result;
+#line 973 "ui_clip.c"
+               }
+#line 300 "ui_clip.vala"
+               delta_pixels = delta_pixels + self->priv->snap_amount;
+#line 301 "ui_clip.vala"
+               self->priv->snap_amount = 0;
+#line 302 "ui_clip.vala"
+               self->priv->snapped = FALSE;
+#line 981 "ui_clip.c"
+       }
+#line 305 "ui_clip.vala"
+       delta_time = model_time_system_xsize_to_time (self->priv->time_provider, delta_pixels);
+#line 307 "ui_clip.vala"
+       switch (self->priv->motion_mode) {
+#line 987 "ui_clip.c"
+               case CLIP_VIEW_MOTION_MODE_NONE:
+               {
+                       gboolean _tmp0_ = FALSE;
+#line 309 "ui_clip.vala"
+                       if (!self->priv->button_down) {
+#line 309 "ui_clip.vala"
+                               _tmp0_ = clip_view_is_left_trim (self, (*event).x, (*event).y);
+#line 995 "ui_clip.c"
+                       } else {
+#line 309 "ui_clip.vala"
+                               _tmp0_ = FALSE;
+#line 999 "ui_clip.c"
+                       }
+#line 309 "ui_clip.vala"
+                       if (_tmp0_) {
+#line 310 "ui_clip.vala"
+                               gdk_window_set_cursor (GTK_WIDGET (self)->window, clip_view_left_trim_cursor);
+#line 1005 "ui_clip.c"
+                       } else {
+                               gboolean _tmp1_ = FALSE;
+#line 311 "ui_clip.vala"
+                               if (!self->priv->button_down) {
+#line 311 "ui_clip.vala"
+                                       _tmp1_ = clip_view_is_right_trim (self, (*event).x, (*event).y);
+#line 1012 "ui_clip.c"
+                               } else {
+#line 311 "ui_clip.vala"
+                                       _tmp1_ = FALSE;
+#line 1016 "ui_clip.c"
+                               }
+#line 311 "ui_clip.vala"
+                               if (_tmp1_) {
+#line 312 "ui_clip.vala"
+                                       gdk_window_set_cursor (GTK_WIDGET (self)->window, clip_view_right_trim_cursor);
+#line 1022 "ui_clip.c"
+                               } else {
+                                       gboolean _tmp2_ = FALSE;
+#line 313 "ui_clip.vala"
+                                       if (self->is_selected) {
+#line 313 "ui_clip.vala"
+                                               _tmp2_ = self->priv->button_down;
+#line 1029 "ui_clip.c"
+                                       } else {
+#line 313 "ui_clip.vala"
+                                               _tmp2_ = FALSE;
+#line 1033 "ui_clip.c"
+                                       }
+#line 313 "ui_clip.vala"
+                                       if (_tmp2_) {
+#line 314 "ui_clip.vala"
+                                               if (abs (delta_pixels) > CLIP_VIEW_MIN_DRAG) {
+#line 1039 "ui_clip.c"
+                                                       gboolean do_copy;
+#line 315 "ui_clip.vala"
+                                                       do_copy = ((*event).state & GDK_CONTROL_MASK) != 0;
+#line 316 "ui_clip.vala"
+                                                       if (do_copy) {
+#line 317 "ui_clip.vala"
+                                                               gdk_window_set_cursor (GTK_WIDGET (self)->window, clip_view_plus_cursor);
+#line 1047 "ui_clip.c"
+                                                       } else {
+#line 319 "ui_clip.vala"
+                                                               gdk_window_set_cursor (GTK_WIDGET (self)->window, clip_view_hand_cursor);
+#line 1051 "ui_clip.c"
+                                                       }
+#line 321 "ui_clip.vala"
+                                                       self->priv->motion_mode = CLIP_VIEW_MOTION_MODE_DRAGGING;
+#line 322 "ui_clip.vala"
+                                                       g_signal_emit_by_name (self, "move-begin", self, do_copy);
+#line 1057 "ui_clip.c"
+                                               }
+                                       } else {
+#line 325 "ui_clip.vala"
+                                               gdk_window_set_cursor (GTK_WIDGET (self)->window, NULL);
+#line 1062 "ui_clip.c"
+                                       }
+                               }
+                       }
+#line 327 "ui_clip.vala"
+                       break;
+#line 1068 "ui_clip.c"
+               }
+               case CLIP_VIEW_MOTION_MODE_RIGHT_TRIM:
+               case CLIP_VIEW_MOTION_MODE_LEFT_TRIM:
+               {
+#line 330 "ui_clip.vala"
+                       if (self->priv->button_down) {
+#line 331 "ui_clip.vala"
+                               if (self->priv->motion_mode == CLIP_VIEW_MOTION_MODE_LEFT_TRIM) {
+#line 332 "ui_clip.vala"
+                                       model_clip_trim (self->clip, delta_time, GDK_WINDOW_EDGE_WEST);
+#line 1079 "ui_clip.c"
+                               } else {
+                                       gint64 duration;
+#line 334 "ui_clip.vala"
+                                       duration = model_clip_get_duration (self->clip);
+#line 335 "ui_clip.vala"
+                                       model_clip_trim (self->clip, delta_time, GDK_WINDOW_EDGE_EAST);
+#line 336 "ui_clip.vala"
+                                       if (duration != model_clip_get_duration (self->clip)) {
+#line 337 "ui_clip.vala"
+                                               self->priv->drag_point = self->priv->drag_point + ((gint) delta_pixels);
+#line 1090 "ui_clip.c"
+                                       }
+                               }
+                       }
+                       result = TRUE;
+#line 341 "ui_clip.vala"
+                       return result;
+#line 1097 "ui_clip.c"
+               }
+               case CLIP_VIEW_MOTION_MODE_DRAGGING:
+               {
+#line 343 "ui_clip.vala"
+                       g_signal_emit_by_name (self, "move-request", self, delta_time);
+#line 1103 "ui_clip.c"
+                       result = TRUE;
+#line 344 "ui_clip.vala"
+                       return result;
+#line 1107 "ui_clip.c"
+               }
+       }
+       result = FALSE;
+#line 346 "ui_clip.vala"
+       return result;
+#line 1113 "ui_clip.c"
+}
+
+
+#line 349 "ui_clip.vala"
+static gboolean clip_view_is_trim_height (ClipView* self, double y) {
+#line 1119 "ui_clip.c"
+       gboolean result = FALSE;
+#line 349 "ui_clip.vala"
+       g_return_val_if_fail (IS_CLIP_VIEW (self), FALSE);
+#line 1123 "ui_clip.c"
+       result = (y - GTK_WIDGET (self)->allocation.y) > (GTK_WIDGET (self)->allocation.height / 2);
+#line 350 "ui_clip.vala"
+       return result;
+#line 1127 "ui_clip.c"
+}
+
+
+#line 353 "ui_clip.vala"
+static gboolean clip_view_is_left_trim (ClipView* self, double x, double y) {
+#line 1133 "ui_clip.c"
+       gboolean result = FALSE;
+       gboolean _tmp0_ = FALSE;
+       gboolean _tmp1_ = FALSE;
+#line 353 "ui_clip.vala"
+       g_return_val_if_fail (IS_CLIP_VIEW (self), FALSE);
+#line 354 "ui_clip.vala"
+       if (clip_view_is_trim_height (self, y)) {
+#line 354 "ui_clip.vala"
+               _tmp1_ = x > 0;
+#line 1143 "ui_clip.c"
+       } else {
+#line 354 "ui_clip.vala"
+               _tmp1_ = FALSE;
+#line 1147 "ui_clip.c"
+       }
+#line 354 "ui_clip.vala"
+       if (_tmp1_) {
+#line 354 "ui_clip.vala"
+               _tmp0_ = x < CLIP_VIEW_TRIM_WIDTH;
+#line 1153 "ui_clip.c"
+       } else {
+#line 354 "ui_clip.vala"
+               _tmp0_ = FALSE;
+#line 1157 "ui_clip.c"
+       }
+       result = _tmp0_;
+#line 354 "ui_clip.vala"
+       return result;
+#line 1162 "ui_clip.c"
+}
+
+
+#line 357 "ui_clip.vala"
+static gboolean clip_view_is_right_trim (ClipView* self, double x, double y) {
+#line 1168 "ui_clip.c"
+       gboolean result = FALSE;
+       gboolean _tmp0_ = FALSE;
+       gboolean _tmp1_ = FALSE;
+#line 357 "ui_clip.vala"
+       g_return_val_if_fail (IS_CLIP_VIEW (self), FALSE);
+#line 358 "ui_clip.vala"
+       if (clip_view_is_trim_height (self, y)) {
+#line 358 "ui_clip.vala"
+               _tmp1_ = x > (GTK_WIDGET (self)->allocation.width - CLIP_VIEW_TRIM_WIDTH);
+#line 1178 "ui_clip.c"
+       } else {
+#line 358 "ui_clip.vala"
+               _tmp1_ = FALSE;
+#line 1182 "ui_clip.c"
+       }
+#line 358 "ui_clip.vala"
+       if (_tmp1_) {
+#line 359 "ui_clip.vala"
+               _tmp0_ = x < GTK_WIDGET (self)->allocation.width;
+#line 1188 "ui_clip.c"
+       } else {
+#line 358 "ui_clip.vala"
+               _tmp0_ = FALSE;
+#line 1192 "ui_clip.c"
+       }
+       result = _tmp0_;
+#line 358 "ui_clip.vala"
+       return result;
+#line 1197 "ui_clip.c"
+}
+
+
+#line 362 "ui_clip.vala"
+void clip_view_select (ClipView* self) {
+#line 362 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 363 "ui_clip.vala"
+       if (!self->is_selected) {
+#line 364 "ui_clip.vala"
+               g_signal_emit_by_name (self, "selection-request", self, TRUE);
+#line 1209 "ui_clip.c"
+       }
+}
+
+
+#line 368 "ui_clip.vala"
+void clip_view_snap (ClipView* self, gint64 amount) {
+#line 368 "ui_clip.vala"
+       g_return_if_fail (IS_CLIP_VIEW (self));
+#line 369 "ui_clip.vala"
+       self->priv->snap_amount = model_time_system_time_to_xsize (self->priv->time_provider, amount);
+#line 370 "ui_clip.vala"
+       self->priv->snapped = TRUE;
+#line 1222 "ui_clip.c"
+}
+
+
+static void clip_view_class_init (ClipViewClass * klass) {
+       clip_view_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (ClipViewPrivate));
+       GTK_WIDGET_CLASS (klass)->expose_event = clip_view_real_expose_event;
+       GTK_WIDGET_CLASS (klass)->button_press_event = clip_view_real_button_press_event;
+       GTK_WIDGET_CLASS (klass)->button_release_event = clip_view_real_button_release_event;
+       GTK_WIDGET_CLASS (klass)->motion_notify_event = clip_view_real_motion_notify_event;
+       G_OBJECT_CLASS (klass)->finalize = clip_view_finalize;
+       g_signal_new ("clip_deleted", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_CLIP);
+       g_signal_new ("clip_moved", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TYPE_CLIP_VIEW);
+       g_signal_new ("selection_request", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2, TYPE_CLIP_VIEW, G_TYPE_BOOLEAN);
+       g_signal_new ("move_request", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_INT64, G_TYPE_NONE, 2, TYPE_CLIP_VIEW, G_TYPE_INT64);
+       g_signal_new ("move_commit", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_INT64, G_TYPE_NONE, 2, TYPE_CLIP_VIEW, G_TYPE_INT64);
+       g_signal_new ("move_begin", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2, TYPE_CLIP_VIEW, G_TYPE_BOOLEAN);
+       g_signal_new ("trim_begin", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_ENUM, G_TYPE_NONE, 2, TYPE_CLIP_VIEW, GDK_TYPE_WINDOW_EDGE);
+       g_signal_new ("trim_commit", TYPE_CLIP_VIEW, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_ENUM, G_TYPE_NONE, 2, TYPE_CLIP_VIEW, GDK_TYPE_WINDOW_EDGE);
+       clip_view_left_trim_cursor = gdk_cursor_new (GDK_LEFT_SIDE);
+       clip_view_right_trim_cursor = gdk_cursor_new (GDK_RIGHT_SIDE);
+       clip_view_hand_cursor = gdk_cursor_new_from_name (gdk_display_get_default (), "dnd-none");
+       clip_view_plus_cursor = gdk_cursor_new_from_name (gdk_display_get_default (), "dnd-copy");
+}
+
+
+static void clip_view_instance_init (ClipView * self) {
+       self->priv = CLIP_VIEW_GET_PRIVATE (self);
+       self->priv->motion_mode = CLIP_VIEW_MOTION_MODE_NONE;
+       self->priv->button_down = FALSE;
+}
+
+
+static void clip_view_finalize (GObject* obj) {
+       ClipView * self;
+       self = CLIP_VIEW (obj);
+       _g_object_unref0 (self->clip);
+       _g_object_unref0 (self->priv->transport_delegate);
+       G_OBJECT_CLASS (clip_view_parent_class)->finalize (obj);
+}
+
+
+GType clip_view_get_type (void) {
+       static volatile gsize clip_view_type_id__volatile = 0;
+       if (g_once_init_enter (&clip_view_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ClipViewClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) clip_view_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ClipView), 0, (GInstanceInitFunc) clip_view_instance_init, NULL };
+               GType clip_view_type_id;
+               clip_view_type_id = g_type_register_static (GTK_TYPE_DRAWING_AREA, "ClipView", &g_define_type_info, 0);
+               g_once_init_leave (&clip_view_type_id__volatile, clip_view_type_id);
+       }
+       return clip_view_type_id__volatile;
+}
+
+
+
+static void g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__OBJECT_BOOLEAN) (gpointer data1, gpointer arg_1, gboolean arg_2, gpointer data2);
+       register GMarshalFunc_VOID__OBJECT_BOOLEAN callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__OBJECT_BOOLEAN) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_object (param_values + 1), g_value_get_boolean (param_values + 2), data2);
+}
+
+
+static void g_cclosure_user_marshal_VOID__OBJECT_INT64 (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__OBJECT_INT64) (gpointer data1, gpointer arg_1, gint64 arg_2, gpointer data2);
+       register GMarshalFunc_VOID__OBJECT_INT64 callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__OBJECT_INT64) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_object (param_values + 1), g_value_get_int64 (param_values + 2), data2);
+}
+
+
+static void g_cclosure_user_marshal_VOID__OBJECT_ENUM (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__OBJECT_ENUM) (gpointer data1, gpointer arg_1, gint arg_2, gpointer data2);
+       register GMarshalFunc_VOID__OBJECT_ENUM callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__OBJECT_ENUM) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_object (param_values + 1), g_value_get_enum (param_values + 2), data2);
+}
+
+
+