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); } }
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(); } } }
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); } }
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(); } } }
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; }