From 14550aaa3ae905255a408c54ec29ac20aaa1fea6 Mon Sep 17 00:00:00 2001 From: Yuto Terada Date: Sat, 28 Sep 2024 23:09:48 +0900 Subject: [PATCH 1/2] feat: Add ToolWindowExtension --- src/Beutl.Extensibility/PageExtension.cs | 7 +++---- .../ToolWindowExtension.cs | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/Beutl.Extensibility/ToolWindowExtension.cs diff --git a/src/Beutl.Extensibility/PageExtension.cs b/src/Beutl.Extensibility/PageExtension.cs index 733eb17a3..c255d9543 100644 --- a/src/Beutl.Extensibility/PageExtension.cs +++ b/src/Beutl.Extensibility/PageExtension.cs @@ -1,23 +1,22 @@ -using System.Diagnostics.CodeAnalysis; - -using Avalonia.Controls; +using Avalonia.Controls; using FluentAvalonia.UI.Controls; namespace Beutl.Extensibility; +[Obsolete("Use ToolWindowExtension instead.")] public abstract class PageExtension : Extension { public abstract Control CreateControl(); public abstract IPageContext CreateContext(); - [Obsolete] public abstract IconSource GetFilledIcon(); public abstract IconSource GetRegularIcon(); } +[Obsolete("Use ToolWindowContext instead.")] public interface IPageContext : IDisposable { PageExtension Extension { get; } diff --git a/src/Beutl.Extensibility/ToolWindowExtension.cs b/src/Beutl.Extensibility/ToolWindowExtension.cs new file mode 100644 index 000000000..f683c3792 --- /dev/null +++ b/src/Beutl.Extensibility/ToolWindowExtension.cs @@ -0,0 +1,21 @@ +using Avalonia.Controls; + +namespace Beutl.Extensibility; + +public abstract class ToolWindowExtension : Extension +{ + public abstract bool AllowMultiple { get; } + + public abstract bool ShowAsDialog { get; } + + public abstract bool RequiresEditorContext { get; } + + public abstract Window? CreateWindow(IEditorContext? editorContext); + + public abstract IToolWindowContext? CreateContext(IEditorContext? editorContext); +} + +public interface IToolWindowContext : IDisposable +{ + ToolWindowExtension Extension { get; } +} From 3b85e99b4d4a21364eaa1c6554138c6bdd2b9347 Mon Sep 17 00:00:00 2001 From: Yuto Terada Date: Sat, 28 Sep 2024 23:10:33 +0900 Subject: [PATCH 2/2] feat: Use ToolWindowExtension in Extensions and Output --- ...sionsPage.axaml => ExtensionsDialog.axaml} | 23 +++--- ...age.axaml.cs => ExtensionsDialog.axaml.cs} | 70 ++++++++----------- .../DevelopPages/PackageDetailsPage.axaml.cs | 2 +- .../DevelopPages/PackageReleasesPage.axaml.cs | 2 +- .../DevelopPages/PackageSettingsPage.axaml.cs | 2 +- .../DevelopPages/ReleasePage.axaml.cs | 2 +- .../PublicPackageDetailsPage.axaml.cs | 2 +- .../DiscoverPages/RankingPage.axaml.cs | 2 +- .../DiscoverPages/SearchPage.axaml.cs | 2 +- src/Beutl/Pages/OutputDialog.axaml | 2 +- src/Beutl/Pages/OutputDialog.axaml.cs | 8 +-- .../PrimitiveImpls/ExtensionPageExtension.cs | 43 ------------ .../ExtensionsDialogExtension.cs | 35 ++++++++++ .../PrimitiveImpls/OutputDialogExtension.cs | 31 ++++++++ .../PrimitiveImpls/OutputPageExtension.cs | 39 ----------- .../LoadPrimitiveExtensionTask.cs | 4 +- ...wModel.cs => ExtensionsDialogViewModel.cs} | 8 +-- ...eViewModel.cs => OutputDialogViewModel.cs} | 10 ++- 18 files changed, 130 insertions(+), 157 deletions(-) rename src/Beutl/Pages/{ExtensionsPage.axaml => ExtensionsDialog.axaml} (87%) rename src/Beutl/Pages/{ExtensionsPage.axaml.cs => ExtensionsDialog.axaml.cs} (79%) delete mode 100644 src/Beutl/Services/PrimitiveImpls/ExtensionPageExtension.cs create mode 100644 src/Beutl/Services/PrimitiveImpls/ExtensionsDialogExtension.cs create mode 100644 src/Beutl/Services/PrimitiveImpls/OutputDialogExtension.cs delete mode 100644 src/Beutl/Services/PrimitiveImpls/OutputPageExtension.cs rename src/Beutl/ViewModels/{ExtensionsPageViewModel.cs => ExtensionsDialogViewModel.cs} (89%) rename src/Beutl/ViewModels/{OutputPageViewModel.cs => OutputDialogViewModel.cs} (83%) diff --git a/src/Beutl/Pages/ExtensionsPage.axaml b/src/Beutl/Pages/ExtensionsDialog.axaml similarity index 87% rename from src/Beutl/Pages/ExtensionsPage.axaml rename to src/Beutl/Pages/ExtensionsDialog.axaml index bb2f870dc..77bed8fdf 100644 --- a/src/Beutl/Pages/ExtensionsPage.axaml +++ b/src/Beutl/Pages/ExtensionsDialog.axaml @@ -1,13 +1,14 @@ - + - + diff --git a/src/Beutl/Pages/ExtensionsPage.axaml.cs b/src/Beutl/Pages/ExtensionsDialog.axaml.cs similarity index 79% rename from src/Beutl/Pages/ExtensionsPage.axaml.cs rename to src/Beutl/Pages/ExtensionsDialog.axaml.cs index d87713d2d..6eb548edf 100644 --- a/src/Beutl/Pages/ExtensionsPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsDialog.axaml.cs @@ -1,33 +1,40 @@ using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Interactivity; -using Avalonia.LogicalTree; - +using Avalonia.Platform; using Beutl.Logging; using Beutl.Pages.ExtensionsPages; using Beutl.Pages.ExtensionsPages.DevelopPages; using Beutl.Pages.ExtensionsPages.DiscoverPages; -using Beutl.Services; using Beutl.ViewModels; using Beutl.ViewModels.ExtensionsPages; using Beutl.ViewModels.ExtensionsPages.DiscoverPages; -using Beutl.Views; - using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Media.Animation; using FluentAvalonia.UI.Navigation; - +using FluentAvalonia.UI.Windowing; using Microsoft.Extensions.Logging; namespace Beutl.Pages; -public sealed partial class ExtensionsPage : UserControl +public sealed partial class ExtensionsDialog : AppWindow { - private readonly ILogger _logger = Log.CreateLogger(); + private readonly ILogger _logger = Log.CreateLogger(); - public ExtensionsPage() + public ExtensionsDialog() { InitializeComponent(); + if (OperatingSystem.IsWindows()) + { + TitleBar.ExtendsContentIntoTitleBar = true; + TitleBar.Height = 40; + } + else if (OperatingSystem.IsMacOS()) + { + ExtendClientAreaToDecorationsHint = true; + ExtendClientAreaChromeHints = ExtendClientAreaChromeHints.PreferSystemChrome; + } List items = GetItems(); nav.MenuItemsSource = items; @@ -41,21 +48,15 @@ public ExtensionsPage() nav.SelectedItem = selected; } - protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + protected override void OnOpened(EventArgs e) { - base.OnAttachedToVisualTree(e); + base.OnOpened(e); if (nav.SelectedItem is NavigationViewItem selected) { OnItemInvoked(selected); } } - protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) - { - base.OnDetachedFromVisualTree(e); - frame.SetNavigationState("|\n0\n0"); - } - private void Search_Click(object? sender, RoutedEventArgs e) { frame.Navigate(typeof(SearchPage), searchTextBox.Text); @@ -63,16 +64,15 @@ private void Search_Click(object? sender, RoutedEventArgs e) private async void OpenSettings_Click(object? sender, RoutedEventArgs e) { - if (this.FindLogicalAncestorOfType() is not { DataContext: MainViewModel viewModel }) - return; - - if (TopLevel.GetTopLevel(this) is not Window window) - return; + var mainViewModel = Application.Current!.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime + ? lifetime.MainWindow!.DataContext as MainViewModel + : null; + if (mainViewModel is null) return; - var dialogViewModel = viewModel.SettingsDialog; + var dialogViewModel = mainViewModel.SettingsDialog; var dialog = new SettingsDialog { DataContext = dialogViewModel }; dialogViewModel.GoToAccountSettingsPage(); - await dialog.ShowDialog(window); + await dialog.ShowDialog(this); } private static List GetItems() @@ -83,28 +83,19 @@ private static List GetItems() { Content = "Home", Tag = typeof(DiscoverPage), - IconSource = new SymbolIconSource - { - Symbol = Symbol.Home - } + IconSource = new SymbolIconSource { Symbol = Symbol.Home } }, new NavigationViewItem() { Content = "Library", Tag = typeof(LibraryPage), - IconSource = new SymbolIconSource - { - Symbol = Symbol.Library - } + IconSource = new SymbolIconSource { Symbol = Symbol.Library } }, new NavigationViewItem() { Content = "Develop", Tag = typeof(DevelopPage), - IconSource = new SymbolIconSource - { - Symbol = Symbol.Code - } + IconSource = new SymbolIconSource { Symbol = Symbol.Code } } ]; } @@ -125,7 +116,7 @@ private void Nav_ItemInvoked(object? sender, NavigationViewItemInvokedEventArgs private void OnItemInvoked(NavigationViewItem nvi) { if (nvi.Tag is Type typ - && DataContext is ExtensionsPageViewModel { IsAuthorized.Value: true } viewModel) + && DataContext is ExtensionsDialogViewModel { IsAuthorized.Value: true } viewModel) { NavigationTransitionInfo transitionInfo = SharedNavigationTransitionInfo.Instance; if (typ == typeof(DevelopPage)) @@ -179,6 +170,7 @@ private void Frame_Navigating(object sender, NavigatingCancelEventArgs e) entrance.FromHorizontalOffset = 28; } } + entrance.FromVerticalOffset = 0; } } @@ -212,8 +204,8 @@ private static int ToNumber(Type type) return 0; } else if (type == typeof(PackageDetailsPage) - || type == typeof(PublicPackageDetailsPage) - || type == typeof(RankingPageViewModel)) + || type == typeof(PublicPackageDetailsPage) + || type == typeof(RankingPageViewModel)) { return 1; } diff --git a/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageDetailsPage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageDetailsPage.axaml.cs index 46826fc41..c211993d0 100644 --- a/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageDetailsPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageDetailsPage.axaml.cs @@ -49,7 +49,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; } private void NavigatePackageSettingsPage_Click(object? sender, RoutedEventArgs e) diff --git a/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageReleasesPage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageReleasesPage.axaml.cs index e2f728986..62f9c0880 100644 --- a/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageReleasesPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageReleasesPage.axaml.cs @@ -57,7 +57,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; } private void OnReleasesListPointerReleased(object? sender, PointerReleasedEventArgs e) diff --git a/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageSettingsPage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageSettingsPage.axaml.cs index e8eac1a73..9dbe96ac4 100644 --- a/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageSettingsPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DevelopPages/PackageSettingsPage.axaml.cs @@ -51,7 +51,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; } private void NavigatePackageDetailsPage_Click(object? sender, RoutedEventArgs e) diff --git a/src/Beutl/Pages/ExtensionsPages/DevelopPages/ReleasePage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DevelopPages/ReleasePage.axaml.cs index 3a766cbf6..bc663c6ed 100644 --- a/src/Beutl/Pages/ExtensionsPages/DevelopPages/ReleasePage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DevelopPages/ReleasePage.axaml.cs @@ -51,7 +51,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Develop.DataContextFactory; } private void NavigatePackageDetailsPage_Click(object? sender, RoutedEventArgs e) diff --git a/src/Beutl/Pages/ExtensionsPages/DiscoverPages/PublicPackageDetailsPage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DiscoverPages/PublicPackageDetailsPage.axaml.cs index aada7d656..f3f2d0168 100644 --- a/src/Beutl/Pages/ExtensionsPages/DiscoverPages/PublicPackageDetailsPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DiscoverPages/PublicPackageDetailsPage.axaml.cs @@ -48,7 +48,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Discover.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Discover.DataContextFactory; } private async void OpenWebSite_Click(object? sender, RoutedEventArgs e) diff --git a/src/Beutl/Pages/ExtensionsPages/DiscoverPages/RankingPage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DiscoverPages/RankingPage.axaml.cs index 728f44b2f..bb0e8f965 100644 --- a/src/Beutl/Pages/ExtensionsPages/DiscoverPages/RankingPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DiscoverPages/RankingPage.axaml.cs @@ -48,7 +48,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Discover.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Discover.DataContextFactory; } private void Package_Click(object? sender, RoutedEventArgs e) diff --git a/src/Beutl/Pages/ExtensionsPages/DiscoverPages/SearchPage.axaml.cs b/src/Beutl/Pages/ExtensionsPages/DiscoverPages/SearchPage.axaml.cs index 50c4cdf25..1e7371e2f 100644 --- a/src/Beutl/Pages/ExtensionsPages/DiscoverPages/SearchPage.axaml.cs +++ b/src/Beutl/Pages/ExtensionsPages/DiscoverPages/SearchPage.axaml.cs @@ -48,7 +48,7 @@ private void DestoryDataContext() private DataContextFactory GetDataContextFactory() { - return ((ExtensionsPageViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Discover.DataContextFactory; + return ((ExtensionsDialogViewModel)this.FindLogicalAncestorOfType()!.DataContext!).Discover.DataContextFactory; } private void Package_Click(object? sender, RoutedEventArgs e) diff --git a/src/Beutl/Pages/OutputDialog.axaml b/src/Beutl/Pages/OutputDialog.axaml index f5106d508..31bad649f 100644 --- a/src/Beutl/Pages/OutputDialog.axaml +++ b/src/Beutl/Pages/OutputDialog.axaml @@ -8,7 +8,7 @@ xmlns:viewModel="using:Beutl.ViewModels" d:DesignHeight="450" d:DesignWidth="800" - x:DataType="viewModel:OutputPageViewModel" + x:DataType="viewModel:OutputDialogViewModel" mc:Ignorable="d"> "ExtensionsPage"; - - public override string DisplayName => Strings.Extensions; - - public override IPageContext CreateContext() - { - var mainViewModel = Application.Current!.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime - ? lifetime.MainWindow!.DataContext as MainViewModel - : throw new InvalidOperationException("ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime"); - return new ExtensionsPageViewModel(mainViewModel!._beutlClients); - } - - public override Control CreateControl() - { - return new Pages.ExtensionsPage(); - } - - [Obsolete] - public override IconSource GetFilledIcon() - { - return new SymbolIconSource() { Symbol = Symbol.PuzzlePiece, IsFilled = true }; - } - - public override IconSource GetRegularIcon() - { - return new SymbolIconSource() { Symbol = Symbol.PuzzlePiece }; - } -} diff --git a/src/Beutl/Services/PrimitiveImpls/ExtensionsDialogExtension.cs b/src/Beutl/Services/PrimitiveImpls/ExtensionsDialogExtension.cs new file mode 100644 index 000000000..934dc4ef1 --- /dev/null +++ b/src/Beutl/Services/PrimitiveImpls/ExtensionsDialogExtension.cs @@ -0,0 +1,35 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; +using Beutl.ViewModels; + +namespace Beutl.Services.PrimitiveImpls; + +[PrimitiveImpl] +public sealed class ExtensionsDialogExtension : ToolWindowExtension +{ + public static readonly ExtensionsDialogExtension Instance = new(); + + public override string Name => "ExtensionsDialog"; + + public override string DisplayName => Strings.Extensions; + + public override bool ShowAsDialog => true; + + public override bool RequiresEditorContext => false; + + public override bool AllowMultiple => false; + + public override IToolWindowContext CreateContext(IEditorContext? editorContext) + { + var mainViewModel = Application.Current!.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime + ? lifetime.MainWindow!.DataContext as MainViewModel + : throw new InvalidOperationException("ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime"); + return new ExtensionsDialogViewModel(mainViewModel!._beutlClients); + } + + public override Window CreateWindow(IEditorContext? editorContext) + { + return new Pages.ExtensionsDialog(); + } +} diff --git a/src/Beutl/Services/PrimitiveImpls/OutputDialogExtension.cs b/src/Beutl/Services/PrimitiveImpls/OutputDialogExtension.cs new file mode 100644 index 000000000..b1306c00d --- /dev/null +++ b/src/Beutl/Services/PrimitiveImpls/OutputDialogExtension.cs @@ -0,0 +1,31 @@ +using Avalonia.Controls; +using Beutl.Pages; +using Beutl.ViewModels; + +namespace Beutl.Services.PrimitiveImpls; + +[PrimitiveImpl] +public sealed class OutputDialogExtension : ToolWindowExtension +{ + public static readonly OutputDialogExtension Instance = new(); + + public override string Name => "OutputPage"; + + public override string DisplayName => Strings.Output; + + public override bool ShowAsDialog => true; + + public override bool RequiresEditorContext => false; + + public override bool AllowMultiple => false; + + public override IToolWindowContext CreateContext(IEditorContext? editorContext) + { + return new OutputDialogViewModel(); + } + + public override Window CreateWindow(IEditorContext? editorContext) + { + return new OutputDialog(); + } +} diff --git a/src/Beutl/Services/PrimitiveImpls/OutputPageExtension.cs b/src/Beutl/Services/PrimitiveImpls/OutputPageExtension.cs deleted file mode 100644 index f1a92699b..000000000 --- a/src/Beutl/Services/PrimitiveImpls/OutputPageExtension.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Avalonia.Controls; -using Beutl.Pages; -using Beutl.ViewModels; -using FluentAvalonia.UI.Controls; -using Symbol = FluentIcons.Common.Symbol; -using SymbolIconSource = FluentIcons.FluentAvalonia.SymbolIconSource; - -namespace Beutl.Services.PrimitiveImpls; - -[PrimitiveImpl] -public sealed class OutputPageExtension : PageExtension -{ - public static readonly OutputPageExtension Instance = new(); - - public override string Name => "OutputPage"; - - public override string DisplayName => Strings.Output; - - public override IPageContext CreateContext() - { - return new OutputPageViewModel(); - } - - public override Control CreateControl() - { - return new OutputDialog(); - } - - [Obsolete] - public override IconSource GetFilledIcon() - { - return new SymbolIconSource() { Symbol = Symbol.ArrowExportLtr, IsFilled = true }; - } - - public override IconSource GetRegularIcon() - { - return new SymbolIconSource() { Symbol = Symbol.ArrowExportLtr }; - } -} diff --git a/src/Beutl/Services/StartupTasks/LoadPrimitiveExtensionTask.cs b/src/Beutl/Services/StartupTasks/LoadPrimitiveExtensionTask.cs index ca3de57ac..95047e87e 100644 --- a/src/Beutl/Services/StartupTasks/LoadPrimitiveExtensionTask.cs +++ b/src/Beutl/Services/StartupTasks/LoadPrimitiveExtensionTask.cs @@ -9,8 +9,8 @@ public sealed class LoadPrimitiveExtensionTask : StartupTask public static readonly Extension[] PrimitiveExtensions = [ - ExtensionsPageExtension.Instance, - OutputPageExtension.Instance, + ExtensionsDialogExtension.Instance, + OutputDialogExtension.Instance, SceneEditorExtension.Instance, SceneOutputExtension.Instance, SceneProjectItemExtension.Instance, diff --git a/src/Beutl/ViewModels/ExtensionsPageViewModel.cs b/src/Beutl/ViewModels/ExtensionsDialogViewModel.cs similarity index 89% rename from src/Beutl/ViewModels/ExtensionsPageViewModel.cs rename to src/Beutl/ViewModels/ExtensionsDialogViewModel.cs index 6ad64bce7..b952d7171 100644 --- a/src/Beutl/ViewModels/ExtensionsPageViewModel.cs +++ b/src/Beutl/ViewModels/ExtensionsDialogViewModel.cs @@ -6,7 +6,7 @@ namespace Beutl.ViewModels; -public sealed class ExtensionsPageViewModel : IPageContext +public sealed class ExtensionsDialogViewModel : IToolWindowContext { private readonly CompositeDisposable _disposables = []; private readonly CompositeDisposable _authDisposables = []; @@ -15,7 +15,7 @@ public sealed class ExtensionsPageViewModel : IPageContext private Lazy? _library; private Lazy? _develop; - public ExtensionsPageViewModel(BeutlApiApplication clients) + public ExtensionsDialogViewModel(BeutlApiApplication clients) { _clients = clients; IsAuthorized = clients.AuthorizedUser @@ -56,9 +56,7 @@ public LibraryPageViewModel Library public DevelopPageViewModel Develop => _develop?.Value ?? throw new Exception("Authorization is required."); - public PageExtension Extension => ExtensionsPageExtension.Instance; - - public string Header => Strings.Extensions; + public ToolWindowExtension Extension => ExtensionsDialogExtension.Instance; public void Dispose() { diff --git a/src/Beutl/ViewModels/OutputPageViewModel.cs b/src/Beutl/ViewModels/OutputDialogViewModel.cs similarity index 83% rename from src/Beutl/ViewModels/OutputPageViewModel.cs rename to src/Beutl/ViewModels/OutputDialogViewModel.cs index 0f1bc56a6..5e9993ce2 100644 --- a/src/Beutl/ViewModels/OutputPageViewModel.cs +++ b/src/Beutl/ViewModels/OutputDialogViewModel.cs @@ -9,12 +9,12 @@ namespace Beutl.ViewModels; -public sealed class OutputPageViewModel : BasePageViewModel, IPageContext +public sealed class OutputDialogViewModel : BasePageViewModel, IToolWindowContext { private readonly OutputService _outputService; - private readonly ILogger _logger = Log.CreateLogger(); + private readonly ILogger _logger = Log.CreateLogger(); - public OutputPageViewModel() + public OutputDialogViewModel() { _outputService = OutputService.Current; CanRemove = SelectedItem @@ -22,9 +22,7 @@ public OutputPageViewModel() .ToReadOnlyReactivePropertySlim(); } - public PageExtension Extension => OutputPageExtension.Instance; - - public string Header => Strings.Output; + public ToolWindowExtension Extension => OutputDialogExtension.Instance; public ICoreList Items => _outputService.Items;