Ejemplo n.º 1
0
        //-----------------------------------------------------------------------
        protected override void OnPreviewMouseUp(MouseButtonEventArgs args)
        {
            if (TimelineItem == null)
            {
                return;
            }

            var    pos           = args.GetPosition(this);
            var    clickPos      = pos.X - TimelineItem.LeftPad;
            double pixelsASecond = ActualWidth / TimelineItem.TimelineRange;

            if (isMarqueeSelecting)
            {
                if (Math.Abs(marqueeCurrentPos - marqueeStartPos) > 5)
                {
                    var timelineIndex      = TimelineItem.TimelineGroup.ToList().IndexOf(TimelineItem);
                    var marqueeMinTimeline = (int)Math.Min(marqueeStartTimeline, marqueeCurrentTimeline);
                    var marqueeMaxTimeline = (int)Math.Max(marqueeStartTimeline, marqueeCurrentTimeline);

                    if (timelineIndex >= marqueeMinTimeline && timelineIndex <= marqueeMaxTimeline)
                    {
                        // deselect all
                        if (TimelineItem.DataModel.SelectedItems != null)
                        {
                            foreach (var selected in TimelineItem.DataModel.SelectedItems.ToList())
                            {
                                selected.IsSelected = false;
                            }
                        }

                        foreach (var timeline in TimelineItem.TimelineGroup)
                        {
                            foreach (var keyframe in timeline.Children)
                            {
                                keyframe.IsSelected = false;
                            }
                        }

                        // do selection
                        var minPos = Math.Min(marqueeStartPos, marqueeCurrentPos);
                        var maxPos = Math.Max(marqueeStartPos, marqueeCurrentPos);

                        var timelineGroup = TimelineItem.TimelineGroup.ToList();
                        for (int i = marqueeMinTimeline; i <= marqueeMaxTimeline; i++)
                        {
                            var timeline = timelineGroup[i];

                            foreach (KeyframeItem keyframe in timeline.Children)
                            {
                                var leftPos  = keyframe.GetKeyframeTime() * pixelsASecond;
                                var rightPos = leftPos + GetKeyframeWidth(keyframe);

                                if (minPos < rightPos && maxPos > leftPos)
                                {
                                    keyframe.IsSelected = true;
                                }
                            }
                        }
                    }
                }

                foreach (var timeline in TimelineItem.TimelineGroup)
                {
                    timeline.Timeline.dirty = true;
                }
            }
            else if (!isResizeDragging && !isDraggingItems && !isMarqueeSelecting)
            {
                if (args.ChangedButton == MouseButton.Right)
                {
                    ContextMenu menu = new ContextMenu();

                    var selected = TimelineItem.Children.FirstOrDefault((e) => e.IsSelected);
                    if (selected != null)
                    {
                        MenuItem delete = new MenuItem();
                        delete.Header    = "Delete";
                        delete.Click    += delegate { TimelineItem.Remove(selected); dirty = true; };
                        delete.IsEnabled = !TimelineItem.IsAtMin;
                        menu.Items.Add(delete);
                    }
                    else
                    {
                        if (TimelineItem.TimelineDef.KeyframeDefinitions.Count == 1)
                        {
                            MenuItem add = new MenuItem();
                            add.Header = "Add " + TimelineItem.TimelineDef.KeyframeDefinitions[0].Name;
                            add.Click += delegate
                            {
                                var newTime     = clickPos / pixelsASecond;
                                var roundedTime = Snap(newTime);

                                TimelineItem.Add(TimelineItem.TimelineDef.KeyframeDefinitions[0], (float)roundedTime);

                                dirty = true;
                            };
                            add.IsEnabled = !TimelineItem.IsAtMax;
                            menu.Items.Add(add);

                            var keyDef      = TimelineItem.TimelineDef.KeyframeDefinitions[0];
                            var nonBaseDefs = keyDef.Children.Where(e => e != keyDef.TimeDefinition && e != keyDef.DurationDefinition).ToList();
                            var firstChild  = nonBaseDefs.FirstOrDefault();
                            if (nonBaseDefs.Count == 1 && firstChild is FileDefinition)
                            {
                                menu.AddItem("Add Multiple", () =>
                                {
                                    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

                                    var fdef = firstChild as FileDefinition;

                                    if (fdef.AllowedFileTypes != null)
                                    {
                                        var filter = "Resource files (" +
                                                     string.Join(", ", fdef.AllowedFileTypes.Select((e) => "*." + e)) +
                                                     ") | " +
                                                     string.Join("; ", fdef.AllowedFileTypes.Select((e) => "*." + e));
                                        dlg.Filter = filter;
                                    }

                                    dlg.Multiselect = true;

                                    bool?result = dlg.ShowDialog();

                                    if (result == true)
                                    {
                                        var newTime     = clickPos / pixelsASecond;
                                        var roundedTime = Snap(newTime);

                                        var filenames = dlg.FileNames;
                                        foreach (var file in filenames)
                                        {
                                            var chosen = file;

                                            if (fdef.StripExtension)
                                            {
                                                chosen = Path.ChangeExtension(chosen, null);
                                            }

                                            // make relative
                                            var relativeTo = Path.Combine(Path.GetDirectoryName(Workspace.Instance.ProjectRoot), fdef.BasePath, "fakefile.fake");

                                            Uri path1      = new Uri(chosen);
                                            Uri path2      = new Uri(relativeTo);
                                            Uri diff       = path2.MakeRelativeUri(path1);
                                            string relPath = Uri.UnescapeDataString(diff.OriginalString);

                                            var created = TimelineItem.Add(keyDef, (float)roundedTime);

                                            var fitem   = (FileItem)created.Children.FirstOrDefault(e => e.Definition == firstChild);
                                            fitem.Value = relPath;

                                            roundedTime += 0.1;
                                        }

                                        dirty = true;
                                    }
                                });
                            }
                        }
                        else
                        {
                            var add = menu.AddItem("Add");
                            add.IsEnabled = !TimelineItem.IsAtMax;

                            if (!TimelineItem.IsAtMax)
                            {
                                var currentGroup = "";
                                foreach (var def in TimelineItem.TimelineDef.Keys)
                                {
                                    if (def.Item2 != currentGroup)
                                    {
                                        currentGroup = def.Item2;
                                        add.AddGroupHeader(currentGroup);
                                    }

                                    add.AddItem(def.Item1.Name, () =>
                                    {
                                        var newTime     = clickPos / pixelsASecond;
                                        var roundedTime = Snap(newTime);

                                        TimelineItem.Add(def.Item1, (float)roundedTime);

                                        dirty = true;
                                    });
                                }
                            }
                        }
                    }

                    menu.AddSeperator();

                    menu.AddItem("Auto Position Keyframes", delegate
                    {
                        var firstTime = TimelineItem.Children.Select(e => (e as KeyframeItem).Time).Min();
                        var lastTime  = TimelineItem.Children.Select(e => (e as KeyframeItem).Time).Max();

                        var count = TimelineItem.Children.Count;

                        var step = (lastTime - firstTime) / (count - 1);

                        var current = firstTime;
                        foreach (var keyframe in TimelineItem.Children.Select(e => e as KeyframeItem).OrderBy(e => e.Time).ToList())
                        {
                            keyframe.Time = current;

                            current += step;
                        }
                    });

                    menu.AddSeperator();

                    MenuItem zoom = new MenuItem();
                    zoom.Header = "Zoom To Best Fit";
                    zoom.Click += delegate { ZoomToBestFit(); };
                    menu.Items.Add(zoom);

                    this.ContextMenu = menu;

                    menu.IsOpen = true;

                    args.Handled = true;
                }
            }

            EndDrag();
        }