diff --git a/src/Markdowser/GlobalSuppressions.cs b/src/Markdowser/GlobalSuppressions.cs index e7bc418..5814a4d 100644 --- a/src/Markdowser/GlobalSuppressions.cs +++ b/src/Markdowser/GlobalSuppressions.cs @@ -7,4 +7,5 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("Minor Code Smell", "S1075:URIs should not be hardcoded", Justification = "")] [assembly: SuppressMessage("Minor Code Smell", "CS0067:The event 'ChangeThemeCommand.CanExecuteChanged' is never used", Justification = "", Scope = "member", Target = "~N:Markdowser.Commands")] -[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "")] \ No newline at end of file +[assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "")] +[assembly: SuppressMessage("Minor Code Smell", "S3267:Loops should be simplified with \"LINQ\" expressions", Justification = "", Scope = "member", Target = "~M:Markdowser.Processing.ContentProcessorManager.ProcessContent(System.Net.HttpWebResponse,System.IProgress{Markdowser.Processing.ProcessingProgress})~Markdowser.ViewModels.ContentViewModelBase")] \ No newline at end of file diff --git a/src/Markdowser/Markdowser.csproj b/src/Markdowser/Markdowser.csproj index 77074ed..47eb033 100644 --- a/src/Markdowser/Markdowser.csproj +++ b/src/Markdowser/Markdowser.csproj @@ -37,4 +37,9 @@ + + + + + diff --git a/src/Markdowser/Processing/ContentProcessor.cs b/src/Markdowser/Processing/ContentProcessor.cs new file mode 100644 index 0000000..638b59a --- /dev/null +++ b/src/Markdowser/Processing/ContentProcessor.cs @@ -0,0 +1,24 @@ +using Markdowser.ViewModels; + +using System; +using System.Collections.Generic; +using System.Net; +using System.Threading.Tasks; + +namespace Markdowser.Processing; + +internal class ContentProcessorManager +{ + private readonly List processors = []; + + public void RegisterProcessor(IContentProcessor processor) + { + processors.Add(processor); + } + + public Task ProcessContent(HttpWebResponse response, IProgress progress) + { + IContentProcessor? processor = processors.Find(processor => processor.CanProcess(response)) ?? throw new InvalidOperationException("No processor found for the given response."); + return processor.Process(response, progress); + } +} \ No newline at end of file diff --git a/src/Markdowser/Processing/IContentProcessor.cs b/src/Markdowser/Processing/IContentProcessor.cs new file mode 100644 index 0000000..62ea995 --- /dev/null +++ b/src/Markdowser/Processing/IContentProcessor.cs @@ -0,0 +1,14 @@ +using Markdowser.ViewModels; + +using System; +using System.Net; +using System.Threading.Tasks; + +namespace Markdowser.Processing; + +internal interface IContentProcessor +{ + bool CanProcess(HttpWebResponse response); + + Task Process(HttpWebResponse response, IProgress progress); +} \ No newline at end of file diff --git a/src/Markdowser/Processing/ProcessingProgress.cs b/src/Markdowser/Processing/ProcessingProgress.cs new file mode 100644 index 0000000..6ea5107 --- /dev/null +++ b/src/Markdowser/Processing/ProcessingProgress.cs @@ -0,0 +1,9 @@ +namespace Markdowser.Processing; + +public readonly struct ProcessingProgress(int current, int total) +{ + public int Current { get; } = current; + public int Total { get; } = total; + + public double Percentage => (double)Current / Total * 100; +} \ No newline at end of file diff --git a/src/Markdowser/Utilities/ColumnDefinition.cs b/src/Markdowser/Utilities/ColumnDefinition.cs index 20caaa3..d0e7cf8 100644 --- a/src/Markdowser/Utilities/ColumnDefinition.cs +++ b/src/Markdowser/Utilities/ColumnDefinition.cs @@ -13,7 +13,7 @@ internal static class ColumnDefinition } else if (!visibility) { - _ = element.SetValue(LastWidthProperty, element.GetValue(Avalonia.Controls.ColumnDefinition.WidthProperty)); + _ = element.SetValue(LastWidthProperty!, element.GetValue(Avalonia.Controls.ColumnDefinition.WidthProperty)); _ = element.SetValue(Avalonia.Controls.ColumnDefinition.WidthProperty, ZeroWidth); } return visibility; diff --git a/src/Markdowser/ViewModels/Content/MarkdownContentViewModel.cs b/src/Markdowser/ViewModels/Content/MarkdownContentViewModel.cs new file mode 100644 index 0000000..3831b93 --- /dev/null +++ b/src/Markdowser/ViewModels/Content/MarkdownContentViewModel.cs @@ -0,0 +1,6 @@ +namespace Markdowser.ViewModels.Content; + +public class MarkdownContentViewModel(string title, string markdown) : ContentViewModelBase(title) +{ + public string Markdown { get; } = markdown; +} \ No newline at end of file diff --git a/src/Markdowser/ViewModels/ContentViewModelBase.cs b/src/Markdowser/ViewModels/ContentViewModelBase.cs new file mode 100644 index 0000000..95f0edf --- /dev/null +++ b/src/Markdowser/ViewModels/ContentViewModelBase.cs @@ -0,0 +1,6 @@ +namespace Markdowser.ViewModels; + +public abstract class ContentViewModelBase(string title) +{ + public string Title { get; } = title; +} \ No newline at end of file diff --git a/src/Markdowser/ViewModels/MainWindowViewModel.cs b/src/Markdowser/ViewModels/MainWindowViewModel.cs index 2488d4a..9c06dfe 100644 --- a/src/Markdowser/ViewModels/MainWindowViewModel.cs +++ b/src/Markdowser/ViewModels/MainWindowViewModel.cs @@ -35,7 +35,6 @@ public partial class MainWindowViewModel : ViewModelBase private bool isBusy; private int progress; public ObservableCollection Tabs => GlobalState.Tabs; - public string Title => $"{nameof(Markdowser)} - {Assembly.GetExecutingAssembly().GetName().Version?.ToString()}"; public TabItem CurrentTab { @@ -178,6 +177,8 @@ public partial class MainWindowViewModel : ViewModelBase GlobalState.ContentReload += (sender, _) => { + // Updatre icon when dark mode changes + this.RaisePropertyChanged(nameof(Icon)); this.RaisePropertyChanged(nameof(Content)); }; } diff --git a/src/Markdowser/ViewModels/ViewModelBase.cs b/src/Markdowser/ViewModels/ViewModelBase.cs index 28a9281..249c5d2 100644 --- a/src/Markdowser/ViewModels/ViewModelBase.cs +++ b/src/Markdowser/ViewModels/ViewModelBase.cs @@ -1,6 +1,17 @@ -using ReactiveUI; +using Avalonia.Controls; +using Avalonia.Platform; + +using Markdowser.Models; + +using ReactiveUI; + +using System.Reflection; namespace Markdowser.ViewModels; + public class ViewModelBase : ReactiveObject { -} + public string Title => $"{nameof(Markdowser)} - {Assembly.GetExecutingAssembly().GetName().Version?.ToString()}"; + + public WindowIcon Icon => Settings.Current.DarkMode ? new WindowIcon(AssetLoader.Open(new("avares://Markdowser/Assets/Markdowser-Dark-Transparent.ico"))) : new WindowIcon(AssetLoader.Open(new("avares://Markdowser/Assets/Markdowser-Light-Transparent.ico"))); +} \ No newline at end of file diff --git a/src/Markdowser/Views/MainWindow.axaml b/src/Markdowser/Views/MainWindow.axaml index 16f5b4a..6b8fef6 100644 --- a/src/Markdowser/Views/MainWindow.axaml +++ b/src/Markdowser/Views/MainWindow.axaml @@ -11,7 +11,7 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Markdowser.Views.MainWindow" x:DataType="vm:MainWindowViewModel" - Icon="/Assets/Markdowser-Light-Transparent.ico" + Icon="{Binding Icon}" Title="{Binding Title}">