31 App.controller(
'TimelineCtrl',
function($scope) {
43 playhead_position : 10,
48 image :
'./media/images/thumbnail.png',
54 title :
'Clip U2V5ENELDY',
56 { type :
'Saturation', icon :
'bw.png'},
57 { type :
'ChromaKey',icon :
'om.png'},
58 { type :
'Negate',icon :
'neg.png'},
59 { type :
'Blur', icon:
'blur.png'},
60 { type :
'Brightness', icon:
'cartoon.png'}
62 images : {
start: 1, end: 4},
90 location_x: { Points: [] },
91 location_y: { Points: [] },
92 scale_x: { Points: [] },
93 scale_y: { Points: [] },
94 rotation: { Points: [] },
96 volume: { Points: [] }
102 image :
'./media/images/thumbnail.png',
110 images : {
start: 3, end: 7},
112 alpha: { Points: [] },
113 location_x: { Points: [] },
114 location_y: { Points: [] },
115 scale_x: { Points: [] },
116 scale_y: { Points: [] },
117 rotation: { Points: [] },
118 time: { Points: [] },
119 volume: { Points: [] }
124 image :
'./media/images/thumbnail.png',
132 { type :
'Deinterlace',icon :
'om.png'},
133 { type :
'Blur', icon:
'blur.png'},
134 { type :
'Mask', icon:
'cartoon.png'}
136 images : {
start: 5, end: 10 },
138 audio_data : [.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3,.5, .6, .7, .7, .6, .5, .4, .1, 0, -0.1, -0.3, -0.6, -0.6, -0.3, -0.1, 0, .2, .3, ],
139 alpha: { Points: [] },
140 location_x: { Points: [] },
141 location_y: { Points: [] },
142 scale_x: { Points: [] },
143 scale_y: { Points: [] },
144 rotation: { Points: [] },
145 time: { Points: [] },
146 volume: { Points: [] }
154 title :
'Transition',
162 title :
'Transition',
170 title :
'Transition',
179 {
id:
'L0', number:0, y:0, label:
'', lock:
false},
180 {
id:
'L1', number:1, y:0, label:
'', lock:
false},
181 {
id:
'L2', number:2, y:0, label:
'', lock:
false},
182 {
id:
'L3', number:3, y:0, label:
'', lock:
false},
183 {
id:
'L4', number:4, y:0, label:
'', lock:
false}
211 [0, 30,
'rendering'],
212 [40, 50,
'complete'],
213 [100, 150,
'complete'],
218 $scope.pixelsPerSecond = parseFloat($scope.project.tick_pixels) / parseFloat($scope.project.scale);
219 $scope.playheadOffset = 0;
220 $scope.keyframePointOffset = 3;
221 $scope.playhead_animating =
false;
222 $scope.playhead_height = 300;
223 $scope.playheadTime =
secondsToTime($scope.project.playhead_position, $scope.project.fps.num, $scope.project.fps.den);
224 $scope.shift_pressed =
false;
225 $scope.snapline_position = 0.0;
226 $scope.snapline =
false;
227 $scope.enable_snapping =
true;
228 $scope.debug =
false;
229 $scope.min_width = 1024;
230 $scope.track_label =
"Track %s";
231 $scope.enable_sorting =
true;
235 $scope.EnableQt =
function() {
237 $scope.project.clips = [];
238 $scope.project.markers = [];
239 $scope.project.effects = [];
240 $scope.project.progress = [];
241 timeline.qt_log(
"$scope.Qt = true;");
245 $scope.MovePlayhead =
function(position_seconds) {
247 $scope.project.playhead_position = position_seconds;
248 $scope.playheadTime =
secondsToTime(position_seconds, $scope.project.fps.num, $scope.project.fps.den);
251 $(
".playhead-top").css(
"left", (($scope.project.playhead_position * $scope.pixelsPerSecond) + $scope.playheadOffset) +
"px");
252 $(
".playhead-line").css(
"left", (($scope.project.playhead_position * $scope.pixelsPerSecond) + $scope.playheadOffset) +
"px");
253 $(
"#ruler_time").text($scope.playheadTime.hour +
":" + $scope.playheadTime.min +
":" + $scope.playheadTime.sec +
":" + $scope.playheadTime.frame);
257 $scope.MovePlayheadToFrame =
function(position_frames) {
259 if ($scope.playhead_animating)
263 var frames_per_second = $scope.project.fps.num / $scope.project.fps.den;
264 var position_seconds = ((position_frames - 1) / frames_per_second);
267 $scope.MovePlayhead(position_seconds);
271 $scope.PreviewFrame =
function(position_seconds) {
273 var frames_per_second = $scope.project.fps.num / $scope.project.fps.den;
274 var frame = (position_seconds * frames_per_second) + 1;
278 timeline.PlayheadMoved(position_seconds, frame,
secondsToTime(position_seconds, $scope.project.fps.num, $scope.project.fps.den));
283 $scope.PreviewClipFrame =
function(clip_id, position_seconds) {
285 var frames_per_second = $scope.project.fps.num / $scope.project.fps.den;
286 var frame = (position_seconds * frames_per_second) + 1;
290 timeline.PreviewClipFrame(clip_id, frame);
294 $scope.getKeyframes =
function(
object){
298 var frames_per_second = $scope.project.fps.num / $scope.project.fps.den;
299 var clip_start_x = Math.round(
object.
start * frames_per_second) + 1.0;
300 var clip_end_x = Math.round(
object.end * frames_per_second) + 1.0;
303 for (child in
object) {
304 if (!
object.hasOwnProperty(child)) {
310 if (typeof
object[child] ==
"object" &&
"Points" in
object[child])
311 for (var point = 0; point <
object[child].Points.length; point++) {
312 var co =
object[child].Points[point].co;
313 if (co.X >= clip_start_x && co.X <= clip_end_x)
315 keyframes[co.X] = co.Y;
320 if (
"effects" in
object)
321 for (
effect in
object[
"effects"]) {
324 for (child in
object[
"effects"][
effect]) {
325 if (!
object[
"effects"][effect].hasOwnProperty(child)) {
331 if (typeof
object[
"effects"][effect][child] ==
"object" &&
"Points" in
object[
"effects"][effect][child])
332 for (var point = 0; point <
object[
"effects"][effect][child].Points.length; point++) {
333 var co =
object[
"effects"][effect][child].Points[point].co;
334 if (co.X >= clip_start_x && co.X <= clip_end_x)
336 keyframes[co.X] = co.Y;
347 $scope.getTrackTop =
function(layer){
349 var vert_scroll_offset = $(
"#scrolling_tracks").
scrollTop();
350 var horz_scroll_offset = $(
"#scrolling_tracks").scrollLeft();
353 var track_id =
"div#track_" + layer;
354 if ($(track_id).length)
355 return $(track_id).position().top + vert_scroll_offset;
364 $scope.setScale =
function(scaleVal){
365 $scope.$apply(
function(){
366 $scope.project.scale = scaleVal;
367 $scope.pixelsPerSecond = parseFloat($scope.project.tick_pixels) / parseFloat($scope.project.scale);
372 $scope.setAudioData =
function(clip_id, audio_data){
374 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++)
375 if ($scope.project.clips[clip_index].id == clip_id) {
377 $scope.$apply(
function(){
378 $scope.project.clips[clip_index].audio_data = audio_data;
379 $scope.project.clips[clip_index].show_audio =
true;
381 timeline.qt_log(
"Audio data successful set on clip JSON");
390 $scope.hideAudioData =
function(clip_id, audio_data){
392 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++)
393 if ($scope.project.clips[clip_index].id == clip_id) {
395 $scope.$apply(
function(){
396 $scope.project.clips[clip_index].show_audio =
false;
397 $scope.project.clips[clip_index].audio_data = [];
404 $scope.reDrawAllAudioData =
function(){
406 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++) {
407 if (
"audio_data" in $scope.project.clips[clip_index] && $scope.project.clips[clip_index].audio_data.length > 0) {
409 drawAudio($scope, $scope.project.clips[clip_index].id);
415 $scope.hasAudioData =
function(clip_id){
417 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++) {
418 if ($scope.project.clips[clip_index].id == clip_id &&
"audio_data" in $scope.project.clips[clip_index] && $scope.project.clips[clip_index].audio_data.length > 0) {
428 $scope.SetSnappingMode =
function(enable_snapping){
429 $scope.$apply(
function(){
430 $scope.enable_snapping = enable_snapping;
432 $(
".droppable").draggable(
"option",
"snapTolerance", 20);
434 $(
".droppable").draggable(
"option",
"snapTolerance", 0);
439 $scope.GetEffectColor =
function(effect_type){
462 $scope.AddClip =
function(x, y, clip_json){
463 $scope.$apply(
function(){
466 var scrolling_tracks_offset = $(
"#scrolling_tracks").
offset().left;
467 var clip_position = parseFloat(x - scrolling_tracks_offset) / parseFloat($scope.pixelsPerSecond);
468 clip_json.position = clip_position;
469 clip_json.layer = $scope.GetTrackAtY(y).number;
472 $scope.project.clips.push(clip_json);
478 $scope.ClearAllSelections =
function() {
480 $scope.SelectTransition(
"",
true);
481 $scope.SelectEffect(
"",
true);
484 $scope.$apply(
function() {
485 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++)
486 $scope.project.clips[clip_index].selected =
false;
487 for (var effect_index = 0; effect_index < $scope.project.effects.length; effect_index++)
488 $scope.project.effects[effect_index].selected =
false;
493 $scope.SelectAll =
function() {
494 $scope.$apply(
function() {
496 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++) {
497 $scope.project.clips[clip_index].selected =
true;
498 timeline.addSelection($scope.project.clips[clip_index].id,
"clip",
false);
501 for (var effect_index = 0; effect_index < $scope.project.effects.length; effect_index++) {
502 $scope.project.effects[effect_index].selected =
true;
503 timeline.addSelection($scope.project.effects[effect_index].id,
"transition",
false);
510 $scope.SelectClip =
function(clip_id, clear_selections, event) {
512 var
id = clip_id.replace(
"clip_",
"");
515 if (
id !=
"" && clear_selections) {
516 $scope.SelectTransition(
"", clear_selections);
517 $scope.SelectEffect(
"", clear_selections);
522 if (event && event.ctrlKey)
526 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++)
527 if ($scope.project.clips[clip_index].id ==
id) {
528 $scope.project.clips[clip_index].selected =
true;
530 timeline.addSelection(
id,
"clip", clear_selections);
532 else if (clear_selections && !is_ctrl) {
533 $scope.project.clips[clip_index].selected =
false;
535 timeline.removeSelection($scope.project.clips[clip_index].id,
"clip");
540 $scope.SelectTransition =
function(tran_id, clear_selections, event) {
542 var
id = tran_id.replace(
"transition_",
"");
545 if (
id !=
"" && clear_selections) {
546 $scope.SelectClip(
"",
true);
547 $scope.SelectEffect(
"",
true);
552 if (event && event.ctrlKey)
556 for (var tran_index = 0; tran_index < $scope.project.effects.length; tran_index++)
557 if ($scope.project.effects[tran_index].id ==
id) {
558 $scope.project.effects[tran_index].selected =
true;
560 timeline.addSelection(
id,
"transition", clear_selections);
562 else if (clear_selections && !is_ctrl) {
563 $scope.project.effects[tran_index].selected =
false;
565 timeline.removeSelection($scope.project.effects[tran_index].id,
"transition");
570 $scope.FormatThumbPath =
function(image_url) {
571 if (image_url.charAt(0) ==
".")
574 return "file:///" + image_url;
578 $scope.SelectEffect =
function(effect_id) {
580 timeline.addSelection(effect_id,
"effect",
true);
584 $scope.ResizeTimeline =
function() {
587 var furthest_right_edge = 0;
588 for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++)
590 var
clip = $scope.project.clips[clip_index];
591 var right_edge = clip.position + (clip.end - clip.start);
592 if (right_edge > furthest_right_edge)
593 furthest_right_edge = right_edge;
597 if (furthest_right_edge > $scope.project.duration)
599 timeline.resizeTimeline(furthest_right_edge + 10)
600 $scope.project.duration = furthest_right_edge + 10;
605 $scope.ShowClipMenu =
function(clip_id) {
607 timeline.qt_log(
"$scope.ShowClipMenu");
613 $scope.ShowEffectMenu =
function(effect_id) {
615 timeline.qt_log(
"$scope.ShowEffectMenu");
621 $scope.ShowTransitionMenu =
function(tran_id) {
623 timeline.qt_log(
"$scope.ShowTransitionMenu");
624 timeline.ShowTransitionMenu(tran_id);
629 $scope.ShowTrackMenu =
function(layer_id) {
631 timeline.qt_log(
"$scope.ShowTrackMenu");
637 $scope.ShowMarkerMenu =
function(marker_id) {
639 timeline.qt_log(
"$scope.ShowMarkerMenu");
645 $scope.ShowPlayheadMenu =
function(position) {
647 timeline.qt_log(
"$scope.ShowPlayheadMenu");
648 timeline.ShowPlayheadMenu(position);
653 $scope.ShowTimelineMenu =
function(
e, layer_number) {
655 timeline.ShowTimelineMenu($scope.GetJavaScriptPosition(
e.pageX), layer_number);
660 $scope.GetTrackName =
function(layer_label, layer_number){
662 if (layer_label.length > 0)
665 return $scope.track_label.replace(
'%s', layer_number.toString());
668 $scope.SetTrackLabel =
function (label){
669 $scope.track_label = label;
673 $scope.GetTimelineWidth =
function(min_value){
675 return Math.max(min_value, $scope.project.duration * $scope.pixelsPerSecond);
680 $scope.GetJavaScriptPosition =
function(x){
682 var horz_scroll_offset = $(
"#scrolling_tracks").scrollLeft();
683 var scrolling_tracks_offset_left = $(
"#scrolling_tracks").
offset().left;
684 x += horz_scroll_offset;
687 var clip_position = parseFloat(x - scrolling_tracks_offset_left) / parseFloat($scope.pixelsPerSecond);
688 if (clip_position < 0)
692 return clip_position;
696 $scope.GetJavaScriptTrack =
function(y){
698 var vert_scroll_offset = $(
"#scrolling_tracks").
scrollTop();
699 y += vert_scroll_offset;
702 var track_number = parseInt($scope.GetTrackAtY(y).number);
707 $scope.UpdateRecentItemJSON =
function(item_type, item_id) {
710 var item_object = null;
711 if (item_type ==
'clip') {
712 item_object =
findElement($scope.project.clips,
"id", item_id);
713 }
else if (item_type ==
'transition') {
714 item_object =
findElement($scope.project.effects,
"id", item_id);
721 var scrolling_tracks_offset_top = $(
"#scrolling_tracks").
offset().top;
722 var clip_position = parseFloat(
bounding_box.left) / parseFloat($scope.pixelsPerSecond);
723 var layer_num = $scope.GetTrackAtY(
bounding_box.track_position - scrolling_tracks_offset_top).number;
726 $scope.$apply(
function() {
728 item_object.position = clip_position;
729 item_object.layer = layer_num;
733 if (item_type ==
'clip')
734 timeline.update_clip_data(JSON.stringify(item_object));
735 else if (item_type ==
'transition')
736 timeline.update_transition_data(JSON.stringify(item_object));
739 $scope.ResizeTimeline();
742 $scope.HideSnapline();
749 $scope.StartManualMove =
function(item_type, item_id){
751 $scope.$apply(
function() {
752 if (item_type ==
'clip')
753 $scope.SelectClip(item_id,
true);
754 else if (item_type ==
'transition')
755 $scope.SelectTransition(item_id,
true);
759 var element_id =
"#" + item_type +
"_" + item_id;
775 $scope.MoveItem =
function(x, y, item_type) {
777 var vert_scroll_offset = $(
"#scrolling_tracks").
scrollTop();
778 var horz_scroll_offset = $(
"#scrolling_tracks").scrollLeft();
779 x += horz_scroll_offset;
780 y += vert_scroll_offset;
783 var scrolling_tracks_offset_left = $(
"#scrolling_tracks").
offset().left;
784 var scrolling_tracks_offset_top = $(
"#scrolling_tracks").
offset().top;
787 var left = parseFloat(x - scrolling_tracks_offset_left);
788 var top = parseFloat(y - scrolling_tracks_offset_top);
801 var clip_position = parseFloat(results.position.left) / parseFloat($scope.pixelsPerSecond);
802 if (clip_position < 0)
807 for (var layer_index = $scope.project.layers.length - 1; layer_index >= 0 ; layer_index--) {
808 var layer = $scope.project.layers[layer_index];
818 bounding_box.element.css(
'left', results.position.left);
823 $scope.UpdateLayerIndex =
function(){
826 timeline.qt_log(
'UpdateLayerIndex');
828 var vert_scroll_offset = $(
"#scrolling_tracks").
scrollTop();
829 var horz_scroll_offset = $(
"#scrolling_tracks").scrollLeft();
832 var scrolling_tracks_offset_left = $(
"#scrolling_tracks").
offset().left;
833 var scrolling_tracks_offset_top = $(
"#scrolling_tracks").
offset().top;
835 $scope.$apply(
function(){
838 for (var layer_index = 0; layer_index < $scope.project.layers.length; layer_index++) {
839 var layer = $scope.project.layers[layer_index];
842 var layer_elem = $(
"#track_" + layer.number);
845 layer.y = layer_elem.offset().top + vert_scroll_offset;
850 $scope.playhead_height = $(
"#track-container").
height();
851 $(
".playhead-line").
height($scope.playhead_height);
856 $scope.SortItems =
function(){
857 if (!$scope.enable_sorting)
864 $scope.$apply(
function(){
866 $scope.project.clips = $scope.project.clips.sort(
function(a,b) {
867 if ( a.position < b.position )
869 if ( a.position > b.position )
875 $scope.project.effects = $scope.project.effects.sort(
function(a,b) {
876 if ( a.position < b.position )
878 if ( a.position > b.position )
884 $scope.project.layers = $scope.project.layers.sort(
function(a,b) {
885 if ( a.number < b.number )
887 if ( a.number > b.number )
896 $scope.GetMissingTransitions =
function(original_clip) {
898 var transition_size = null;
901 var original_left = original_clip.position;
902 var original_right = original_clip.position + (original_clip.end - original_clip.start);
905 for (var index = 0; index < $scope.project.clips.length; index++) {
906 var clip = $scope.project.clips[index];
909 if (original_clip.layer != clip.layer)
913 var clip_left = clip.position;
914 var clip_right = clip.position + (clip.end - clip.start);
916 if (original_left < clip_right && original_left > clip_left)
917 transition_size = {
"position" : original_left,
"layer" : clip.layer,
"start" : 0,
"end" : (clip_right - original_left) };
918 else if (original_right > clip_left && original_right < clip_right)
919 transition_size = {
"position" : clip_left,
"layer" : clip.layer,
"start" : 0,
"end" : (original_right - clip_left) };
921 if (transition_size != null && transition_size.end >= 0.5)
924 else if (transition_size != null && transition_size.end < 0.5)
926 transition_size = null;
931 if (transition_size != null)
932 for (var tran_index = 0; tran_index < $scope.project.effects.length; tran_index++) {
933 var tran = $scope.project.effects[tran_index];
936 if (tran.layer != transition_size.layer)
939 var tran_left = tran.position;
940 var tran_right = tran.position + (tran.end - tran.start);
942 var new_tran_left = transition_size.position;
943 var new_tran_right = transition_size.position + (transition_size.end - transition_size.start);
945 var TOLERANCE = 0.01;
947 if (Math.abs(tran_left - new_tran_left) < TOLERANCE || Math.abs(tran_right - new_tran_right) < TOLERANCE) {
948 transition_size = null;
953 return transition_size;
957 $scope.GetNearbyPosition =
function(pixel_positions, threashold, ignore_ids){
959 var smallest_diff = 900.0;
960 var smallest_abs_diff = 900.0;
961 var snapping_position = 0.0;
965 for (var pos_index = 0; pos_index < pixel_positions.length; pos_index++) {
966 var pixel_position = pixel_positions[pos_index];
967 var position = pixel_position / $scope.pixelsPerSecond;
970 for (var index = 0; index < $scope.project.clips.length; index++) {
971 var clip = $scope.project.clips[index];
974 if (ignore_ids.hasOwnProperty(clip.id))
977 diffs.push({
'diff' : position - clip.position,
'position' : clip.position},
978 {
'diff' : position - (clip.position + (clip.end - clip.start)),
'position' : clip.position + (clip.end - clip.start)});
982 for (var index = 0; index < $scope.project.effects.length; index++) {
983 var
transition = $scope.project.effects[index];
986 if (ignore_ids.hasOwnProperty(transition.id))
989 diffs.push({
'diff' : position - transition.position,
'position' : transition.position},
990 {
'diff' : position - (transition.position + (transition.end - transition.start)),
'position' : transition.position + (transition.end - transition.start)});
994 for (var index = 0; index < $scope.project.markers.length; index++) {
995 var
marker = $scope.project.markers[index];
997 diffs.push({
'diff' : position - marker.position,
'position' : marker.position},
998 {
'diff' : position - (marker.position + (marker.end - marker.start)),
'position' : marker.position + (marker.end - marker.start)});
1002 var playhead_diff = position - $scope.project.playhead_position;
1003 diffs.push({
'diff' : playhead_diff,
'position' : $scope.project.playhead_position });
1006 for (var diff_index = 0; diff_index < diffs.length; diff_index++) {
1007 var diff = diffs[diff_index].diff;
1008 var position = diffs[diff_index].position;
1009 var abs_diff = Math.abs(diff);
1012 if (abs_diff < smallest_abs_diff && abs_diff <= threashold) {
1014 smallest_diff = diff;
1015 smallest_abs_diff = abs_diff;
1016 snapping_position = position;
1022 if (smallest_diff == 900.0)
1023 smallest_diff = 0.0;
1026 return [smallest_diff, snapping_position];
1030 $scope.ShowSnapline =
function(position){
1031 if (position != $scope.snapline_position || !$scope.snapline) {
1033 $scope.$apply(
function(){
1034 $scope.snapline_position = position;
1035 $scope.snapline =
true;
1041 $scope.HideSnapline =
function(){
1042 if ($scope.snapline) {
1044 $scope.$apply(
function(){
1045 $scope.snapline =
false;
1051 $scope.GetTrackAtY =
function(y){
1054 for (var layer_index = $scope.project.layers.length - 1; layer_index >= 0 ; layer_index--) {
1055 var layer = $scope.project.layers[layer_index];
1064 if ($scope.project.layers.length > 0)
1065 return $scope.project.layers[0];
1071 $scope.GetTrackStyle =
function(lock){
1074 return "track track_disabled";
1082 $scope.ApplyJsonDiff =
function(jsonDiff){
1085 for (var action_index = 0; action_index < jsonDiff.length; action_index++) {
1086 var action = jsonDiff[action_index];
1089 var previous_object = null;
1090 var current_object = $scope.project;
1091 var current_position = 0;
1092 var current_key =
"";
1093 for (var key_index = 0; key_index < action.key.length; key_index++) {
1094 var key_value = action.key[key_index];
1097 if (key_value.constructor == String) {
1099 if (!current_object.hasOwnProperty(key_value))
1104 previous_object = current_object;
1105 current_object = current_object[key_value];
1106 current_key = key_value;
1108 }
else if (key_value.constructor == Object) {
1111 if (
"id" in key_value)
1112 id = key_value[
"id"];
1115 if (current_object.constructor == Array) {
1117 current_position = 0;
1118 for (var child_index = 0; child_index < current_object.length; child_index++) {
1119 var child_object = current_object[child_index];
1122 if (child_object.hasOwnProperty(
"id") && child_object.id == id) {
1124 previous_object = current_object;
1125 current_object = child_object;
1137 if (current_object){
1139 if (action.type ==
"insert") {
1142 if (current_object.constructor == Array)
1144 $scope.$apply(
function(){
1145 current_object.push(action.value);
1149 if (previous_object.constructor == Array) {
1151 $scope.$apply(
function(){
1152 previous_object[current_position] = action.value;
1155 }
else if (previous_object.constructor == Object) {
1157 $scope.$apply(
function(){
1158 previous_object[current_key] = action.value;
1163 }
else if (action.type ==
"update") {
1166 if (current_object.constructor == Object && action.value.constructor == Object) {
1167 for (var update_key in action.value)
1168 if (update_key in current_object)
1170 $scope.$apply(
function () {
1171 current_object[update_key] = action.value[update_key];
1176 if (previous_object.constructor == Array) {
1178 $scope.$apply(
function(){
1179 previous_object[current_position] = action.value;
1182 }
else if (previous_object.constructor == Object) {
1184 $scope.$apply(
function(){
1185 previous_object[current_key] = action.value;
1191 }
else if (action.type ==
"delete") {
1194 $scope.$apply(
function(){
1195 previous_object.splice(current_position, 1);
1200 $scope.ResizeTimeline();
1206 $scope.UpdateLayerIndex();
1219 $scope.LoadJson =
function(EntireProjectJson){
1221 $scope.$apply(
function(){
1223 $scope.project = EntireProjectJson.value;
1226 $scope.SelectClip(
"",
true);
1233 $scope.UpdateLayerIndex();
1243 $scope.LockItems =
function(){
1261 $scope.ToggleDebug =
function() {
1262 if ($scope.debug ==
true)
1263 $scope.debug =
false;
1265 $scope.debug =
true;
1269 $scope.addClips =
function(numClips) {
1270 startNum = $scope.project.clips.length + 1;
1272 for (var x = 0; x < parseInt(numClips); x++) {
1273 $scope.project.clips.push({
1276 image :
'./media/images/thumbnail.png',
1281 position : positionNum,
1284 images : {
start: 3, end: 7},
1286 alpha: { Points: [] },
1287 location_x: { Points: [] },
1288 location_y: { Points: [] },
1289 scale_x: { Points: [] },
1290 scale_y: { Points: [] },
1291 rotation: { Points: [] },
1292 time: { Points: [] },
1293 volume: { Points: [] }
1299 $scope.numClips =
"";
1304 $scope.addEffect =
function(clipNum){
1306 elm =
findElement($scope.project.clips,
"number", clipNum);
1308 effect :
'Old Movie',
1311 $scope.clipNum =
"";
1316 $scope.addMarker =
function(markLoc){
1317 $scope.project.markers.push({
1318 location: parseInt(markLoc),
1321 $scope.markLoc =
"";
1325 $scope.changeImage =
function(startImage){
1326 console.log(startImage);
1327 $scope.project.clips[2].images.start=startImage;
1328 $scope.startImage =
"";
if(window.getComputedStyle)
function findElement(arr, propName, propValue)
function moveBoundingBox(scope, previous_x, previous_y, x_offset, y_offset, left, top)
function setBoundingBox(item)
Tween propHooks scrollTop
function drawAudio(scope, clip_id)
function secondsToTime(secs, fps_num, fps_den)