OpenShot Video Editor
2.0.0
|
The AngularJS controller used by the OpenShot Timeline. More...
Go to the source code of this file.
Functions | |
App | controller ('TimelineCtrl', function($scope){$scope.project={fps:{num:24, den:1}, duration:300, scale:16.0, tick_pixels:100, playhead_position:10, clips:[{id: '1', layer:1, image: './media/images/thumbnail.png', locked:false, duration:32, start:0, end:32, position:0.0, title: 'Clip U2V5ENELDY', effects:[{type: 'Saturation', icon: 'bw.png'},{type: 'ChromaKey', icon: 'om.png'},{type: 'Negate', icon: 'neg.png'},{type: 'Blur', icon: 'blur.png'},{type: 'Brightness', icon: 'cartoon.png'}], images:{start:1, end:4}, show_audio:false, alpha:{Points:[{"interpolation":2,"co":{"Y":0,"X":0}},{"interpolation":1,"co":{"Y":0,"X":250}},{"interpolation":1,"co":{"Y":1,"X":500}}]}, location_x:{Points:[]}, location_y:{Points:[]}, scale_x:{Points:[]}, scale_y:{Points:[]}, rotation:{Points:[]}, time:{Points:[]}, volume:{Points:[]}},{id: '2', layer:2, image: './media/images/thumbnail.png', locked:false, duration:45, start:0, end:45, position:0.0, title: 'Clip B', effects:[], images:{start:3, end:7}, show_audio:false, alpha:{Points:[]}, location_x:{Points:[]}, location_y:{Points:[]}, scale_x:{Points:[]}, scale_y:{Points:[]}, rotation:{Points:[]}, time:{Points:[]}, volume:{Points:[]}},{id: '3', layer:3, image: './media/images/thumbnail.png', locked:false, duration:120, start:0, end:120, position:32.0, title: 'Clip C', effects:[{type: 'Deinterlace', icon: 'om.png'},{type: 'Blur', icon: 'blur.png'},{type: 'Mask', icon: 'cartoon.png'}], images:{start:5, end:10}, show_audio:false, 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,], alpha:{Points:[]}, location_x:{Points:[]}, location_y:{Points:[]}, scale_x:{Points:[]}, scale_y:{Points:[]}, rotation:{Points:[]}, time:{Points:[]}, volume:{Points:[]}},], effects:[{id: '5', layer:4, title: 'Transition', position:20.0, start:0, end:30},{id: '6', layer:3, title: 'Transition', position:137.5, start:0, end:30},{id: '7', layer:2, title: 'Transition', position:30.5, start:0, end:30}], layers:[{id: 'L0', number:0, y:0, label: '', lock:false},{id: 'L1', number:1, y:0, label: '', lock:false},{id: 'L2', number:2, y:0, label: '', lock:false},{id: 'L3', number:3, y:0, label: '', lock:false},{id: 'L4', number:4, y:0, label: '', lock:false}], markers:[{id: 'M1', position:16, icon: 'yellow.png'},{id: 'M2', position:120, icon: 'green.png'},{id: 'M3', position:300, icon: 'red.png'},{id: 'M4', position:10, icon: 'purple.png'},], progress:[[0, 30, 'rendering'], [40, 50, 'complete'], [100, 150, 'complete'],]};$scope.pixelsPerSecond=parseFloat($scope.project.tick_pixels)/parseFloat($scope.project.scale);$scope.playheadOffset=0;$scope.keyframePointOffset=3;$scope.playhead_animating=false;$scope.playhead_height=300;$scope.playheadTime=secondsToTime($scope.project.playhead_position, $scope.project.fps.num, $scope.project.fps.den);$scope.shift_pressed=false;$scope.snapline_position=0.0;$scope.snapline=false;$scope.enable_snapping=true;$scope.debug=false;$scope.min_width=1024;$scope.track_label="Track %s";$scope.enable_sorting=true;$scope.Qt=false;$scope.EnableQt=function(){$scope.Qt=true;$scope.project.clips=[];$scope.project.markers=[];$scope.project.effects=[];$scope.project.progress=[];timeline.qt_log("$scope.Qt = true;");};$scope.MovePlayhead=function(position_seconds){$scope.project.playhead_position=position_seconds;$scope.playheadTime=secondsToTime(position_seconds, $scope.project.fps.num, $scope.project.fps.den);$(".playhead-top").css("left",(($scope.project.playhead_position *$scope.pixelsPerSecond)+$scope.playheadOffset)+"px");$(".playhead-line").css("left",(($scope.project.playhead_position *$scope.pixelsPerSecond)+$scope.playheadOffset)+"px");$("#ruler_time").text($scope.playheadTime.hour+":"+$scope.playheadTime.min+":"+$scope.playheadTime.sec+":"+$scope.playheadTime.frame);};$scope.MovePlayheadToFrame=function(position_frames){if($scope.playhead_animating) return;var frames_per_second=$scope.project.fps.num/$scope.project.fps.den;var position_seconds=((position_frames-1)/frames_per_second);$scope.MovePlayhead(position_seconds);};$scope.PreviewFrame=function(position_seconds){var frames_per_second=$scope.project.fps.num/$scope.project.fps.den;var frame=(position_seconds *frames_per_second)+1;if($scope.Qt) timeline.PlayheadMoved(position_seconds, frame, secondsToTime(position_seconds, $scope.project.fps.num, $scope.project.fps.den));};$scope.PreviewClipFrame=function(clip_id, position_seconds){var frames_per_second=$scope.project.fps.num/$scope.project.fps.den;var frame=(position_seconds *frames_per_second)+1;if($scope.Qt) timeline.PreviewClipFrame(clip_id, frame);};$scope.getKeyframes=function(object){keyframes={};var frames_per_second=$scope.project.fps.num/$scope.project.fps.den;var clip_start_x=Math.round(object.start *frames_per_second)+1.0;var clip_end_x=Math.round(object.end *frames_per_second)+1.0;for(child in object){if(!object.hasOwnProperty(child)){continue;}if(typeof object[child]=="object"&&"Points"in object[child]) for(var point=0;point< object[child].Points.length;point++){var co=object[child].Points[point].co;if(co.X >=clip_start_x &&co.X<=clip_end_x) keyframes[co.X]=co.Y;}}if("effects"in object) for(effect in object["effects"]){for(child in object["effects"][effect]){if(!object["effects"][effect].hasOwnProperty(child)){continue;}if(typeof object["effects"][effect][child]=="object"&&"Points"in object["effects"][effect][child]) for(var point=0;point< object["effects"][effect][child].Points.length;point++){var co=object["effects"][effect][child].Points[point].co;if(co.X >=clip_start_x &&co.X<=clip_end_x) keyframes[co.X]=co.Y;}}}return keyframes;};$scope.getTrackTop=function(layer){var vert_scroll_offset=$("#scrolling_tracks").scrollTop();var horz_scroll_offset=$("#scrolling_tracks").scrollLeft();var track_id="div#track_"+layer;if($(track_id).length) return $(track_id).position().top+vert_scroll_offset;else return 0;};$scope.setScale=function(scaleVal){$scope.$apply(function(){$scope.project.scale=scaleVal;$scope.pixelsPerSecond=parseFloat($scope.project.tick_pixels)/parseFloat($scope.project.scale);});};$scope.setAudioData=function(clip_id, audio_data){for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++) if($scope.project.clips[clip_index].id==clip_id){$scope.$apply(function(){$scope.project.clips[clip_index].audio_data=audio_data;$scope.project.clips[clip_index].show_audio=true;});timeline.qt_log("Audio data successful set on clip JSON");break;}drawAudio($scope, clip_id);};$scope.hideAudioData=function(clip_id, audio_data){for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++) if($scope.project.clips[clip_index].id==clip_id){$scope.$apply(function(){$scope.project.clips[clip_index].show_audio=false;$scope.project.clips[clip_index].audio_data=[];});break;}};$scope.reDrawAllAudioData=function(){for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++){if("audio_data"in $scope.project.clips[clip_index]&&$scope.project.clips[clip_index].audio_data.length > 0){drawAudio($scope, $scope.project.clips[clip_index].id);}}};$scope.hasAudioData=function(clip_id){for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++){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){return true;break;}}return false;};$scope.SetSnappingMode=function(enable_snapping){$scope.$apply(function(){$scope.enable_snapping=enable_snapping;if(enable_snapping)$(".droppable").draggable("option","snapTolerance", 20);else $(".droppable").draggable("option","snapTolerance", 0);});};$scope.GetEffectColor=function(effect_type){switch(effect_type){case"Blur":return"#0095bf";case"Brightness":return"#5500ff";case"ChromaKey":return"#00ad2d";case"Deinterlace":return"#006001";case"Mask":return"#cb0091";case"Negate":return"#ff9700";case"Saturation":return"#ff3d00";default:return"#000000";}};$scope.AddClip=function(x, y, clip_json){$scope.$apply(function(){var scrolling_tracks_offset=$("#scrolling_tracks").offset().left;var clip_position=parseFloat(x-scrolling_tracks_offset)/parseFloat($scope.pixelsPerSecond);clip_json.position=clip_position;clip_json.layer=$scope.GetTrackAtY(y).number;$scope.project.clips.push(clip_json);});};$scope.ClearAllSelections=function(){$scope.SelectTransition("", true);$scope.SelectEffect("", true);$scope.$apply(function(){for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++)$scope.project.clips[clip_index].selected=false;for(var effect_index=0;effect_index< $scope.project.effects.length;effect_index++)$scope.project.effects[effect_index].selected=false;});};$scope.SelectAll=function(){$scope.$apply(function(){for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++){$scope.project.clips[clip_index].selected=true;timeline.addSelection($scope.project.clips[clip_index].id,"clip", false);}for(var effect_index=0;effect_index< $scope.project.effects.length;effect_index++){$scope.project.effects[effect_index].selected=true;timeline.addSelection($scope.project.effects[effect_index].id,"transition", false);}});};$scope.SelectClip=function(clip_id, clear_selections, event){var id=clip_id.replace("clip_","");if(id!=""&&clear_selections){$scope.SelectTransition("", clear_selections);$scope.SelectEffect("", clear_selections);}is_ctrl=false;if(event &&event.ctrlKey) is_ctrl=true;for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++) if($scope.project.clips[clip_index].id==id){$scope.project.clips[clip_index].selected=true;if($scope.Qt) timeline.addSelection(id,"clip", clear_selections);}else if(clear_selections &&!is_ctrl){$scope.project.clips[clip_index].selected=false;if($scope.Qt) timeline.removeSelection($scope.project.clips[clip_index].id,"clip");}};$scope.SelectTransition=function(tran_id, clear_selections, event){var id=tran_id.replace("transition_","");if(id!=""&&clear_selections){$scope.SelectClip("", true);$scope.SelectEffect("", true);}is_ctrl=false;if(event &&event.ctrlKey) is_ctrl=true;for(var tran_index=0;tran_index< $scope.project.effects.length;tran_index++) if($scope.project.effects[tran_index].id==id){$scope.project.effects[tran_index].selected=true;if($scope.Qt) timeline.addSelection(id,"transition", clear_selections);}else if(clear_selections &&!is_ctrl){$scope.project.effects[tran_index].selected=false;if($scope.Qt) timeline.removeSelection($scope.project.effects[tran_index].id,"transition");}};$scope.FormatThumbPath=function(image_url){if(image_url.charAt(0)==".") return image_url;else return"file:///"+image_url;};$scope.SelectEffect=function(effect_id){if($scope.Qt) timeline.addSelection(effect_id,"effect", true);};$scope.ResizeTimeline=function(){var furthest_right_edge=0;for(var clip_index=0;clip_index< $scope.project.clips.length;clip_index++){var clip=$scope.project.clips[clip_index];var right_edge=clip.position+(clip.end-clip.start);if(right_edge > furthest_right_edge) furthest_right_edge=right_edge;}if(furthest_right_edge > $scope.project.duration) if($scope.Qt){timeline.resizeTimeline(furthest_right_edge+10) $scope.project.duration=furthest_right_edge+10;}};$scope.ShowClipMenu=function(clip_id){if($scope.Qt){timeline.qt_log("$scope.ShowClipMenu");timeline.ShowClipMenu(clip_id);}};$scope.ShowEffectMenu=function(effect_id){if($scope.Qt){timeline.qt_log("$scope.ShowEffectMenu");timeline.ShowEffectMenu(effect_id);}};$scope.ShowTransitionMenu=function(tran_id){if($scope.Qt){timeline.qt_log("$scope.ShowTransitionMenu");timeline.ShowTransitionMenu(tran_id);}};$scope.ShowTrackMenu=function(layer_id){if($scope.Qt){timeline.qt_log("$scope.ShowTrackMenu");timeline.ShowTrackMenu(layer_id);}};$scope.ShowMarkerMenu=function(marker_id){if($scope.Qt){timeline.qt_log("$scope.ShowMarkerMenu");timeline.ShowMarkerMenu(marker_id);}};$scope.ShowPlayheadMenu=function(position){if($scope.Qt){timeline.qt_log("$scope.ShowPlayheadMenu");timeline.ShowPlayheadMenu(position);}};$scope.ShowTimelineMenu=function(e, layer_number){if($scope.Qt){timeline.ShowTimelineMenu($scope.GetJavaScriptPosition(e.pageX), layer_number);}};$scope.GetTrackName=function(layer_label, layer_number){if(layer_label.length > 0) return layer_label;else return $scope.track_label.replace('%s', layer_number.toString());};$scope.SetTrackLabel=function(label){$scope.track_label=label;};$scope.GetTimelineWidth=function(min_value){return Math.max(min_value, $scope.project.duration *$scope.pixelsPerSecond);};$scope.GetJavaScriptPosition=function(x){var horz_scroll_offset=$("#scrolling_tracks").scrollLeft();var scrolling_tracks_offset_left=$("#scrolling_tracks").offset().left;x+=horz_scroll_offset;var clip_position=parseFloat(x-scrolling_tracks_offset_left)/parseFloat($scope.pixelsPerSecond);if(clip_position< 0) clip_position=0;return clip_position;};$scope.GetJavaScriptTrack=function(y){var vert_scroll_offset=$("#scrolling_tracks").scrollTop();y+=vert_scroll_offset;var track_number=parseInt($scope.GetTrackAtY(y).number);return track_number;};$scope.UpdateRecentItemJSON=function(item_type, item_id){var item_object=null;if(item_type== 'clip'){item_object=findElement($scope.project.clips,"id", item_id);}else if(item_type== 'transition'){item_object=findElement($scope.project.effects,"id", item_id);}else{return;}var scrolling_tracks_offset_top=$("#scrolling_tracks").offset().top;var clip_position=parseFloat(bounding_box.left)/parseFloat($scope.pixelsPerSecond);var layer_num=$scope.GetTrackAtY(bounding_box.track_position-scrolling_tracks_offset_top).number;$scope.$apply(function(){item_object.position=clip_position;item_object.layer=layer_num;});if(item_type== 'clip') timeline.update_clip_data(JSON.stringify(item_object));else if(item_type== 'transition') timeline.update_transition_data(JSON.stringify(item_object));$scope.ResizeTimeline();$scope.HideSnapline();bounding_box={};};$scope.StartManualMove=function(item_type, item_id){$scope.$apply(function(){if(item_type== 'clip')$scope.SelectClip(item_id, true);else if(item_type== 'transition')$scope.SelectTransition(item_id, true);});var element_id="#"+item_type+"_"+item_id;bounding_box={};setBoundingBox($(element_id));bounding_box.previous_x=bounding_box.left;bounding_box.previous_y=bounding_box.top;bounding_box.offset_x=0;bounding_box.offset_y=0;bounding_box.element=$(element_id);bounding_box.track_position=0;};$scope.MoveItem=function(x, y, item_type){var vert_scroll_offset=$("#scrolling_tracks").scrollTop();var horz_scroll_offset=$("#scrolling_tracks").scrollLeft();x+=horz_scroll_offset;y+=vert_scroll_offset;var scrolling_tracks_offset_left=$("#scrolling_tracks").offset().left;var scrolling_tracks_offset_top=$("#scrolling_tracks").offset().top;var left=parseFloat(x-scrolling_tracks_offset_left);var top=parseFloat(y-scrolling_tracks_offset_top);var x_offset=left-bounding_box.previous_x;var y_offset=top-bounding_box.previous_y;results=moveBoundingBox($scope, bounding_box.previous_x, bounding_box.previous_y, x_offset, y_offset, left, top);bounding_box.previous_x=results.position.left;bounding_box.previous_y=results.position.top;var clip_position=parseFloat(results.position.left)/parseFloat($scope.pixelsPerSecond);if(clip_position< 0) clip_position=0;bounding_box.track_position=0;for(var layer_index=$scope.project.layers.length-1;layer_index >=0;layer_index--){var layer=$scope.project.layers[layer_index];if(!layer.lock) if((top< layer.y &&top > bounding_box.track_position)||bounding_box.track_position==0) bounding_box.track_position=layer.y;}bounding_box.element.css('left', results.position.left);bounding_box.element.css('top', bounding_box.track_position-scrolling_tracks_offset_top);};$scope.UpdateLayerIndex=function(){if($scope.Qt) timeline.qt_log('UpdateLayerIndex');var vert_scroll_offset=$("#scrolling_tracks").scrollTop();var horz_scroll_offset=$("#scrolling_tracks").scrollLeft();var scrolling_tracks_offset_left=$("#scrolling_tracks").offset().left;var scrolling_tracks_offset_top=$("#scrolling_tracks").offset().top;$scope.$apply(function(){for(var layer_index=0;layer_index< $scope.project.layers.length;layer_index++){var layer=$scope.project.layers[layer_index];var layer_elem=$("#track_"+layer.number);if(layer_elem){layer.y=layer_elem.offset().top+vert_scroll_offset;}}$scope.playhead_height=$("#track-container").height();$(".playhead-line").height($scope.playhead_height);});};$scope.SortItems=function(){if(!$scope.enable_sorting) return;if($scope.Qt) timeline.qt_log('SortItems');$scope.$apply(function(){$scope.project.clips=$scope.project.clips.sort(function(a, b){if(a.position< b.position) return-1;if(a.position > b.position) return 1;return 0;});$scope.project.effects=$scope.project.effects.sort(function(a, b){if(a.position< b.position) return-1;if(a.position > b.position) return 1;return 0;});$scope.project.layers=$scope.project.layers.sort(function(a, b){if(a.number< b.number) return-1;if(a.number > b.number) return 1;return 0;});});};$scope.GetMissingTransitions=function(original_clip){var transition_size=null;var original_left=original_clip.position;var original_right=original_clip.position+(original_clip.end-original_clip.start);for(var index=0;index< $scope.project.clips.length;index++){var clip=$scope.project.clips[index];if(original_clip.layer!=clip.layer) continue;var clip_left=clip.position;var clip_right=clip.position+(clip.end-clip.start);if(original_left< clip_right &&original_left > clip_left) transition_size={"position":original_left,"layer":clip.layer,"start":0,"end":(clip_right-original_left)};else if(original_right > clip_left &&original_right< clip_right) transition_size={"position":clip_left,"layer":clip.layer,"start":0,"end":(original_right-clip_left)};if(transition_size!=null &&transition_size.end >=0.5) break;else if(transition_size!=null &&transition_size.end< 0.5) transition_size=null;}if(transition_size!=null) for(var tran_index=0;tran_index< $scope.project.effects.length;tran_index++){var tran=$scope.project.effects[tran_index];if(tran.layer!=transition_size.layer) continue;var tran_left=tran.position;var tran_right=tran.position+(tran.end-tran.start);var new_tran_left=transition_size.position;var new_tran_right=transition_size.position+(transition_size.end-transition_size.start);var TOLERANCE=0.01;if(Math.abs(tran_left-new_tran_left)< TOLERANCE||Math.abs(tran_right-new_tran_right)< TOLERANCE){transition_size=null;break;}}return transition_size;};$scope.GetNearbyPosition=function(pixel_positions, threashold, ignore_ids){var smallest_diff=900.0;var smallest_abs_diff=900.0;var snapping_position=0.0;var diffs=[];for(var pos_index=0;pos_index< pixel_positions.length;pos_index++){var pixel_position=pixel_positions[pos_index];var position=pixel_position/$scope.pixelsPerSecond;for(var index=0;index< $scope.project.clips.length;index++){var clip=$scope.project.clips[index];if(ignore_ids.hasOwnProperty(clip.id)) continue;diffs.push({'diff':position-clip.position, 'position':clip.position},{'diff':position-(clip.position+(clip.end-clip.start)), 'position':clip.position+(clip.end-clip.start)});}for(var index=0;index< $scope.project.effects.length;index++){var transition=$scope.project.effects[index];if(ignore_ids.hasOwnProperty(transition.id)) continue;diffs.push({'diff':position-transition.position, 'position':transition.position},{'diff':position-(transition.position+(transition.end-transition.start)), 'position':transition.position+(transition.end-transition.start)});}for(var index=0;index< $scope.project.markers.length;index++){var marker=$scope.project.markers[index];diffs.push({'diff':position-marker.position, 'position':marker.position},{'diff':position-(marker.position+(marker.end-marker.start)), 'position':marker.position+(marker.end-marker.start)});}var playhead_diff=position-$scope.project.playhead_position;diffs.push({'diff':playhead_diff, 'position':$scope.project.playhead_position});for(var diff_index=0;diff_index< diffs.length;diff_index++){var diff=diffs[diff_index].diff;var position=diffs[diff_index].position;var abs_diff=Math.abs(diff);if(abs_diff< smallest_abs_diff &&abs_diff<=threashold){smallest_diff=diff;smallest_abs_diff=abs_diff;snapping_position=position;}}}if(smallest_diff==900.0) smallest_diff=0.0;return[smallest_diff, snapping_position];};$scope.ShowSnapline=function(position){if(position!=$scope.snapline_position||!$scope.snapline){$scope.$apply(function(){$scope.snapline_position=position;$scope.snapline=true;});}};$scope.HideSnapline=function(){if($scope.snapline){$scope.$apply(function(){$scope.snapline=false;});}};$scope.GetTrackAtY=function(y){for(var layer_index=$scope.project.layers.length-1;layer_index >=0;layer_index--){var layer=$scope.project.layers[layer_index];if(layer.y > y) return layer;}if($scope.project.layers.length > 0) return $scope.project.layers[0];else return null;};$scope.GetTrackStyle=function(lock){if(lock) return"track track_disabled";else return"track";};$scope.ApplyJsonDiff=function(jsonDiff){for(var action_index=0;action_index< jsonDiff.length;action_index++){var action=jsonDiff[action_index];var previous_object=null;var current_object=$scope.project;var current_position=0;var current_key="";for(var key_index=0;key_index< action.key.length;key_index++){var key_value=action.key[key_index];if(key_value.constructor==String){if(!current_object.hasOwnProperty(key_value)) return false;previous_object=current_object;current_object=current_object[key_value];current_key=key_value;}else if(key_value.constructor==Object){var id=null;if("id"in key_value) id=key_value["id"];if(current_object.constructor==Array){current_position=0;for(var child_index=0;child_index< current_object.length;child_index++){var child_object=current_object[child_index];if(child_object.hasOwnProperty("id")&&child_object.id==id){previous_object=current_object;current_object=child_object;break;}current_position++;}}}}if(current_object){if(action.type=="insert"){if(current_object.constructor==Array)$scope.$apply(function(){current_object.push(action.value);});else{if(previous_object.constructor==Array){$scope.$apply(function(){previous_object[current_position]=action.value;});}else if(previous_object.constructor==Object){$scope.$apply(function(){previous_object[current_key]=action.value;});}}}else if(action.type=="update"){if(current_object.constructor==Object &&action.value.constructor==Object){for(var update_key in action.value) if(update_key in current_object)$scope.$apply(function(){current_object[update_key]=action.value[update_key];});}else{if(previous_object.constructor==Array){$scope.$apply(function(){previous_object[current_position]=action.value;});}else if(previous_object.constructor==Object){$scope.$apply(function(){previous_object[current_key]=action.value;});}}}else if(action.type=="delete"){$scope.$apply(function(){previous_object.splice(current_position, 1);});}$scope.ResizeTimeline();$scope.SortItems();$scope.UpdateLayerIndex();$scope.LockItems();}}return true;};$scope.LoadJson=function(EntireProjectJson){$scope.$apply(function(){$scope.project=EntireProjectJson.value;$scope.SelectClip("", true);});$scope.SortItems;$scope.UpdateLayerIndex();$scope.LockItems();return true;};$scope.LockItems=function(){};$scope.ToggleDebug=function(){if($scope.debug==true) $scope.debug=false;else $scope.debug=true;};$scope.addClips=function(numClips){startNum=$scope.project.clips.length+1;positionNum=0;for(var x=0;x< parseInt(numClips);x++){$scope.project.clips.push({id:x.toString(), layer:0, image: './media/images/thumbnail.png', locked:false, duration:5, start:0, end:5, position:positionNum, title: 'Clip B', effects:[], images:{start:3, end:7}, show_audio:false, alpha:{Points:[]}, location_x:{Points:[]}, location_y:{Points:[]}, scale_x:{Points:[]}, scale_y:{Points:[]}, rotation:{Points:[]}, time:{Points:[]}, volume:{Points:[]}});startNum++;positionNum+=5;};$scope.numClips="";};$scope.addEffect=function(clipNum){elm=findElement($scope.project.clips,"number", clipNum);elm.effects.push({effect: 'Old Movie', icon: 'om.png'});$scope.clipNum="";};$scope.addMarker=function(markLoc){$scope.project.markers.push({location:parseInt(markLoc), icon: 'blue.png'});$scope.markLoc="";};$scope.changeImage=function(startImage){console.log(startImage);$scope.project.clips[2].images.start=startImage;$scope.startImage="";};}) |
The AngularJS controller used by the OpenShot Timeline.
Copyright (c) 2008-2014 OpenShot Studios, LLC http://www.openshotstudios.com/. This file is part of OpenShot Video Editor, an open-source project dedicated to delivering high quality video editing and animation solutions to the world. For more information visit http://www.openshot.org/.
OpenShot Video Editor is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
OpenShot Video Editor is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with OpenShot Library. If not, see http://www.gnu.org/licenses/.
Definition in file controllers.js.
App controller | ( | 'TimelineCtrl' | ) |
StartManualMove | " + image_url; }; $scope.SelectEffect = function(effect_id) { if ($scope.Qt) timeline.addSelection(effect_id, "effect", true); }; $scope.ResizeTimeline = function() { var furthest_right_edge = 0; for (var clip_index = 0; clip_index < $scope.project.clips.length; clip_index++) { var clip = $scope.project.clips[clip_index]; var right_edge = clip.position + (clip.end - clip.start); if (right_edge > furthest_right_edge) furthest_right_edge = right_edge; } if (furthest_right_edge > $scope.project.duration) if ($scope.Qt) { timeline.resizeTimeline(furthest_right_edge + 10) $scope.project.duration = furthest_right_edge + 10; } }; $scope.ShowClipMenu = function(clip_id) { if ($scope.Qt) { timeline.qt_log("$scope.ShowClipMenu"); timeline.ShowClipMenu(clip_id); } }; $scope.ShowEffectMenu = function(effect_id) { if ($scope.Qt) { timeline.qt_log("$scope.ShowEffectMenu"); timeline.ShowEffectMenu(effect_id); } }; $scope.ShowTransitionMenu = function(tran_id) { if ($scope.Qt) { timeline.qt_log("$scope.ShowTransitionMenu"); timeline.ShowTransitionMenu(tran_id); } }; $scope.ShowTrackMenu = function(layer_id) { if ($scope.Qt) { timeline.qt_log("$scope.ShowTrackMenu"); timeline.ShowTrackMenu(layer_id); } }; $scope.ShowMarkerMenu = function(marker_id) { if ($scope.Qt) { timeline.qt_log("$scope.ShowMarkerMenu"); timeline.ShowMarkerMenu(marker_id); } }; $scope.ShowPlayheadMenu = function(position) { if ($scope.Qt) { timeline.qt_log("$scope.ShowPlayheadMenu"); timeline.ShowPlayheadMenu(position); } }; $scope.ShowTimelineMenu = function(e, layer_number) { if ($scope.Qt) { timeline.ShowTimelineMenu($scope.GetJavaScriptPosition(e.pageX), layer_number); } }; $scope.GetTrackName = function(layer_label, layer_number){ if (layer_label.length > 0) return layer_label; else return $scope.track_label.replace('%s', layer_number.toString()); }; $scope.SetTrackLabel = function (label){ $scope.track_label = label; }; $scope.GetTimelineWidth = function(min_value){ return Math.max(min_value, $scope.project.duration * $scope.pixelsPerSecond); }; $scope.GetJavaScriptPosition = function(x){ var horz_scroll_offset = $("#scrolling_tracks").scrollLeft(); var scrolling_tracks_offset_left = $("#scrolling_tracks").offset().left; x += horz_scroll_offset; var clip_position = parseFloat(x - scrolling_tracks_offset_left) / parseFloat($scope.pixelsPerSecond); if (clip_position < 0) clip_position = 0; return clip_position; }; $scope.GetJavaScriptTrack = function(y){ var vert_scroll_offset = $("#scrolling_tracks").scrollTop(); y += vert_scroll_offset; var track_number = parseInt($scope.GetTrackAtY(y).number); return track_number; }; $scope.UpdateRecentItemJSON = function(item_type, item_id) { var item_object = null; if (item_type == 'clip') { item_object = findElement($scope.project.clips, "id", item_id); } else if (item_type == 'transition') { item_object = findElement($scope.project.effects, "id", item_id); } else { return; } var scrolling_tracks_offset_top = $("#scrolling_tracks").offset().top; var clip_position = parseFloat(bounding_box.left) / parseFloat($scope.pixelsPerSecond); var layer_num = $scope.GetTrackAtY(bounding_box.track_position - scrolling_tracks_offset_top).number; $scope.$apply(function() { |