protected void DragCardStarted() { DraggedCards.Clear(); // in theory draggedCards should already be empty, but it's better to recover if there was a problem during last DnD if (!Selection.IsEmpty()) DraggedCards.AddRange(Selection.Cards); else if (_isOverCount) DraggedCards.AddRange(MultipleCards.Cast<Card>()); else if (Card != null) DraggedCards.Add(Card); else return; // Fix: Card == null can occur, e.g. hold the mouse down but don't move, dismiss the card with a keyboard shortcut (e.g. Delete) and move the mouse after that (with the left button still down). _isDragging = true; // Keep control of the card and the group it's in foreach (Card c in DraggedCards) c.KeepControl(); Card.Group.KeepControl(); // Hides the card view RaiseEvent(new CardEventArgs(CardHoveredEvent, this)); // Starts the drag-and-drop ScaleFactor = TransformToAncestor(_mainWin).TransformBounds(new Rect(0, 0, 1, 1)).Size; //bool rot90 = (Card.Orientation & CardOrientation.Rot90) != 0; _mouseOffset = new Vector(_mousePt.X*Program.Game.Definition.CardDefinition.Width/ActualWidth, _mousePt.Y*Program.Game.Definition.CardDefinition.Height/ActualHeight); // Create adorners var mwn = _mainWin.Content as Visual; AdornerLayer layer = null; if (mwn != null) layer = AdornerLayer.GetAdornerLayer(mwn); double offset = 0; double step = ActualWidth*1.05; // HACK: if the selected card is in HandControl, its ContentPresenter has a RenderTransform, // which we must account for if (GroupControl is HandControl) { var parent = VisualTreeHelper.GetParent(this) as ContentPresenter; if (parent != null) step = 1.05*parent.RenderTransform.TransformBounds(new Rect(0, 0, ActualWidth, 0)).Width; } foreach (CardControl cardCtrl in Selection.GetCardControls(GroupControl, this)) { // Create an adorner if (Card.Group is Table) { var overlay = new CardDragAdorner(cardCtrl, _mouseOffset); OverlayElements.Add(overlay); if (layer != null) layer.Add(overlay); } else { // If there are multiple cards but they don't come from the table, // layout the adorners properly var overlay = new CardDragAdorner(this, cardCtrl, _mouseOffset); OverlayElements.Add(overlay); if (cardCtrl != this) { offset += step; overlay.OffsetBy(offset, 0); overlay.CollapseTo(0, 0, false); } if (layer != null) layer.Add(overlay); } // Make the card translucent cardCtrl.Opacity = 0.4; } if (!Selection.IsEmpty() || !_isOverCount) return; // Create additional fake adorners when dragging from the count label offset = 0; foreach (Card c in MultipleCards.Skip(1)) { offset += step; var overlay = new CardDragAdorner(this, _mouseOffset); overlay.OffsetBy(offset, 0); overlay.CollapseTo(0, 0, false); OverlayElements.Add(overlay); if (layer != null) layer.Add(overlay); } }
protected void DragCardStarted() { DraggedCards.Clear(); // in theory draggedCards should already be empty, but it's better to recover if there was a problem during last DnD if (!Selection.IsEmpty()) { DraggedCards.AddRange(Selection.Cards); } else if (_isOverCount) { DraggedCards.AddRange(MultipleCards.Cast <Card>()); } else if (Card != null) { DraggedCards.Add(Card); } else { return; } // Fix: Card == null can occur, e.g. hold the mouse down but don't move, dismiss the card with a keyboard shortcut (e.g. Delete) and move the mouse after that (with the left button still down). _isDragging = true; // Keep control of the card and the group it's in foreach (Card c in DraggedCards) { c.KeepControl(); } Card.Group.KeepControl(); // Hides the card view RaiseEvent(new CardEventArgs(CardHoveredEvent, this)); // Starts the drag-and-drop ScaleFactor = TransformToAncestor(_mainWin).TransformBounds(new Rect(0, 0, 1, 1)).Size; //bool rot90 = (Card.Orientation & CardOrientation.Rot90) != 0; _mouseOffset = new Vector(_mousePt.X * Program.GameEngine.Definition.CardWidth / ActualWidth, _mousePt.Y * Program.GameEngine.Definition.CardHeight / ActualHeight); // Create adorners var mwn = _mainWin.Content as Visual; AdornerLayer layer = null; if (mwn != null) { layer = AdornerLayer.GetAdornerLayer(mwn); } double offset = 0; double step = ActualWidth * 1.05; // HACK: if the selected card is in HandControl, its ContentPresenter has a RenderTransform, // which we must account for if (GroupControl is HandControl) { var parent = VisualTreeHelper.GetParent(this) as ContentPresenter; if (parent != null) { step = 1.05 * parent.RenderTransform.TransformBounds(new Rect(0, 0, ActualWidth, 0)).Width; } } foreach (CardControl cardCtrl in Selection.GetCardControls(GroupControl, this)) { // Create an adorner if (Card.Group is Table) { var overlay = new CardDragAdorner(cardCtrl, _mouseOffset); OverlayElements.Add(overlay); if (layer != null) { layer.Add(overlay); } } else { // If there are multiple cards but they don't come from the table, // layout the adorners properly var overlay = new CardDragAdorner(this, cardCtrl, _mouseOffset); OverlayElements.Add(overlay); if (cardCtrl != this) { offset += step; overlay.OffsetBy(offset, 0); overlay.CollapseTo(0, 0, false); } if (layer != null) { layer.Add(overlay); } } // Make the card translucent cardCtrl.Opacity = 0.4; } if (!Selection.IsEmpty() || !_isOverCount) { return; } // Create additional fake adorners when dragging from the count label offset = 0; foreach (Card c in MultipleCards.Skip(1)) { offset += step; var overlay = new CardDragAdorner(this, _mouseOffset); overlay.OffsetBy(offset, 0); overlay.CollapseTo(0, 0, false); OverlayElements.Add(overlay); if (layer != null) { layer.Add(overlay); } } }