public override void OnDrag(Vector2 pos) { int frame = FrameUtil.PosToFrame(pos.x); if (!hasModify) { if (frame != hitResult.Frame) { hasModify = true; view.RegistUndo("move clip"); } } if (hasModify) { if (hitResult.HitPart == FrameClipHitPartType.LeftCtrl) { foreach (var clipRef in view.SelectedClips) { int startFrame = clipRef.Clip.StartFrame - (frame - lastFrame); startFrame = Mathf.Clamp(startFrame, 0, view.FrameCount - 1); clipRef.Clip.StartFrame = startFrame; } } else if (hitResult.HitPart == FrameClipHitPartType.RightCtrl) { } lastFrame = frame; TrackUtil.UpdateAllTrack(view.Asset); } }
public static void RemoveSelectedClip(this FrameLineView view) { view.RegistUndo("remove clips"); foreach (var clipRef in view.SelectedClips) { view.Asset.RemoveClip(clipRef); } view.SelectedClips.Clear(); TrackUtil.UpdateAllTrack(view.Asset); }
public static void MoveSelectedClip(this FrameLineView view, int offsetFrame) { foreach (var clipRef in view.SelectedClips) { int startFrame = clipRef.Clip.StartFrame - offsetFrame; startFrame = Mathf.Clamp(startFrame, 0, view.FrameCount - 1); clipRef.Clip.StartFrame = startFrame; } TrackUtil.UpdateAllTrack(view.Asset); }
public static void MoveClipEnd(this FrameLineView view, FrameClipRef clipRef, int frame) { if (frame >= view.FrameCount) { return; } if (clipRef.Clip.Length <= 0 && frame == (view.FrameCount - 1)) { return; } clipRef.Clip.Length = frame - clipRef.Clip.StartFrame + 1; var track = view.Asset.FindTrack(clipRef.Clip.TrackID); TrackUtil.UpdateClipTrackIndex(track); }
public static void MoveClipStart(this FrameLineView view, FrameClipRef clipRef, int frame) { if (frame < 0) { return; } int lastStart = clipRef.Clip.StartFrame; clipRef.Clip.StartFrame = frame; if (clipRef.Clip.Length > 0) { int length = clipRef.Clip.Length + (frame - lastStart); clipRef.Clip.Length = Mathf.Max(length, 1); } var track = view.Asset.FindTrack(clipRef.Clip.TrackID); TrackUtil.UpdateClipTrackIndex(track); }
public bool OnDraw(Vector2 size) { int showTrackCount = TrackUtil.GetVisableTrackCount(Asset); float frameHeight = showTrackCount * (ViewStyles.ClipHeight + ViewStyles.ClipVInterval) + ViewStyles.ClipVInterval; float framWidth = Asset.FrameCount * ViewStyles.FrameWidth + 10; //滚动位置 float xOffset = ScrollPos.x * framWidth; float yOffset = ScrollPos.y * frameHeight; VisableFrameStart = Mathf.FloorToInt(xOffset / ViewStyles.FrameWidth); VisableTrackStart = Mathf.FloorToInt(yOffset / (ViewStyles.FrameWidth + ViewStyles.ClipVInterval)); //轨道头部 Rect trackHeadRect = new Rect(0, 0, ViewStyles.TrackHeadWidth, size.y - ViewStyles.ScrollBarSize); bool rePaint = false; using (new GUILayout.AreaScope(trackHeadRect)) { //轨道头部按钮区域 using (new GUILayout.AreaScope(new Rect(0, 0, trackHeadRect.width, ViewStyles.FrameBarHeight), "", EditorStyles.toolbar)) { using (new GUILayout.HorizontalScope()) { DrawToolBar(); } } Rect rect = new Rect(0, ViewStyles.FrameBarHeight, trackHeadRect.width, trackHeadRect.height - ViewStyles.FrameBarHeight); VisableTrackEnd = Mathf.CeilToInt((rect.height + yOffset - VisableTrackStart * (ViewStyles.ClipHeight + ViewStyles.ClipVInterval)) / (ViewStyles.ClipHeight + ViewStyles.ClipVInterval)); //轨道头部 using (new GUI.ClipScope(rect)) { //滚动位置 Rect viewRect = new Rect(0, -yOffset, trackHeadRect.width, frameHeight); using (new GUILayout.AreaScope(viewRect)) { var e = Event.current; if (viewRect.Contains(e.mousePosition)) { rePaint |= OnTrackHeadEvent(e); } DrawTrackHead(); } } } //轨道区域大小 Vector2 trackAreaSize = new Vector2(framWidth, frameHeight); //轨道区域 Rect frameRect = new Rect(ViewStyles.TrackHeadWidth, 0, size.x - ViewStyles.TrackHeadWidth - ViewStyles.ScrollBarSize, size.y - ViewStyles.ScrollBarSize); //轨道在窗口中显示的大小 Vector2 trackAreaInViewSize = new Vector2(frameRect.width, frameRect.height - ViewStyles.FrameBarHeight); using (new GUI.ClipScope(frameRect)) { VisableFrameEnd = Mathf.CeilToInt((frameRect.width + xOffset - VisableFrameStart * ViewStyles.FrameWidth) / ViewStyles.FrameWidth) + VisableFrameStart; //画帧标号背景条 GUI.Box(new Rect(0, 0, frameRect.width, ViewStyles.FrameBarHeight), ""); //帧长度区域|<-所有帧->|,水平滚动区域 using (new GUILayout.AreaScope(new Rect(-xOffset, 0, framWidth, frameRect.height))) { DrawFrameLineBackGround(new Rect(new Vector2(xOffset, 0), frameRect.size)); { var e = Event.current; if (e.mousePosition.y < ViewStyles.FrameBarHeight) { rePaint |= OnFrameBarEvent(e); } } //轨道条区域 using (new GUI.ClipScope(new Rect(0, ViewStyles.FrameBarHeight, framWidth, frameHeight))) { Rect trackViewRect = new Rect(0, -yOffset, framWidth, frameHeight); using (new GUILayout.AreaScope(trackViewRect)) { var e = Event.current; Vector2 mousePos = e.mousePosition; bool mouseInView = trackViewRect.Contains(mousePos); if (mouseInView || dragOperate != null) { rePaint |= OnFrameClipsEvent(e); } DrawFrameClips(mouseInView, mousePos); } } } } Rect vBarRect = new Rect(size.x - ViewStyles.ScrollBarSize, 0, ViewStyles.ScrollBarSize, size.y - ViewStyles.ScrollBarSize); float vSize = Mathf.Clamp01(trackAreaInViewSize.y / trackAreaSize.y); ScrollPos.y = GUI.VerticalScrollbar(vBarRect, ScrollPos.y, vSize, 0, 1); Rect hBarRect = new Rect(ViewStyles.TrackHeadWidth, size.y - ViewStyles.ScrollBarSize, size.x - ViewStyles.TrackHeadWidth - ViewStyles.ScrollBarSize, ViewStyles.ScrollBarSize); float hSize = Mathf.Clamp01(trackAreaInViewSize.x / trackAreaSize.x); ScrollPos.x = GUI.HorizontalScrollbar(hBarRect, ScrollPos.x, hSize, 0, 1); return(rePaint); }