using DominionBase.Enums;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace Dominion.NET_WPF.Controls
{
///
/// Interaction logic for ucCardConstraint.xaml
///
public partial class ucCardConstraint : UserControl, IDisposable
{
private DominionBase.Cards.Constraint _constraint;
public DominionBase.Cards.Constraint Constraint
{
get { return _constraint; }
set {
_constraint = value;
cbMinimum.ItemsSource = Counts;
cbMinimum.SelectedItem = _constraint.Minimum;
cbMaximum.ItemsSource = Counts;
cbMaximum.SelectedItem = _constraint.Maximum;
cbCriteria.SelectedItem = _constraint.ConstraintType;
cbValue.SelectedItem = _constraint.ConstraintValue;
}
}
public static readonly RoutedEvent RemoveClickEvent = EventManager.RegisterRoutedEvent(
"RemoveClick",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ucCardConstraint));
public event RoutedEventHandler RemoveClick
{
add { AddHandler(RemoveClickEvent, value); }
remove { RemoveHandler(RemoveClickEvent, value); }
}
public static readonly DependencyProperty DisplayObjectsProperty =
DependencyProperty.Register("DisplayObjects", typeof(DisplayObjects), typeof(ucCardConstraint),
new PropertyMetadata(new DisplayObjects()));
public DisplayObjects DisplayObjects
{
get { return (DisplayObjects)GetValue(DisplayObjectsProperty); }
set
{
SetValue(DisplayObjectsProperty, value);
}
}
private readonly List _counts = new List();
public ObservableCollection Counts
{
get
{
if (_counts.Count == 0)
{
for (var i = Constraint.RangeMin; i <= Constraint.RangeMax; i++)
_counts.Add(i);
}
return new ObservableCollection(_counts);
}
}
public ucCardConstraint()
{
InitializeComponent();
if (WMain.Settings != null)
{
WMain.Settings.SettingsChanged += Settings_SettingsChanged;
Settings_SettingsChanged(WMain.Settings, null);
}
}
public void Dispose()
{
if (WMain.Settings != null)
{
WMain.Settings.SettingsChanged -= Settings_SettingsChanged;
}
}
private void Settings_SettingsChanged(object sender, SettingsChangedEventArgs e)
{
var settings = sender as Settings;
if (settings != null)
{
if (settings.ToolTipShowDuration == ToolTipShowDuration.Off)
ToolTipService.SetIsEnabled(cbValue, false);
else
{
ToolTipService.SetIsEnabled(cbValue, true);
ToolTipService.SetShowDuration(cbValue, (int)settings.ToolTipShowDuration);
}
}
}
private void cbMinimum_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cbMinimum?.SelectedItem == null)
return;
Constraint.Minimum = (int)cbMinimum.SelectedItem;
cbMaximum.SelectedItem = Constraint.Maximum;
}
private void cbMaximum_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cbMaximum?.SelectedItem == null)
return;
Constraint.Maximum = (int)cbMaximum.SelectedItem;
cbMinimum.SelectedItem = Constraint.Minimum;
}
private void cbCriteria_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cbValue == null)
return;
if (e.AddedItems.Count > 0)
{
Constraint.ConstraintType = (DominionBase.Cards.ConstraintType)e.AddedItems[0];
switch (Constraint.ConstraintType)
{
case DominionBase.Cards.ConstraintType.Unknown:
break;
case DominionBase.Cards.ConstraintType.SetIs:
cbValue.ItemsSource = DisplayObjects.Sources;
if (Constraint.ConstraintValue is Source cvSource)
{
foreach (var kvpSource in cbValue.Items.OfType>())
{
if (kvpSource.Key != cvSource) continue;
cbValue.SelectedItem = kvpSource;
break;
}
}
cbValue.Focus();
break;
case DominionBase.Cards.ConstraintType.CategoryContains:
cbValue.ItemsSource = DisplayObjects.CategoriesContains;
if (Constraint.ConstraintValue is Categories cvCategories)
{
foreach (var kvpCategory in cbValue.Items.OfType>())
{
if (kvpCategory.Key != cvCategories) continue;
cbValue.SelectedItem = kvpCategory;
break;
}
}
cbValue.Focus();
break;
case DominionBase.Cards.ConstraintType.CardCosts:
cbValue.ItemsSource = DisplayObjects.Costs;
if (Constraint.ConstraintValue is DominionBase.Cards.Cost cvCost)
{
foreach (var kvpCost in cbValue.Items.OfType>())
{
if (kvpCost.Key != cvCost) continue;
cbValue.SelectedItem = kvpCost;
break;
}
}
cbValue.Focus();
break;
case DominionBase.Cards.ConstraintType.CardDontUse:
cbValue.ItemsSource = DisplayObjects.Cards;
if (Constraint.ConstraintValue is string s)
{
foreach (var card in cbValue.Items.OfType())
{
if (card.Name != s) continue;
cbValue.SelectedItem = card;
break;
}
}
cbValue.Focus();
break;
case DominionBase.Cards.ConstraintType.CardMustUse:
cbValue.ItemsSource = DisplayObjects.Cards;
if (Constraint.ConstraintValue is string value)
{
foreach (var card in cbValue.Items.OfType())
{
if (card.Name != value) continue;
cbValue.SelectedItem = card;
break;
}
}
cbValue.Focus();
break;
case DominionBase.Cards.ConstraintType.HasTrait:
cbValue.ItemsSource = DisplayObjects.Trait;
if (Constraint.ConstraintValue is Traits cvTraits)
{
foreach (var kvpTrait in cbValue.Items.OfType>())
{
if (kvpTrait.Key != cvTraits) continue;
cbValue.SelectedItem = kvpTrait;
break;
}
}
cbValue.Focus();
break;
default:
break;
}
_counts.Clear();
cbMinimum.ItemsSource = Counts;
cbMinimum.SelectedItem = _constraint.Minimum;
cbMaximum.ItemsSource = Counts;
cbMaximum.SelectedItem = _constraint.Maximum;
}
}
private void cbValue_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
{
if (Constraint.ConstraintType == DominionBase.Cards.ConstraintType.CardDontUse || Constraint.ConstraintType == DominionBase.Cards.ConstraintType.CardMustUse)
{
ttCard.Visibility = Visibility.Visible;
ttcCard.Card = (DominionBase.IDisplayable)e.AddedItems[0];
Constraint.ConstraintValue = ((DominionBase.IDisplayable)e.AddedItems[0]).Name;
}
else
{
ttCard.Visibility = Visibility.Collapsed;
ttcCard.Card = null;
Constraint.ConstraintValue = e.AddedItems[0];
}
}
}
private void cbValue_MouseDown(object sender, MouseButtonEventArgs e)
{
var fe = sender as FrameworkElement;
if (WMain.Settings == null || ((fe?.ToolTip as ToolTip)?.Content as ToolTipIDisplayable)?.Card == null ||
(((ToolTip) fe.ToolTip).Content as ToolTipIDisplayable)?.Card.Type == DominionBase.Cards.Universal.TypeClass.Dummy ||
(((ToolTip) fe.ToolTip).Content as ToolTipIDisplayable)?.Card.Type == DominionBase.Cards.Universal.TypeClass.DummyRed ||
(((ToolTip) fe.ToolTip).Content as ToolTipIDisplayable)?.Card.Type == DominionBase.Cards.Universal.TypeClass.Blank)
return;
if (WMain.Settings.ShowToolTipOnRightClick && e.ChangedButton == MouseButton.Right && e.ButtonState == MouseButtonState.Pressed)
{
fe.CaptureMouse();
var toolTip = fe.ToolTip as ToolTip;
if (toolTip != null) toolTip.IsOpen = true;
}
}
private void cbValue_MouseUp(object sender, MouseButtonEventArgs e)
{
var fe = sender as FrameworkElement;
if (WMain.Settings == null || fe?.ToolTip == null)
return;
if (WMain.Settings.ShowToolTipOnRightClick && e.ChangedButton == MouseButton.Right && e.ButtonState == MouseButtonState.Released)
{
fe.ReleaseMouseCapture();
var toolTip = fe.ToolTip as ToolTip;
if (toolTip != null) toolTip.IsOpen = false;
}
}
private void bRemove_Click(object sender, RoutedEventArgs e)
{
var button = sender as Button;
if (button != null) button.IsEnabled = false;
RaiseEvent(new RoutedEventArgs(RemoveClickEvent));
if (button != null) button.IsEnabled = true;
}
private void This_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var toolTip = cbValue.ToolTip as ToolTip;
if (toolTip != null && toolTip.IsOpen)
((ToolTip) cbValue.ToolTip).IsOpen = false;
}
}
}