From baf41417738d6f29d8792f00c5dd4dedcec278e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Mon, 20 Oct 2025 21:10:14 +0200 Subject: [PATCH] PrintUI thing. --- .../MailRenderingPageViewModel.cs | 35 +++++-------------- .../Views/MailRenderingPage.xaml.cs | 23 ++++++++++-- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs index f6bfbe12..4aec1f3d 100644 --- a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs @@ -55,6 +55,8 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, // Used in 'Save as' and 'Print' functionality. public Func> SaveHTMLasPDFFunc { get; set; } + public Action ShowPrintUIAction { get; set; } + #region Properties public bool ShouldDisplayDownloadProgress => IsIndetermineProgress || (CurrentDownloadPercentage > 0 && CurrentDownloadPercentage <= 100); @@ -255,7 +257,7 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, } else if (operation == MailOperation.Print) { - await PrintAsync(); + ShowPrintUI(); } else if (operation == MailOperation.ViewMessageSource) { @@ -680,37 +682,16 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, } } - private async Task PrintAsync() + private void ShowPrintUI() { - // Printing: - // 1. Let WebView2 save the current HTML as PDF to temporary location. - // 2. Saving as PDF will divide pages correctly for Win2D CanvasBitmap. - // 3. Use Win2D CanvasBitmap as IPrintDocumentSource and WinRT APIs to print the PDF. - try { - var printFilePath = Path.Combine(_applicationConfiguration.ApplicationTempFolderPath, "print.pdf"); - - if (File.Exists(printFilePath)) File.Delete(printFilePath); - - await SaveHTMLasPDFFunc(printFilePath); - - var result = await PrintService.PrintPdfFileAsync(printFilePath, Subject); - - if (result == PrintingResult.Submitted) - { - _dialogService.InfoBarMessage(Translator.DialogMessage_PrintingSuccessTitle, Translator.DialogMessage_PrintingSuccessMessage, InfoBarMessageType.Success); - } - else if (result != PrintingResult.Canceled) - { - var message = string.Format(Translator.DialogMessage_PrintingFailedMessage, result); - _dialogService.InfoBarMessage(Translator.DialogMessage_PrintingFailedTitle, message, InfoBarMessageType.Warning); - } + ShowPrintUIAction?.Invoke(); } - catch (Exception ex) + catch (Exception exception) { - Log.Error(ex, "Failed to print mail."); - _dialogService.InfoBarMessage(string.Empty, ex.Message, InfoBarMessageType.Error); + Log.Error(exception, "Failed to print mail."); + _dialogService.InfoBarMessage(string.Empty, exception.Message, InfoBarMessageType.Error); } } diff --git a/Wino.Mail.WinUI/Views/MailRenderingPage.xaml.cs b/Wino.Mail.WinUI/Views/MailRenderingPage.xaml.cs index e3a56c21..4cf4a470 100644 --- a/Wino.Mail.WinUI/Views/MailRenderingPage.xaml.cs +++ b/Wino.Mail.WinUI/Views/MailRenderingPage.xaml.cs @@ -43,12 +43,29 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract, Environment.SetEnvironmentVariable("WEBVIEW2_DEFAULT_BACKGROUND_COLOR", "00FFFFFF"); Environment.SetEnvironmentVariable("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", "--enable-features=OverlayScrollbar,msOverlayScrollbarWinStyle,msOverlayScrollbarWinStyleAnimation,msWebView2CodeCache"); + ViewModel.ShowPrintUIAction = ShowPrintUI; + ViewModel.SaveHTMLasPDFFunc = new Func>((path) => { return Chromium.CoreWebView2.PrintToPdfAsync(path, null).AsTask(); }); } + private async void ShowPrintUI() + { + if (Chromium.CoreWebView2 == null) return; + + // TODO: Footer still shows wino.mail/html, there is no way to change it currently. + // TODO: ShowPrintUI - System doesn't open. + // TODO: ShowPrintUI - System doesn't open. + + // Set the document title before printing. This title will be used in the print dialog and header. + await Chromium.CoreWebView2.ExecuteScriptAsync($"document.title = '{ViewModel.Subject}';"); + var settings = Chromium.CoreWebView2.Environment.CreatePrintSettings(); + + Chromium.CoreWebView2?.ShowPrintUI(CoreWebView2PrintDialogKind.System); + } + public override async void OnEditorThemeChanged() { base.OnEditorThemeChanged(); @@ -181,7 +198,7 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract, var editorBundlePath = (await ViewModel.NativeAppService.GetEditorBundlePathAsync()).Replace("editor.html", string.Empty); - Chromium.CoreWebView2.SetVirtualHostNameToFolderMapping("app.reader", editorBundlePath, CoreWebView2HostResourceAccessKind.Allow); + Chromium.CoreWebView2.SetVirtualHostNameToFolderMapping("wino.mail", editorBundlePath, CoreWebView2HostResourceAccessKind.Allow); Chromium.CoreWebView2.DOMContentLoaded -= DOMContentLoaded; Chromium.CoreWebView2.DOMContentLoaded += DOMContentLoaded; @@ -189,7 +206,7 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract, Chromium.CoreWebView2.NewWindowRequested -= WindowRequested; Chromium.CoreWebView2.NewWindowRequested += WindowRequested; - Chromium.Source = new Uri("https://app.reader/reader.html"); + Chromium.Source = new Uri("https://wino.mail/reader.html"); } @@ -206,7 +223,7 @@ public sealed partial class MailRenderingPage : MailRenderingPageAbstract, private async void WebViewNavigationStarting(WebView2 sender, CoreWebView2NavigationStartingEventArgs args) { // This is our reader. - if (args.Uri == "https://app.reader/reader.html") + if (args.Uri == "https://wino.mail/reader.html") return; // Cancel all external navigations since it's navigating to different address inside the WebView2.