Esempio n. 1
0
        private void UpdateModel()
        {
            CardChoiceViewModel model = DataContext as CardChoiceViewModel;

            if (model == null)
            {
                return;
            }

            _cardStacks.Children.Clear();
            _canvas.Children.Clear();

            if (model.CardStacks.Count == 0)
            {
                return;
            }

            int maxCount = (from line in model.CardStacks
                            select line.Cards.Count).Max();

            _cardStacks.Width  = Math.Min(maxCount * Settings.CardChoiceBox.CardXSpacing, Settings.CardChoiceBox.MaxWindowWidth);
            _cardStacks.Height = model.CardStacks.Count * Settings.CardChoiceBox.CardYSpacing;

            ObservableCollection <string> deckNames = new ObservableCollection <string>();

            // First, create layout.
            foreach (var line in model.CardStacks)
            {
                deckNames.Add(line.DeckName);

                CardStack stack = new SingleRowCardStack()
                {
                    ParentCanvas = _canvas
                };
                stack.MaxCardSpacing = Settings.CardChoiceBox.CardXSpacing;
                stack.MaxCardSpacingOnHighlighted = Settings.CardChoiceBox.CardXSpacing + 15;
                stack.CardAlignment = HorizontalAlignment.Center;
                stack.Height        = 130d;
                stack.Margin        = new Thickness(1, 10, 1, 10);
                stack.AddCards(line.Cards);
                foreach (var card in stack.Cards)
                {
                    card.Cursor      = Cursors.Hand;
                    card.MouseEnter += card_MouseEnter;
                    card.MouseLeave += card_MouseLeave;
                }

                stack.HorizontalAlignment = HorizontalAlignment.Left;
                stack.Width = _cardStacks.Width;
                _cardStacks.Children.Add(stack);
            }

            deckIcons.ItemsSource = deckNames;

            if (model == null || model.DisplayOnly)
            {
                return;
            }
            Trace.Assert(model != null);

            foreach (var s in model.CardStacks)
            {
                foreach (var card in s.Cards)
                {
                    if (model.Verifier.Verify(new List <List <Card> >()
                    {
                        new List <Card>()
                        {
                            card.Card
                        }
                    })
                        != Core.UI.VerifierResult.Success)
                    {
                        card.IsEnabled = false;
                    }

                    card.OnSelectedChanged += (o, e) =>
                    {
                        var c = o as CardViewModel;
                        model.Answer.Clear();
                        model.Answer.Add(new List <Card>());
                        if (c.IsSelected)
                        {
                            model.Answer[0].Add(c.Card);
                            foreach (var otherCardStack in model.CardStacks)
                            {
                                foreach (var otherCard in otherCardStack.Cards)
                                {
                                    if (otherCard != o)
                                    {
                                        otherCard.IsSelected = false;
                                    }
                                }
                            }
                            if (model.MultiChoiceCommands.Count == 1)
                            {
                                model.MultiChoiceCommands.First().Execute(null);
                            }
                            else
                            {
                                foreach (var command in model.MultiChoiceCommands)
                                {
                                    MultiChoiceCommand mc = command as MultiChoiceCommand;
                                    mc.CanExecuteStatus = true;
                                }
                            }
                        }
                        else
                        {
                            foreach (var command in model.MultiChoiceCommands)
                            {
                                MultiChoiceCommand mc = command as MultiChoiceCommand;
                                mc.CanExecuteStatus = false;
                            }
                        }
                    };
                }
            }

            if (model.MultiChoiceCommands.Count > 1)
            {
                gridChoices.Visibility = Visibility.Visible;
            }
            else
            {
                Trace.Assert(model.MultiChoiceCommands.Count == 1);
                gridChoices.Visibility = Visibility.Hidden;
            }

            if (model.TimeOutSeconds > 0)
            {
                Duration        duration        = new Duration(TimeSpan.FromSeconds(model.TimeOutSeconds));
                DoubleAnimation doubleanimation = new DoubleAnimation(100d, 0d, duration);
                progressBar.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
            }
        }
