public CardDragAdorner(CardControl anchor, CardControl sourceCard, Vector mousePoint)
: base(Application.Current.MainWindow.Content as UIElement)
{
SourceCard = sourceCard;
bool isCardInverted = anchor.IsOnTableCanvas && (Player.LocalPlayer.InvertedTable ^ anchor.IsInverted);
Point cardOrigin;
if (isCardInverted)
{
var cardDef = Program.Game.Definition.CardDefinition;
cardOrigin = new Point(cardDef.Width, cardDef.Height);
mouseOffset = new Vector(cardDef.Width - mousePoint.X, cardDef.Height - mousePoint.Y);
}
else
{
cardOrigin = new Point();
mouseOffset = mousePoint;
}
basePt = anchor.TranslatePoint(cardOrigin, Application.Current.MainWindow.Content as UIElement);
_faceUp = sourceCard.IsAlwaysUp ? true : sourceCard.Card.FaceUp;
lightRedBrush = Brushes.Red.Clone();
faceDownBrush = new ImageBrush(sourceCard.Card.GetBitmapImage(false));
faceUpBrush = _faceUp ?
(Brush)new VisualBrush(sourceCard.GetCardVisual()) { Viewbox = new Rect(0, 0, sourceCard.ActualWidth, sourceCard.ActualHeight), ViewboxUnits = BrushMappingMode.Absolute } :
(Brush)new ImageBrush(new BitmapImage(new Uri(Program.Game.Definition.CardDefinition.Front)));
invertTransform = new ScaleTransform() { CenterX = 0.5, CenterY = 0.5 };
faceUpBrush.RelativeTransform = invertTransform;
if (faceUpBrush is VisualBrush)
RenderOptions.SetCachingHint(faceUpBrush, CachingHint.Cache);
child.BeginInit();
child.Width = anchor.ActualWidth * CardControl.scaleFactor.Width;
child.Height = anchor.ActualHeight * CardControl.scaleFactor.Height;
child.Fill = _faceUp ? faceUpBrush : faceDownBrush;
child.StrokeThickness = 3;
var transforms = new TransformGroup();
child.RenderTransform = transforms;
rot = sourceCard.Card.Orientation;
if ((rot & CardOrientation.Rot180) != 0)
{
rot180Transform = new RotateTransform(180, child.Width / 2, child.Height / 2);
transforms.Children.Add(rot180Transform);
}
if ((rot & CardOrientation.Rot90) != 0)
{
rot90Transform = isCardInverted ?
new RotateTransform(90, child.Width / 2, child.Width / 2) :
new RotateTransform(90, child.Width / 2, child.Height - child.Width / 2);
transforms.Children.Add(rot90Transform);
}
translate = new TranslateTransform();
transforms.Children.Add(translate);
child.IsHitTestVisible = false;
child.EndInit();
AddVisualChild(child);
DoubleAnimation animation = new DoubleAnimation(0.55, 0.75, new Duration(TimeSpan.FromMilliseconds(500)));
animation.AutoReverse = true;
animation.RepeatBehavior = RepeatBehavior.Forever;
animation.Freeze();
faceUpBrush.BeginAnimation(Brush.OpacityProperty, animation);
faceDownBrush.BeginAnimation(Brush.OpacityProperty, animation);
lightRedBrush.BeginAnimation(Brush.OpacityProperty, animation);
}