Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        //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);
        }