Esempio n. 2
0
        public void UpdateModel()
        {
            CardChoiceViewModel model = DataContext as CardChoiceViewModel;

            if (model == null)
            {
                return;
            }

            _cardStacks.Children.Clear();
            _cardSlots.Children.Clear();
            _canvas.Children.Clear();
            _slotCanvas.Children.Clear();

            _allCardStacks.Clear();
            _allCardSlots.Clear();
            _originalPlace.Clear();
            _stackInfo.Clear();
            _stackToSlot.Clear();
            _resultPanel.Children.Clear();
            _resultSlotPanel.Children.Clear();

            int maxCount = (from line in model.CardStacks
                            select line.Cards.Count).Max();

            var resultDecks = from line in model.CardStacks
                              where line.IsResultDeck
                              select line;

            bool isResultHorizontal = (resultDecks.Max(l => l.Capacity) == 1);

            if (isResultHorizontal)
            {
                maxCount = Math.Max(maxCount, resultDecks.Count());
            }

            _cardStacks.Width = Math.Min(maxCount * Settings.CardChoiceBox.CardXSpacing, Settings.CardChoiceBox.MaxWindowWidth);
            if (isResultHorizontal)
            {
                _cardStacks.Height = (model.CardStacks.Count - resultDecks.Count() + 1) * Settings.CardChoiceBox.CardYSpacing;
            }
            else
            {
                _cardStacks.Height = model.CardStacks.Count * Settings.CardChoiceBox.CardYSpacing;
            }
            _cardSlots.Width  = _cardStacks.Width;
            _cardSlots.Height = _cardStacks.Height;

            ObservableCollection <string> deckNames = new ObservableCollection <string>();

            // First, create layout.
            foreach (var line in model.CardStacks)
            {
                CardStack slot = new CardStack()
                {
                    ParentCanvas = _slotCanvas
                };
                slot.MaxCardSpacing = Settings.CardChoiceBox.CardXSpacing;
                slot.CardAlignment  = HorizontalAlignment.Left;
                slot.Height         = 130d;
                slot.Margin         = new Thickness(1, 10, 1, 10);

                if (isResultHorizontal && line.IsResultDeck)
                {
                    slot.HorizontalAlignment = HorizontalAlignment.Left;
                    slot.Width = line.Capacity * Settings.CardChoiceBox.CardXSpacing;
                    _resultSlotPanel.Children.Add(slot);
                }
                else
                {
                    slot.HorizontalAlignment = HorizontalAlignment.Stretch;
                    _cardSlots.Children.Add(slot);
                }

                if (line.IsResultDeck)
                {
                    string key   = string.Format("CardSlot.Hint.{0}", line.DeckName);
                    string hint  = (Application.Current.TryFindResource(key) as string) ?? string.Empty;
                    var    slots = new List <CardViewModel>();
                    for (int i = 0; i < line.Capacity; i++)
                    {
                        slots.Add(new CardSlotViewModel()
                        {
                            Hint = hint, Card = null
                        });
                    }
                    slot.AddCards(slots);
                    foreach (var cardSlot in slot.Cards)
                    {
                        cardSlot.IsHitTestVisible = false;
                    }
                }
                else
                {
                    deckNames.Add(line.DeckName);
                }

                var stack = new SingleRowCardStack()
                {
                    ParentCanvas = _canvas
                };
                stack.IsDraggingHandled           = false;
                stack.MaxCardSpacing              = Settings.CardChoiceBox.CardXSpacing;
                stack.MaxCardSpacingOnHighlighted = Settings.CardChoiceBox.CardXSpacing;
                stack.CardAlignment = HorizontalAlignment.Left;
                stack.Height        = 130d;
                stack.Margin        = new Thickness(1, 10, 1, 10);
                stack.AddCards(line.Cards);

                _stackInfo.Add(stack, line);

                foreach (var cardView in stack.Cards)
                {
                    _originalPlace.Add(cardView, stack);
                    if (!model.DisplayOnly)
                    {
                        cardView.DragDirection = DragDirection.Both;
                        cardView.OnDragBegin  += cardView_OnDragBegin;
                        cardView.OnDragging   += cardView_OnDragging;
                        cardView.OnDragEnd    += cardView_OnDragEnd;
                    }
                }

                if (isResultHorizontal && line.IsResultDeck)
                {
                    stack.HorizontalAlignment = HorizontalAlignment.Left;
                    stack.Width = line.Capacity * Settings.CardChoiceBox.CardXSpacing;
                    _resultPanel.Children.Add(stack);
                }
                else
                {
                    stack.HorizontalAlignment = HorizontalAlignment.Left;
                    stack.Width = _cardStacks.Width;
                    _cardStacks.Children.Add(stack);
                }

                _stackToSlot.Add(stack, slot);

                _allCardStacks.Add(stack);
                _allCardSlots.Add(slot);
            }

            deckIcons.ItemsSource = deckNames;

            if (isResultHorizontal)
            {
                _cardStacks.Children.Add(_resultPanel);
                _cardSlots.Children.Add(_resultSlotPanel);
            }
            _UpdateAnswer();
            _UpdateVerifiedStatus();

            // Progress bar
            if (model.TimeOutSeconds > 0)
            {
                Duration        duration        = new Duration(TimeSpan.FromSeconds(model.TimeOutSeconds));
                DoubleAnimation doubleanimation = new DoubleAnimation(100d, 0d, duration);
                progressBar.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
            }
        }
