protected override void OnCardDropped(object sender, CardsEventArgs e) { e.Handled = e.CanDrop = true; var cardCtrl = e.OriginalSource as CardControl; int delta = Program.GameEngine.Definition.CardSize.Height - Program.GameEngine.Definition.CardSize.Width; Table table = Program.GameEngine.Table; Vector mouseOffset; if (cardCtrl != null && (cardCtrl.IsInverted || (Player.LocalPlayer.InvertedTable && !cardCtrl.IsOnTableCanvas))) { //mouseOffset = new Vector(Program.GameEngine.Definition.CardSize.Width - e.MouseOffset.X, Program.GameEngine.Definition.CardSize.Height - e.MouseOffset.Y); mouseOffset = new Vector(cardCtrl.Card.RealWidth - e.MouseOffset.X, cardCtrl.Card.RealHeight - e.MouseOffset.Y); } else { mouseOffset = e.MouseOffset; } Point pt = MousePosition(); pt -= mouseOffset; if (Selection.IsEmpty() || !(Selection.Source is Table)) { if (Program.GameSettings.UseTwoSidedTable && (e.ClickedCard.Orientation & CardOrientation.Rot90) != 0) { // We have to offset the position if we cross the middle line bool newPosInverted = IsInInvertedZone(pt.Y, e.ClickedCard); if (cardCtrl != null && (!cardCtrl.IsInverted && newPosInverted)) { delta = cardCtrl.Card.RealHeight - cardCtrl.Card.RealWidth; pt.X += delta; pt.Y += delta; } else if (cardCtrl != null && (cardCtrl.IsInverted && !newPosInverted)) { delta = cardCtrl.Card.RealHeight - cardCtrl.Card.RealWidth; pt.X -= delta; pt.Y -= delta; } } int idx = table.GetCardIndex(e.ClickedCard); if (idx != -1 || table.Visibility != DataNew.Entities.GroupVisibility.Undefined) { e.FaceUp = e.ClickedCard.FaceUp; } if (idx == -1) { idx = table.Cards.Count; } var cards = e.Cards.ToArray(); //double xOffset = e.ClickedCard.Size.Width * 1.05; double xOffset = e.ClickedCard.RealWidth * 1.05; var curX = pt.X; Card.MoveCardsToTable(cards, (args) => { if (args.Card == e.ClickedCard) { args.X = (int)pt.X; } else { curX += xOffset; args.X = (int)curX; } args.FaceUp = e.FaceUp ?? false; args.Y = (int)pt.Y; args.Index = idx; xOffset = args.Card.RealWidth * 1.05; //xOffset = args.Card.Size.Width * 1.05; }, false); //e.ClickedCard.MoveToTable((int)pt.X, (int)pt.Y, e.FaceUp != null && e.FaceUp.Value, idx, false); //// If there were other cards (i.e. dragging from a count number in GroupWindow), move them accordingly //double xOffset = Program.GameEngine.Definition.CardWidth * 1.05; //foreach (Card c in e.Cards.Where(c => c != e.ClickedCard)) //{ // pt.X += xOffset; // c.MoveToTable((int)pt.X, (int)pt.Y, e.FaceUp != null && e.FaceUp.Value, idx, false); //} } else { // There are multiple cards, coming from the table. Offset them accordingly double dx = pt.X - e.ClickedCard.X; double dy = pt.Y - e.ClickedCard.Y; var cards = Selection.Cards.ToArray(); //int x,y = 0; //int idx = 0; Card.MoveCardsToTable(cards, (args) => { var c = args.Card; int x = (int)(c.X + dx); int y = (int)(c.Y + dy); args.Index = table.GetCardIndex(c); // If the card is tapped and has crossed the middle line in a two-sided table, we have to adjust its position if (Program.GameSettings.UseTwoSidedTable && (c.Orientation & CardOrientation.Rot90) != 0) { bool oldPosInverted = IsInInvertedZone(c.Y, c); bool newPosInverted = IsInInvertedZone(y, c); if (!oldPosInverted && newPosInverted) { delta = c.RealHeight - c.RealWidth; x += delta; y += delta; } else if (oldPosInverted && !newPosInverted) { delta = c.RealHeight - c.RealWidth; x -= delta; y -= delta; } } args.X = x; args.Y = y; args.FaceUp = c.FaceUp; }, false); } }
//protected override async Task<List<Control>> CreateCardMenuItems(Card card, DataNew.Entities.Group def) protected override List <Control> CreateCardMenuItems(Card card, DataNew.Entities.Group def) { //List<Control> items = await base.CreateCardMenuItems(card, def); List <Control> items = base.CreateCardMenuItems(card, def); var item = new MenuItem { Header = "Move to" }; var subItem = new MenuItem { Header = Program.GameEngine.Definition.Player.Hand.Name, InputGestureText = Program.GameEngine.Definition.Player.Hand.Shortcut }; subItem.Click += delegate { Selection.Do(c => c.MoveTo(Player.LocalPlayer.Hand, true, false), ContextCard); }; if (Program.GameEngine.Definition.Player.Hand.MoveTo) { item.Items.Add(subItem); } var groupDefs = Program.GameEngine.Definition.Player.Groups.ToArray(); var moveToBottomItems = new List <MenuItem>(); for (int i = 0; i < groupDefs.Length; ++i) { var groupDef = groupDefs[i]; if (!groupDef.MoveTo) { continue; } Group indexedGroup = Player.LocalPlayer.IndexedGroups[i + 1]; // 0 is hand subItem = new MenuItem { Header = groupDef.Name, InputGestureText = groupDef.Shortcut }; subItem.Click += delegate { Selection.Do(c => c.MoveTo(indexedGroup, true, false), ContextCard); }; item.Items.Add(subItem); subItem = new MenuItem { Header = string.Format("Bottom of {0}", groupDef.Name), InputGestureText = string.IsNullOrEmpty(groupDef.Shortcut) ? null : "Alt+" + groupDef.Shortcut }; subItem.Click += delegate { Selection.Do(c => c.MoveTo(indexedGroup, true, indexedGroup.Count, false), ContextCard); }; moveToBottomItems.Add(subItem); } if (moveToBottomItems.Count > 0) { item.Items.Add(new Separator()); } foreach (MenuItem x in moveToBottomItems) { item.Items.Add(x); } if (item.Items.Count > 0) { items.Add(item); } item = new MenuItem { Header = "Bring to front", InputGestureText = "PgUp" }; item.Click += delegate { Selection.Do(c => Program.GameEngine.Table.BringToFront(c), ContextCard); }; items.Add(item); item = new MenuItem { Header = "Send to back", InputGestureText = "PgDn" }; item.Click += delegate { Selection.Do(c => Program.GameEngine.Table.SendToBack(c), ContextCard); }; items.Add(item); return(items); }