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); } }
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); } }
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); } }