Bläddra i källkod

Add prototype Av UI sample to works with ServiceContainer (App.Resources) and use it inside ViewModel

Dalibor Votruba 2 år sedan
förälder
incheckning
545365ca8e

+ 28 - 1
Workbench/QMonitor/qmonlib.ui/App.axaml.cs

@@ -1,14 +1,19 @@
 using Avalonia;
 using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Markup.Xaml;
-
+using Microsoft.Extensions.DependencyInjection;
 using qmonlib.ui.ViewModels;
 using qmonlib.ui.Views;
+using System;
+using System.IO.Abstractions;
+using Quadarax.Foundation.Core.Logging;
+using Quadarax.Foundation.Core.QMonitor;
 
 namespace qmonlib.ui;
 
 public partial class App : Application
 {
+    private IServiceProvider _services;
     public override void Initialize()
     {
         AvaloniaXamlLoader.Load(this);
@@ -16,6 +21,11 @@ public partial class App : Application
 
     public override void OnFrameworkInitializationCompleted()
     {
+        ConfigureServiceProvider();
+
+        // assign list of available services to the application resources
+        this.Resources[typeof(IServiceProvider)] = _services;
+     
         if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
         {
             desktop.MainWindow = new MainWindow
@@ -33,4 +43,21 @@ public partial class App : Application
 
         base.OnFrameworkInitializationCompleted();
     }
+
+    private void ConfigureServiceProvider()
+    {
+        var services = ConfigureServices();
+        _services = services.BuildServiceProvider();
+    }
+        
+    private static IServiceCollection ConfigureServices()
+    {
+        var services = new ServiceCollection();
+        //TODO: Put service registrations here
+
+        services.AddSingleton<QMonReceiver>(new QMonReceiver(new FileSystem(),
+            QMonReceiverConfiguration.CreateDefault(), false, new ConsoleLogger()));
+        
+        return services;
+    }
 }

+ 6 - 3
Workbench/QMonitor/qmonlib.ui/ViewModels/MainViewModel.cs

@@ -1,6 +1,9 @@
-namespace qmonlib.ui.ViewModels;
+using qmonlib.ui.ViewModels.Navigator;
 
-public class MainViewModel : ViewModelBase
+namespace qmonlib.ui.ViewModels;
+
+public class MainViewModel : ReceiverViewModelBase
 {
-    public string Greeting => "Welcome to Avalonia!";
+    public NavSearchViewModel NavSearch { get; private set; } = new();
+
 }

+ 20 - 2
Workbench/QMonitor/qmonlib.ui/ViewModels/Navigator/NavSearchViewModel.cs

@@ -1,7 +1,25 @@
-namespace qmonlib.ui.ViewModels.Navigator
+using System.Collections.Generic;
+using Quadarax.Foundation.Core.QMonitor;
+
+namespace qmonlib.ui.ViewModels.Navigator
 {
-    public class NavSearchViewModel : ViewModelBase
+    public class NavSearchViewModel : ReceiverViewModelBase
     {
+        /// <summary>
+        /// Filter pattern expression
+        /// </summary>
         public string? SearchText { get; set; }
+        /// <summary>
+        /// List of general metadata (filtered by <see cref="SearchText"/>)
+        /// </summary>
+        public IList<MonGeneral> DataFiltered { get; set; } = new List<MonGeneral>();
+        /// <summary>
+        /// Count of general metadata total count (not filtered)
+        /// </summary>
+        public int DataTotalCount { get; set; }
+        /// <summary>
+        /// Count of general metadata filtered count (what returns in <see cref="DataFiltered"/>
+        /// </summary>
+        public int DataFilteredCount { get; set; }
     }
 }

+ 9 - 0
Workbench/QMonitor/qmonlib.ui/ViewModels/ReceiverViewModelBase.cs

@@ -0,0 +1,9 @@
+using Quadarax.Foundation.Core.QMonitor;
+
+namespace qmonlib.ui.ViewModels
+{
+    public class ReceiverViewModelBase : ViewModelBase
+    {
+        protected QMonReceiver Receiver => GetService<QMonReceiver>();
+    }
+}

+ 7 - 1
Workbench/QMonitor/qmonlib.ui/ViewModels/ViewModelBase.cs

@@ -1,7 +1,13 @@
-using ReactiveUI;
+using System;
+using Avalonia.Controls;
+using ReactiveUI;
 
 namespace qmonlib.ui.ViewModels;
 
 public class ViewModelBase : ReactiveObject
 {
+    protected TService GetService<TService>() where TService : notnull
+    {
+        return (TService)((IServiceProvider)Avalonia.Application.Current.FindResource(typeof(IServiceProvider))).GetService(typeof(TService));
+    }
 }

+ 2 - 1
Workbench/QMonitor/qmonlib.ui/Views/MainView.axaml

@@ -25,7 +25,8 @@
                     </Button.Content>
                 </Button>
                 <!-- Filter section -->
-                <vw-navigator:NavSearch />
+                <vw-navigator:NavFilter />
+                <vw-navigator:NavGeneralMetadata />
             </Panel>
         </SplitView.Pane>
         <!--[+]Split LVL 1-->

+ 51 - 0
Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavFilter.axaml

@@ -0,0 +1,51 @@
+<!--xmlns:vm-navigator="clr-namespace:qmonlib.ui.ViewModels.Navigator"
+             x:DataType="vm-navigator:NavSearchViewModel"-->
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:vm="clr-namespace:qmonlib.ui.ViewModels"
+             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+             x:Class="qmonlib.ui.Views.Navigator.NavFilter"
+             x:CompileBindings="False">
+
+    <!--<Design.DataContext>
+        --><!-- This only sets the DataContext for the previewer in an IDE,
+         to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) --><!--
+        <vm:MainViewModel />
+    </Design.DataContext>-->
+
+    <Grid Height="32" VerticalAlignment="Top" DataContext="{Binding NavSearch}">
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="*" />
+            <ColumnDefinition Width="Auto" />
+            <ColumnDefinition Width="32" />
+        </Grid.ColumnDefinitions>
+
+        <!-- textbox: filter input -->
+        <TextBox Name="tbSearch"
+                 Text="{Binding SearchText}"
+                 Watermark="Type pattern filter"
+                 FlowDirection="LeftToRight"
+                 Grid.Column="0"
+                 Grid.Row="0">
+            <ToolTip.Tip>
+                Put pattern like (use * for any character) string to filter requested values from list
+            </ToolTip.Tip>
+        </TextBox>
+        
+        <!-- button: clear filter -->
+        <Button
+            Width="32" Height="32"
+            VerticalAlignment="Top"
+            Grid.Column="1"
+            Grid.Row="0">
+            <Button.Content>
+                X
+            </Button.Content>
+            <ToolTip.Tip>
+                Clears filter pattern text box
+            </ToolTip.Tip>
+        </Button>
+    </Grid>
+</UserControl>

+ 2 - 2
Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavSearch.axaml.cs → Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavFilter.axaml.cs

@@ -2,9 +2,9 @@ using Avalonia.Controls;
 
 namespace qmonlib.ui.Views.Navigator
 {
-    public partial class NavSearch : UserControl
+    public partial class NavFilter : UserControl
     {
-        public NavSearch()
+        public NavFilter()
         {
             InitializeComponent();
         }

+ 32 - 0
Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavGeneralMetadata.axaml

@@ -0,0 +1,32 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:vm-navigator="clr-namespace:qmonlib.ui.ViewModels.Navigator"
+             x:DataType="vm-navigator:NavSearchViewModel"
+             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+             x:Class="qmonlib.ui.Views.Navigator.NavGeneralMetadata">
+    <Grid>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="*" />
+        </Grid.ColumnDefinitions>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto" />
+            <RowDefinition Height="*" />
+        </Grid.RowDefinitions>
+        
+        <!-- list: shows general metadata (filtered) -->
+        <!--<ListBox Grid.Row="1" Items="{Binding SearchResults}" SelectedItem="{Binding SelectedSearchResult}">
+            <ListBox.ItemTemplate>
+                <DataTemplate>
+                    <StackPanel Orientation="Horizontal">
+                        <TextBlock Text="{Binding Name}" />
+                        <TextBlock Text="{Binding Path}" />
+                    </StackPanel>
+                </DataTemplate>
+            </ListBox.ItemTemplate>
+        </ListBox>-->
+
+
+    </Grid>
+</UserControl>

+ 12 - 0
Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavGeneralMetadata.axaml.cs

@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace qmonlib.ui.Views.Navigator
+{
+    public partial class NavGeneralMetadata : UserControl
+    {
+        public NavGeneralMetadata()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 0 - 20
Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavSearch.axaml

@@ -1,20 +0,0 @@
-<UserControl xmlns="https://github.com/avaloniaui"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-             xmlns:vm-navigator="clr-namespace:qmonlib.ui.ViewModels.Navigator"
-             x:DataType="vm-navigator:NavSearchViewModel"
-             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
-             x:Class="qmonlib.ui.Views.Navigator.NavSearch"
-             x:CompileBindings="True">
-
-            <TextBox Name="tbSearch" 
-                     Text="{Binding SearchText}" 
-                     Watermark="Type pattern filter"
-                     >
-                <ToolTip.Tip>
-                    Put pattern like (use * for any character) string to filter requested values from list
-                </ToolTip.Tip>
-            </TextBox>
-             
-</UserControl>

+ 10 - 0
Workbench/QMonitor/qmonlib.ui/qmonlib.ui.csproj

@@ -24,6 +24,7 @@
     <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.4" />
     <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
     <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.4" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
   </ItemGroup>
 
   <ItemGroup>
@@ -34,4 +35,13 @@
   <ItemGroup>
     <ProjectReference Include="..\qmonlib\qmonlib.csproj" />
   </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Views\Navigator\NavFilter.axaml.cs">
+      <DependentUpon>NavFilter.axaml</DependentUpon>
+    </Compile>
+    <Compile Update="Views\Navigator\NavGeneralMetadata.axaml.cs">
+      <DependentUpon>NavGeneralMetadata.axaml</DependentUpon>
+    </Compile>
+  </ItemGroup>
 </Project>