Esempio n. 3
0
        private void UpdateModel()
        {
            CardChoiceViewModel model = DataContext as CardChoiceViewModel;
            if (model == null) return;

            _cardStacks.Children.Clear();
            _canvas.Children.Clear();

            if (model.CardStacks.Count == 0)
            {
                return;
            }

            int maxCount = (from line in model.CardStacks
                            select line.Cards.Count).Max();

            _cardStacks.Width = Math.Min(maxCount * _cardXSpacing, 570);
            _cardStacks.Height = model.CardStacks.Count * _cardYSpacing;

            ObservableCollection<string> deckNames = new ObservableCollection<string>();

            // First, create layout.
            foreach (var line in model.CardStacks)
            {
                deckNames.Add(line.DeckName);

                CardStack stack = new SingleRowCardStack() { ParentCanvas = _canvas };
                stack.MaxCardSpacing = _cardXSpacing;
                stack.MaxCardSpacingOnHighlighted = _cardXSpacing + 15;
                stack.CardAlignment = HorizontalAlignment.Center;
                stack.Height = 130d;
                stack.Margin = new Thickness(1, 10, 1, 10);
                stack.AddCards(line.Cards);
                foreach (var card in stack.Cards)
                {
                    card.Cursor = Cursors.Hand;
                    card.MouseEnter += card_MouseEnter;
                    card.MouseLeave += card_MouseLeave;
                }

                stack.HorizontalAlignment = HorizontalAlignment.Stretch;
                _cardStacks.Children.Add(stack);
            }

            deckIcons.ItemsSource = deckNames;

            if (model == null || model.DisplayOnly) return;
            Trace.Assert(model != null);

            foreach (var s in model.CardStacks)
            {
                foreach (var card in s.Cards)
                {
                    if (model.Verifier.Verify(new List<List<Card>>() { new List<Card>() { card.Card } })
                        != Core.UI.VerifierResult.Success)
                    {
                        card.IsEnabled = false;
                    }

                    card.OnSelectedChanged += (o, e) =>
                    {
                        var c = o as CardViewModel;
                        model.Answer.Clear();
                        model.Answer.Add(new List<Card>());
                        if (c.IsSelected)
                        {
                            model.Answer[0].Add(c.Card);
                            foreach (var otherCardStack in model.CardStacks)
                            {
                                foreach (var otherCard in otherCardStack.Cards)
                                {
                                    if (otherCard != o)
                                    {
                                        otherCard.IsSelected = false;
                                    }
                                }
                            }
                            if (model.MultiChoiceCommands.Count == 1)
                            {
                                model.MultiChoiceCommands.First().Execute(null);
                            }
                            else
                            {
                                foreach (var command in model.MultiChoiceCommands)
                                {
                                    MultiChoiceCommand mc = command as MultiChoiceCommand;
                                    mc.CanExecuteStatus = true;
                                }
                            }
                        }
                        else
                        {
                            foreach (var command in model.MultiChoiceCommands)
                            {
                                MultiChoiceCommand mc = command as MultiChoiceCommand;
                                mc.CanExecuteStatus = false;
                            }
                        }
                    };
                }
            }

            if (model.MultiChoiceCommands.Count > 1)
            {
                gridChoices.Visibility = Visibility.Visible;
            }
            else
            {
                Trace.Assert(model.MultiChoiceCommands.Count == 1);
                gridChoices.Visibility = Visibility.Hidden;
            }

            if (model.TimeOutSeconds > 0)
            {
                Duration duration = new Duration(TimeSpan.FromSeconds(model.TimeOutSeconds));
                DoubleAnimation doubleanimation = new DoubleAnimation(100d, 0d, duration);
                progressBar.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
            }
        }
        public void UpdateModel()
        {
            CardChoiceViewModel model = DataContext as CardChoiceViewModel;
            if (model == null) return;

            _cardStacks.Children.Clear();
            _cardSlots.Children.Clear();
            _canvas.Children.Clear();
            _slotCanvas.Children.Clear();

            _allCardStacks.Clear();
            _allCardSlots.Clear();
            _originalPlace.Clear();
            _stackInfo.Clear();
            _stackToSlot.Clear();
            _resultPanel.Children.Clear();
            _resultSlotPanel.Children.Clear();

            int maxCount = (from line in model.CardStacks
                            select line.Cards.Count).Max();

            var resultDecks = from line in model.CardStacks
                              where line.IsResultDeck
                              select line;

            bool isResultHorizontal = (resultDecks.Max(l => l.Capacity) == 1);

            if (isResultHorizontal)
            {
                maxCount = Math.Max(maxCount, resultDecks.Count());
            }

            _cardStacks.Width = Math.Min(maxCount * Settings.CardChoiceBox.CardXSpacing, Settings.CardChoiceBox.MaxWindowWidth);
            if (isResultHorizontal)
            {
                _cardStacks.Height = (model.CardStacks.Count - resultDecks.Count() + 1) * Settings.CardChoiceBox.CardYSpacing;
            }
            else
            {
                _cardStacks.Height = model.CardStacks.Count * Settings.CardChoiceBox.CardYSpacing;
            }
            _cardSlots.Width = _cardStacks.Width;
            _cardSlots.Height = _cardStacks.Height;

            ObservableCollection<string> deckNames = new ObservableCollection<string>();

            // First, create layout.
            foreach (var line in model.CardStacks)
            {

                CardStack slot = new CardStack() { ParentCanvas = _slotCanvas };
                slot.MaxCardSpacing = Settings.CardChoiceBox.CardXSpacing;
                slot.CardAlignment = HorizontalAlignment.Left;
                slot.Height = 130d;
                slot.Margin = new Thickness(1, 10, 1, 10);

                if (isResultHorizontal && line.IsResultDeck)
                {
                    slot.HorizontalAlignment = HorizontalAlignment.Left;
                    slot.Width = line.Capacity * Settings.CardChoiceBox.CardXSpacing;
                    _resultSlotPanel.Children.Add(slot);
                }
                else
                {
                    slot.HorizontalAlignment = HorizontalAlignment.Stretch;
                    _cardSlots.Children.Add(slot);
                }

                if (line.IsResultDeck)
                {
                    string key = string.Format("CardSlot.Hint.{0}", line.DeckName);
                    string hint = (Application.Current.TryFindResource(key) as string) ?? string.Empty;
                    var slots = new List<CardViewModel>();
                    for (int i = 0; i < line.Capacity; i++)
                    {

                        slots.Add(new CardSlotViewModel() { Hint = hint, Card = null });
                    }
                    slot.AddCards(slots);
                    foreach (var cardSlot in slot.Cards)
                    {
                        cardSlot.IsHitTestVisible = false;
                    }
                }
                else
                {
                    deckNames.Add(line.DeckName);
                }

                var stack = new SingleRowCardStack() { ParentCanvas = _canvas };
                stack.IsDraggingHandled = false;
                stack.MaxCardSpacing = Settings.CardChoiceBox.CardXSpacing;
                stack.MaxCardSpacingOnHighlighted = Settings.CardChoiceBox.CardXSpacing;
                stack.CardAlignment = HorizontalAlignment.Left;
                stack.Height = 130d;
                stack.Margin = new Thickness(1, 10, 1, 10);
                stack.AddCards(line.Cards);

                _stackInfo.Add(stack, line);

                foreach (var cardView in stack.Cards)
                {
                    _originalPlace.Add(cardView, stack);
                    if (!model.DisplayOnly)
                    {
                        cardView.DragDirection = DragDirection.Both;
                        cardView.OnDragBegin += cardView_OnDragBegin;
                        cardView.OnDragging += cardView_OnDragging;
                        cardView.OnDragEnd += cardView_OnDragEnd;
                    }
                }

                if (isResultHorizontal && line.IsResultDeck)
                {
                    stack.HorizontalAlignment = HorizontalAlignment.Left;
                    stack.Width = line.Capacity * Settings.CardChoiceBox.CardXSpacing;
                    _resultPanel.Children.Add(stack);
                }
                else
                {
                    stack.HorizontalAlignment = HorizontalAlignment.Left;
                    stack.Width = _cardStacks.Width;
                    _cardStacks.Children.Add(stack);
                }

                _stackToSlot.Add(stack, slot);

                _allCardStacks.Add(stack);
                _allCardSlots.Add(slot);
            }

            deckIcons.ItemsSource = deckNames;

            if (isResultHorizontal)
            {
                _cardStacks.Children.Add(_resultPanel);
                _cardSlots.Children.Add(_resultSlotPanel);
            }
            _UpdateAnswer();
            _UpdateVerifiedStatus();

            // Progress bar
            if (model.TimeOutSeconds > 0)
            {
                Duration duration = new Duration(TimeSpan.FromSeconds(model.TimeOutSeconds));
                DoubleAnimation doubleanimation = new DoubleAnimation(100d, 0d, duration);
                progressBar.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);
            }
        }