예제 #1
0
        private static void SetDragImage(Gtk.TreeView menuLayout, Gtk.DragBeginArgs args)
        {
            var selection         = menuLayout.Selection;
            var firstSelectedPath = selection.GetSelectedRows().First();

            Gtk.TreeIter iter;
            if (menuLayout.Model.GetIter(out iter, firstSelectedPath))
            {
                var        firstDraggedItem = menuLayout.Model.GetValue(iter, 0) as FileNodeViewModel;
                string     text;
                Gdk.Pixbuf icon;
                if (selection.CountSelectedRows() > 1)
                {
                    text = "<Multiple Items>";
                    icon = firstDraggedItem is FolderViewModel ? DragMultipleItemsFolderImage : DragMultipleItemsProgramImage;
                }
                else
                {
                    text = firstDraggedItem.LongName;
                    icon = firstDraggedItem.Icon;
                }
                var dragWidget = new DragDropImage(icon, text);
                Gtk.Drag.SetIconWidget(args.Context, dragWidget, 0, 0);
            }
        }
예제 #2
0
        private void SlideBack()
        {
            _isAnimating = true;

            if (ZoomOnDrag)
            {
                ScaleTransform transform            = (ScaleTransform)_overlayElement.LayoutTransform;
                DoubleAnimationUsingKeyFrames anim  = new DoubleAnimationUsingKeyFrames();
                EasingDoubleKeyFrame          frame = new EasingDoubleKeyFrame(1, Settings.AnimationsEnabled ? KeyTime.FromTimeSpan(AnimationHelpers.AnimationDuration.TimeSpan) : KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)));
                frame.EasingFunction = AnimationHelpers.EasingFunction;
                anim.KeyFrames.Add(frame);
                transform.BeginAnimation(ScaleTransform.ScaleXProperty, anim);
                transform.BeginAnimation(ScaleTransform.ScaleYProperty, anim);
                _overlayElement.BeginAnimation(OpacityProperty, anim);
            }

            if (Settings.AnimationsEnabled)
            {
                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = TimeSpan.FromMilliseconds(10);
                timer.Tick    += timer_Tick;
                timer.Start();
            }
            else
            {
                AdornerLayer.GetAdornerLayer(PART_ItemsHost).Remove(_overlayElement);
                _originalElement.Opacity = 1;
                _overlayElement          = null;
                _isAnimating             = false;

                Mouse.Capture(null);
            }
        }
        private void timer_Tick(object sender, EventArgs e)
        {
            if (_overlayElement != null)
            {
                if (Math.Abs(_overlayElement.LeftOffset) > 0.1 ||
                    Math.Abs(_overlayElement.TopOffset) > 0.1)
                {
                    _overlayElement.LeftOffset -= _overlayElement.LeftOffset / 6;
                    _overlayElement.TopOffset  -= _overlayElement.TopOffset / 6;
                }
                else
                {
                    AdornerLayer.GetAdornerLayer(this).Remove(_overlayElement);                    //Application.Current.MainWindow.Content as Grid).Remove(_overlayElement);
                    _originalElement.ApplyAnimationClock(FrameworkElement.OpacityProperty, null);
                    _originalElement.Opacity = 1;
                    _overlayElement          = null;
                    _isAnimating             = false;
                    _dragCopy = false;

                    Mouse.Capture(null);

                    (sender as DispatcherTimer).Stop();
                }
            }
        }
