Ejemplo n.º 1
0
        private async Task BuildPdf_ExecuteAsync()
        {
            Reporter.StartBusy();
            Reporter.StartProgress();
            var pdfBuilder = new CardPdfBuilder(Settings.Default.PdfPageSize, Settings.Default.PdfScalingPercent, Settings.Default.PdfHasCutLines, Settings.Default.CutLineSize, Settings.Default.CutLineColor);

            var images     = new List <XImage>();
            int totalCount = DisplayedCards.Aggregate(0, (a, b) => a + b.Quantity);
            var count      = 0;

            foreach (CardViewModel t in DisplayedCards)
            {
                for (var j = 0; j < t.Quantity; j++)
                {
                    await Task.Delay(1);

                    Reporter.Progress(count, 0, totalCount);
                    Reporter.Report($"Performing ancient ritual {count}/{totalCount}");

                    var enc = new JpegBitmapEncoder {
                        QualityLevel = Settings.Default.PdfJpegQuality
                    };
                    var stream = new MemoryStream();
                    enc.Frames.Add(BitmapFrame.Create(t.CardImage));
                    enc.Save(stream);
                    images.Add(XImage.FromStream(stream));

                    count += 1;
                }
            }

            Reporter.StopProgress();
            await pdfBuilder.DrawImages(images, Reporter);

            string       directory = Environment.ExpandEnvironmentVariables(Settings.Default.PdfSaveFolder);
            const string fileName  = "BoxyProxies";
            const string ext       = ".pdf";
            string       fullPath  = Path.Combine(directory, fileName + ext);
            var          tries     = 1;

            while (File.Exists(fullPath))
            {
                fullPath = Path.Combine(directory, fileName + $" ({tries})" + ext);
                tries   += 1;
            }

            Reporter.Report($"Summoning the ancient one, {fileName}");
            var message = string.Empty;

            Reporter.StopBusy();
            Reporter.StopProgress();

            if (!pdfBuilder.Document.CanSave(ref message))
            {
                Reporter.Report(message, true);
                Reporter.StopBusy();
                Reporter.StopProgress();
                return;
            }

            try
            {
                pdfBuilder.Document.Save(fullPath);
            }
            catch (Exception e)
            {
                Reporter.Report(e.Message, true);
                DisplayError(e, "Could not save PDF to file.");
                return;
            }

            Reporter.Report("Ritual complete");
            SavedPdfFilePaths.Add(fullPath);

            if (!Settings.Default.PdfOpenWhenSaveDone)
            {
                return;
            }

            try
            {
                Process.Start(fullPath);
            }
            catch (Exception e)
            {
                Reporter.Report(e.Message, true);
                DisplayError(e, "Could not open PDF. Do you have a PDF viewer installed?");
            }
        }
Ejemplo n.º 2
0
        private async Task SearchSubmit_ExecuteAsync()
        {
            DisplayErrors.Clear();
            TimeSpan?timeSinceUpdate = DateTime.Now - OracleCatalog.UpdateTime;

            if (timeSinceUpdate == null)
            {
                var yesNoDialog = new YesNoDialogViewModel("Card Catalog must be updated before continuing. Would you like to update the Card Catalog (~65 MB) now?", "Update?");
                if (!(DialogService.ShowDialog(yesNoDialog) ?? false))
                {
                    return;
                }

                await UpdateCatalog_ExecuteAsync();
            }

            if (timeSinceUpdate > TimeSpan.FromDays(7))
            {
                var yesNoDialog = new YesNoDialogViewModel("Card Catalog is out of date, it is recommended you get a new catalog now." +
                                                           "If you don't, cards may not appear in search results or you may receive old " +
                                                           "imagery. Click 'Yes' to update the Card Catalog (~65 MB) now or 'No' use the old catalog.", "Update?");
                if (!(DialogService.ShowDialog(yesNoDialog) ?? false))
                {
                    return;
                }

                await UpdateCatalog_ExecuteAsync();
            }

            DisplayedCards.Clear();
            await Task.Delay(100);

            Reporter.StartBusy();
            Reporter.StartProgress();
            Reporter.Report("Deciphering old one's poem");
            Reporter.StatusReported += BuildingCardsErrors;

            List <SearchLine> lines = DecklistText
                                      .Split(new[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries)
                                      .Where(s => !string.IsNullOrWhiteSpace(s))
                                      .Select(l => new SearchLine(l))
                                      .ToList();

            for (var i = 0; i < lines.Count; i++)
            {
                List <Card> cards = OracleCatalog.FindExactCard(lines[i].SearchTerm);

                if (!cards.Any())
                {
                    cards.Add(await ScryfallService.GetFuzzyCardAsync(lines[i].SearchTerm, Reporter));
                }

                if (!cards.Any() || cards.Any(c => c == null))
                {
                    Reporter.Report($"[{lines[i].SearchTerm}] returned no results", true);
                    continue;
                }

                Card preferredCard;

                if (cards.Count > 1)
                {
                    var cardChooser = new ChooseCardDialogViewModel(cards, Reporter);
                    await cardChooser.LoadImagesFromCards();

                    if (!(DialogService.ShowDialog(cardChooser) ?? false))
                    {
                        continue;
                    }

                    preferredCard = ArtPreferences.GetPreferredCard(cardChooser.ChosenCard);
                }
                else
                {
                    preferredCard = ArtPreferences.GetPreferredCard(cards.Single());
                }

                if (preferredCard.IsDoubleFaced)
                {
                    BitmapSource frontImage = ImageHelper.LoadBitmap(await ImageCaching.GetImageAsync(preferredCard.CardFaces[0].ImageUris.BorderCrop, Reporter));
                    var          frontVm    = new CardViewModel(Reporter, ArtPreferences, preferredCard, frontImage, lines[i].Quantity, ZoomPercent);

                    BitmapSource backImage = ImageHelper.LoadBitmap(await ImageCaching.GetImageAsync(preferredCard.CardFaces[1].ImageUris.BorderCrop, Reporter));
                    var          backVm    = new CardViewModel(Reporter, ArtPreferences, preferredCard, backImage, lines[i].Quantity, ZoomPercent, false);

                    DisplayedCards.Add(frontVm);
                    await Task.Delay(10);

                    DisplayedCards.Add(backVm);
                    await Task.Delay(10);

                    Reporter.Progress(i, 0, lines.Count - 1);
                }
                else
                {
                    BitmapSource preferredImage = ImageHelper.LoadBitmap(await ImageCaching.GetImageAsync(preferredCard.ImageUris.BorderCrop, Reporter));
                    var          cardVm         = new CardViewModel(Reporter, ArtPreferences, preferredCard, preferredImage, lines[i].Quantity, ZoomPercent);
                    DisplayedCards.Add(cardVm);
                    await Task.Delay(10);

                    Reporter.Progress(i, 0, lines.Count - 1);
                }
            }

            Reporter.StatusReported -= BuildingCardsErrors;
            Reporter.StopBusy();
            Reporter.StopProgress();
        }