diff --git a/AvaloniaVisualBasic/App.axaml b/AvaloniaVisualBasic/App.axaml index 8659b02..3cf851d 100644 --- a/AvaloniaVisualBasic/App.axaml +++ b/AvaloniaVisualBasic/App.axaml @@ -1,12 +1,16 @@ + + + @@ -34,6 +38,6 @@ - + \ No newline at end of file diff --git a/AvaloniaVisualBasic/App.axaml.cs b/AvaloniaVisualBasic/App.axaml.cs index a538423..0692db9 100644 --- a/AvaloniaVisualBasic/App.axaml.cs +++ b/AvaloniaVisualBasic/App.axaml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Globalization; using System.Threading.Tasks; using Avalonia; @@ -12,6 +13,7 @@ using AvaloniaVisualBasic.VisualDesigner; using Classic.Avalonia.Theme; using Classic.CommonControls.Dialogs; +using CommunityToolkit.Mvvm.ComponentModel; using R3; namespace AvaloniaVisualBasic; @@ -27,9 +29,6 @@ public override void Initialize() public override void OnFrameworkInitializationCompleted() { - var rootViewModel = new DISetup().Root; - Static.RootViewModel = rootViewModel; - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { // Line below is needed to remove Avalonia data validation. @@ -39,19 +38,17 @@ public override void OnFrameworkInitializationCompleted() if (Static.ForceSingleView) { Static.SingleView = true; - Static.MainView = new MainView - { - DataContext = rootViewModel - }; - - desktop.MainWindow = new ClassicWindow() + Static.MainView = new MainView(); + desktop.MainWindow = new ClassicWindow { Content = Static.MainView }; - rootViewModel.ObservePropertyChanged(x => x.Title) - .Subscribe(title => desktop.MainWindow.Title = title); - + if (desktop.MainWindow.DataContext is MainViewViewModel rootViewModel) + { + rootViewModel.ObservePropertyChanged(x => x.Title) + .Subscribe(title => desktop.MainWindow.Title = title); + } #if DEBUG desktop.MainWindow.AttachDevTools(); #endif @@ -60,10 +57,7 @@ public override void OnFrameworkInitializationCompleted() } else { - var mainWindow = new MainWindow - { - DataContext = rootViewModel - }; + var mainWindow = new MainWindow(); desktop.MainWindow = mainWindow; Static.SingleView = false; Static.MainView = mainWindow.MainView; @@ -72,10 +66,7 @@ public override void OnFrameworkInitializationCompleted() else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) { Static.SingleView = true; - singleViewPlatform.MainView = Static.MainView = new MainView - { - DataContext = rootViewModel - }; + singleViewPlatform.MainView = Static.MainView = new MainView(); Static.MainView.WindowInitialized(); } diff --git a/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj b/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj index 527804b..bdb4fc7 100644 --- a/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj +++ b/AvaloniaVisualBasic/AvaloniaVisualBasic.csproj @@ -21,7 +21,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/AvaloniaVisualBasic/Composition.cs b/AvaloniaVisualBasic/Composition.cs new file mode 100644 index 0000000..6d94567 --- /dev/null +++ b/AvaloniaVisualBasic/Composition.cs @@ -0,0 +1,37 @@ +using Pure.DI; +using System.Diagnostics; +using AvaloniaVisualBasic.IDE; +using AvaloniaVisualBasic.Projects; +using AvaloniaVisualBasic.Tools; +using AvaloniaVisualBasic.VisualDesigner; +using static Pure.DI.Lifetime; +using static Pure.DI.RootKinds; +using MdiWindowManager = AvaloniaVisualBasic.IDE.MdiWindowManager; + +namespace AvaloniaVisualBasic; + +public partial class Composition +{ + [Conditional("DI")] + static void Setup() => + DI.Setup() + .DefaultLifetime(Singleton) + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Bind().To() + .Root(nameof(Root), kind: Virtual); +} \ No newline at end of file diff --git a/AvaloniaVisualBasic/Controls/Properties/PropertyBox.axaml b/AvaloniaVisualBasic/Controls/Properties/PropertyBox.axaml index dc19e7d..b0df92d 100644 --- a/AvaloniaVisualBasic/Controls/Properties/PropertyBox.axaml +++ b/AvaloniaVisualBasic/Controls/Properties/PropertyBox.axaml @@ -4,10 +4,11 @@ xmlns:commonControls="clr-namespace:Classic.CommonControls;assembly=Classic.CommonControls.Avalonia" xmlns:builtinTypes="clr-namespace:AvaloniaVisualBasic.Runtime.BuiltinTypes;assembly=AvaloniaVisualBasic.Runtime" xmlns:converters="clr-namespace:AvaloniaVisualBasic.Converters" + xmlns:avaloniaVisualBasic="clr-namespace:AvaloniaVisualBasic" x:ClassModifier="internal"> - + - + diff --git a/AvaloniaVisualBasic/Controls/Properties/PropertyFontBox.cs b/AvaloniaVisualBasic/Controls/Properties/PropertyFontBox.cs index 7be0040..d70d3af 100644 --- a/AvaloniaVisualBasic/Controls/Properties/PropertyFontBox.cs +++ b/AvaloniaVisualBasic/Controls/Properties/PropertyFontBox.cs @@ -4,6 +4,7 @@ using Avalonia.Controls.Primitives; using Avalonia.Data; using Avalonia.Interactivity; +using AvaloniaVisualBasic.IDE; using AvaloniaVisualBasic.Runtime.BuiltinTypes; using AvaloniaVisualBasic.Utils; using Classic.CommonControls.Dialogs; @@ -14,6 +15,7 @@ public class PropertyFontBox : TemplatedControl { public static readonly StyledProperty FontProperty = AvaloniaProperty.Register("Font", defaultBindingMode: BindingMode.TwoWay, defaultValue: VBFont.Default); public static readonly DirectProperty FontNameProperty = AvaloniaProperty.RegisterDirect("FontName", o => o.FontName); + public static readonly StyledProperty WindowManagerProperty = AvaloniaProperty.Register("WindowManager"); public string? FontName { @@ -26,6 +28,12 @@ public VBFont Font set => SetValue(FontProperty, value); } + public WindowManager WindowManager + { + get => GetValue(WindowManagerProperty); + set => SetValue(WindowManagerProperty, value); + } + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); @@ -37,7 +45,7 @@ private void OnButtonClick(object? sender, RoutedEventArgs e) { async Task OpenFontWindow() { - var result = await Static.RootViewModel.WindowManager.ShowFontDialog(new FontDialogResult(Font.FontFamily, Font.Style, Font.Weight, Font.Size)); + var result = await WindowManager.ShowFontDialog(new FontDialogResult(Font.FontFamily, Font.Style, Font.Weight, Font.Size)); if (result != null) { SetCurrentValue(FontProperty, new VBFont(result.Family, (int)result.Size, result.Weight, result.Style)); diff --git a/AvaloniaVisualBasic/DISetup.cs b/AvaloniaVisualBasic/DISetup.cs deleted file mode 100644 index 224390c..0000000 --- a/AvaloniaVisualBasic/DISetup.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using Pure.DI; -using System.Diagnostics; -using AvaloniaVisualBasic.IDE; -using AvaloniaVisualBasic.Projects; -using AvaloniaVisualBasic.Tools; -using AvaloniaVisualBasic.VisualDesigner; -using static Pure.DI.Lifetime; -using MdiWindowManager = AvaloniaVisualBasic.IDE.MdiWindowManager; - -namespace AvaloniaVisualBasic; - -public partial class DISetup -{ - [Conditional("DI")] - static void Setup() => - DI.Setup() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Bind().As(Singleton).To() - .Root("Root"); - - public static MainViewViewModel DesignTimeRootViewModel => new DISetup().Root; -} \ No newline at end of file diff --git a/AvaloniaVisualBasic/DesignTimeComposition.cs b/AvaloniaVisualBasic/DesignTimeComposition.cs new file mode 100644 index 0000000..03958b1 --- /dev/null +++ b/AvaloniaVisualBasic/DesignTimeComposition.cs @@ -0,0 +1,10 @@ +using System; + +namespace AvaloniaVisualBasic; + +public class DesignTimeComposition: Composition +{ + private readonly Lazy designTimeRoot = new(); + + public override MainViewViewModel Root => designTimeRoot.Value; +} \ No newline at end of file diff --git a/AvaloniaVisualBasic/MainView.axaml b/AvaloniaVisualBasic/MainView.axaml index a6d8a83..888d095 100644 --- a/AvaloniaVisualBasic/MainView.axaml +++ b/AvaloniaVisualBasic/MainView.axaml @@ -10,54 +10,55 @@ xmlns:ide="clr-namespace:AvaloniaVisualBasic.IDE" xmlns:projects="clr-namespace:AvaloniaVisualBasic.Projects" mc:Ignorable="d" d:DesignWidth="1080" d:DesignHeight="551" - x:DataType="vb:MainViewViewModel" + DataContext="{StaticResource Composition}" + Design.DataContext="{d:DesignInstance vb:Composition}" + x:DataType="vb:Composition" x:Name="RootView" - Design.DataContext="{x:Static vb:DISetup.DesignTimeRootViewModel}" x:Class="AvaloniaVisualBasic.MainView"> + ExecutingCommand="{CompiledBinding Root.NYI}" /> + ExecutingCommand="{CompiledBinding Root.NewProject}"/> + ExecutingCommand="{CompiledBinding Root.AddProject}"/> + ExecutingCommand="{CompiledBinding Root.About}" /> + ExecutingCommand="{CompiledBinding Root.OpenAddInManager}" /> + ExecutingCommand="{CompiledBinding Root.OpenOptions}" /> + ExecutingCommand="{CompiledBinding Root.OpenProjectExplorerTool}" /> + ExecutingCommand="{CompiledBinding Root.OpenPropertiesTool}" /> + ExecutingCommand="{CompiledBinding Root.OpenFormLayoutTool}" /> + ExecutingCommand="{CompiledBinding Root.OpenToolBox}" /> + ExecutingCommand="{CompiledBinding Root.OpenImmediateTool}" /> + ExecutingCommand="{CompiledBinding Root.OpenLocalsTool}" /> + ExecutingCommand="{CompiledBinding Root.OpenWatchesTool}" /> + ExecutingCommand="{CompiledBinding Root.OpenColorPaletteTool}" /> + ExecutingCommand="{CompiledBinding Root.StartDefaultProjectCommand}" /> + ExecutingCommand="{CompiledBinding Root.StartDefaultProjectWithFullCompileCommand}" /> + ExecutingCommand="{CompiledBinding Root.BreakProjectCommand}" /> + ExecutingCommand="{CompiledBinding Root.EndProjectCommand}" /> + ExecutingCommand="{CompiledBinding Root.RestartProjectCommand}" /> @@ -65,47 +66,47 @@ ExecutingCommand="{x:Static vb:ApplicationCommands.DisabledCommand}" /> + ExecutingCommand="{CompiledBinding Root.SaveProject}" /> + ExecutingCommand="{CompiledBinding Root.SaveProjectAs}" /> + ExecutingCommand="{CompiledBinding Root.OpenProject}" /> + ExecutingCommand="{CompiledBinding Root.MakeProjectCommand}" /> + ExecutingCommand="{CompiledBinding Root.RemoveProjectCommand}" /> + ExecutingCommand="{CompiledBinding Root.StepInto}" /> + ExecutingCommand="{CompiledBinding Root.StepOver}" /> + ExecutingCommand="{CompiledBinding Root.StepOut}" /> + ExecutingCommand="{CompiledBinding Root.RunToCursor}" /> + ExecutingCommand="{CompiledBinding Root.AddWatch}" /> + ExecutingCommand="{CompiledBinding Root.EditWatch}" /> + ExecutingCommand="{CompiledBinding Root.QuickWatch}" /> + ExecutingCommand="{CompiledBinding Root.ToggleBreakpoint}" /> + ExecutingCommand="{CompiledBinding Root.ClearAllBreakpoints}" /> + ExecutingCommand="{CompiledBinding Root.SetNextStatement}" /> + ExecutingCommand="{CompiledBinding Root.ShowNextStatement}" /> + ExecutingCommand="{CompiledBinding Root.ProjectReferencesCommand}" /> + ExecutingCommand="{CompiledBinding Root.ProjectComponentsCommand}" /> + ExecutingCommand="{CompiledBinding Root.ProjectPropertiesCommand}" /> @@ -118,20 +119,20 @@ - + - - + + - + @@ -190,7 +191,7 @@ - + @@ -206,12 +207,12 @@ - + - @@ -287,12 +288,12 @@ - - - + + + - +