예제 #4
0
        private void DragStarted()
        {
            _isDragging = true;

            if (ZoomOnDrag)
            {
                _originalElement.Opacity = 0.6;
            }

            _overlayElement = new DragDropImage(_originalElement);

            if (ZoomOnDrag)
            {
                _overlayElement.TopOffset  -= 0.05 * _originalElement.ActualHeight;
                _overlayElement.LeftOffset -= 0.05 * _originalElement.ActualWidth;

                ScaleTransform transform = new ScaleTransform(1, 1);
                _overlayElement.LayoutTransform = transform;
                DoubleAnimationUsingKeyFrames anim  = new DoubleAnimationUsingKeyFrames();
                EasingDoubleKeyFrame          frame = new EasingDoubleKeyFrame(1.1, Settings.AnimationsEnabled ? KeyTime.FromTimeSpan(AnimationHelpers.AnimationDuration.TimeSpan) : KeyTime.FromTimeSpan(TimeSpan.Zero));
                frame.EasingFunction = AnimationHelpers.EasingFunction;
                anim.KeyFrames.Add(frame);
                transform.BeginAnimation(ScaleTransform.ScaleXProperty, anim);
                transform.BeginAnimation(ScaleTransform.ScaleYProperty, anim);
            }

            AdornerLayer layer = AdornerLayer.GetAdornerLayer(PART_ItemsHost);

            layer.Add(_overlayElement);

            RaiseDragStartEvent();
        }
        private void DragStarted()
        {
            _isDragging = true;
            _originalElement.Opacity = 1;
            _overlayElement          = new DragDropImage(_originalElement);
            AdornerLayer layer = AdornerLayer.GetAdornerLayer(this);            //Application.Current.MainWindow.Content as Grid);

            layer.Add(_overlayElement);
        }
        private void SlideBack()
        {
            _isAnimating = true;

            if (Settings.AnimationsEnabled)
            {
                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = TimeSpan.FromMilliseconds(10);
                timer.Tick    += timer_Tick;
                timer.Start();
            }
            else
            {
                AdornerLayer.GetAdornerLayer(this).Remove(_overlayElement);                //Application.Current.MainWindow.Content as Grid).Remove(_overlayElement);
                _originalElement.ApplyAnimationClock(FrameworkElement.OpacityProperty, null);
                _originalElement.Opacity = 1;
                _overlayElement          = null;
                _isAnimating             = false;
                _dragCopy = false;

                Mouse.Capture(null);
            }
        }
예제 #7
0
        private void timer_Tick(object sender, EventArgs e)
        {
            if (_overlayElement != null)
            {
                if (Math.Abs(_overlayElement.LeftOffset) > 0.1 ||
                    Math.Abs(_overlayElement.TopOffset) > 0.1)
                {
                    _overlayElement.LeftOffset -= _overlayElement.LeftOffset / 3;
                    _overlayElement.TopOffset  -= _overlayElement.TopOffset / 3;
                }
                else
                {
                    AdornerLayer.GetAdornerLayer(PART_ItemsHost).Remove(_overlayElement);
                    _originalElement.Opacity = 1;
                    _overlayElement          = null;
                    _isAnimating             = false;

                    Mouse.Capture(null);

                    ((DispatcherTimer)sender).Stop();
                }
            }
        }
