using LegoArtTool; using Microsoft.Win32; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Shapes; namespace LegoArt { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private readonly LegoArtColorService legoArtColorService; private readonly BitmapHelperService bitmapHelperService; private readonly ImageHelperService imageHelperService; private LegoArtImageGenerationService legoArtImageGenerationService; public MainWindow() { InitializeComponent(); legoArtColorService = new LegoArtColorService(); bitmapHelperService = new BitmapHelperService(); imageHelperService = new ImageHelperService(); legoArtImageGenerationService = new LegoArtImageGenerationService(); } private void btnImageChooser_Click(object sender, RoutedEventArgs e) { var openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == true) { tbImagePath.Text = openFileDialog.FileName; Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = Cursors.Wait; }); LoadImage(openFileDialog.FileName); Application.Current.Dispatcher.Invoke(() => { Mouse.OverrideCursor = null; }); } } private void LoadImage(string path) { var bitmap = new System.Drawing.Bitmap(path); var reducedBitMap = legoArtImageGenerationService.GenerateLegoArtImageFromFullColorImage(bitmap); var legoArtColors = legoArtColorService.ParseImage(reducedBitMap); if (legoArtColors != null) { var sourceBitmap = bitmapHelperService.Scale(reducedBitMap, 1); sourceImage.Source = imageHelperService.LoadToImage(sourceBitmap); var convertedBitmap = bitmapHelperService.ConvertToPixelMatrix(sourceBitmap, 20); scaledImage.Source = imageHelperService.LoadToImage(convertedBitmap); parentStackPanel.Children.Clear(); AddLine(System.Drawing.Color.White, "Have", "Needed", "RGB", "#", "Difference", System.Drawing.Color.White); var sortedColors = legoArtColors.OrderBy(c => c.LegoNumber).ToList(); for (int i = 0; i < sortedColors.Count; i++) { var color = sortedColors[i].Color; var textRgb = $"{color.R};{color.G};{color.B}"; var difference = sortedColors[i].HaveCount - sortedColors[i].NeedCount; var statusColor = difference < 0 ? System.Drawing.Color.Red : System.Drawing.Color.Green; AddLine(color, sortedColors[i].HaveCount.ToString(), sortedColors[i].NeedCount.ToString(), textRgb, sortedColors[i].LegoNumber.ToString(), difference.ToString(), statusColor); } var have = legoArtColors.Sum(l => l.HaveCount); var needed = legoArtColors.Sum(l => l.NeedCount); AddLine(System.Drawing.Color.White, have.ToString(), needed.ToString(), "Total:", "", "", System.Drawing.Color.White); } else { MessageBox.Show("Image includes wrong colors", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } private void AddLine(System.Drawing.Color color, string textHave, string textNeed, string textRgb, string textNumber, string textDifference, System.Drawing.Color statusColor) { var displayColor = imageHelperService.ConvertDrawingToWindowsMediaColor(color); var rect = new Rectangle(); rect.Width = 20; rect.Height = 20; rect.Fill = new SolidColorBrush(displayColor); var textBlockHave = new TextBlock(); textBlockHave.Width = 40; textBlockHave.Height = 20; textBlockHave.TextAlignment = TextAlignment.Center; textBlockHave.Text = textHave; var textBlockNeed = new TextBlock(); textBlockNeed.Width = 50; textBlockNeed.Height = 20; textBlockNeed.TextAlignment = TextAlignment.Center; textBlockNeed.Text = textNeed; var textBlockRgb = new TextBlock(); textBlockRgb.Width = 100; textBlockRgb.Height = 20; textBlockRgb.TextAlignment = TextAlignment.Left; textBlockRgb.Text = textRgb; var legoNumber = new TextBlock(); legoNumber.Width = 20; legoNumber.Height = 20; legoNumber.TextAlignment = TextAlignment.Center; legoNumber.Text = textNumber; var differenceTextBlock = new TextBlock(); differenceTextBlock.Width = 55; differenceTextBlock.Height = 20; differenceTextBlock.TextAlignment = TextAlignment.Center; differenceTextBlock.Text = textDifference; var displayStatusColor = imageHelperService.ConvertDrawingToWindowsMediaColor(statusColor); var status = new Rectangle(); status.Width = 20; status.Height = 20; status.Fill = new SolidColorBrush(displayStatusColor); var stackPanel = new StackPanel(); stackPanel.Orientation = Orientation.Horizontal; stackPanel.Margin = new Thickness(2, 2, 2, 2); stackPanel.Children.Add(legoNumber); stackPanel.Children.Add(rect); stackPanel.Children.Add(textBlockRgb); stackPanel.Children.Add(textBlockHave); stackPanel.Children.Add(textBlockNeed); stackPanel.Children.Add(differenceTextBlock); stackPanel.Children.Add(status); parentStackPanel.Children.Add(stackPanel); } } }