public override void Run() { if (UiObjects.CurrentVideoClip != null) { var toRemove = UiObjects.CurrentVideoClip; var clipIndex = Proj.ClipsVideo.IndexOf(toRemove); Context.AddUndableAction_andFireRedo(new UndoableAction { Redo = () => { cxzxc("delete vclip " + clipIndex); Proj.ClipsVideo.Remove(toRemove); }, Undo = () => { cxzxc("UNDO delete vclip " + clipIndex); Proj.ClipsVideo.Insert(clipIndex, toRemove); }, PostAction = () => { UiObjects.SetHoverVideo(null); if (Proj.ClipsVideo.Count == 0) { UiObjects.SetActiveVideo(null, Proj); Context.SetFrameMarker_ForceRepaint(0); } else { var highlightIndex = clipIndex; if (highlightIndex >= Proj.ClipsVideo.Count) { highlightIndex = Proj.ClipsVideo.Count - 1; } var clipToSelect = Proj.ClipsVideo[highlightIndex]; var firstFrameOfSelected = Proj.GetVideoClipAbsFramePositionLeft(clipToSelect); UiObjects.SetActiveVideo(clipToSelect, Proj); //UiObjects.SetCurrentMarkerFrame(firstFrameOfSelected); // TODO: don't repaint twice, rather keep track of whether to repaint or not Context.SetFrameMarker_ShowFrameInPlayer(firstFrameOfSelected); // ... deleting clips should have an impact on render partial menu, meaning when delete clip (or duplicate) projupdate should also be fired, yes? if (toRemove.IsRenderBreakupPoint) { Context.Fire_ProjectUpdated_AsFarAsMenusAreConcerned(); } } Context.UpdateCanvasWidthFromProjAndDimdim(); } }); } else if (UiObjects.CurrentAudioClip != null) { var toRemove = UiObjects.CurrentAudioClip; var allLinksQuery = Proj.ClipsVideo.Where(c => c.AudioClipLinks.Any(l => l.AudioClip == toRemove)); var allLinks = (allLinksQuery.Any()) ? allLinksQuery.Select(c => new Tuple <VidkaClipVideoAbstract, VidkaAudioClipLink>(c, c.AudioClipLinks.FirstOrDefault(l => l.AudioClip == toRemove))).ToArray() : null; Context.AddUndableAction_andFireRedo(new UndoableAction { Redo = () => { cxzxc("delete aclip"); Proj.ClipsAudio.Remove(toRemove); if (allLinks != null) { foreach (var lll in allLinks) { lll.Item1.AudioClipLinks.Remove(lll.Item2); } } }, Undo = () => { cxzxc("UNDO delete aclip"); Proj.ClipsAudio.Add(toRemove); if (allLinks != null) { foreach (var lll in allLinks) { lll.Item1.AudioClipLinks.Add(lll.Item2); } } }, PostAction = () => { UiObjects.SetHoverVideo(null); UiObjects.SetHoverAudio(null); UiObjects.SetActiveAudio(null); Context.UpdateCanvasWidthFromProjAndDimdim(); } }); } }