From 7bb7a174ed494c66eb00cb8078b1298f292f1dd2 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:08:56 +0200 Subject: [PATCH] Show progress message on progress bar --- .../Processing/ProcessingProgress.cs | 6 ++- .../Processing/Processors/HtmlProcessor.cs | 2 +- src/Markdowser/Utilities/BytesToString.cs | 50 +++++++++++++++++++ .../ViewModels/MainWindowViewModel.cs | 49 +++++++++++++++--- src/Markdowser/Views/MainWindow.axaml | 2 +- 5 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 src/Markdowser/Utilities/BytesToString.cs diff --git a/src/Markdowser/Processing/ProcessingProgress.cs b/src/Markdowser/Processing/ProcessingProgress.cs index 4d7c68c..029d6f6 100644 --- a/src/Markdowser/Processing/ProcessingProgress.cs +++ b/src/Markdowser/Processing/ProcessingProgress.cs @@ -1,10 +1,12 @@ namespace Markdowser.Processing; -public readonly struct ProcessingProgress(long current, long total, string? message = null) +public readonly struct ProcessingProgress(long current, long total, string? message = null, bool isBytes = false) { public long Current { get; } = current; public long Total { get; } = total; public string? Message { get; } = message; - public int Percentage => (int)((double)Total / Current * 100); + public bool IsBytes { get; } = isBytes; + + public int Percentage => (int)((double)Current / Total * 100); } \ No newline at end of file diff --git a/src/Markdowser/Processing/Processors/HtmlProcessor.cs b/src/Markdowser/Processing/Processors/HtmlProcessor.cs index efb9b56..42b9597 100644 --- a/src/Markdowser/Processing/Processors/HtmlProcessor.cs +++ b/src/Markdowser/Processing/Processors/HtmlProcessor.cs @@ -49,7 +49,7 @@ internal partial class HtmlProcessor : IContentProcessor { _ = html.AppendLine(await streamReader.ReadLineAsync()); - progress.Report(new ProcessingProgress(length, contentStream.Position)); + progress.Report(new ProcessingProgress(contentStream.Position, length)); } HtmlDocument htmlDoc = new HtmlDocument(); diff --git a/src/Markdowser/Utilities/BytesToString.cs b/src/Markdowser/Utilities/BytesToString.cs new file mode 100644 index 0000000..4816ce3 --- /dev/null +++ b/src/Markdowser/Utilities/BytesToString.cs @@ -0,0 +1,50 @@ +using System; +using System.Globalization; + +namespace Markdowser.Utilities; + +internal static class BytesToString +{ + public static string Convert(long value) + { + string suffix; + double readable; + switch (Math.Abs(value)) + { + case >= 0x1000000000000000: + suffix = "EiB"; + readable = value >> 50; + break; + + case >= 0x4000000000000: + suffix = "PiB"; + readable = value >> 40; + break; + + case >= 0x10000000000: + suffix = "TiB"; + readable = value >> 30; + break; + + case >= 0x40000000: + suffix = "GiB"; + readable = value >> 20; + break; + + case >= 0x100000: + suffix = "MiB"; + readable = value >> 10; + break; + + case >= 0x400: + suffix = "KiB"; + readable = value; + break; + + default: + return value.ToString("0 B"); + } + + return (readable / 1024).ToString("0.00 ", CultureInfo.InvariantCulture) + suffix; + } +} \ No newline at end of file diff --git a/src/Markdowser/ViewModels/MainWindowViewModel.cs b/src/Markdowser/ViewModels/MainWindowViewModel.cs index 0e22407..a36e358 100644 --- a/src/Markdowser/ViewModels/MainWindowViewModel.cs +++ b/src/Markdowser/ViewModels/MainWindowViewModel.cs @@ -31,7 +31,9 @@ public partial class MainWindowViewModel : ViewModelBase private WindowState windowState; private bool showSidePanel; private bool isBusy; - private int progress; + private double progress; + private double progressMax; + private string progressText; public ObservableCollection Tabs { get; } = [new TabItem() { Header = "New Tab" }]; public TabItem CurrentTab @@ -108,7 +110,7 @@ public partial class MainWindowViewModel : ViewModelBase set => this.RaiseAndSetIfChanged(ref isBusy, value); } - public int Progress + public double Progress { get => progress; set @@ -118,6 +120,18 @@ public partial class MainWindowViewModel : ViewModelBase } } + public double ProgressMax + { + get => progressMax; + set => _ = this.RaiseAndSetIfChanged(ref progressMax, value); + } + + public string ProgressText + { + get => progressText; + set => this.RaiseAndSetIfChanged(ref progressText, value); + } + public SettingsViewModel SettingsViewModel => new SettingsViewModel(); public bool CloseTabEnabled => Tabs.Count > 1; public bool BackEnabled => CurrentTabState.BackHistory.Count > 0; @@ -205,6 +219,7 @@ public partial class MainWindowViewModel : ViewModelBase contentProcessorManager.RegisterProcessor(new HtmlProcessor()); contentProcessorManager.RegisterProcessor(new CommonImageProcessor()); + contentProcessorManager.RegisterProcessor(new DownloadProcessor()); GlobalState.ThemeChanged += (s, e) => { @@ -276,7 +291,7 @@ public partial class MainWindowViewModel : ViewModelBase } else { - HttpResponseMessage httpResponseMessage = await httpClient.GetAsync(Url); + HttpResponseMessage httpResponseMessage = await httpClient.GetAsync(Url, HttpCompletionOption.ResponseHeadersRead); string? newUrl = httpResponseMessage.RequestMessage?.RequestUri?.ToString(); string oldUrl = Url; @@ -300,14 +315,17 @@ public partial class MainWindowViewModel : ViewModelBase return; } - Content = await contentProcessorManager.ProcessContent(httpResponseMessage, new Progress(p => Progress = p.Percentage)); + Content = await contentProcessorManager.ProcessContent(httpResponseMessage, new Progress(UpdateProgress)); - if (oldUrl != Url) + if (Content.Cacheable) { - cacheService.Set(oldUrl, Content); - } + if (oldUrl != Url) + { + cacheService.Set(oldUrl, Content); + } - cacheService.Set(Url, Content); + cacheService.Set(Url, Content); + } } Dispatcher.UIThread.Post(() => CurrentTab.Header = Content.Title); @@ -354,6 +372,21 @@ public partial class MainWindowViewModel : ViewModelBase }); } + private void UpdateProgress(ProcessingProgress progress) + { + Progress = progress.Current; + ProgressMax = progress.Total; + + if (progress.IsBytes) + { + ProgressText = $"{progress.Message} ({{1:0}}%) {BytesToString.Convert((long)Progress)}/{BytesToString.Convert((long)ProgressMax)}"; + } + else + { + ProgressText = $"{progress.Message} ({{1:0}}%) {{0}}/{{3}}"; + } + } + private void UrlChanged(object? sender, EventArgs e) { this.RaisePropertyChanged(nameof(ForwardEnabled)); diff --git a/src/Markdowser/Views/MainWindow.axaml b/src/Markdowser/Views/MainWindow.axaml index 0ddbd58..8361b8f 100644 --- a/src/Markdowser/Views/MainWindow.axaml +++ b/src/Markdowser/Views/MainWindow.axaml @@ -114,7 +114,7 @@ - +