using Microsoft.Web.WebView2.Core; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Models.Printing; namespace Wino.Mail.WinUI.Extensions; /// /// Extension methods and utilities for converting between Domain print models and CoreWebView2 print settings. /// public static class PrintSettingsExtensions { /// /// Converts a Domain PrintOrientation to CoreWebView2PrintOrientation. /// public static CoreWebView2PrintOrientation ToCoreWebView2Orientation(this PrintOrientation orientation) { return orientation switch { PrintOrientation.Portrait => CoreWebView2PrintOrientation.Portrait, PrintOrientation.Landscape => CoreWebView2PrintOrientation.Landscape, _ => CoreWebView2PrintOrientation.Portrait }; } /// /// Converts a CoreWebView2PrintOrientation to Domain PrintOrientation. /// public static PrintOrientation ToDomainOrientation(this CoreWebView2PrintOrientation orientation) { return orientation switch { CoreWebView2PrintOrientation.Portrait => PrintOrientation.Portrait, CoreWebView2PrintOrientation.Landscape => PrintOrientation.Landscape, _ => PrintOrientation.Portrait }; } /// /// Converts a Domain PrintColorMode to CoreWebView2PrintColorMode. /// public static CoreWebView2PrintColorMode ToCoreWebView2ColorMode(this PrintColorMode colorMode) { return colorMode switch { PrintColorMode.Default => CoreWebView2PrintColorMode.Default, PrintColorMode.Color => CoreWebView2PrintColorMode.Color, PrintColorMode.Grayscale => CoreWebView2PrintColorMode.Grayscale, _ => CoreWebView2PrintColorMode.Default }; } /// /// Converts a CoreWebView2PrintColorMode to Domain PrintColorMode. /// public static PrintColorMode ToDomainColorMode(this CoreWebView2PrintColorMode colorMode) { return colorMode switch { CoreWebView2PrintColorMode.Default => PrintColorMode.Default, CoreWebView2PrintColorMode.Color => PrintColorMode.Color, CoreWebView2PrintColorMode.Grayscale => PrintColorMode.Grayscale, _ => PrintColorMode.Default }; } /// /// Converts a Domain PrintCollation to CoreWebView2PrintCollation. /// public static CoreWebView2PrintCollation ToCoreWebView2Collation(this PrintCollation collation) { return collation switch { PrintCollation.Default => CoreWebView2PrintCollation.Default, PrintCollation.Collated => CoreWebView2PrintCollation.Collated, PrintCollation.Uncollated => CoreWebView2PrintCollation.Uncollated, _ => CoreWebView2PrintCollation.Default }; } /// /// Converts a CoreWebView2PrintCollation to Domain PrintCollation. /// public static PrintCollation ToDomainCollation(this CoreWebView2PrintCollation collation) { return collation switch { CoreWebView2PrintCollation.Default => PrintCollation.Default, CoreWebView2PrintCollation.Collated => PrintCollation.Collated, CoreWebView2PrintCollation.Uncollated => PrintCollation.Uncollated, _ => PrintCollation.Default }; } /// /// Converts a Domain PrintDuplex to CoreWebView2PrintDuplex. /// public static CoreWebView2PrintDuplex ToCoreWebView2Duplex(this PrintDuplex duplex) { // Note: Simplified mapping due to enum value differences return duplex switch { PrintDuplex.Default => CoreWebView2PrintDuplex.Default, _ => CoreWebView2PrintDuplex.Default }; } /// /// Converts a CoreWebView2PrintDuplex to Domain PrintDuplex. /// public static PrintDuplex ToDomainDuplex(this CoreWebView2PrintDuplex duplex) { // Note: Simplified mapping due to enum value differences return duplex switch { CoreWebView2PrintDuplex.Default => PrintDuplex.Default, _ => PrintDuplex.Default }; } /// /// Converts a Domain PrintMediaSize to CoreWebView2PrintMediaSize. /// public static CoreWebView2PrintMediaSize ToCoreWebView2MediaSize(this PrintMediaSize mediaSize) { // Note: Simplified mapping due to enum value differences return mediaSize switch { PrintMediaSize.Default => CoreWebView2PrintMediaSize.Default, _ => CoreWebView2PrintMediaSize.Default }; } /// /// Converts a CoreWebView2PrintMediaSize to Domain PrintMediaSize. /// public static PrintMediaSize ToDomainMediaSize(this CoreWebView2PrintMediaSize mediaSize) { // Note: Simplified mapping due to enum value differences return mediaSize switch { CoreWebView2PrintMediaSize.Default => PrintMediaSize.Default, _ => PrintMediaSize.Default }; } /// /// Creates a CoreWebView2PrintSettings object from a WebView2PrintSettingsModel. /// /// The domain model containing the print settings. /// The CoreWebView2Environment to create the settings object. /// A configured CoreWebView2PrintSettings object. public static CoreWebView2PrintSettings ToCoreWebView2PrintSettings( this WebView2PrintSettingsModel model, CoreWebView2Environment environment) { var settings = environment.CreatePrintSettings(); settings.PrinterName = model.PrinterName; settings.Orientation = model.Orientation.ToCoreWebView2Orientation(); settings.ColorMode = model.ColorMode.ToCoreWebView2ColorMode(); settings.Collation = model.Collation.ToCoreWebView2Collation(); settings.Duplex = model.Duplex.ToCoreWebView2Duplex(); settings.MediaSize = model.MediaSize.ToCoreWebView2MediaSize(); settings.Copies = model.Copies; settings.MarginTop = model.MarginTop; settings.MarginBottom = model.MarginBottom; settings.MarginLeft = model.MarginLeft; settings.MarginRight = model.MarginRight; settings.ShouldPrintBackgrounds = model.ShouldPrintBackgrounds; settings.ShouldPrintSelectionOnly = model.ShouldPrintSelectionOnly; settings.ShouldPrintHeaderAndFooter = model.ShouldPrintHeaderAndFooter; settings.HeaderTitle = model.HeaderTitle; settings.FooterUri = model.FooterUri; settings.ScaleFactor = model.ScaleFactor; settings.PagesPerSide = model.PagesPerSide; settings.PageRanges = model.PageRanges; return settings; } /// /// Creates a CoreWebView2PrintSettings object containing only document-safe settings for PDF generation. /// Printer job options such as copies, duplex, printer name, N-up, and page ranges stay in the WinRT print session. /// public static CoreWebView2PrintSettings ToCoreWebView2PdfRenderSettings( this WebView2PrintSettingsModel model, CoreWebView2Environment environment) { var settings = environment.CreatePrintSettings(); settings.Orientation = model.Orientation.ToCoreWebView2Orientation(); settings.ColorMode = model.ColorMode.ToCoreWebView2ColorMode(); settings.MediaSize = model.MediaSize.ToCoreWebView2MediaSize(); settings.MarginTop = model.MarginTop; settings.MarginBottom = model.MarginBottom; settings.MarginLeft = model.MarginLeft; settings.MarginRight = model.MarginRight; settings.ShouldPrintBackgrounds = model.ShouldPrintBackgrounds; settings.ShouldPrintSelectionOnly = model.ShouldPrintSelectionOnly; settings.ShouldPrintHeaderAndFooter = model.ShouldPrintHeaderAndFooter; settings.HeaderTitle = model.HeaderTitle; settings.FooterUri = model.FooterUri; settings.ScaleFactor = model.ScaleFactor; return settings; } /// /// Updates a WebView2PrintSettingsModel from a CoreWebView2PrintSettings object. /// /// The domain model to update. /// The source CoreWebView2PrintSettings. public static void FromCoreWebView2PrintSettings( this WebView2PrintSettingsModel model, CoreWebView2PrintSettings settings) { if (settings == null) return; model.PrinterName = settings.PrinterName ?? string.Empty; model.Orientation = settings.Orientation.ToDomainOrientation(); model.ColorMode = settings.ColorMode.ToDomainColorMode(); model.Collation = settings.Collation.ToDomainCollation(); model.Duplex = settings.Duplex.ToDomainDuplex(); model.MediaSize = settings.MediaSize.ToDomainMediaSize(); model.Copies = settings.Copies; model.MarginTop = settings.MarginTop; model.MarginBottom = settings.MarginBottom; model.MarginLeft = settings.MarginLeft; model.MarginRight = settings.MarginRight; model.ShouldPrintBackgrounds = settings.ShouldPrintBackgrounds; model.ShouldPrintSelectionOnly = settings.ShouldPrintSelectionOnly; model.ShouldPrintHeaderAndFooter = settings.ShouldPrintHeaderAndFooter; model.HeaderTitle = settings.HeaderTitle ?? string.Empty; model.FooterUri = settings.FooterUri ?? string.Empty; model.ScaleFactor = settings.ScaleFactor; model.PagesPerSide = settings.PagesPerSide; model.PageRanges = settings.PageRanges ?? string.Empty; } }