using DominionBase; using DominionBase.Cards; using DominionBase.Enums; using DominionBase.Piles; using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using Visibility = System.Windows.Visibility; namespace Dominion.NET_WPF.Controls { /// /// Interaction logic for ucCardIcon.xaml /// public partial class ucCardIcon : UserControl, IDisposable { public static readonly DependencyProperty SizeProperty = DependencyProperty.Register("Size", typeof(CardSize), typeof(ucCardIcon), new PropertyMetadata(CardSize.SmallText)); public CardSize Size { get { return (CardSize)GetValue(SizeProperty); } set { SetValue(SizeProperty, value); switch (value) { case CardSize.SmallText: dpName.Height = 16; lName.Margin = new Thickness(0, 0, 2, 0); lName.Padding = new Thickness(0); Padding = new Thickness(0); break; case CardSize.Text: dpName.Height = double.NaN; lName.Margin = new Thickness(0, 0, 5, 0); lName.Padding = new Thickness(0, 2, 0, 2); Padding = new Thickness(5); break; } } } private IDisplayable _card; private int _count; private Settings _containee; private WeakucCardIcon _weakContainer; public int Count { get { return _count; } set { _count = value; if (_count < 0) _count = 0; if (_count > 1) { lCount.Visibility = Visibility.Visible; lCount.Content = $"{_count}x"; } else { lCount.Visibility = Visibility.Collapsed; } } } public ucCardIcon() { InitializeComponent(); if (WMain.Settings != null) { Settings = WMain.Settings; Settings_SettingsChanged(WMain.Settings, null); } } #region IDisposable variables, properties, & methods // Track whether Dispose has been called. private bool _disposed; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // Check to see if Dispose has already been called. if (!_disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (disposing) { // Dispose managed resources. } // Call the appropriate methods to clean up // unmanaged resources here. // If disposing is false, // only the following code is executed. _card = null; //memoryLeak = null; if (WMain.Settings != null) { WMain.Settings.SettingsChanged -= Settings_SettingsChanged; } // Note disposing has been done. _disposed = true; } } ~ucCardIcon() { Dispose(false); } #endregion public Settings Settings { get { return _containee; } set { if (_weakContainer == null) _weakContainer = new WeakucCardIcon(this); // unsubscribe old if (_containee != null) _containee.SettingsChanged -= _weakContainer.Settings_SettingsChanged; _containee = value; // subscribe new if (_containee != null) _containee.SettingsChanged += _weakContainer.Settings_SettingsChanged; } } protected virtual void Settings_SettingsChanged(object sender, SettingsChangedEventArgs e) { var settings = sender as Settings; if (settings != null) { if (settings.ToolTipShowDuration == ToolTipShowDuration.Off) ToolTipService.SetIsEnabled(this, false); else { ToolTipService.SetIsEnabled(this, true); ToolTipService.SetShowDuration(this, (int)settings.ToolTipShowDuration); } } } private class WeakucCardIcon : WeakReference { public WeakucCardIcon(ucCardIcon target) : base(target) { } public void Settings_SettingsChanged(object sender, SettingsChangedEventArgs e) { var b = (ucCardIcon)Target; if (b != null) b.Settings_SettingsChanged(sender, e); else { var c = sender as Settings; if (c != null) { c.SettingsChanged -= Settings_SettingsChanged; } } } } public IDisplayable Card { get { return _card; } set { _card = value; if (_card != null) { Title = _card.Name; var category = Card.Category; var card = Card as Card; if (card != null) category = card.PhysicalCategory; lName.Background = Caching.BrushRepository.GetBackgroundBrush(category); lName.Foreground = Caching.BrushRepository.GetForegroundBrush(category); // Flip the foreground/background for Events if (category.HasFlag(Categories.Event)) { var t = lName.Foreground; lName.Foreground = lName.Background; lName.Background = t; } if (category.HasFlag(Categories.Reaction)) tbName.Effect = Caching.DropShadowRepository.GetDSE(8, Colors.White, 1d); Count = 1; } else { Title = string.Empty; Count = 0; } ttcCard.Card = Card; } } public string Title { get { return tbName.Text; } private set { tbName.Text = value; lName.Visibility = string.IsNullOrEmpty(value) ? Visibility.Hidden : Visibility.Visible; } } private void UserControl_MouseDown(object sender, MouseButtonEventArgs e) { if (WMain.Settings == null || ((ToolTip as ToolTip)?.Content as ToolTipIDisplayable)?.Card == null || (((ToolTip) ToolTip).Content as ToolTipIDisplayable)?.Card.Type == DominionBase.Cards.Universal.TypeClass.Dummy || (((ToolTip) ToolTip).Content as ToolTipIDisplayable)?.Card.Type == DominionBase.Cards.Universal.TypeClass.DummyRed || (((ToolTip) ToolTip).Content as ToolTipIDisplayable)?.Card.Type == DominionBase.Cards.Universal.TypeClass.Blank) return; if (WMain.Settings.ShowToolTipOnRightClick && e.ChangedButton == MouseButton.Right && e.ButtonState == MouseButtonState.Pressed) { CaptureMouse(); ((ToolTip) ToolTip).IsOpen = true; e.Handled = true; } } private void UserControl_MouseUp(object sender, MouseButtonEventArgs e) { if (WMain.Settings == null || ToolTip == null) return; if (WMain.Settings.ShowToolTipOnRightClick && e.ChangedButton == MouseButton.Right && e.ButtonState == MouseButtonState.Released) { ReleaseMouseCapture(); var toolTip = ToolTip as ToolTip; if (toolTip != null) toolTip.IsOpen = false; e.Handled = true; } } private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { var toolTip = ToolTip as ToolTip; if (toolTip != null && toolTip.IsOpen) ((ToolTip) ToolTip).IsOpen = false; } private void UserControl_MouseEnter(object sender, MouseEventArgs e) { CardHover.RaiseCardHoverEvent(this, new CardHoverEventArgs(Card?.DisplayCard)); } private void UserControl_StylusEnter(object sender, StylusEventArgs e) { CardHover.RaiseCardHoverEvent(this, new CardHoverEventArgs(Card?.DisplayCard)); } private void UserControl_TouchEnter(object sender, TouchEventArgs e) { CardHover.RaiseCardHoverEvent(this, new CardHoverEventArgs(Card?.DisplayCard)); } } public class CardIconUtilities { public static IEnumerable CreateCardIcons(IEnumerable cards) { var list = new List(); var cardsList = cards as IList ?? cards.ToList(); if (!cardsList.Any()) return list; ucCardIcon icon; var previousIndex = -1; for (var c = 0; c < cardsList.Count; c++) { if (previousIndex < 0) { previousIndex = c; continue; } if (cardsList.ElementAt(previousIndex).Type != cardsList.ElementAt(c).Type) { icon = new ucCardIcon { Card = cardsList.ElementAt(previousIndex), Count = c - previousIndex }; var card = icon.Card as Supply; if (card != null && card.Tokens.Any(t => t.Name == "BaneToken")) list.Add(new ucTokenIcon { Token = card.Tokens.First(t => t.Name == "BaneToken"), Size = CardSize.SmallText }); list.Add(icon); previousIndex = c; } } icon = new ucCardIcon { Card = cardsList.Last(), Count = cardsList.Count - previousIndex }; var supply = icon.Card as Supply; if (supply != null && supply.Tokens.Any(t => t.Name == "BaneToken")) list.Add(new ucTokenIcon { Token = supply.Tokens.First(t => t.Name == "BaneToken"), Size = CardSize.SmallText }); list.Add(icon); return list; } public static ucCardIcon CreateCardIcon(IDisplayable card) { var icon = new ucCardIcon { Card = card, Count = 1 }; return icon; } } }