using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using DominionBase; namespace Dominion.NET_WPF.Controls.GameLog { /// /// Interaction logic for ucGameMessage.xaml /// public partial class ucGameMessage : LogSection { public ucGameMessage() { InitializeComponent(); SpContainer = spArea; } public override bool IsExpanded { get { return expTurn.IsExpanded; } set { expTurn.IsExpanded = value; } } public override void New(string title) { var dp = new DockPanel(); var tbTitle = new TextBlock {Text = title}; DockPanel.SetDock(tbTitle, Dock.Left); dp.Children.Add(tbTitle); expTurn.Header = dp; } public override void TearDown() { base.TearDown(); spArea.Children.Clear(); } public override void Log(params object[] items) { var sbFullLine = new StringBuilder(); var dpContainer = new DockPanel { LastChildFill = true }; var container = new WrapPanel { Orientation = Orientation.Horizontal }; DockPanel.SetDock(container, Dock.Left); dpContainer.Children.Add(container); var background = Brushes.Transparent; var foreground = Brushes.Transparent; foreach (var item in items) { if (item is Color iColor) { foreground = new SolidColorBrush(iColor); } else if (item is string iString) { if (string.IsNullOrEmpty(iString)) continue; var itemTuple = GenerateElements(iString, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } else if (item is int iInt) { var itemTuple = GenerateElements(iInt, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } else if (item is DominionBase.Players.Player iPlayer) { var itemTuple = GenerateElements(iPlayer, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } else if (item is DominionBase.Players.PlayerCollection iPlayerCol) { var isFirstItem = true; foreach (var player in iPlayerCol) { Tuple, string> itemTuple; if (!isFirstItem) { itemTuple = GenerateElements(", ", background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } itemTuple = GenerateElements(player, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); isFirstItem = false; } } else if (item is DominionBase.Visual.VisualPlayer iVisualPlayer) { var itemTuple = GenerateElements(iVisualPlayer, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } else if (item is IDisplayable iDispl) { var itemTuple = GenerateElements(iDispl, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } else if (item is IEnumerable iEDisp) { var itemTuple = GenerateElements(iEDisp, background, foreground); foreach (var elem in itemTuple.Item1) container.Children.Add(elem); sbFullLine.Append(itemTuple.Item2); } } var g = new TextBlock { HorizontalAlignment = HorizontalAlignment.Stretch, Background = background }; DockPanel.SetDock(g, Dock.Left); container.Children.Add(g); Utilities.Log(LogFile, sbFullLine.ToString()); spArea.Children.Add(dpContainer); container.BringIntoView(); } private Tuple, string> GenerateElements(string item, Brush background, SolidColorBrush foreground) { var elements = new List(); foreach (var elem in Utilities.RenderText(item, NET_WPF.RenderSize.Tiny, true)) { var block = elem as TextBlock; if (block != null) { block.Background = background; block.Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground; } DockPanel.SetDock(elem, Dock.Left); elements.Add(elem); } return new Tuple, string>(elements, item.Replace("", "*").Replace("", "*")); } private Tuple, string> GenerateElements(int item, Brush background, SolidColorBrush foreground) { var elements = new List(); var tbLine = new TextBlock { Text = item.ToString(), Background = background, FontWeight = FontWeights.Bold, Foreground = foreground.Color.A == 0 ? Brushes.Crimson : foreground }; DockPanel.SetDock(tbLine, Dock.Left); elements.Add(tbLine); return new Tuple, string>(elements, item.ToString()); } private Tuple, string> GenerateElements(IPlayer item, Brush background, SolidColorBrush foreground) { var elements = new List(); var tbLine = new TextBlock { Text = item.Name, Background = background, Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground, FontWeight = FontWeights.Bold }; DockPanel.SetDock(tbLine, Dock.Left); elements.Add(tbLine); return new Tuple, string>(elements, item.Name); } private Tuple, string> GenerateElements(DominionBase.Visual.VisualPlayer item, Brush background, SolidColorBrush foreground) { var elements = new List(); var tbLine = new TextBlock { Text = item.Name, Background = background, Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground, FontWeight = FontWeights.Bold }; DockPanel.SetDock(tbLine, Dock.Left); elements.Add(tbLine); return new Tuple, string>(elements, item.Name); } private Tuple, string> GenerateElements(IDisplayable item, Brush background, SolidColorBrush foreground) { var elements = new List(); var icon = CardIconUtilities.CreateCardIcon(item); icon.Background = background; DockPanel.SetDock(icon, Dock.Left); elements.Add(icon); return new Tuple, string>(elements, item.Name); } private Tuple, string> GenerateElements(IEnumerable item, Brush background, SolidColorBrush foreground) { var elements = new List(); var sbItem = new StringBuilder(); var itemList = item as IList ?? item.ToList(); foreach (var uc in CardIconUtilities.CreateCardIcons(itemList)) { uc.Background = background; DockPanel.SetDock(uc, Dock.Left); elements.Add(uc); var icon = uc as ucCardIcon; if (icon != null) { if (icon.Count == 1) sbItem.Append(icon.Card.Name); else sbItem.AppendFormat("{0}x {1}", icon.Count, icon.Card.Name); var tbLine = new TextBlock { Text = ", ", Background = background, Foreground = foreground.Color.A == 0 ? Brushes.Black : foreground }; DockPanel.SetDock(tbLine, Dock.Left); elements.Add(tbLine); sbItem.Append(", "); } else if (uc is ucTokenIcon ucTI) { sbItem.AppendFormat("({0})", ucTI.Token.LongDisplayString); } } if (itemList.Any()) { elements.RemoveAt(elements.Count - 1); sbItem = sbItem.Remove(sbItem.Length - 2, 2); } return new Tuple, string>(elements, sbItem.ToString()); } } }