Initial commit
[fillmore] / src / marina / marina / timeline.c
diff --git a/src/marina/marina/timeline.c b/src/marina/marina/timeline.c
new file mode 100644 (file)
index 0000000..3d62e24
--- /dev/null
@@ -0,0 +1,2906 @@
+/* timeline.c generated by valac, the Vala compiler
+ * generated from timeline.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 <gee.h>
+#include <gtk/gtk.h>
+#include <float.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gdk/gdk.h>
+#include <gst/gst.h>
+#include <gobject/gvaluecollector.h>
+
+
+#define TYPE_TRACK_CLIP_PAIR (track_clip_pair_get_type ())
+#define TRACK_CLIP_PAIR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TRACK_CLIP_PAIR, TrackClipPair))
+#define TRACK_CLIP_PAIR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TRACK_CLIP_PAIR, TrackClipPairClass))
+#define IS_TRACK_CLIP_PAIR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TRACK_CLIP_PAIR))
+#define IS_TRACK_CLIP_PAIR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TRACK_CLIP_PAIR))
+#define TRACK_CLIP_PAIR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TRACK_CLIP_PAIR, TrackClipPairClass))
+
+typedef struct _TrackClipPair TrackClipPair;
+typedef struct _TrackClipPairClass TrackClipPairClass;
+typedef struct _TrackClipPairPrivate TrackClipPairPrivate;
+
+#define MODEL_TYPE_TRACK (model_track_get_type ())
+#define MODEL_TRACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TRACK, ModelTrack))
+#define MODEL_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_TRACK, ModelTrackClass))
+#define MODEL_IS_TRACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TRACK))
+#define MODEL_IS_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_TRACK))
+#define MODEL_TRACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_TRACK, ModelTrackClass))
+
+typedef struct _ModelTrack ModelTrack;
+typedef struct _ModelTrackClass ModelTrackClass;
+
+#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 _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+typedef struct _ParamSpecTrackClipPair ParamSpecTrackClipPair;
+
+#define TYPE_CLIPBOARD (clipboard_get_type ())
+#define CLIPBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CLIPBOARD, Clipboard))
+#define CLIPBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CLIPBOARD, ClipboardClass))
+#define IS_CLIPBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CLIPBOARD))
+#define IS_CLIPBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CLIPBOARD))
+#define CLIPBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CLIPBOARD, ClipboardClass))
+
+typedef struct _Clipboard Clipboard;
+typedef struct _ClipboardClass ClipboardClass;
+typedef struct _ClipboardPrivate ClipboardPrivate;
+
+#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;
+
+#define TYPE_TRACK_VIEW (track_view_get_type ())
+#define TRACK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TRACK_VIEW, TrackView))
+#define IS_TRACK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TRACK_VIEW))
+#define TRACK_VIEW_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_TRACK_VIEW, TrackViewIface))
+
+typedef struct _TrackView TrackView;
+typedef struct _TrackViewIface TrackViewIface;
+typedef struct _ClipViewPrivate ClipViewPrivate;
+#define _track_clip_pair_unref0(var) ((var == NULL) ? NULL : (var = (track_clip_pair_unref (var), NULL)))
+typedef struct _ParamSpecClipboard ParamSpecClipboard;
+
+#define TYPE_TIME_LINE (time_line_get_type ())
+#define TIME_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TIME_LINE, TimeLine))
+#define TIME_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TIME_LINE, TimeLineClass))
+#define IS_TIME_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TIME_LINE))
+#define IS_TIME_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TIME_LINE))
+#define TIME_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TIME_LINE, TimeLineClass))
+
+typedef struct _TimeLine TimeLine;
+typedef struct _TimeLineClass TimeLineClass;
+typedef struct _TimeLinePrivate TimeLinePrivate;
+
+#define MODEL_TYPE_PROJECT (model_project_get_type ())
+#define MODEL_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_PROJECT, ModelProject))
+#define MODEL_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_PROJECT, ModelProjectClass))
+#define MODEL_IS_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_PROJECT))
+#define MODEL_IS_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_PROJECT))
+#define MODEL_PROJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_PROJECT, ModelProjectClass))
+
+typedef struct _ModelProject ModelProject;
+typedef struct _ModelProjectClass ModelProjectClass;
+
+#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 VIEW_TYPE_RULER (view_ruler_get_type ())
+#define VIEW_RULER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIEW_TYPE_RULER, ViewRuler))
+#define VIEW_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIEW_TYPE_RULER, ViewRulerClass))
+#define VIEW_IS_RULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIEW_TYPE_RULER))
+#define VIEW_IS_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIEW_TYPE_RULER))
+#define VIEW_RULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIEW_TYPE_RULER, ViewRulerClass))
+
+typedef struct _ViewRuler ViewRuler;
+typedef struct _ViewRulerClass ViewRulerClass;
+#define _clipboard_unref0(var) ((var == NULL) ? NULL : (var = (clipboard_unref (var), NULL)))
+
+#define MODEL_TYPE_TEMPO_INFORMATION (model_tempo_information_get_type ())
+#define MODEL_TEMPO_INFORMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TEMPO_INFORMATION, ModelTempoInformation))
+#define MODEL_IS_TEMPO_INFORMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TEMPO_INFORMATION))
+#define MODEL_TEMPO_INFORMATION_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MODEL_TYPE_TEMPO_INFORMATION, ModelTempoInformationIface))
+
+typedef struct _ModelTempoInformation ModelTempoInformation;
+typedef struct _ModelTempoInformationIface ModelTempoInformationIface;
+
+#define TYPE_FRACTION (fraction_get_type ())
+typedef struct _Fraction Fraction;
+typedef struct _ModelProjectPrivate ModelProjectPrivate;
+
+#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 TYPE_TIME_CODE (time_code_get_type ())
+typedef struct _TimeCode TimeCode;
+
+#define VIEW_TYPE_MEDIA_ENGINE (view_media_engine_get_type ())
+#define VIEW_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIEW_TYPE_MEDIA_ENGINE, ViewMediaEngine))
+#define VIEW_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIEW_TYPE_MEDIA_ENGINE, ViewMediaEngineClass))
+#define VIEW_IS_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIEW_TYPE_MEDIA_ENGINE))
+#define VIEW_IS_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIEW_TYPE_MEDIA_ENGINE))
+#define VIEW_MEDIA_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIEW_TYPE_MEDIA_ENGINE, ViewMediaEngineClass))
+
+typedef struct _ViewMediaEngine ViewMediaEngine;
+typedef struct _ViewMediaEngineClass ViewMediaEngineClass;
+
+#define MODEL_TYPE_PROJECT_LOADER (model_project_loader_get_type ())
+#define MODEL_PROJECT_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_PROJECT_LOADER, ModelProjectLoader))
+#define MODEL_PROJECT_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_PROJECT_LOADER, ModelProjectLoaderClass))
+#define MODEL_IS_PROJECT_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_PROJECT_LOADER))
+#define MODEL_IS_PROJECT_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_PROJECT_LOADER))
+#define MODEL_PROJECT_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_PROJECT_LOADER, ModelProjectLoaderClass))
+
+typedef struct _ModelProjectLoader ModelProjectLoader;
+typedef struct _ModelProjectLoaderClass ModelProjectLoaderClass;
+
+#define MODEL_TYPE_UNDO_MANAGER (model_undo_manager_get_type ())
+#define MODEL_UNDO_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_UNDO_MANAGER, ModelUndoManager))
+#define MODEL_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerClass))
+#define MODEL_IS_UNDO_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_UNDO_MANAGER))
+#define MODEL_IS_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_UNDO_MANAGER))
+#define MODEL_UNDO_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerClass))
+
+typedef struct _ModelUndoManager ModelUndoManager;
+typedef struct _ModelUndoManagerClass ModelUndoManagerClass;
+
+#define MODEL_TYPE_LIBRARY_IMPORTER (model_library_importer_get_type ())
+#define MODEL_LIBRARY_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_LIBRARY_IMPORTER, ModelLibraryImporter))
+#define MODEL_LIBRARY_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_LIBRARY_IMPORTER, ModelLibraryImporterClass))
+#define MODEL_IS_LIBRARY_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_LIBRARY_IMPORTER))
+#define MODEL_IS_LIBRARY_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_LIBRARY_IMPORTER))
+#define MODEL_LIBRARY_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_LIBRARY_IMPORTER, ModelLibraryImporterClass))
+
+typedef struct _ModelLibraryImporter ModelLibraryImporter;
+typedef struct _ModelLibraryImporterClass ModelLibraryImporterClass;
+
+#define LOGGING_TYPE_FACILITY (logging_facility_get_type ())
+
+#define LOGGING_TYPE_LEVEL (logging_level_get_type ())
+
+#define TYPE_CLASS_FACTORY (class_factory_get_type ())
+#define CLASS_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CLASS_FACTORY, ClassFactory))
+#define CLASS_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CLASS_FACTORY, ClassFactoryClass))
+#define IS_CLASS_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CLASS_FACTORY))
+#define IS_CLASS_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CLASS_FACTORY))
+#define CLASS_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CLASS_FACTORY, ClassFactoryClass))
+
+typedef struct _ClassFactory ClassFactory;
+typedef struct _ClassFactoryClass ClassFactoryClass;
+#define _class_factory_unref0(var) ((var == NULL) ? NULL : (var = (class_factory_unref (var), NULL)))
+
+#define MODEL_TYPE_MEDIA_TYPE (model_media_type_get_type ())
+typedef struct _ModelClipPrivate ModelClipPrivate;
+#define _g_free0(var) (var = (g_free (var), NULL))
+#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
+#define _g_list_free0(var) ((var == NULL) ? NULL : (var = (g_list_free (var), NULL)))
+
+struct _TrackClipPair {
+       GTypeInstance parent_instance;
+       volatile int ref_count;
+       TrackClipPairPrivate * priv;
+       ModelTrack* track;
+       ModelClip* clip;
+};
+
+struct _TrackClipPairClass {
+       GTypeClass parent_class;
+       void (*finalize) (TrackClipPair *self);
+};
+
+struct _ParamSpecTrackClipPair {
+       GParamSpec parent_instance;
+};
+
+struct _Clipboard {
+       GTypeInstance parent_instance;
+       volatile int ref_count;
+       ClipboardPrivate * priv;
+       GeeArrayList* clips;
+};
+
+struct _ClipboardClass {
+       GTypeClass parent_class;
+       void (*finalize) (Clipboard *self);
+};
+
+struct _ClipboardPrivate {
+       gint64 minimum_time;
+};
+
+struct _TrackViewIface {
+       GTypeInterface parent_iface;
+       void (*move_to_top) (TrackView* self, ClipView* clip_view);
+       void (*resize) (TrackView* self);
+       ModelTrack* (*get_track) (TrackView* self);
+       gint (*get_track_height) (TrackView* self);
+       GtkWidget* (*find_child) (TrackView* self, double x, double y);
+       void (*select_all) (TrackView* self);
+};
+
+struct _ClipView {
+       GtkDrawingArea parent_instance;
+       ClipViewPrivate * priv;
+       ModelClip* clip;
+       gint64 initial_time;
+       gboolean is_selected;
+       gint height;
+};
+
+struct _ClipViewClass {
+       GtkDrawingAreaClass parent_class;
+};
+
+struct _ParamSpecClipboard {
+       GParamSpec parent_instance;
+};
+
+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 _TimeLine {
+       GtkEventBox parent_instance;
+       TimeLinePrivate * priv;
+       ModelProject* project;
+       ModelTimeSystem* provider;
+       ViewRuler* ruler;
+       GeeArrayList* tracks;
+       GeeArrayList* selected_clips;
+       Clipboard* clipboard;
+};
+
+struct _TimeLineClass {
+       GtkEventBoxClass parent_class;
+};
+
+struct _TimeLinePrivate {
+       GtkWidget* drag_widget;
+       gboolean copying;
+       GtkVBox* vbox;
+       float pixel_div;
+       float pixel_min;
+       float pixel_max;
+       GtkLabel* high_water;
+};
+
+struct _Fraction {
+       gint numerator;
+       gint denominator;
+};
+
+struct _ModelTempoInformationIface {
+       GTypeInterface parent_iface;
+       void (*get_time_signature) (ModelTempoInformation* self, Fraction* result);
+       gint (*get_bpm) (ModelTempoInformation* self);
+};
+
+struct _TimeCode {
+       gint hour;
+       gint minute;
+       gint second;
+       gint frame;
+       gboolean drop_code;
+};
+
+struct _ModelProject {
+       GObject parent_instance;
+       ModelProjectPrivate * priv;
+       GeeArrayList* tracks;
+       GeeArrayList* inactive_tracks;
+       GeeArrayList* clipfiles;
+       ViewMediaEngine* media_engine;
+       char* project_file;
+       ModelProjectLoader* loader;
+       ModelUndoManager* undo_manager;
+       ModelLibraryImporter* importer;
+       Fraction default_framerate;
+       gboolean click_during_play;
+       gboolean click_during_record;
+       double click_volume;
+       gboolean library_visible;
+       gint library_width;
+       gboolean snap_to_clip;
+};
+
+struct _ModelProjectClass {
+       GObjectClass parent_class;
+       void (*get_clip_time) (ModelProject* self, ModelClipFile* f, TimeCode* result);
+       char* (*get_project_file) (ModelProject* self);
+       void (*do_append) (ModelProject* self, ModelTrack* track, ModelClipFile* clipfile, const char* name, gint64 insert_time);
+       void (*add_track) (ModelProject* self, ModelTrack* track);
+       void (*insert_track) (ModelProject* self, gint index, ModelTrack* track);
+       void (*load) (ModelProject* self, const char* fname);
+       void (*save) (ModelProject* self, const char* filename);
+       char* (*get_app_name) (ModelProject* self);
+       void (*load_complete) (ModelProject* self);
+};
+
+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;
+
+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;
+};
+
+
+static gpointer track_clip_pair_parent_class = NULL;
+static gpointer clipboard_parent_class = NULL;
+static gpointer time_line_parent_class = NULL;
+
+gpointer track_clip_pair_ref (gpointer instance);
+void track_clip_pair_unref (gpointer instance);
+GParamSpec* param_spec_track_clip_pair (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void value_set_track_clip_pair (GValue* value, gpointer v_object);
+void value_take_track_clip_pair (GValue* value, gpointer v_object);
+gpointer value_get_track_clip_pair (const GValue* value);
+GType track_clip_pair_get_type (void);
+GType model_track_get_type (void);
+GType model_clip_get_type (void);
+enum  {
+       TRACK_CLIP_PAIR_DUMMY_PROPERTY
+};
+TrackClipPair* track_clip_pair_new (ModelTrack* track, ModelClip* clip);
+TrackClipPair* track_clip_pair_construct (GType object_type, ModelTrack* track, ModelClip* clip);
+static void track_clip_pair_finalize (TrackClipPair* obj);
+gpointer clipboard_ref (gpointer instance);
+void clipboard_unref (gpointer instance);
+GParamSpec* param_spec_clipboard (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void value_set_clipboard (GValue* value, gpointer v_object);
+void value_take_clipboard (GValue* value, gpointer v_object);
+gpointer value_get_clipboard (const GValue* value);
+GType clipboard_get_type (void);
+#define CLIPBOARD_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_CLIPBOARD, ClipboardPrivate))
+enum  {
+       CLIPBOARD_DUMMY_PROPERTY
+};
+GType clip_view_get_type (void);
+GType track_view_get_type (void);
+gint64 model_clip_get_start (ModelClip* self);
+ModelTrack* track_view_get_track (TrackView* self);
+void clipboard_select (Clipboard* self, GeeArrayList* selected_clips);
+void model_track_do_clip_paste (ModelTrack* self, ModelClip* clip, gint64 position);
+ModelClip* model_clip_copy (ModelClip* self);
+void clipboard_paste (Clipboard* self, ModelTrack* selected_track, gint64 time);
+Clipboard* clipboard_new (void);
+Clipboard* clipboard_construct (GType object_type);
+static void clipboard_finalize (Clipboard* obj);
+GType time_line_get_type (void);
+GType model_project_get_type (void);
+GType model_time_system_get_type (void);
+GType view_ruler_get_type (void);
+#define TIME_LINE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_TIME_LINE, TimeLinePrivate))
+enum  {
+       TIME_LINE_DUMMY_PROPERTY
+};
+#define TIME_LINE_BAR_HEIGHT 32
+#define TIME_LINE_BORDER 4
+#define TIME_LINE_RULER_HEIGHT 32
+static void time_line_on_geometry_changed (TimeLine* self);
+static void _time_line_on_geometry_changed_model_time_system_geometry_changed (ModelTimeSystem* _sender, gpointer self);
+ViewRuler* view_ruler_new (ModelTimeSystem* provider, gint height);
+ViewRuler* view_ruler_construct (GType object_type, ModelTimeSystem* provider, gint height);
+void time_line_on_ruler_position_changed (TimeLine* self, gint x);
+static void _time_line_on_ruler_position_changed_view_ruler_position_changed (ViewRuler* _sender, gint x, gpointer self);
+static void time_line_on_track_added (TimeLine* self, ModelTrack* track);
+static void _time_line_on_track_added_model_project_track_added (ModelProject* _sender, ModelTrack* track, gpointer self);
+static void time_line_on_track_removed (TimeLine* self, ModelTrack* track);
+static void _time_line_on_track_removed_model_project_track_removed (ModelProject* _sender, ModelTrack* track, gpointer self);
+GType fraction_get_type (void);
+Fraction* fraction_dup (const Fraction* self);
+void fraction_free (Fraction* self);
+GType model_tempo_information_get_type (void);
+GType model_clip_file_get_type (void);
+GType time_code_get_type (void);
+TimeCode* time_code_dup (const TimeCode* self);
+void time_code_free (TimeCode* self);
+GType view_media_engine_get_type (void);
+GType model_project_loader_get_type (void);
+gpointer model_undo_manager_ref (gpointer instance);
+void model_undo_manager_unref (gpointer instance);
+GParamSpec* model_param_spec_undo_manager (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_undo_manager (GValue* value, gpointer v_object);
+void model_value_take_undo_manager (GValue* value, gpointer v_object);
+gpointer model_value_get_undo_manager (const GValue* value);
+GType model_undo_manager_get_type (void);
+GType model_library_importer_get_type (void);
+static void time_line_on_position_changed (TimeLine* self);
+static void _time_line_on_position_changed_view_media_engine_position_changed (ViewMediaEngine* _sender, gint64 position, gpointer self);
+void parse_color (const char* color, GdkColor* result);
+void model_time_system_calculate_pixel_step (ModelTimeSystem* self, float inc, float pixel_min, float pixel_div);
+TimeLine* time_line_new (ModelProject* p, ModelTimeSystem* provider, GdkDragAction actions);
+TimeLine* time_line_construct (GType object_type, ModelProject* p, ModelTimeSystem* provider, GdkDragAction actions);
+gint64 model_project_get_length (ModelProject* self);
+void time_line_zoom (TimeLine* self, float inc);
+float model_time_system_get_pixel_percentage (ModelTimeSystem* self);
+void time_line_zoom_to_project (TimeLine* self, double width);
+void track_view_resize (TrackView* self);
+gint64 model_project_transport_get_position (ModelProject* 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);
+gpointer class_factory_ref (gpointer instance);
+void class_factory_unref (gpointer instance);
+GParamSpec* param_spec_class_factory (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void value_set_class_factory (GValue* value, gpointer v_object);
+void value_take_class_factory (GValue* value, gpointer v_object);
+gpointer value_get_class_factory (const GValue* value);
+GType class_factory_get_type (void);
+ClassFactory* class_factory_get_class_factory (void);
+TrackView* class_factory_get_track_view (ClassFactory* self, ModelTrack* track, TimeLine* timeline);
+void time_line_on_clip_view_added (TimeLine* self, ClipView* clip_view);
+static void _time_line_on_clip_view_added_track_view_clip_view_added (TrackView* _sender, ClipView* clip_view, gpointer self);
+GType model_media_type_get_type (void);
+ModelMediaType model_track_media_type (ModelTrack* self);
+static void time_line_on_clip_view_selection_request (TimeLine* self, ClipView* clip_view, gboolean extend);
+static void _time_line_on_clip_view_selection_request_clip_view_selection_request (ClipView* _sender, ClipView* clip_view, gboolean extend_selection, gpointer self);
+static void time_line_on_clip_view_move_request (TimeLine* self, ClipView* clip_view, gint64 delta);
+static void _time_line_on_clip_view_move_request_clip_view_move_request (ClipView* _sender, ClipView* clip_view, gint64 delta, gpointer self);
+static void time_line_on_clip_view_move_commit (TimeLine* self, ClipView* clip_view, gint64 delta);
+static void _time_line_on_clip_view_move_commit_clip_view_move_commit (ClipView* _sender, ClipView* clip_view, gint64 delta, gpointer self);
+static void time_line_on_clip_view_move_begin (TimeLine* self, ClipView* clip_view, gboolean copy);
+static void _time_line_on_clip_view_move_begin_clip_view_move_begin (ClipView* _sender, ClipView* clip_view, gboolean copy, gpointer self);
+static void time_line_on_clip_view_trim_begin (TimeLine* self, ClipView* clip, GdkWindowEdge edge);
+static void _time_line_on_clip_view_trim_begin_clip_view_trim_begin (ClipView* _sender, ClipView* clip_view, GdkWindowEdge edge, gpointer self);
+static void time_line_on_clip_view_trim_commit (TimeLine* self, ClipView* clip_view, GdkWindowEdge edge);
+static void _time_line_on_clip_view_trim_commit_clip_view_trim_commit (ClipView* _sender, ClipView* clip_view, GdkWindowEdge edge, gpointer self);
+void time_line_deselect_all_clips (TimeLine* self);
+void model_undo_manager_start_transaction (ModelUndoManager* self, const char* description);
+gint64 model_clip_get_end (ModelClip* self);
+void model_clip_gnonlin_disconnect (ModelClip* self);
+void model_track_remove_clip_from_array (ModelTrack* self, ModelClip* pos);
+void model_track_append_at_time (ModelTrack* self, ModelClip* c, gint64 time, gboolean select);
+void track_view_move_to_top (TrackView* self, ClipView* clip_view);
+gint64 model_clip_get_duration (ModelClip* self);
+gboolean time_line_is_clip_selected (TimeLine* self);
+void model_clip_gnonlin_connect (ModelClip* self);
+void model_track_move (ModelTrack* self, ModelClip* c, gint64 pos, gint64 original_time);
+void model_undo_manager_end_transaction (ModelUndoManager* self, const char* description);
+void model_clip_trim (ModelClip* self, gint64 delta, GdkWindowEdge edge);
+void model_track_trim (ModelTrack* self, ModelClip* clip, gint64 delta, GdkWindowEdge edge);
+#define CLIP_VIEW_SNAP_DELTA 10
+gint model_time_system_time_to_xsize (ModelTimeSystem* self, gint64 time);
+gint64 model_time_system_xsize_to_time (ModelTimeSystem* self, gint x);
+gboolean model_track_clip_is_near (ModelTrack* self, ModelClip* clip, gint64 range, gint64* adjustment);
+void clip_view_snap (ClipView* self, gint64 amount);
+static void time_line_constrain_move (TimeLine* self, ClipView* clip_view, gint64* delta);
+static gboolean time_line_move_allowed (TimeLine* self, gint64* move_distance);
+static void time_line_move_the_clips (TimeLine* self, gint64 move_distance);
+gint model_time_system_time_to_xpos (ModelTimeSystem* self, gint64 time);
+void time_line_do_clip_move (TimeLine* self, ClipView* clip_view, gint64 delta);
+void model_clip_set_start (ModelClip* self, gint64 value);
+gboolean model_project_transport_is_recording (ModelProject* self);
+void time_line_update_pos (TimeLine* self, gint event_x);
+gboolean time_line_gap_selected (TimeLine* self);
+void clip_view_delete_clip (ClipView* self);
+void time_line_delete_selection (TimeLine* self);
+void time_line_do_cut (TimeLine* self);
+void time_line_do_copy (TimeLine* self);
+void time_line_do_paste (TimeLine* self, gint64 pos);
+void time_line_paste (TimeLine* self);
+gboolean model_track_get_is_selected (ModelTrack* self);
+static TrackView* time_line_find_video_track_view (TimeLine* self);
+static TrackView* time_line_find_audio_track_view (TimeLine* self);
+void track_view_select_all (TrackView* self);
+void time_line_select_all (TimeLine* self);
+static gboolean time_line_real_expose_event (GtkWidget* base, GdkEventExpose* event);
+GtkWidget* time_line_find_child (TimeLine* self, double x, double y);
+void dialog_utils_warning (const char* major_message, const char* minor_message);
+GtkResponseType dialog_utils_add_cancel (const char* message);
+void model_project_create_clip_importer (ModelProject* self, ModelTrack* track, gboolean timeline_add, gint64 time_to_add, gboolean both_tracks, GtkWindow* progress_window_parent, gint number);
+gint64 model_time_system_xpos_to_time (ModelTimeSystem* self, gint x);
+void model_library_importer_add_file (ModelLibraryImporter* self, const char* filename, GError** error);
+void model_library_importer_start (ModelLibraryImporter* self, GError** error);
+static void time_line_real_drag_data_received (GtkWidget* base, GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data, guint drag_info, guint time);
+void model_project_snap_coord (ModelProject* self, gint64* coord, gint64 span);
+gint64 model_time_system_get_pixel_snap_time (ModelTimeSystem* self);
+void view_media_engine_go (ViewMediaEngine* self, gint64 pos);
+static void time_line_deselect_all (TimeLine* self);
+GtkWidget* track_view_find_child (TrackView* self, double x, double y);
+void model_track_set_selected (ModelTrack* self, gboolean is_selected);
+static gboolean time_line_real_button_press_event (GtkWidget* base, GdkEventButton* event);
+static gboolean time_line_real_button_release_event (GtkWidget* base, GdkEventButton* event);
+static gboolean time_line_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event);
+static void time_line_finalize (GObject* obj);
+static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
+static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
+static gint _vala_array_length (gpointer array);
+
+extern const GtkTargetEntry drag_target_entries[1];
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+       return self ? g_object_ref (self) : NULL;
+}
+
+
+#line 10 "timeline.vala"
+TrackClipPair* track_clip_pair_construct (GType object_type, ModelTrack* track, ModelClip* clip) {
+#line 600 "timeline.c"
+       TrackClipPair* self;
+       ModelTrack* _tmp0_;
+       ModelClip* _tmp1_;
+#line 10 "timeline.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (track), NULL);
+#line 10 "timeline.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (clip), NULL);
+#line 608 "timeline.c"
+       self = (TrackClipPair*) g_type_create_instance (object_type);
+#line 11 "timeline.vala"
+       self->track = (_tmp0_ = _g_object_ref0 (track), _g_object_unref0 (self->track), _tmp0_);
+#line 12 "timeline.vala"
+       self->clip = (_tmp1_ = _g_object_ref0 (clip), _g_object_unref0 (self->clip), _tmp1_);
+#line 614 "timeline.c"
+       return self;
+}
+
+
+#line 10 "timeline.vala"
+TrackClipPair* track_clip_pair_new (ModelTrack* track, ModelClip* clip) {
+#line 10 "timeline.vala"
+       return track_clip_pair_construct (TYPE_TRACK_CLIP_PAIR, track, clip);
+#line 623 "timeline.c"
+}
+
+
+static void value_track_clip_pair_init (GValue* value) {
+       value->data[0].v_pointer = NULL;
+}
+
+
+static void value_track_clip_pair_free_value (GValue* value) {
+       if (value->data[0].v_pointer) {
+               track_clip_pair_unref (value->data[0].v_pointer);
+       }
+}
+
+
+static void value_track_clip_pair_copy_value (const GValue* src_value, GValue* dest_value) {
+       if (src_value->data[0].v_pointer) {
+               dest_value->data[0].v_pointer = track_clip_pair_ref (src_value->data[0].v_pointer);
+       } else {
+               dest_value->data[0].v_pointer = NULL;
+       }
+}
+
+
+static gpointer value_track_clip_pair_peek_pointer (const GValue* value) {
+       return value->data[0].v_pointer;
+}
+
+
+static gchar* value_track_clip_pair_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       if (collect_values[0].v_pointer) {
+               TrackClipPair* object;
+               object = collect_values[0].v_pointer;
+               if (object->parent_instance.g_class == NULL) {
+                       return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
+                       return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               }
+               value->data[0].v_pointer = track_clip_pair_ref (object);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       return NULL;
+}
+
+
+static gchar* value_track_clip_pair_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       TrackClipPair** object_p;
+       object_p = collect_values[0].v_pointer;
+       if (!object_p) {
+               return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+       }
+       if (!value->data[0].v_pointer) {
+               *object_p = NULL;
+       } else if (collect_flags && G_VALUE_NOCOPY_CONTENTS) {
+               *object_p = value->data[0].v_pointer;
+       } else {
+               *object_p = track_clip_pair_ref (value->data[0].v_pointer);
+       }
+       return NULL;
+}
+
+
+GParamSpec* param_spec_track_clip_pair (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
+       ParamSpecTrackClipPair* spec;
+       g_return_val_if_fail (g_type_is_a (object_type, TYPE_TRACK_CLIP_PAIR), NULL);
+       spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
+       G_PARAM_SPEC (spec)->value_type = object_type;
+       return G_PARAM_SPEC (spec);
+}
+
+
+gpointer value_get_track_clip_pair (const GValue* value) {
+       g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_TRACK_CLIP_PAIR), NULL);
+       return value->data[0].v_pointer;
+}
+
+
+void value_set_track_clip_pair (GValue* value, gpointer v_object) {
+       TrackClipPair* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_TRACK_CLIP_PAIR));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_TRACK_CLIP_PAIR));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+               track_clip_pair_ref (value->data[0].v_pointer);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               track_clip_pair_unref (old);
+       }
+}
+
+
+void value_take_track_clip_pair (GValue* value, gpointer v_object) {
+       TrackClipPair* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_TRACK_CLIP_PAIR));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_TRACK_CLIP_PAIR));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               track_clip_pair_unref (old);
+       }
+}
+
+
+static void track_clip_pair_class_init (TrackClipPairClass * klass) {
+       track_clip_pair_parent_class = g_type_class_peek_parent (klass);
+       TRACK_CLIP_PAIR_CLASS (klass)->finalize = track_clip_pair_finalize;
+}
+
+
+static void track_clip_pair_instance_init (TrackClipPair * self) {
+       self->ref_count = 1;
+}
+
+
+static void track_clip_pair_finalize (TrackClipPair* obj) {
+       TrackClipPair * self;
+       self = TRACK_CLIP_PAIR (obj);
+       _g_object_unref0 (self->track);
+       _g_object_unref0 (self->clip);
+}
+
+
+GType track_clip_pair_get_type (void) {
+       static volatile gsize track_clip_pair_type_id__volatile = 0;
+       if (g_once_init_enter (&track_clip_pair_type_id__volatile)) {
+               static const GTypeValueTable g_define_type_value_table = { value_track_clip_pair_init, value_track_clip_pair_free_value, value_track_clip_pair_copy_value, value_track_clip_pair_peek_pointer, "p", value_track_clip_pair_collect_value, "p", value_track_clip_pair_lcopy_value };
+               static const GTypeInfo g_define_type_info = { sizeof (TrackClipPairClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) track_clip_pair_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (TrackClipPair), 0, (GInstanceInitFunc) track_clip_pair_instance_init, &g_define_type_value_table };
+               static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
+               GType track_clip_pair_type_id;
+               track_clip_pair_type_id = g_type_register_fundamental (g_type_fundamental_next (), "TrackClipPair", &g_define_type_info, &g_define_type_fundamental_info, 0);
+               g_once_init_leave (&track_clip_pair_type_id__volatile, track_clip_pair_type_id);
+       }
+       return track_clip_pair_type_id__volatile;
+}
+
+
+gpointer track_clip_pair_ref (gpointer instance) {
+       TrackClipPair* self;
+       self = instance;
+       g_atomic_int_inc (&self->ref_count);
+       return instance;
+}
+
+
+void track_clip_pair_unref (gpointer instance) {
+       TrackClipPair* self;
+       self = instance;
+       if (g_atomic_int_dec_and_test (&self->ref_count)) {
+               TRACK_CLIP_PAIR_GET_CLASS (self)->finalize (self);
+               g_type_free_instance ((GTypeInstance *) self);
+       }
+}
+
+
+#line 22 "timeline.vala"
+void clipboard_select (Clipboard* self, GeeArrayList* selected_clips) {
+#line 22 "timeline.vala"
+       g_return_if_fail (IS_CLIPBOARD (self));
+#line 22 "timeline.vala"
+       g_return_if_fail (GEE_IS_ARRAY_LIST (selected_clips));
+#line 23 "timeline.vala"
+       gee_abstract_collection_clear (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 24 "timeline.vala"
+       self->priv->minimum_time = (gint64) (-1);
+#line 798 "timeline.c"
+       {
+               GeeIterator* _clip_view_it;
+               _clip_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (selected_clips));
+#line 25 "timeline.vala"
+               while (TRUE) {
+#line 804 "timeline.c"
+                       ClipView* clip_view;
+                       GtkContainer* _tmp0_;
+                       TrackView* track_view;
+                       gboolean _tmp1_ = FALSE;
+                       ModelTrack* _tmp2_;
+                       TrackClipPair* _tmp3_;
+                       TrackClipPair* track_clip_pair;
+#line 25 "timeline.vala"
+                       if (!gee_iterator_next (_clip_view_it)) {
+#line 25 "timeline.vala"
+                               break;
+#line 816 "timeline.c"
+                       }
+#line 25 "timeline.vala"
+                       clip_view = (ClipView*) gee_iterator_get (_clip_view_it);
+#line 26 "timeline.vala"
+                       track_view = _g_object_ref0 ((_tmp0_ = gtk_widget_get_parent (GTK_WIDGET (clip_view)), IS_TRACK_VIEW (_tmp0_) ? ((TrackView*) _tmp0_) : NULL));
+#line 27 "timeline.vala"
+                       if (self->priv->minimum_time < 0) {
+#line 27 "timeline.vala"
+                               _tmp1_ = TRUE;
+#line 826 "timeline.c"
+                       } else {
+#line 27 "timeline.vala"
+                               _tmp1_ = model_clip_get_start (clip_view->clip) < self->priv->minimum_time;
+#line 830 "timeline.c"
+                       }
+#line 27 "timeline.vala"
+                       if (_tmp1_) {
+#line 28 "timeline.vala"
+                               self->priv->minimum_time = model_clip_get_start (clip_view->clip);
+#line 836 "timeline.c"
+                       }
+#line 30 "timeline.vala"
+                       track_clip_pair = (_tmp3_ = track_clip_pair_new (_tmp2_ = track_view_get_track (track_view), clip_view->clip), _g_object_unref0 (_tmp2_), _tmp3_);
+#line 31 "timeline.vala"
+                       gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->clips), track_clip_pair);
+#line 842 "timeline.c"
+                       _g_object_unref0 (clip_view);
+                       _g_object_unref0 (track_view);
+                       _track_clip_pair_unref0 (track_clip_pair);
+               }
+               _g_object_unref0 (_clip_view_it);
+       }
+}
+
+
+#line 35 "timeline.vala"
+void clipboard_paste (Clipboard* self, ModelTrack* selected_track, gint64 time) {
+#line 35 "timeline.vala"
+       g_return_if_fail (IS_CLIPBOARD (self));
+#line 35 "timeline.vala"
+       g_return_if_fail (MODEL_IS_TRACK (selected_track));
+#line 36 "timeline.vala"
+       if (gee_collection_get_size (GEE_COLLECTION (self->clips)) != 1) {
+#line 860 "timeline.c"
+               {
+                       GeeIterator* _pair_it;
+                       _pair_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 37 "timeline.vala"
+                       while (TRUE) {
+#line 866 "timeline.c"
+                               TrackClipPair* pair;
+                               ModelClip* _tmp0_;
+#line 37 "timeline.vala"
+                               if (!gee_iterator_next (_pair_it)) {
+#line 37 "timeline.vala"
+                                       break;
+#line 873 "timeline.c"
+                               }
+#line 37 "timeline.vala"
+                               pair = (TrackClipPair*) gee_iterator_get (_pair_it);
+#line 38 "timeline.vala"
+                               model_track_do_clip_paste (pair->track, _tmp0_ = model_clip_copy (pair->clip), (time + model_clip_get_start (pair->clip)) - self->priv->minimum_time);
+#line 879 "timeline.c"
+                               _g_object_unref0 (_tmp0_);
+                               _track_clip_pair_unref0 (pair);
+                       }
+                       _g_object_unref0 (_pair_it);
+               }
+       } else {
+               ModelClip* _tmp2_;
+               TrackClipPair* _tmp1_;
+#line 41 "timeline.vala"
+               model_track_do_clip_paste (selected_track, _tmp2_ = model_clip_copy ((_tmp1_ = (TrackClipPair*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), 0))->clip), time);
+#line 890 "timeline.c"
+               _g_object_unref0 (_tmp2_);
+               _track_clip_pair_unref0 (_tmp1_);
+       }
+}
+
+
+#line 18 "timeline.vala"
+Clipboard* clipboard_construct (GType object_type) {
+#line 899 "timeline.c"
+       Clipboard* self;
+       self = (Clipboard*) g_type_create_instance (object_type);
+       return self;
+}
+
+
+#line 18 "timeline.vala"
+Clipboard* clipboard_new (void) {
+#line 18 "timeline.vala"
+       return clipboard_construct (TYPE_CLIPBOARD);
+#line 910 "timeline.c"
+}
+
+
+static void value_clipboard_init (GValue* value) {
+       value->data[0].v_pointer = NULL;
+}
+
+
+static void value_clipboard_free_value (GValue* value) {
+       if (value->data[0].v_pointer) {
+               clipboard_unref (value->data[0].v_pointer);
+       }
+}
+
+
+static void value_clipboard_copy_value (const GValue* src_value, GValue* dest_value) {
+       if (src_value->data[0].v_pointer) {
+               dest_value->data[0].v_pointer = clipboard_ref (src_value->data[0].v_pointer);
+       } else {
+               dest_value->data[0].v_pointer = NULL;
+       }
+}
+
+
+static gpointer value_clipboard_peek_pointer (const GValue* value) {
+       return value->data[0].v_pointer;
+}
+
+
+static gchar* value_clipboard_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       if (collect_values[0].v_pointer) {
+               Clipboard* object;
+               object = collect_values[0].v_pointer;
+               if (object->parent_instance.g_class == NULL) {
+                       return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
+                       return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               }
+               value->data[0].v_pointer = clipboard_ref (object);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       return NULL;
+}
+
+
+static gchar* value_clipboard_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       Clipboard** object_p;
+       object_p = collect_values[0].v_pointer;
+       if (!object_p) {
+               return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+       }
+       if (!value->data[0].v_pointer) {
+               *object_p = NULL;
+       } else if (collect_flags && G_VALUE_NOCOPY_CONTENTS) {
+               *object_p = value->data[0].v_pointer;
+       } else {
+               *object_p = clipboard_ref (value->data[0].v_pointer);
+       }
+       return NULL;
+}
+
+
+GParamSpec* param_spec_clipboard (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
+       ParamSpecClipboard* spec;
+       g_return_val_if_fail (g_type_is_a (object_type, TYPE_CLIPBOARD), NULL);
+       spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
+       G_PARAM_SPEC (spec)->value_type = object_type;
+       return G_PARAM_SPEC (spec);
+}
+
+
+gpointer value_get_clipboard (const GValue* value) {
+       g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_CLIPBOARD), NULL);
+       return value->data[0].v_pointer;
+}
+
+
+void value_set_clipboard (GValue* value, gpointer v_object) {
+       Clipboard* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_CLIPBOARD));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_CLIPBOARD));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+               clipboard_ref (value->data[0].v_pointer);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               clipboard_unref (old);
+       }
+}
+
+
+void value_take_clipboard (GValue* value, gpointer v_object) {
+       Clipboard* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_CLIPBOARD));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_CLIPBOARD));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               clipboard_unref (old);
+       }
+}
+
+
+static void clipboard_class_init (ClipboardClass * klass) {
+       clipboard_parent_class = g_type_class_peek_parent (klass);
+       CLIPBOARD_CLASS (klass)->finalize = clipboard_finalize;
+       g_type_class_add_private (klass, sizeof (ClipboardPrivate));
+}
+
+
+static void clipboard_instance_init (Clipboard * self) {
+       self->priv = CLIPBOARD_GET_PRIVATE (self);
+       self->clips = gee_array_list_new (TYPE_TRACK_CLIP_PAIR, (GBoxedCopyFunc) track_clip_pair_ref, track_clip_pair_unref, NULL);
+       self->priv->minimum_time = (gint64) (-1);
+       self->ref_count = 1;
+}
+
+
+static void clipboard_finalize (Clipboard* obj) {
+       Clipboard * self;
+       self = CLIPBOARD (obj);
+       _g_object_unref0 (self->clips);
+}
+
+
+GType clipboard_get_type (void) {
+       static volatile gsize clipboard_type_id__volatile = 0;
+       if (g_once_init_enter (&clipboard_type_id__volatile)) {
+               static const GTypeValueTable g_define_type_value_table = { value_clipboard_init, value_clipboard_free_value, value_clipboard_copy_value, value_clipboard_peek_pointer, "p", value_clipboard_collect_value, "p", value_clipboard_lcopy_value };
+               static const GTypeInfo g_define_type_info = { sizeof (ClipboardClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) clipboard_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Clipboard), 0, (GInstanceInitFunc) clipboard_instance_init, &g_define_type_value_table };
+               static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
+               GType clipboard_type_id;
+               clipboard_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Clipboard", &g_define_type_info, &g_define_type_fundamental_info, 0);
+               g_once_init_leave (&clipboard_type_id__volatile, clipboard_type_id);
+       }
+       return clipboard_type_id__volatile;
+}
+
+
+gpointer clipboard_ref (gpointer instance) {
+       Clipboard* self;
+       self = instance;
+       g_atomic_int_inc (&self->ref_count);
+       return instance;
+}
+
+
+void clipboard_unref (gpointer instance) {
+       Clipboard* self;
+       self = instance;
+       if (g_atomic_int_dec_and_test (&self->ref_count)) {
+               CLIPBOARD_GET_CLASS (self)->finalize (self);
+               g_type_free_instance ((GTypeInstance *) self);
+       }
+}
+
+
+#line 124 "timeline.vala"
+static void _time_line_on_geometry_changed_model_time_system_geometry_changed (ModelTimeSystem* _sender, gpointer self) {
+#line 1080 "timeline.c"
+       time_line_on_geometry_changed (self);
+}
+
+
+#line 368 "timeline.vala"
+static void _time_line_on_ruler_position_changed_view_ruler_position_changed (ViewRuler* _sender, gint x, gpointer self) {
+#line 1087 "timeline.c"
+       time_line_on_ruler_position_changed (self, x);
+}
+
+
+#line 135 "timeline.vala"
+static void _time_line_on_track_added_model_project_track_added (ModelProject* _sender, ModelTrack* track, gpointer self) {
+#line 1094 "timeline.c"
+       time_line_on_track_added (self, track);
+}
+
+
+#line 148 "timeline.vala"
+static void _time_line_on_track_removed_model_project_track_removed (ModelProject* _sender, ModelTrack* track, gpointer self) {
+#line 1101 "timeline.c"
+       time_line_on_track_removed (self, track);
+}
+
+
+#line 130 "timeline.vala"
+static void _time_line_on_position_changed_view_media_engine_position_changed (ViewMediaEngine* _sender, gint64 position, gpointer self) {
+#line 1108 "timeline.c"
+       time_line_on_position_changed (self);
+}
+
+
+#line 75 "timeline.vala"
+TimeLine* time_line_construct (GType object_type, ModelProject* p, ModelTimeSystem* provider, GdkDragAction actions) {
+#line 1115 "timeline.c"
+       TimeLine * self;
+       GtkWidget* _tmp0_;
+       ModelProject* _tmp1_;
+       GtkVBox* _tmp2_;
+       ViewRuler* _tmp3_;
+       GdkColor _tmp5_;
+       GdkColor _tmp4_ = {0};
+       GdkColor _tmp7_;
+       GdkColor _tmp6_ = {0};
+#line 75 "timeline.vala"
+       g_return_val_if_fail (MODEL_IS_PROJECT (p), NULL);
+#line 75 "timeline.vala"
+       g_return_val_if_fail (MODEL_IS_TIME_SYSTEM (provider), NULL);
+#line 1129 "timeline.c"
+       self = g_object_newv (object_type, 0, NULL);
+#line 76 "timeline.vala"
+       gtk_widget_add_events (GTK_WIDGET (self), (gint) GDK_POINTER_MOTION_MASK);
+#line 77 "timeline.vala"
+       self->priv->drag_widget = (_tmp0_ = NULL, _g_object_unref0 (self->priv->drag_widget), _tmp0_);
+#line 78 "timeline.vala"
+       g_object_set (GTK_WIDGET (self), "can-focus", TRUE, NULL);
+#line 79 "timeline.vala"
+       self->project = (_tmp1_ = _g_object_ref0 (p), _g_object_unref0 (self->project), _tmp1_);
+#line 80 "timeline.vala"
+       self->provider = provider;
+#line 81 "timeline.vala"
+       g_signal_connect_object (provider, "geometry-changed", (GCallback) _time_line_on_geometry_changed_model_time_system_geometry_changed, self, 0);
+#line 83 "timeline.vala"
+       self->priv->vbox = (_tmp2_ = g_object_ref_sink ((GtkVBox*) gtk_vbox_new (FALSE, 0)), _g_object_unref0 (self->priv->vbox), _tmp2_);
+#line 84 "timeline.vala"
+       self->ruler = (_tmp3_ = g_object_ref_sink (view_ruler_new (provider, TIME_LINE_RULER_HEIGHT)), _g_object_unref0 (self->ruler), _tmp3_);
+#line 85 "timeline.vala"
+       g_signal_connect_object (self->ruler, "position-changed", (GCallback) _time_line_on_ruler_position_changed_view_ruler_position_changed, self, 0);
+#line 86 "timeline.vala"
+       gtk_box_pack_start (GTK_BOX (self->priv->vbox), GTK_WIDGET (self->ruler), FALSE, FALSE, (guint) 0);
+#line 88 "timeline.vala"
+       g_signal_connect_object (self->project, "track-added", (GCallback) _time_line_on_track_added_model_project_track_added, self, 0);
+#line 89 "timeline.vala"
+       g_signal_connect_object (self->project, "track-removed", (GCallback) _time_line_on_track_removed_model_project_track_removed, self, 0);
+#line 90 "timeline.vala"
+       g_signal_connect_object (self->project->media_engine, "position-changed", (GCallback) _time_line_on_position_changed_view_media_engine_position_changed, self, 0);
+#line 91 "timeline.vala"
+       gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->priv->vbox));
+#line 93 "timeline.vala"
+       gtk_widget_modify_bg (GTK_WIDGET (self), GTK_STATE_NORMAL, (_tmp5_ = (parse_color ("#444", &_tmp4_), _tmp4_), &_tmp5_));
+#line 94 "timeline.vala"
+       gtk_widget_modify_fg (GTK_WIDGET (self), GTK_STATE_NORMAL, (_tmp7_ = (parse_color ("#f00", &_tmp6_), _tmp6_), &_tmp7_));
+#line 96 "timeline.vala"
+       self->priv->pixel_div = self->priv->pixel_max / self->priv->pixel_min;
+#line 97 "timeline.vala"
+       model_time_system_calculate_pixel_step (provider, 0.5f, self->priv->pixel_min, self->priv->pixel_div);
+#line 98 "timeline.vala"
+       gtk_drag_dest_set (GTK_WIDGET (self), GTK_DEST_DEFAULT_ALL, drag_target_entries, G_N_ELEMENTS (drag_target_entries), actions);
+#line 1169 "timeline.c"
+       return self;
+}
+
+
+#line 75 "timeline.vala"
+TimeLine* time_line_new (ModelProject* p, ModelTimeSystem* provider, GdkDragAction actions) {
+#line 75 "timeline.vala"
+       return time_line_construct (TYPE_TIME_LINE, p, provider, actions);
+#line 1178 "timeline.c"
+}
+
+
+#line 101 "timeline.vala"
+void time_line_zoom_to_project (TimeLine* self, double width) {
+#line 1184 "timeline.c"
+       double numerator;
+       double denominator;
+#line 101 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 102 "timeline.vala"
+       if (model_project_get_length (self->project) == 0) {
+#line 103 "timeline.vala"
+               return;
+#line 1193 "timeline.c"
+       }
+#line 106 "timeline.vala"
+       width = width - 12.0;
+#line 108 "timeline.vala"
+       numerator = log ((width * GST_SECOND) / (((double) model_project_get_length (self->project)) * ((double) self->priv->pixel_min)));
+#line 110 "timeline.vala"
+       denominator = log ((double) self->priv->pixel_div);
+#line 112 "timeline.vala"
+       time_line_zoom (self, ((float) (numerator / denominator)) - model_time_system_get_pixel_percentage (self->provider));
+#line 1203 "timeline.c"
+}
+
+
+#line 115 "timeline.vala"
+void time_line_zoom (TimeLine* self, float inc) {
+#line 115 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 116 "timeline.vala"
+       model_time_system_calculate_pixel_step (self->provider, inc, self->priv->pixel_min, self->priv->pixel_div);
+#line 1213 "timeline.c"
+       {
+               GeeIterator* _track_it;
+               _track_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->tracks));
+#line 117 "timeline.vala"
+               while (TRUE) {
+#line 1219 "timeline.c"
+                       TrackView* track;
+#line 117 "timeline.vala"
+                       if (!gee_iterator_next (_track_it)) {
+#line 117 "timeline.vala"
+                               break;
+#line 1225 "timeline.c"
+                       }
+#line 117 "timeline.vala"
+                       track = (TrackView*) gee_iterator_get (_track_it);
+#line 118 "timeline.vala"
+                       track_view_resize (track);
+#line 1231 "timeline.c"
+                       _g_object_unref0 (track);
+               }
+               _g_object_unref0 (_track_it);
+       }
+#line 120 "timeline.vala"
+       g_signal_emit_by_name (self->project->media_engine, "position-changed", model_project_transport_get_position (self->project));
+#line 121 "timeline.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self));
+#line 1240 "timeline.c"
+}
+
+
+#line 124 "timeline.vala"
+static void time_line_on_geometry_changed (TimeLine* self) {
+#line 124 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 125 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_geometry_changed");
+#line 126 "timeline.vala"
+       model_time_system_calculate_pixel_step (self->provider, (float) 0, self->priv->pixel_min, self->priv->pixel_div);
+#line 127 "timeline.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self->ruler));
+#line 1254 "timeline.c"
+}
+
+
+#line 130 "timeline.vala"
+static void time_line_on_position_changed (TimeLine* self) {
+#line 130 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 131 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_position_changed");
+#line 132 "timeline.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self));
+#line 1266 "timeline.c"
+}
+
+
+#line 160 "timeline.vala"
+static void _time_line_on_clip_view_added_track_view_clip_view_added (TrackView* _sender, ClipView* clip_view, gpointer self) {
+#line 1272 "timeline.c"
+       time_line_on_clip_view_added (self, clip_view);
+}
+
+
+#line 135 "timeline.vala"
+static void time_line_on_track_added (TimeLine* self, ModelTrack* track) {
+#line 1279 "timeline.c"
+       ClassFactory* _tmp0_;
+       TrackView* _tmp1_;
+       TrackView* track_view;
+#line 135 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 135 "timeline.vala"
+       g_return_if_fail (MODEL_IS_TRACK (track));
+#line 136 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_track_added");
+#line 137 "timeline.vala"
+       track_view = (_tmp1_ = class_factory_get_track_view (_tmp0_ = class_factory_get_class_factory (), track, self), _class_factory_unref0 (_tmp0_), _tmp1_);
+#line 138 "timeline.vala"
+       g_signal_connect_object (track_view, "clip-view-added", (GCallback) _time_line_on_clip_view_added_track_view_clip_view_added, self, 0);
+#line 139 "timeline.vala"
+       gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->tracks), track_view);
+#line 140 "timeline.vala"
+       gtk_box_pack_start (GTK_BOX (self->priv->vbox), GTK_WIDGET (track_view), FALSE, FALSE, (guint) 0);
+#line 141 "timeline.vala"
+       g_signal_emit_by_name (self, "trackview-added", track_view);
+#line 142 "timeline.vala"
+       if (model_track_media_type (track) == MODEL_MEDIA_TYPE_VIDEO) {
+#line 143 "timeline.vala"
+               gtk_box_reorder_child (GTK_BOX (self->priv->vbox), GTK_WIDGET (track_view), 1);
+#line 1303 "timeline.c"
+       }
+#line 145 "timeline.vala"
+       gtk_widget_show_all (GTK_WIDGET (self->priv->vbox));
+#line 1307 "timeline.c"
+       _g_object_unref0 (track_view);
+}
+
+
+#line 148 "timeline.vala"
+static void time_line_on_track_removed (TimeLine* self, ModelTrack* track) {
+#line 148 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 148 "timeline.vala"
+       g_return_if_fail (MODEL_IS_TRACK (track));
+#line 149 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_track_removed");
+#line 1320 "timeline.c"
+       {
+               GeeIterator* _track_view_it;
+               _track_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->tracks));
+#line 150 "timeline.vala"
+               while (TRUE) {
+#line 1326 "timeline.c"
+                       TrackView* track_view;
+                       ModelTrack* _tmp0_;
+                       gboolean _tmp1_;
+#line 150 "timeline.vala"
+                       if (!gee_iterator_next (_track_view_it)) {
+#line 150 "timeline.vala"
+                               break;
+#line 1334 "timeline.c"
+                       }
+#line 150 "timeline.vala"
+                       track_view = (TrackView*) gee_iterator_get (_track_view_it);
+#line 151 "timeline.vala"
+                       if ((_tmp1_ = (_tmp0_ = track_view_get_track (track_view)) == track, _g_object_unref0 (_tmp0_), _tmp1_)) {
+#line 152 "timeline.vala"
+                               g_signal_emit_by_name (self, "trackview-removed", track_view);
+#line 153 "timeline.vala"
+                               gtk_container_remove (GTK_CONTAINER (self->priv->vbox), GTK_WIDGET (track_view));
+#line 154 "timeline.vala"
+                               gee_abstract_collection_remove (GEE_ABSTRACT_COLLECTION (self->tracks), track_view);
+#line 1346 "timeline.c"
+                               _g_object_unref0 (track_view);
+#line 155 "timeline.vala"
+                               break;
+#line 1350 "timeline.c"
+                       }
+                       _g_object_unref0 (track_view);
+               }
+               _g_object_unref0 (_track_view_it);
+       }
+}
+
+
+#line 234 "timeline.vala"
+static void _time_line_on_clip_view_selection_request_clip_view_selection_request (ClipView* _sender, ClipView* clip_view, gboolean extend_selection, gpointer self) {
+#line 1361 "timeline.c"
+       time_line_on_clip_view_selection_request (self, clip_view, extend_selection);
+}
+
+
+#line 327 "timeline.vala"
+static void _time_line_on_clip_view_move_request_clip_view_move_request (ClipView* _sender, ClipView* clip_view, gint64 delta, gpointer self) {
+#line 1368 "timeline.c"
+       time_line_on_clip_view_move_request (self, clip_view, delta);
+}
+
+
+#line 267 "timeline.vala"
+static void _time_line_on_clip_view_move_commit_clip_view_move_commit (ClipView* _sender, ClipView* clip_view, gint64 delta, gpointer self) {
+#line 1375 "timeline.c"
+       time_line_on_clip_view_move_commit (self, clip_view, delta);
+}
+
+
+#line 177 "timeline.vala"
+static void _time_line_on_clip_view_move_begin_clip_view_move_begin (ClipView* _sender, ClipView* clip_view, gboolean copy, gpointer self) {
+#line 1382 "timeline.c"
+       time_line_on_clip_view_move_begin (self, clip_view, copy);
+}
+
+
+#line 219 "timeline.vala"
+static void _time_line_on_clip_view_trim_begin_clip_view_trim_begin (ClipView* _sender, ClipView* clip_view, GdkWindowEdge edge, gpointer self) {
+#line 1389 "timeline.c"
+       time_line_on_clip_view_trim_begin (self, clip_view, edge);
+}
+
+
+#line 288 "timeline.vala"
+static void _time_line_on_clip_view_trim_commit_clip_view_trim_commit (ClipView* _sender, ClipView* clip_view, GdkWindowEdge edge, gpointer self) {
+#line 1396 "timeline.c"
+       time_line_on_clip_view_trim_commit (self, clip_view, edge);
+}
+
+
+#line 160 "timeline.vala"
+void time_line_on_clip_view_added (TimeLine* self, ClipView* clip_view) {
+#line 160 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 160 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 161 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_clip_view_added");
+#line 162 "timeline.vala"
+       g_signal_connect_object (clip_view, "selection-request", (GCallback) _time_line_on_clip_view_selection_request_clip_view_selection_request, self, 0);
+#line 163 "timeline.vala"
+       g_signal_connect_object (clip_view, "move-request", (GCallback) _time_line_on_clip_view_move_request_clip_view_move_request, self, 0);
+#line 164 "timeline.vala"
+       g_signal_connect_object (clip_view, "move-commit", (GCallback) _time_line_on_clip_view_move_commit_clip_view_move_commit, self, 0);
+#line 165 "timeline.vala"
+       g_signal_connect_object (clip_view, "move-begin", (GCallback) _time_line_on_clip_view_move_begin_clip_view_move_begin, self, 0);
+#line 166 "timeline.vala"
+       g_signal_connect_object (clip_view, "trim-begin", (GCallback) _time_line_on_clip_view_trim_begin_clip_view_trim_begin, self, 0);
+#line 167 "timeline.vala"
+       g_signal_connect_object (clip_view, "trim-commit", (GCallback) _time_line_on_clip_view_trim_commit_clip_view_trim_commit, self, 0);
+#line 1421 "timeline.c"
+}
+
+
+#line 170 "timeline.vala"
+void time_line_deselect_all_clips (TimeLine* self) {
+#line 170 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 1429 "timeline.c"
+       {
+               GeeIterator* _selected_clip_view_it;
+               _selected_clip_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 171 "timeline.vala"
+               while (TRUE) {
+#line 1435 "timeline.c"
+                       ClipView* selected_clip_view;
+#line 171 "timeline.vala"
+                       if (!gee_iterator_next (_selected_clip_view_it)) {
+#line 171 "timeline.vala"
+                               break;
+#line 1441 "timeline.c"
+                       }
+#line 171 "timeline.vala"
+                       selected_clip_view = (ClipView*) gee_iterator_get (_selected_clip_view_it);
+#line 172 "timeline.vala"
+                       selected_clip_view->is_selected = FALSE;
+#line 1447 "timeline.c"
+                       _g_object_unref0 (selected_clip_view);
+               }
+               _g_object_unref0 (_selected_clip_view_it);
+       }
+#line 174 "timeline.vala"
+       gee_abstract_collection_clear (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 1454 "timeline.c"
+}
+
+
+#line 177 "timeline.vala"
+static void time_line_on_clip_view_move_begin (TimeLine* self, ClipView* clip_view, gboolean copy) {
+#line 1460 "timeline.c"
+       ClipView* max_clip;
+       GtkLabel* _tmp5_;
+       GtkWidget* _tmp6_;
+       GtkFixed* the_parent;
+#line 177 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 177 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 178 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_view_move_begin");
+#line 179 "timeline.vala"
+       self->priv->copying = copy;
+#line 180 "timeline.vala"
+       if (copy) {
+#line 181 "timeline.vala"
+               model_undo_manager_start_transaction (self->project->undo_manager, "Copy Clip");
+#line 1477 "timeline.c"
+       }
+#line 183 "timeline.vala"
+       max_clip = NULL;
+#line 1481 "timeline.c"
+       {
+               GeeIterator* _selected_clip_it;
+               _selected_clip_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 185 "timeline.vala"
+               while (TRUE) {
+#line 1487 "timeline.c"
+                       ClipView* selected_clip;
+                       GtkWidget* _tmp2_;
+                       TrackView* track_view;
+#line 185 "timeline.vala"
+                       if (!gee_iterator_next (_selected_clip_it)) {
+#line 185 "timeline.vala"
+                               break;
+#line 1495 "timeline.c"
+                       }
+#line 185 "timeline.vala"
+                       selected_clip = (ClipView*) gee_iterator_get (_selected_clip_it);
+#line 186 "timeline.vala"
+                       if (max_clip == NULL) {
+#line 1501 "timeline.c"
+                               ClipView* _tmp0_;
+#line 187 "timeline.vala"
+                               max_clip = (_tmp0_ = _g_object_ref0 (selected_clip), _g_object_unref0 (max_clip), _tmp0_);
+#line 1505 "timeline.c"
+                       } else {
+#line 188 "timeline.vala"
+                               if (model_clip_get_end (max_clip->clip) < model_clip_get_end (selected_clip->clip)) {
+#line 1509 "timeline.c"
+                                       ClipView* _tmp1_;
+#line 189 "timeline.vala"
+                                       max_clip = (_tmp1_ = _g_object_ref0 (selected_clip), _g_object_unref0 (max_clip), _tmp1_);
+#line 1513 "timeline.c"
+                               }
+                       }
+#line 191 "timeline.vala"
+                       selected_clip->initial_time = model_clip_get_start (selected_clip->clip);
+#line 192 "timeline.vala"
+                       model_clip_gnonlin_disconnect (selected_clip->clip);
+#line 193 "timeline.vala"
+                       track_view = _g_object_ref0 ((_tmp2_ = gtk_widget_get_parent (GTK_WIDGET (selected_clip)), IS_TRACK_VIEW (_tmp2_) ? ((TrackView*) _tmp2_) : NULL));
+#line 194 "timeline.vala"
+                       if (track_view != NULL) {
+#line 1524 "timeline.c"
+                               ModelTrack* _tmp3_;
+#line 195 "timeline.vala"
+                               model_track_remove_clip_from_array (_tmp3_ = track_view_get_track (track_view), selected_clip->clip);
+#line 1528 "timeline.c"
+                               _g_object_unref0 (_tmp3_);
+                       }
+#line 197 "timeline.vala"
+                       if (copy) {
+#line 1533 "timeline.c"
+                               ModelClip* clip;
+                               ModelTrack* _tmp4_;
+#line 201 "timeline.vala"
+                               clip = model_clip_copy (selected_clip->clip);
+#line 202 "timeline.vala"
+                               model_track_append_at_time (_tmp4_ = track_view_get_track (track_view), clip, model_clip_get_start (selected_clip->clip), FALSE);
+#line 1540 "timeline.c"
+                               _g_object_unref0 (_tmp4_);
+                               _g_object_unref0 (clip);
+                       }
+                       _g_object_unref0 (selected_clip);
+                       _g_object_unref0 (track_view);
+               }
+               _g_object_unref0 (_selected_clip_it);
+       }
+#line 206 "timeline.vala"
+       self->priv->high_water = (_tmp5_ = g_object_ref_sink ((GtkLabel*) gtk_label_new (NULL)), _g_object_unref0 (self->priv->high_water), _tmp5_);
+#line 207 "timeline.vala"
+       the_parent = _g_object_ref0 ((_tmp6_ = gtk_widget_get_parent (GTK_WIDGET (clip_view)), GTK_IS_FIXED (_tmp6_) ? ((GtkFixed*) _tmp6_) : NULL));
+#line 208 "timeline.vala"
+       gtk_fixed_put (the_parent, GTK_WIDGET (self->priv->high_water), GTK_WIDGET (max_clip)->allocation.x + GTK_WIDGET (max_clip)->allocation.width, GTK_WIDGET (max_clip)->allocation.y);
+#line 1555 "timeline.c"
+       {
+               GeeIterator* _selected_clip_it;
+               _selected_clip_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 213 "timeline.vala"
+               while (TRUE) {
+#line 1561 "timeline.c"
+                       ClipView* selected_clip;
+                       GtkWidget* _tmp7_;
+                       TrackView* track_view;
+#line 213 "timeline.vala"
+                       if (!gee_iterator_next (_selected_clip_it)) {
+#line 213 "timeline.vala"
+                               break;
+#line 1569 "timeline.c"
+                       }
+#line 213 "timeline.vala"
+                       selected_clip = (ClipView*) gee_iterator_get (_selected_clip_it);
+#line 214 "timeline.vala"
+                       track_view = _g_object_ref0 ((_tmp7_ = gtk_widget_get_parent (GTK_WIDGET (selected_clip)), IS_TRACK_VIEW (_tmp7_) ? ((TrackView*) _tmp7_) : NULL));
+#line 215 "timeline.vala"
+                       track_view_move_to_top (track_view, selected_clip);
+#line 1577 "timeline.c"
+                       _g_object_unref0 (selected_clip);
+                       _g_object_unref0 (track_view);
+               }
+               _g_object_unref0 (_selected_clip_it);
+       }
+       _g_object_unref0 (max_clip);
+       _g_object_unref0 (the_parent);
+}
+
+
+#line 219 "timeline.vala"
+static void time_line_on_clip_view_trim_begin (TimeLine* self, ClipView* clip, GdkWindowEdge edge) {
+#line 219 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 219 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip));
+#line 220 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_view_trim_begin");
+#line 221 "timeline.vala"
+       switch (edge) {
+#line 1598 "timeline.c"
+               case GDK_WINDOW_EDGE_WEST:
+               {
+#line 223 "timeline.vala"
+                       clip->initial_time = model_clip_get_start (clip->clip);
+#line 224 "timeline.vala"
+                       break;
+#line 1605 "timeline.c"
+               }
+               case GDK_WINDOW_EDGE_EAST:
+               {
+#line 226 "timeline.vala"
+                       clip->initial_time = model_clip_get_duration (clip->clip);
+#line 227 "timeline.vala"
+                       break;
+#line 1613 "timeline.c"
+               }
+               default:
+               {
+#line 229 "timeline.vala"
+                       g_assert (FALSE);
+#line 230 "timeline.vala"
+                       break;
+#line 1621 "timeline.c"
+               }
+       }
+}
+
+
+#line 234 "timeline.vala"
+static void time_line_on_clip_view_selection_request (TimeLine* self, ClipView* clip_view, gboolean extend) {
+#line 1629 "timeline.c"
+       gboolean in_selected_clips;
+#line 234 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 234 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 235 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_view_selection_request");
+#line 241 "timeline.vala"
+       in_selected_clips = gee_abstract_collection_contains (GEE_ABSTRACT_COLLECTION (self->selected_clips), clip_view);
+#line 242 "timeline.vala"
+       if (!extend) {
+#line 243 "timeline.vala"
+               if (!in_selected_clips) {
+#line 244 "timeline.vala"
+                       time_line_deselect_all_clips (self);
+#line 245 "timeline.vala"
+                       clip_view->is_selected = TRUE;
+#line 246 "timeline.vala"
+                       gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->selected_clips), clip_view);
+#line 1649 "timeline.c"
+               }
+       } else {
+#line 249 "timeline.vala"
+               if (gee_collection_get_size (GEE_COLLECTION (self->selected_clips)) > 1) {
+#line 1654 "timeline.c"
+                       gboolean _tmp0_ = FALSE;
+#line 250 "timeline.vala"
+                       if (in_selected_clips) {
+#line 250 "timeline.vala"
+                               _tmp0_ = clip_view->is_selected;
+#line 1660 "timeline.c"
+                       } else {
+#line 250 "timeline.vala"
+                               _tmp0_ = FALSE;
+#line 1664 "timeline.c"
+                       }
+#line 250 "timeline.vala"
+                       if (_tmp0_) {
+#line 1668 "timeline.c"
+                               GtkWidget* _tmp1_;
+#line 251 "timeline.vala"
+                               clip_view->is_selected = FALSE;
+#line 253 "timeline.vala"
+                               self->priv->drag_widget = (_tmp1_ = NULL, _g_object_unref0 (self->priv->drag_widget), _tmp1_);
+#line 254 "timeline.vala"
+                               gee_abstract_collection_remove (GEE_ABSTRACT_COLLECTION (self->selected_clips), clip_view);
+#line 1676 "timeline.c"
+                       }
+               }
+#line 257 "timeline.vala"
+               if (!in_selected_clips) {
+#line 258 "timeline.vala"
+                       clip_view->is_selected = TRUE;
+#line 259 "timeline.vala"
+                       gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->selected_clips), clip_view);
+#line 1685 "timeline.c"
+               }
+       }
+#line 262 "timeline.vala"
+       g_signal_emit_by_name (self, "track-changed");
+#line 263 "timeline.vala"
+       g_signal_emit_by_name (self, "selection-changed", time_line_is_clip_selected (self));
+#line 264 "timeline.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self));
+#line 1694 "timeline.c"
+}
+
+
+#line 267 "timeline.vala"
+static void time_line_on_clip_view_move_commit (TimeLine* self, ClipView* clip_view, gint64 delta) {
+#line 1700 "timeline.c"
+       GtkWidget* _tmp0_;
+       GtkFixed* fixed;
+       GtkLabel* _tmp1_;
+#line 267 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 267 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 268 "timeline.vala"
+       gdk_window_set_cursor (GTK_WIDGET (self)->window, NULL);
+#line 269 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_view_move_request");
+#line 270 "timeline.vala"
+       fixed = _g_object_ref0 ((_tmp0_ = gtk_widget_get_parent (GTK_WIDGET (self->priv->high_water)), GTK_IS_FIXED (_tmp0_) ? ((GtkFixed*) _tmp0_) : NULL));
+#line 271 "timeline.vala"
+       gtk_container_remove (GTK_CONTAINER (fixed), GTK_WIDGET (self->priv->high_water));
+#line 272 "timeline.vala"
+       self->priv->high_water = (_tmp1_ = NULL, _g_object_unref0 (self->priv->high_water), _tmp1_);
+#line 274 "timeline.vala"
+       model_undo_manager_start_transaction (self->project->undo_manager, "Move Clip");
+#line 1720 "timeline.c"
+       {
+               GeeIterator* _selected_clip_view_it;
+               _selected_clip_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 275 "timeline.vala"
+               while (TRUE) {
+#line 1726 "timeline.c"
+                       ClipView* selected_clip_view;
+                       GtkWidget* _tmp2_;
+                       TrackView* track_view;
+                       ModelTrack* _tmp3_;
+#line 275 "timeline.vala"
+                       if (!gee_iterator_next (_selected_clip_view_it)) {
+#line 275 "timeline.vala"
+                               break;
+#line 1735 "timeline.c"
+                       }
+#line 275 "timeline.vala"
+                       selected_clip_view = (ClipView*) gee_iterator_get (_selected_clip_view_it);
+#line 276 "timeline.vala"
+                       track_view = _g_object_ref0 ((_tmp2_ = gtk_widget_get_parent (GTK_WIDGET (selected_clip_view)), IS_TRACK_VIEW (_tmp2_) ? ((TrackView*) _tmp2_) : NULL));
+#line 277 "timeline.vala"
+                       model_clip_gnonlin_connect (selected_clip_view->clip);
+#line 278 "timeline.vala"
+                       model_track_move (_tmp3_ = track_view_get_track (track_view), selected_clip_view->clip, model_clip_get_start (selected_clip_view->clip), selected_clip_view->initial_time);
+#line 1745 "timeline.c"
+                       _g_object_unref0 (_tmp3_);
+                       _g_object_unref0 (selected_clip_view);
+                       _g_object_unref0 (track_view);
+               }
+               _g_object_unref0 (_selected_clip_view_it);
+       }
+#line 281 "timeline.vala"
+       model_undo_manager_end_transaction (self->project->undo_manager, "Move Clip");
+#line 282 "timeline.vala"
+       if (self->priv->copying) {
+#line 283 "timeline.vala"
+               self->priv->copying = FALSE;
+#line 284 "timeline.vala"
+               model_undo_manager_end_transaction (self->project->undo_manager, "Copy Clip");
+#line 1760 "timeline.c"
+       }
+       _g_object_unref0 (fixed);
+}
+
+
+#line 288 "timeline.vala"
+static void time_line_on_clip_view_trim_commit (TimeLine* self, ClipView* clip_view, GdkWindowEdge edge) {
+#line 1768 "timeline.c"
+       GtkWidget* _tmp0_;
+       TrackView* track_view;
+       gint64 delta;
+       ModelTrack* _tmp1_;
+#line 288 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 288 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 289 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_view_move_commit");
+#line 290 "timeline.vala"
+       gdk_window_set_cursor (GTK_WIDGET (self)->window, NULL);
+#line 291 "timeline.vala"
+       track_view = _g_object_ref0 ((_tmp0_ = gtk_widget_get_parent (GTK_WIDGET (clip_view)), IS_TRACK_VIEW (_tmp0_) ? ((TrackView*) _tmp0_) : NULL));
+#line 292 "timeline.vala"
+       delta = (gint64) 0;
+#line 293 "timeline.vala"
+       switch (edge) {
+#line 1787 "timeline.c"
+               case GDK_WINDOW_EDGE_WEST:
+               {
+#line 295 "timeline.vala"
+                       delta = model_clip_get_start (clip_view->clip) - clip_view->initial_time;
+#line 296 "timeline.vala"
+                       break;
+#line 1794 "timeline.c"
+               }
+               case GDK_WINDOW_EDGE_EAST:
+               {
+#line 298 "timeline.vala"
+                       delta = model_clip_get_duration (clip_view->clip) - clip_view->initial_time;
+#line 299 "timeline.vala"
+                       break;
+#line 1802 "timeline.c"
+               }
+               default:
+               {
+#line 301 "timeline.vala"
+                       g_assert (FALSE);
+#line 302 "timeline.vala"
+                       break;
+#line 1810 "timeline.c"
+               }
+       }
+#line 305 "timeline.vala"
+       model_undo_manager_start_transaction (self->project->undo_manager, "Trim Clip");
+#line 306 "timeline.vala"
+       model_clip_trim (clip_view->clip, -delta, edge);
+#line 307 "timeline.vala"
+       model_clip_gnonlin_connect (clip_view->clip);
+#line 308 "timeline.vala"
+       model_track_trim (_tmp1_ = track_view_get_track (track_view), clip_view->clip, delta, edge);
+#line 1821 "timeline.c"
+       _g_object_unref0 (_tmp1_);
+#line 309 "timeline.vala"
+       model_undo_manager_end_transaction (self->project->undo_manager, "Trim Clip");
+#line 1825 "timeline.c"
+       _g_object_unref0 (track_view);
+}
+
+
+#line 312 "timeline.vala"
+static void time_line_constrain_move (TimeLine* self, ClipView* clip_view, gint64* delta) {
+#line 1832 "timeline.c"
+       gint min_delta;
+       gint delta_xsize;
+       TrackView* _tmp0_;
+       TrackView* track_view;
+       ModelTrack* track;
+#line 312 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 312 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 313 "timeline.vala"
+       min_delta = CLIP_VIEW_SNAP_DELTA;
+#line 314 "timeline.vala"
+       delta_xsize = model_time_system_time_to_xsize (self->provider, *delta);
+#line 315 "timeline.vala"
+       track_view = _g_object_ref0 ((_tmp0_ = TRACK_VIEW (gtk_widget_get_parent (GTK_WIDGET (clip_view))), IS_TRACK_VIEW (_tmp0_) ? ((TrackView*) _tmp0_) : NULL));
+#line 316 "timeline.vala"
+       track = track_view_get_track (track_view);
+#line 317 "timeline.vala"
+       if (abs (delta_xsize) < min_delta) {
+#line 1852 "timeline.c"
+               gint64 range;
+               gint64 adjustment = 0LL;
+#line 318 "timeline.vala"
+               range = model_time_system_xsize_to_time (self->provider, min_delta);
+#line 320 "timeline.vala"
+               if (model_track_clip_is_near (track, clip_view->clip, range, &adjustment)) {
+#line 321 "timeline.vala"
+                       *delta = adjustment;
+#line 322 "timeline.vala"
+                       clip_view_snap (clip_view, (gint64) model_time_system_time_to_xsize (self->provider, adjustment));
+#line 1863 "timeline.c"
+               }
+       }
+       _g_object_unref0 (track_view);
+       _g_object_unref0 (track);
+}
+
+
+#line 327 "timeline.vala"
+static void time_line_on_clip_view_move_request (TimeLine* self, ClipView* clip_view, gint64 delta) {
+#line 327 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 327 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 328 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_view_move_request");
+#line 329 "timeline.vala"
+       if (self->project->snap_to_clip) {
+#line 330 "timeline.vala"
+               time_line_constrain_move (self, clip_view, &delta);
+#line 1883 "timeline.c"
+       }
+#line 332 "timeline.vala"
+       if (time_line_move_allowed (self, &delta)) {
+#line 333 "timeline.vala"
+               time_line_move_the_clips (self, delta);
+#line 1889 "timeline.c"
+       }
+}
+
+
+#line 337 "timeline.vala"
+static gboolean time_line_move_allowed (TimeLine* self, gint64* move_distance) {
+#line 1896 "timeline.c"
+       gboolean result = FALSE;
+       ClipView* max_clip;
+#line 337 "timeline.vala"
+       g_return_val_if_fail (IS_TIME_LINE (self), FALSE);
+#line 338 "timeline.vala"
+       if (self->priv->drag_widget == NULL) {
+#line 1903 "timeline.c"
+               result = FALSE;
+#line 339 "timeline.vala"
+               return result;
+#line 1907 "timeline.c"
+       }
+#line 342 "timeline.vala"
+       max_clip = NULL;
+#line 1911 "timeline.c"
+       {
+               GeeIterator* _clip_view_it;
+               _clip_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 344 "timeline.vala"
+               while (TRUE) {
+#line 1917 "timeline.c"
+                       ClipView* clip_view;
+                       gint position;
+#line 344 "timeline.vala"
+                       if (!gee_iterator_next (_clip_view_it)) {
+#line 344 "timeline.vala"
+                               break;
+#line 1924 "timeline.c"
+                       }
+#line 344 "timeline.vala"
+                       clip_view = (ClipView*) gee_iterator_get (_clip_view_it);
+#line 345 "timeline.vala"
+                       if (max_clip == NULL) {
+#line 1930 "timeline.c"
+                               ClipView* _tmp0_;
+#line 346 "timeline.vala"
+                               max_clip = (_tmp0_ = _g_object_ref0 (clip_view), _g_object_unref0 (max_clip), _tmp0_);
+#line 1934 "timeline.c"
+                       } else {
+#line 347 "timeline.vala"
+                               if (model_clip_get_end (clip_view->clip) > model_clip_get_end (max_clip->clip)) {
+#line 1938 "timeline.c"
+                                       ClipView* _tmp1_;
+#line 348 "timeline.vala"
+                                       max_clip = (_tmp1_ = _g_object_ref0 (clip_view), _g_object_unref0 (max_clip), _tmp1_);
+#line 1942 "timeline.c"
+                               }
+                       }
+#line 350 "timeline.vala"
+                       position = model_time_system_time_to_xpos (self->provider, model_clip_get_start (clip_view->clip) + (*move_distance));
+#line 351 "timeline.vala"
+                       if (position < TIME_LINE_BORDER) {
+#line 1949 "timeline.c"
+                               result = FALSE;
+                               _g_object_unref0 (clip_view);
+                               _g_object_unref0 (_clip_view_it);
+                               _g_object_unref0 (max_clip);
+#line 352 "timeline.vala"
+                               return result;
+#line 1956 "timeline.c"
+                       }
+                       _g_object_unref0 (clip_view);
+               }
+               _g_object_unref0 (_clip_view_it);
+       }
+       result = TRUE;
+       _g_object_unref0 (max_clip);
+#line 355 "timeline.vala"
+       return result;
+#line 1966 "timeline.c"
+}
+
+
+#line 358 "timeline.vala"
+static void time_line_move_the_clips (TimeLine* self, gint64 move_distance) {
+#line 358 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 1974 "timeline.c"
+       {
+               GeeIterator* _clip_view_it;
+               _clip_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 359 "timeline.vala"
+               while (TRUE) {
+#line 1980 "timeline.c"
+                       ClipView* clip_view;
+#line 359 "timeline.vala"
+                       if (!gee_iterator_next (_clip_view_it)) {
+#line 359 "timeline.vala"
+                               break;
+#line 1986 "timeline.c"
+                       }
+#line 359 "timeline.vala"
+                       clip_view = (ClipView*) gee_iterator_get (_clip_view_it);
+#line 360 "timeline.vala"
+                       time_line_do_clip_move (self, clip_view, move_distance);
+#line 1992 "timeline.c"
+                       _g_object_unref0 (clip_view);
+               }
+               _g_object_unref0 (_clip_view_it);
+       }
+}
+
+
+#line 364 "timeline.vala"
+void time_line_do_clip_move (TimeLine* self, ClipView* clip_view, gint64 delta) {
+#line 364 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 364 "timeline.vala"
+       g_return_if_fail (IS_CLIP_VIEW (clip_view));
+#line 365 "timeline.vala"
+       model_clip_set_start (clip_view->clip, model_clip_get_start (clip_view->clip) + delta);
+#line 2008 "timeline.c"
+}
+
+
+#line 368 "timeline.vala"
+void time_line_on_ruler_position_changed (TimeLine* self, gint x) {
+#line 368 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 369 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_ruler_position_changed");
+#line 370 "timeline.vala"
+       if (!model_project_transport_is_recording (self->project)) {
+#line 371 "timeline.vala"
+               time_line_update_pos (self, x);
+#line 2022 "timeline.c"
+       }
+}
+
+
+#line 375 "timeline.vala"
+gboolean time_line_is_clip_selected (TimeLine* self) {
+#line 2029 "timeline.c"
+       gboolean result = FALSE;
+#line 375 "timeline.vala"
+       g_return_val_if_fail (IS_TIME_LINE (self), FALSE);
+#line 2033 "timeline.c"
+       result = gee_collection_get_size (GEE_COLLECTION (self->selected_clips)) > 0;
+#line 376 "timeline.vala"
+       return result;
+#line 2037 "timeline.c"
+}
+
+
+#line 379 "timeline.vala"
+gboolean time_line_gap_selected (TimeLine* self) {
+#line 2043 "timeline.c"
+       gboolean result = FALSE;
+#line 379 "timeline.vala"
+       g_return_val_if_fail (IS_TIME_LINE (self), FALSE);
+#line 2047 "timeline.c"
+       result = FALSE;
+#line 380 "timeline.vala"
+       return result;
+#line 2051 "timeline.c"
+}
+
+
+#line 384 "timeline.vala"
+void time_line_delete_selection (TimeLine* self) {
+#line 2057 "timeline.c"
+       GtkWidget* _tmp0_;
+#line 384 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 385 "timeline.vala"
+       model_undo_manager_start_transaction (self->project->undo_manager, "Delete Clips From Timeline");
+#line 386 "timeline.vala"
+       self->priv->drag_widget = (_tmp0_ = NULL, _g_object_unref0 (self->priv->drag_widget), _tmp0_);
+#line 387 "timeline.vala"
+       if (time_line_is_clip_selected (self)) {
+#line 388 "timeline.vala"
+               while (TRUE) {
+#line 2069 "timeline.c"
+                       ClipView* _tmp1_;
+                       ClipView* _tmp2_;
+#line 388 "timeline.vala"
+                       if (!(gee_collection_get_size (GEE_COLLECTION (self->selected_clips)) > 0)) {
+#line 388 "timeline.vala"
+                               break;
+#line 2076 "timeline.c"
+                       }
+#line 389 "timeline.vala"
+                       clip_view_delete_clip (_tmp1_ = (ClipView*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->selected_clips), 0));
+#line 2080 "timeline.c"
+                       _g_object_unref0 (_tmp1_);
+#line 390 "timeline.vala"
+                       _tmp2_ = (ClipView*) gee_abstract_list_remove_at (GEE_ABSTRACT_LIST (self->selected_clips), 0);
+#line 2084 "timeline.c"
+                       _g_object_unref0 (_tmp2_);
+               }
+#line 392 "timeline.vala"
+               g_signal_emit_by_name (self, "track-changed");
+#line 2089 "timeline.c"
+       } else {
+       }
+#line 409 "timeline.vala"
+       model_undo_manager_end_transaction (self->project->undo_manager, "Delete Clips From Timeline");
+#line 2094 "timeline.c"
+}
+
+
+#line 412 "timeline.vala"
+void time_line_do_cut (TimeLine* self) {
+#line 412 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 413 "timeline.vala"
+       clipboard_select (self->clipboard, self->selected_clips);
+#line 414 "timeline.vala"
+       time_line_delete_selection (self);
+#line 2106 "timeline.c"
+}
+
+
+#line 417 "timeline.vala"
+void time_line_do_copy (TimeLine* self) {
+#line 417 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 418 "timeline.vala"
+       clipboard_select (self->clipboard, self->selected_clips);
+#line 419 "timeline.vala"
+       g_signal_emit_by_name (self, "selection-changed", TRUE);
+#line 2118 "timeline.c"
+}
+
+
+#line 422 "timeline.vala"
+void time_line_paste (TimeLine* self) {
+#line 422 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 423 "timeline.vala"
+       time_line_do_paste (self, model_project_transport_get_position (self->project));
+#line 2128 "timeline.c"
+}
+
+
+#line 426 "timeline.vala"
+void time_line_do_paste (TimeLine* self, gint64 pos) {
+#line 2134 "timeline.c"
+       TrackView* view;
+       ModelTrack* _tmp9_;
+#line 426 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 427 "timeline.vala"
+       view = NULL;
+#line 2141 "timeline.c"
+       {
+               GeeIterator* _track_view_it;
+               _track_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->tracks));
+#line 428 "timeline.vala"
+               while (TRUE) {
+#line 2147 "timeline.c"
+                       TrackView* track_view;
+                       ModelTrack* _tmp0_;
+                       gboolean _tmp1_;
+#line 428 "timeline.vala"
+                       if (!gee_iterator_next (_track_view_it)) {
+#line 428 "timeline.vala"
+                               break;
+#line 2155 "timeline.c"
+                       }
+#line 428 "timeline.vala"
+                       track_view = (TrackView*) gee_iterator_get (_track_view_it);
+#line 429 "timeline.vala"
+                       if ((_tmp1_ = model_track_get_is_selected (_tmp0_ = track_view_get_track (track_view)), _g_object_unref0 (_tmp0_), _tmp1_)) {
+#line 2161 "timeline.c"
+                               TrackView* _tmp2_;
+#line 430 "timeline.vala"
+                               view = (_tmp2_ = _g_object_ref0 (track_view), _g_object_unref0 (view), _tmp2_);
+#line 2165 "timeline.c"
+                       }
+                       _g_object_unref0 (track_view);
+               }
+               _g_object_unref0 (_track_view_it);
+       }
+#line 435 "timeline.vala"
+       if (view == NULL) {
+#line 2173 "timeline.c"
+               TrackView* _tmp3_;
+               TrackClipPair* _tmp4_;
+               gboolean _tmp5_;
+               TrackView* _tmp8_;
+               _tmp3_ = NULL;
+#line 436 "timeline.vala"
+               if ((_tmp5_ = (_tmp4_ = (TrackClipPair*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clipboard->clips), 0))->clip->type == MODEL_MEDIA_TYPE_VIDEO, _track_clip_pair_unref0 (_tmp4_), _tmp5_)) {
+#line 2181 "timeline.c"
+                       TrackView* _tmp6_;
+#line 437 "timeline.vala"
+                       _tmp3_ = (_tmp6_ = time_line_find_video_track_view (self), _g_object_unref0 (_tmp3_), _tmp6_);
+#line 2185 "timeline.c"
+               } else {
+                       TrackView* _tmp7_;
+#line 437 "timeline.vala"
+                       _tmp3_ = (_tmp7_ = time_line_find_audio_track_view (self), _g_object_unref0 (_tmp3_), _tmp7_);
+#line 2190 "timeline.c"
+               }
+#line 436 "timeline.vala"
+               view = (_tmp8_ = _g_object_ref0 (_tmp3_), _g_object_unref0 (view), _tmp8_);
+#line 2194 "timeline.c"
+               _g_object_unref0 (_tmp3_);
+       }
+#line 439 "timeline.vala"
+       model_undo_manager_start_transaction (self->project->undo_manager, "Paste");
+#line 440 "timeline.vala"
+       clipboard_paste (self->clipboard, _tmp9_ = track_view_get_track (view), pos);
+#line 2201 "timeline.c"
+       _g_object_unref0 (_tmp9_);
+#line 441 "timeline.vala"
+       model_undo_manager_end_transaction (self->project->undo_manager, "Paste");
+#line 442 "timeline.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self));
+#line 2207 "timeline.c"
+       _g_object_unref0 (view);
+}
+
+
+#line 445 "timeline.vala"
+void time_line_select_all (TimeLine* self) {
+#line 445 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 2216 "timeline.c"
+       {
+               GeeIterator* _track_it;
+               _track_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->tracks));
+#line 446 "timeline.vala"
+               while (TRUE) {
+#line 2222 "timeline.c"
+                       TrackView* track;
+#line 446 "timeline.vala"
+                       if (!gee_iterator_next (_track_it)) {
+#line 446 "timeline.vala"
+                               break;
+#line 2228 "timeline.c"
+                       }
+#line 446 "timeline.vala"
+                       track = (TrackView*) gee_iterator_get (_track_it);
+#line 447 "timeline.vala"
+                       track_view_select_all (track);
+#line 2234 "timeline.c"
+                       _g_object_unref0 (track);
+               }
+               _g_object_unref0 (_track_it);
+       }
+}
+
+
+#line 451 "timeline.vala"
+static gboolean time_line_real_expose_event (GtkWidget* base, GdkEventExpose* event) {
+#line 2244 "timeline.c"
+       TimeLine * self;
+       gboolean result = FALSE;
+       gint xpos;
+       self = TIME_LINE (base);
+#line 452 "timeline.vala"
+       GTK_WIDGET_CLASS (time_line_parent_class)->expose_event (GTK_WIDGET (GTK_EVENT_BOX (self)), event);
+#line 454 "timeline.vala"
+       xpos = model_time_system_time_to_xpos (self->provider, model_project_transport_get_position (self->project));
+#line 455 "timeline.vala"
+       gdk_draw_line (GDK_DRAWABLE (GTK_WIDGET (self)->window), gtk_widget_get_style (GTK_WIDGET (self))->fg_gc[(gint) GTK_STATE_NORMAL], xpos, 0, xpos, GTK_WIDGET (self)->allocation.height);
+#line 2255 "timeline.c"
+       result = TRUE;
+#line 459 "timeline.vala"
+       return result;
+#line 2259 "timeline.c"
+}
+
+
+#line 462 "timeline.vala"
+static void time_line_real_drag_data_received (GtkWidget* base, GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data, guint drag_info, guint time) {
+#line 2265 "timeline.c"
+       TimeLine * self;
+       GError * _inner_error_;
+       char** _tmp1_;
+       gint _a_size_;
+       gint a_length1;
+       char** _tmp0_;
+       char** a;
+       ModelTrack* track;
+       GtkWidget* _tmp2_;
+       TrackView* track_view;
+       gboolean timeline_add;
+       self = TIME_LINE (base);
+#line 462 "timeline.vala"
+       g_return_if_fail (GDK_IS_DRAG_CONTEXT (context));
+#line 462 "timeline.vala"
+       g_return_if_fail (selection_data != NULL);
+#line 2282 "timeline.c"
+       _inner_error_ = NULL;
+#line 465 "timeline.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_drag_data_received");
+#line 2286 "timeline.c"
+       a = (_tmp1_ = _tmp0_ = gtk_selection_data_get_uris (selection_data), a_length1 = _vala_array_length (_tmp0_), _a_size_ = a_length1, _tmp1_);
+#line 467 "timeline.vala"
+       gtk_drag_finish (context, TRUE, FALSE, (guint32) time);
+#line 469 "timeline.vala"
+       track = NULL;
+#line 470 "timeline.vala"
+       track_view = (_tmp2_ = time_line_find_child (self, (double) x, (double) y), IS_TRACK_VIEW (_tmp2_) ? ((TrackView*) _tmp2_) : NULL);
+#line 472 "timeline.vala"
+       if (track_view == NULL) {
+#line 2296 "timeline.c"
+               a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
+               _g_object_unref0 (track);
+               _g_object_unref0 (track_view);
+#line 473 "timeline.vala"
+               return;
+#line 2302 "timeline.c"
+       }
+#line 476 "timeline.vala"
+       timeline_add = TRUE;
+#line 478 "timeline.vala"
+       if (a_length1 > 1) {
+#line 479 "timeline.vala"
+               if (gtk_drag_get_source_widget (context) != NULL) {
+#line 480 "timeline.vala"
+                       dialog_utils_warning ("Cannot add files", "Files must be dropped onto the timeline individually.");
+#line 2312 "timeline.c"
+                       a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
+                       _g_object_unref0 (track);
+                       _g_object_unref0 (track_view);
+#line 482 "timeline.vala"
+                       return;
+#line 2318 "timeline.c"
+               }
+#line 485 "timeline.vala"
+               if (dialog_utils_add_cancel ("Files must be dropped onto the timeline individually.\n" "Do you wish to add these files to the library?") != GTK_RESPONSE_YES) {
+#line 2322 "timeline.c"
+                       a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
+                       _g_object_unref0 (track);
+                       _g_object_unref0 (track_view);
+#line 488 "timeline.vala"
+                       return;
+#line 2328 "timeline.c"
+               }
+#line 490 "timeline.vala"
+               timeline_add = FALSE;
+#line 2332 "timeline.c"
+       } else {
+               ModelTrack* _tmp3_;
+#line 492 "timeline.vala"
+               track = (_tmp3_ = track_view_get_track (track_view), _g_object_unref0 (track), _tmp3_);
+#line 2337 "timeline.c"
+       }
+#line 495 "timeline.vala"
+       model_project_create_clip_importer (self->project, track, timeline_add, model_time_system_xpos_to_time (self->provider, x), context->action == GDK_ACTION_COPY, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))), a_length1);
+#line 2341 "timeline.c"
+       {
+               {
+                       char** s_collection;
+                       int s_collection_length1;
+                       int s_it;
+#line 498 "timeline.vala"
+                       s_collection = a;
+#line 2349 "timeline.c"
+                       s_collection_length1 = a_length1;
+                       for (s_it = 0; s_it < a_length1; s_it = s_it + 1) {
+                               char* s;
+                               s = g_strdup (s_collection[s_it]);
+                               {
+                                       char* filename;
+                                       filename = NULL;
+                                       {
+                                               char* _tmp4_;
+                                               char* _tmp5_;
+#line 501 "timeline.vala"
+                                               _tmp4_ = g_filename_from_uri (s, NULL, &_inner_error_);
+#line 2362 "timeline.c"
+                                               if (_inner_error_ != NULL) {
+                                                       if (_inner_error_->domain == G_CONVERT_ERROR) {
+                                                               goto __catch16_g_convert_error;
+                                                       }
+                                                       _g_free0 (s);
+                                                       _g_free0 (filename);
+                                                       a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
+                                                       _g_object_unref0 (track);
+                                                       _g_object_unref0 (track_view);
+                                                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+                                                       g_clear_error (&_inner_error_);
+                                                       return;
+                                               }
+#line 501 "timeline.vala"
+                                               filename = (_tmp5_ = _tmp4_, _g_free0 (filename), _tmp5_);
+#line 2378 "timeline.c"
+                                       }
+                                       goto __finally16;
+                                       __catch16_g_convert_error:
+                                       {
+                                               GError * e;
+                                               e = _inner_error_;
+                                               _inner_error_ = NULL;
+                                               {
+                                                       _g_error_free0 (e);
+                                                       _g_free0 (s);
+                                                       _g_free0 (filename);
+#line 502 "timeline.vala"
+                                                       continue;
+#line 2392 "timeline.c"
+                                               }
+                                       }
+                                       __finally16:
+                                       if (_inner_error_ != NULL) {
+                                               _g_free0 (s);
+                                               _g_free0 (filename);
+                                               goto __catch15_g_error;
+                                       }
+#line 503 "timeline.vala"
+                                       model_library_importer_add_file (self->project->importer, filename, &_inner_error_);
+#line 2403 "timeline.c"
+                                       if (_inner_error_ != NULL) {
+                                               _g_free0 (s);
+                                               _g_free0 (filename);
+                                               goto __catch15_g_error;
+                                       }
+                                       _g_free0 (s);
+                                       _g_free0 (filename);
+                               }
+                       }
+               }
+#line 505 "timeline.vala"
+               model_library_importer_start (self->project->importer, &_inner_error_);
+#line 2416 "timeline.c"
+               if (_inner_error_ != NULL) {
+                       goto __catch15_g_error;
+               }
+       }
+       goto __finally15;
+       __catch15_g_error:
+       {
+               GError * e;
+               e = _inner_error_;
+               _inner_error_ = NULL;
+               {
+#line 507 "timeline.vala"
+                       g_signal_emit_by_name (self->project, "error-occurred", "Error importing", e->message);
+#line 2430 "timeline.c"
+                       _g_error_free0 (e);
+               }
+       }
+       __finally15:
+       if (_inner_error_ != NULL) {
+               a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
+               _g_object_unref0 (track);
+               _g_object_unref0 (track_view);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+               g_clear_error (&_inner_error_);
+               return;
+       }
+       a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
+       _g_object_unref0 (track);
+       _g_object_unref0 (track_view);
+}
+
+
+#line 511 "timeline.vala"
+void time_line_update_pos (TimeLine* self, gint event_x) {
+#line 2451 "timeline.c"
+       gint64 time;
+#line 511 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 512 "timeline.vala"
+       time = model_time_system_xpos_to_time (self->provider, event_x);
+#line 513 "timeline.vala"
+       if (self->project->snap_to_clip) {
+#line 514 "timeline.vala"
+               model_project_snap_coord (self->project, &time, model_time_system_get_pixel_snap_time (self->provider));
+#line 2461 "timeline.c"
+       }
+#line 516 "timeline.vala"
+       view_media_engine_go (self->project->media_engine, time);
+#line 2465 "timeline.c"
+}
+
+
+#line 519 "timeline.vala"
+GtkWidget* time_line_find_child (TimeLine* self, double x, double y) {
+#line 2471 "timeline.c"
+       GtkWidget* result = NULL;
+#line 519 "timeline.vala"
+       g_return_val_if_fail (IS_TIME_LINE (self), NULL);
+#line 2475 "timeline.c"
+       {
+               GList* w_collection;
+               GList* w_it;
+#line 520 "timeline.vala"
+               w_collection = gtk_container_get_children (GTK_CONTAINER (self->priv->vbox));
+#line 2481 "timeline.c"
+               for (w_it = w_collection; w_it != NULL; w_it = w_it->next) {
+                       GtkWidget* w;
+#line 520 "timeline.vala"
+                       w = _g_object_ref0 ((GtkWidget*) w_it->data);
+#line 2486 "timeline.c"
+                       {
+                               gboolean _tmp0_ = FALSE;
+#line 521 "timeline.vala"
+                               if (w->allocation.y <= y) {
+#line 521 "timeline.vala"
+                                       _tmp0_ = y < (w->allocation.y + w->allocation.height);
+#line 2493 "timeline.c"
+                               } else {
+#line 521 "timeline.vala"
+                                       _tmp0_ = FALSE;
+#line 2497 "timeline.c"
+                               }
+#line 521 "timeline.vala"
+                               if (_tmp0_) {
+#line 2501 "timeline.c"
+                                       result = w;
+                                       _g_list_free0 (w_collection);
+#line 522 "timeline.vala"
+                                       return result;
+#line 2506 "timeline.c"
+                               }
+                               _g_object_unref0 (w);
+                       }
+               }
+#line 520 "timeline.vala"
+               _g_list_free0 (w_collection);
+#line 2513 "timeline.c"
+       }
+       result = NULL;
+#line 524 "timeline.vala"
+       return result;
+#line 2518 "timeline.c"
+}
+
+
+#line 527 "timeline.vala"
+static void time_line_deselect_all (TimeLine* self) {
+#line 527 "timeline.vala"
+       g_return_if_fail (IS_TIME_LINE (self));
+#line 2526 "timeline.c"
+       {
+               GeeIterator* _clip_view_it;
+               _clip_view_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 528 "timeline.vala"
+               while (TRUE) {
+#line 2532 "timeline.c"
+                       ClipView* clip_view;
+#line 528 "timeline.vala"
+                       if (!gee_iterator_next (_clip_view_it)) {
+#line 528 "timeline.vala"
+                               break;
+#line 2538 "timeline.c"
+                       }
+#line 528 "timeline.vala"
+                       clip_view = (ClipView*) gee_iterator_get (_clip_view_it);
+#line 529 "timeline.vala"
+                       clip_view->is_selected = FALSE;
+#line 2544 "timeline.c"
+                       _g_object_unref0 (clip_view);
+               }
+               _g_object_unref0 (_clip_view_it);
+       }
+#line 531 "timeline.vala"
+       gee_abstract_collection_clear (GEE_ABSTRACT_COLLECTION (self->selected_clips));
+#line 532 "timeline.vala"
+       g_signal_emit_by_name (self, "selection-changed", FALSE);
+#line 2553 "timeline.c"
+}
+
+
+#line 535 "timeline.vala"
+static gboolean time_line_real_button_press_event (GtkWidget* base, GdkEventButton* event) {
+#line 2559 "timeline.c"
+       TimeLine * self;
+       gboolean result = FALSE;
+       GtkWidget* _tmp0_;
+       GtkWidget* child;
+       self = TIME_LINE (base);
+#line 540 "timeline.vala"
+       self->priv->drag_widget = (_tmp0_ = NULL, _g_object_unref0 (self->priv->drag_widget), _tmp0_);
+#line 541 "timeline.vala"
+       child = time_line_find_child (self, (*event).x, (*event).y);
+#line 543 "timeline.vala"
+       if (VIEW_IS_RULER (child)) {
+#line 2571 "timeline.c"
+               GtkWidget* _tmp1_;
+               ViewRuler* ruler;
+               gboolean _tmp2_;
+               GtkWidget* _tmp3_;
+#line 544 "timeline.vala"
+               ruler = _g_object_ref0 ((_tmp1_ = child, VIEW_IS_RULER (_tmp1_) ? ((ViewRuler*) _tmp1_) : NULL));
+#line 545 "timeline.vala"
+               g_signal_emit_by_name (GTK_WIDGET (ruler), "button-press-event", event, &_tmp2_);
+#line 545 "timeline.vala"
+               _tmp2_;
+#line 546 "timeline.vala"
+               self->priv->drag_widget = (_tmp3_ = _g_object_ref0 (child), _g_object_unref0 (self->priv->drag_widget), _tmp3_);
+#line 2584 "timeline.c"
+               _g_object_unref0 (ruler);
+       } else {
+#line 547 "timeline.vala"
+               if (IS_TRACK_VIEW (child)) {
+#line 2589 "timeline.c"
+                       GtkWidget* _tmp4_;
+                       TrackView* track_view;
+                       GtkWidget* _tmp5_;
+#line 548 "timeline.vala"
+                       track_view = _g_object_ref0 ((_tmp4_ = child, IS_TRACK_VIEW (_tmp4_) ? ((TrackView*) _tmp4_) : NULL));
+#line 550 "timeline.vala"
+                       self->priv->drag_widget = (_tmp5_ = track_view_find_child (track_view, (*event).x, (*event).y), _g_object_unref0 (self->priv->drag_widget), _tmp5_);
+#line 551 "timeline.vala"
+                       if (self->priv->drag_widget != NULL) {
+#line 2599 "timeline.c"
+                               gboolean _tmp6_;
+#line 552 "timeline.vala"
+                               g_signal_emit_by_name (self->priv->drag_widget, "button-press-event", event, &_tmp6_);
+#line 552 "timeline.vala"
+                               _tmp6_;
+#line 2605 "timeline.c"
+                       } else {
+                               ModelTrack* _tmp7_;
+#line 554 "timeline.vala"
+                               time_line_deselect_all (self);
+#line 556 "timeline.vala"
+                               model_track_set_selected (_tmp7_ = track_view_get_track (track_view), TRUE);
+#line 2612 "timeline.c"
+                               _g_object_unref0 (_tmp7_);
+                       }
+                       _g_object_unref0 (track_view);
+               } else {
+#line 559 "timeline.vala"
+                       time_line_deselect_all (self);
+#line 2619 "timeline.c"
+               }
+       }
+#line 561 "timeline.vala"
+       gtk_widget_queue_draw (GTK_WIDGET (self));
+#line 2624 "timeline.c"
+       result = TRUE;
+       _g_object_unref0 (child);
+#line 563 "timeline.vala"
+       return result;
+#line 2629 "timeline.c"
+}
+
+
+#line 566 "timeline.vala"
+static gboolean time_line_real_button_release_event (GtkWidget* base, GdkEventButton* event) {
+#line 2635 "timeline.c"
+       TimeLine * self;
+       gboolean result = FALSE;
+       self = TIME_LINE (base);
+#line 567 "timeline.vala"
+       if (self->priv->drag_widget != NULL) {
+#line 2641 "timeline.c"
+               gboolean _tmp0_;
+               GtkWidget* _tmp1_;
+#line 568 "timeline.vala"
+               g_signal_emit_by_name (self->priv->drag_widget, "button-release-event", event, &_tmp0_);
+#line 568 "timeline.vala"
+               _tmp0_;
+#line 569 "timeline.vala"
+               self->priv->drag_widget = (_tmp1_ = NULL, _g_object_unref0 (self->priv->drag_widget), _tmp1_);
+#line 2650 "timeline.c"
+       }
+       result = TRUE;
+#line 571 "timeline.vala"
+       return result;
+#line 2655 "timeline.c"
+}
+
+
+#line 574 "timeline.vala"
+static gboolean time_line_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event) {
+#line 2661 "timeline.c"
+       TimeLine * self;
+       gboolean result = FALSE;
+       self = TIME_LINE (base);
+#line 575 "timeline.vala"
+       if (self->priv->drag_widget != NULL) {
+#line 2667 "timeline.c"
+               gboolean _tmp0_;
+#line 576 "timeline.vala"
+               g_signal_emit_by_name (self->priv->drag_widget, "motion-notify-event", event, &_tmp0_);
+#line 576 "timeline.vala"
+               _tmp0_;
+#line 2673 "timeline.c"
+       } else {
+               GtkWidget* widget;
+#line 578 "timeline.vala"
+               widget = time_line_find_child (self, (*event).x, (*event).y);
+#line 579 "timeline.vala"
+               if (IS_TRACK_VIEW (widget)) {
+#line 2680 "timeline.c"
+                       GtkWidget* _tmp1_;
+                       TrackView* track_view;
+#line 580 "timeline.vala"
+                       track_view = _g_object_ref0 ((_tmp1_ = widget, IS_TRACK_VIEW (_tmp1_) ? ((TrackView*) _tmp1_) : NULL));
+#line 581 "timeline.vala"
+                       if (track_view != NULL) {
+#line 2687 "timeline.c"
+                               GtkWidget* _tmp2_;
+                               ClipView* clip_view;
+#line 582 "timeline.vala"
+                               clip_view = (_tmp2_ = track_view_find_child (track_view, (*event).x, (*event).y), IS_CLIP_VIEW (_tmp2_) ? ((ClipView*) _tmp2_) : NULL);
+#line 583 "timeline.vala"
+                               if (clip_view != NULL) {
+#line 2694 "timeline.c"
+                                       gboolean _tmp3_;
+#line 584 "timeline.vala"
+                                       g_signal_emit_by_name (GTK_WIDGET (clip_view), "motion-notify-event", event, &_tmp3_);
+#line 584 "timeline.vala"
+                                       _tmp3_;
+#line 2700 "timeline.c"
+                               } else {
+#line 586 "timeline.vala"
+                                       gdk_window_set_cursor (GTK_WIDGET (self)->window, NULL);
+#line 2704 "timeline.c"
+                               }
+                               _g_object_unref0 (clip_view);
+                       }
+                       _g_object_unref0 (track_view);
+               } else {
+#line 589 "timeline.vala"
+                       if (VIEW_IS_RULER (widget)) {
+#line 2712 "timeline.c"
+                               gboolean _tmp4_;
+#line 590 "timeline.vala"
+                               g_signal_emit_by_name (widget, "motion-notify-event", event, &_tmp4_);
+#line 590 "timeline.vala"
+                               _tmp4_;
+#line 2718 "timeline.c"
+                       } else {
+#line 592 "timeline.vala"
+                               gdk_window_set_cursor (GTK_WIDGET (self)->window, NULL);
+#line 2722 "timeline.c"
+                       }
+               }
+               _g_object_unref0 (widget);
+       }
+       result = TRUE;
+#line 595 "timeline.vala"
+       return result;
+#line 2730 "timeline.c"
+}
+
+
+#line 598 "timeline.vala"
+static TrackView* time_line_find_video_track_view (TimeLine* self) {
+#line 2736 "timeline.c"
+       TrackView* result = NULL;
+#line 598 "timeline.vala"
+       g_return_val_if_fail (IS_TIME_LINE (self), NULL);
+#line 2740 "timeline.c"
+       {
+               GeeIterator* _track_it;
+               _track_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->tracks));
+#line 599 "timeline.vala"
+               while (TRUE) {
+#line 2746 "timeline.c"
+                       TrackView* track;
+                       ModelTrack* _tmp0_;
+                       gboolean _tmp1_;
+#line 599 "timeline.vala"
+                       if (!gee_iterator_next (_track_it)) {
+#line 599 "timeline.vala"
+                               break;
+#line 2754 "timeline.c"
+                       }
+#line 599 "timeline.vala"
+                       track = (TrackView*) gee_iterator_get (_track_it);
+#line 600 "timeline.vala"
+                       if ((_tmp1_ = model_track_media_type (_tmp0_ = track_view_get_track (track)) == MODEL_MEDIA_TYPE_VIDEO, _g_object_unref0 (_tmp0_), _tmp1_)) {
+#line 2760 "timeline.c"
+                               result = track;
+                               _g_object_unref0 (_track_it);
+#line 601 "timeline.vala"
+                               return result;
+#line 2765 "timeline.c"
+                       }
+                       _g_object_unref0 (track);
+               }
+               _g_object_unref0 (_track_it);
+       }
+       result = NULL;
+#line 605 "timeline.vala"
+       return result;
+#line 2774 "timeline.c"
+}
+
+
+#line 608 "timeline.vala"
+static TrackView* time_line_find_audio_track_view (TimeLine* self) {
+#line 2780 "timeline.c"
+       TrackView* result = NULL;
+#line 608 "timeline.vala"
+       g_return_val_if_fail (IS_TIME_LINE (self), NULL);
+#line 2784 "timeline.c"
+       {
+               GeeIterator* _track_it;
+               _track_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->tracks));
+#line 609 "timeline.vala"
+               while (TRUE) {
+#line 2790 "timeline.c"
+                       TrackView* track;
+                       ModelTrack* _tmp0_;
+                       gboolean _tmp1_;
+#line 609 "timeline.vala"
+                       if (!gee_iterator_next (_track_it)) {
+#line 609 "timeline.vala"
+                               break;
+#line 2798 "timeline.c"
+                       }
+#line 609 "timeline.vala"
+                       track = (TrackView*) gee_iterator_get (_track_it);
+#line 610 "timeline.vala"
+                       if ((_tmp1_ = model_track_media_type (_tmp0_ = track_view_get_track (track)) == MODEL_MEDIA_TYPE_AUDIO, _g_object_unref0 (_tmp0_), _tmp1_)) {
+#line 2804 "timeline.c"
+                               result = track;
+                               _g_object_unref0 (_track_it);
+#line 611 "timeline.vala"
+                               return result;
+#line 2809 "timeline.c"
+                       }
+                       _g_object_unref0 (track);
+               }
+               _g_object_unref0 (_track_it);
+       }
+       result = NULL;
+#line 615 "timeline.vala"
+       return result;
+#line 2818 "timeline.c"
+}
+
+
+static void time_line_class_init (TimeLineClass * klass) {
+       time_line_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (TimeLinePrivate));
+       GTK_WIDGET_CLASS (klass)->expose_event = time_line_real_expose_event;
+       GTK_WIDGET_CLASS (klass)->drag_data_received = time_line_real_drag_data_received;
+       GTK_WIDGET_CLASS (klass)->button_press_event = time_line_real_button_press_event;
+       GTK_WIDGET_CLASS (klass)->button_release_event = time_line_real_button_release_event;
+       GTK_WIDGET_CLASS (klass)->motion_notify_event = time_line_real_motion_notify_event;
+       G_OBJECT_CLASS (klass)->finalize = time_line_finalize;
+       g_signal_new ("selection_changed", TYPE_TIME_LINE, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+       g_signal_new ("track_changed", TYPE_TIME_LINE, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+       g_signal_new ("trackview_added", TYPE_TIME_LINE, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TYPE_TRACK_VIEW);
+       g_signal_new ("trackview_removed", TYPE_TIME_LINE, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TYPE_TRACK_VIEW);
+}
+
+
+static void time_line_instance_init (TimeLine * self) {
+       self->priv = TIME_LINE_GET_PRIVATE (self);
+       self->priv->drag_widget = NULL;
+       self->tracks = gee_array_list_new (TYPE_TRACK_VIEW, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL);
+       self->selected_clips = gee_array_list_new (TYPE_CLIP_VIEW, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL);
+       self->clipboard = clipboard_new ();
+       self->priv->pixel_min = 0.1f;
+       self->priv->pixel_max = 4505.0f;
+}
+
+
+static void time_line_finalize (GObject* obj) {
+       TimeLine * self;
+       self = TIME_LINE (obj);
+       _g_object_unref0 (self->project);
+       _g_object_unref0 (self->ruler);
+       _g_object_unref0 (self->priv->drag_widget);
+       _g_object_unref0 (self->tracks);
+       _g_object_unref0 (self->priv->vbox);
+       _g_object_unref0 (self->selected_clips);
+       _clipboard_unref0 (self->clipboard);
+       _g_object_unref0 (self->priv->high_water);
+       G_OBJECT_CLASS (time_line_parent_class)->finalize (obj);
+}
+
+
+GType time_line_get_type (void) {
+       static volatile gsize time_line_type_id__volatile = 0;
+       if (g_once_init_enter (&time_line_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (TimeLineClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) time_line_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (TimeLine), 0, (GInstanceInitFunc) time_line_instance_init, NULL };
+               GType time_line_type_id;
+               time_line_type_id = g_type_register_static (GTK_TYPE_EVENT_BOX, "TimeLine", &g_define_type_info, 0);
+               g_once_init_leave (&time_line_type_id__volatile, time_line_type_id);
+       }
+       return time_line_type_id__volatile;
+}
+
+
+static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
+       if ((array != NULL) && (destroy_func != NULL)) {
+               int i;
+               for (i = 0; i < array_length; i = i + 1) {
+                       if (((gpointer*) array)[i] != NULL) {
+                               destroy_func (((gpointer*) array)[i]);
+                       }
+               }
+       }
+}
+
+
+static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
+       _vala_array_destroy (array, array_length, destroy_func);
+       g_free (array);
+}
+
+
+static gint _vala_array_length (gpointer array) {
+       int length;
+       length = 0;
+       if (array) {
+               while (((gpointer*) array)[length]) {
+                       length++;
+               }
+       }
+       return length;
+}
+
+
+
+