예제 #8
0
        public static void DragDropToolTip(object sender, RenderEventArgs e, DependencyObject view, Func <string> dragDescription)
        {
            InitializeData();

            DragDropImage  overlay = sender as DragDropImage;
            DrawingContext dc      = e.DrawingContext;
            Window         window  = Window.GetWindow(view);

            // Get a rectangle that represents the desired size of the rendered element
            // after the rendering pass. This will be used to draw at the corners of the
            // adorned element.
            Rect adornedElementRect = new Rect(overlay.AdornedElement.RenderSize);

            double offsetX = 62;
            double offsetY = 2;

            double tooltipWidth;
            double tooltipHeight = 19;

            string        description = dragDescription();
            FormattedText header      = null;
            FormattedText detail      = null;
            bool          copy        = false;

            if (description != null)
            {
                copy = Keyboard.Modifiers == ModifierKeys.Control;

                header = new FormattedText((copy ? "Copy" : "Move") + " to ",
                                           CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                                           NormalFont, 12, HeaderBrush);

                detail = new FormattedText(description,
                                           CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                                           NormalFont, 12, DetailBrush);

                tooltipWidth = Math.Round(header.WidthIncludingTrailingWhitespace + detail.Width) + 5 + 11 + 5 + 6;
            }
            else
            {
                tooltipWidth = 20;
            }

            double maxX = window.ActualWidth - tooltipWidth - 3;
            double maxY = window.ActualHeight - tooltipHeight - 3;

            Point absLocation = overlay.AdornedElement.TranslatePoint(adornedElementRect.TopLeft, window);

            if (offsetX + overlay.LeftOffset + absLocation.X > maxX)
            {
                offsetX = maxX - overlay.LeftOffset - absLocation.X;
            }
            else if (offsetX + overlay.LeftOffset + absLocation.X < 2)
            {
                offsetX = 2 - overlay.LeftOffset - absLocation.X;
            }

            absLocation = overlay.AdornedElement.TranslatePoint(adornedElementRect.BottomLeft, window);

            if (offsetY + overlay.TopOffset + absLocation.Y > maxY)
            {
                offsetY = maxY - overlay.TopOffset - absLocation.Y;
            }
            else if (offsetY + overlay.TopOffset + absLocation.Y < 2)
            {
                offsetY = 2 - overlay.TopOffset - absLocation.Y;
            }

            if (description != null)
            {
                Point rectangleTopLeft = adornedElementRect.BottomLeft;
                rectangleTopLeft.Offset(offsetX + 0.5, offsetY + 0.5);

                Point rectangleBottomRight = rectangleTopLeft;
                rectangleBottomRight.Offset(tooltipWidth, tooltipHeight);
                dc.DrawRectangle(Brushes.White, BorderPen, new Rect(rectangleTopLeft, rectangleBottomRight));

                Point iconLocation = adornedElementRect.BottomLeft;
                iconLocation.Offset(offsetX + 5, offsetY + 4);
                dc.DrawImage(copy ? DragCopyImg : DragMoveImg, new Rect(iconLocation, new Size(11, 11)));

                Point textLocation = adornedElementRect.BottomLeft;
                textLocation.Offset(offsetX + 5 + 11 + 5, offsetY + 3.5);
                dc.DrawText(header, textLocation);

                textLocation.Offset(header.WidthIncludingTrailingWhitespace, 0);
                dc.DrawText(detail, textLocation);
            }
            else
            {
                Point iconLocation = adornedElementRect.BottomLeft;
                iconLocation.Offset(offsetX + 5, offsetY + 4);
                dc.DrawImage(NoDragImg, new Rect(iconLocation, new Size(11, 11)));
            }
        }
        public void DragFinished(bool cancelled)
        {
            if (_isDragging)
            {
                if (cancelled)
                {
                    _isDown     = false;
                    _isDragging = false;
                    SlideBack();
                }
                else
                {
                    Mouse.Capture(null);

                    FrameworkElement directlyOver = Mouse.DirectlyOver as FrameworkElement;

                    while (!(directlyOver is TreeViewItem) && !(directlyOver is TreeView))
                    {
                        if (directlyOver == null)
                        {
                            _isDragging = false;
                            _isDown     = false;
                            _dragCopy   = false;
                            SlideBack();
                            return;
                        }

                        directlyOver = directlyOver.TemplatedParent as FrameworkElement;
                    }

                    TreeViewItem newParent;
                    TreeViewItem oldParent = _originalElement.Parent as TreeViewItem;
                    int          oldIndex  = oldParent.Items.IndexOf(_originalElement);

                    if (directlyOver is TreeViewItem)
                    {
                        newParent = directlyOver as TreeViewItem;
                        int index;

                        if (newParent.Parent is TreeViewItem)
                        {
                            newParent = newParent.Parent as TreeViewItem;
                            index     = newParent.Items.IndexOf(directlyOver);
                        }
                        else
                        {
                            index = 0;
                        }

                        //
                        // Prevent items from being dragged between tree views.
                        //
                        if (newParent.Parent != oldParent.Parent)
                        {
                            DragFinished(true);
                            return;
                        }

                        if (!_dragCopy)
                        {
                            oldParent.Items.Remove(_originalElement);
                            newParent.Items.Insert(index, _originalElement);
                            _originalElement.IsSelected = true;
                            UpdateLayout();
                        }
                        else
                        {
                            //
                            // Hard-coded functionality only for Task objects.
                            //
                            UserTask copy = new UserTask(_originalElement.Header as UserTask);
                            copy.ID = IDGenerator.GenerateID();

                            //
                            // Copy the details file if it exists
                            //
                            if (File.Exists(TaskDatabase.TasksAppData + "\\" + (_originalElement.Header as UserTask).ID))
                            {
                                File.Copy(TaskDatabase.TasksAppData + "\\" + (_originalElement.Header as UserTask).ID,
                                          TaskDatabase.TasksAppData + "\\" + copy.ID);
                            }

                            _originalElement        = new TreeViewItem();
                            _originalElement.Header = copy;

                            newParent.Items.Insert(index, _originalElement);
                            _originalElement.IsSelected = true;

                            // Force a layout update, to ensure that all elements are
                            // in their correct locations.
                            UpdateLayout();

                            AdornerLayer layer = AdornerLayer.GetAdornerLayer(this);
                            layer.Remove(_overlayElement);
                            _overlayElement = new DragDropImage(_originalElement);
                            layer.Add(_overlayElement);
                        }
                    }
                    else
                    {
                        newParent = Items[Items.Count - 1] as TreeViewItem;

                        //
                        // Prevent items from being dragged between tree views.
                        //
                        if (newParent.Parent != oldParent.Parent)
                        {
                            DragFinished(true);
                            return;
                        }

                        if (!_dragCopy)
                        {
                            oldParent.Items.Remove(_originalElement);
                            newParent.Items.Add(_originalElement);
                            _originalElement.IsSelected = true;
                            UpdateLayout();
                        }
                        else
                        {
                            //
                            // Hard-coded functionality only for Task objects.
                            //
                            UserTask copy = new UserTask(_originalElement.Header as UserTask);
                            copy.ID = IDGenerator.GenerateID();

                            //
                            // Copy the details file if it exists
                            //
                            if (File.Exists(TaskDatabase.TasksAppData + "\\" + (_originalElement.Header as UserTask).ID))
                            {
                                File.Copy(TaskDatabase.TasksAppData + "\\" + (_originalElement.Header as UserTask).ID,
                                          TaskDatabase.TasksAppData + "\\" + copy.ID);
                            }

                            _originalElement         = new TreeViewItem();
                            _originalElement.Opacity = 1;
                            _originalElement.Header  = copy;

                            newParent.Items.Add(_originalElement);
                            _originalElement.IsSelected = true;

                            // Force a layout update, to ensure that all elements are
                            // in their correct locations.
                            UpdateLayout();

                            AdornerLayer layer = AdornerLayer.GetAdornerLayer(this);
                            layer.Remove(_overlayElement);
                            _overlayElement = new DragDropImage(_originalElement);
                            layer.Add(_overlayElement);
                        }
                    }

                    newParent.IsExpanded = true;

                    Point mse = Mouse.GetPosition(_originalElement);
                    _overlayElement.LeftOffset = mse.X - _dragOffset.X;
                    _overlayElement.TopOffset  = mse.Y - _dragOffset.Y;

                    DragDirection direction;

                    if (newParent == oldParent)
                    {
                        direction = newParent.Items.IndexOf(_originalElement) < oldIndex ? DragDirection.Up : DragDirection.Down;
                    }
                    else
                    {
                        direction = Items.IndexOf(newParent) < Items.IndexOf(oldParent) ? DragDirection.Up : DragDirection.Down;
                    }

                    if (!(newParent == oldParent && newParent.Items.IndexOf(_originalElement) == oldIndex))
                    {
                        OnItemReorder(new ItemReorderEventArgs(_originalElement, oldParent, newParent, _dragCopy, direction));
                    }

                    SlideBack();
                }
            }
            else
            {
                _dragCopy = false;
                Mouse.Capture(null);
            }

            _isDragging = false;
            _isDown     = false;
        }