ソースを参照

QMonitor, add navigator item context button (pass current data context), working

Dalibor Votruba 2 年 前
コミット
59acf58d5b

+ 3 - 1
Workbench/QMonitor/qmonlib.ui/App.axaml

@@ -7,12 +7,14 @@
     <Application.Styles>
         <FluentTheme />
         <StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
+        <StyleInclude Source="/Styles/Dark.axaml" />
     </Application.Styles>
   <Application.Resources>
         <FontFamily x:Key="KarmaticArcadeFont">avares://qmonlib.ui/Assets/Fonts/ka1.ttf#Karmatic Arcade</FontFamily>
         <FontFamily x:Key="ScoreBoardFont">avares://qmonlib.ui/Assets/Fonts/scoreboard.ttf#Score Board</FontFamily>
       <FontFamily x:Key="ArcadeClassicFont">avares://qmonlib.ui/Assets/Fonts/ArcadeClassic.ttf#Arcade Classic</FontFamily>
       <FontFamily x:Key="BasicDotsFont">avares://qmonlib.ui/Assets/Fonts/Basicdots.TTF#BasicDots</FontFamily>
-
+      <FontFamily x:Key="DosisLightFont">avares://qmonlib.ui/Assets/Fonts/DosisLight.ttf#Dosis</FontFamily>
+      <FontFamily x:Key="DosisSemiBoldFont">avares://qmonlib.ui/Assets/Fonts/DosisSemiBold.ttf#Dosis</FontFamily>
   </Application.Resources>
 </Application>

BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/Dosis-Bold.ttf


BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/Dosis-Book.ttf


BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/Dosis-ExtraBold.ttf


BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/Dosis-ExtraLight.ttf


BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/Dosis-Medium.ttf


BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/DosisLight.ttf


BIN
Workbench/QMonitor/qmonlib.ui/Assets/Fonts/DosisSemiBold.ttf


+ 3 - 3
Workbench/QMonitor/qmonlib.ui/Models/General/CheckBoxListItem.cs → Workbench/QMonitor/qmonlib.ui/Models/General/CheckBoxListItemModel.cs

@@ -2,7 +2,7 @@
 
 namespace qmonlib.ui.Models.General
 {
-    public class CheckBoxListItem : ReactiveObject
+    public class CheckBoxListItemModel : ReactiveObject
     {
         #region *** Private Fields ***
         private bool _isChecked;
@@ -27,12 +27,12 @@ namespace qmonlib.ui.Models.General
             set => this.RaiseAndSetIfChanged(ref _isChecked, value);
         }
         
-        public CheckBoxListItem(string identity, string name, bool isChecked = false)
+        public CheckBoxListItemModel(string identity, string name, bool isChecked = false)
         {
             Identity = identity;
             Name = name;
             IsChecked = isChecked;
         }
-        public CheckBoxListItem(string name) : this(string.Empty, name) { }
+        public CheckBoxListItemModel(string name) : this(string.Empty, name) { }
     }
 }

+ 30 - 0
Workbench/QMonitor/qmonlib.ui/Models/QMonitor/MonItemGeneralModel.cs

@@ -0,0 +1,30 @@
+using System.Linq;
+using Quadarax.Foundation.Core.QMonitor;
+
+namespace qmonlib.ui.Models.QMonitor
+{
+    public class MonItemGeneralModel : MonItemGeneral
+    {
+
+        public string ViewTypeImageSource => ViewType switch
+        {
+            MonViewType.Item => "/Images/32/document.png",
+            MonViewType.List => "/Images/32/list.png",
+            _ => "/Images/32/link-broken.png"
+        };
+
+        public int ItemsCount => Items.Count;
+        public string ItemsListString => string.Join(", ", Items.Select(x => x.Name));
+
+        public MonItemGeneralModel() { }
+        public MonItemGeneralModel(MonItemGeneral general)
+        {
+            Name = general.Name;
+            Caption = general.Caption;
+            Description = general.Description;
+            ViewType = general.ViewType;
+            KeyOrdinals = general.KeyOrdinals;
+            Items = general.Items;
+        }
+    }
+}

+ 29 - 0
Workbench/QMonitor/qmonlib.ui/Styles/Dark.axaml

@@ -0,0 +1,29 @@
+<Styles xmlns="https://github.com/avaloniaui"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Design.PreviewWith>
+        <Border Padding="20">
+            <!-- Add Controls for Previewer Here -->
+        </Border>
+        
+    </Design.PreviewWith>
+   
+    <!-- * Window * -->
+    <Style Selector="Window">
+        <Setter Property="FontFamily" Value="Dosis"/>
+        <Setter Property="FontSize" Value="10"/>
+        <!--<Setter Property="Background" Value="Black"/>-->
+        <!--<Setter Property="Foreground" Value="GreenYellow"/>-->
+    </Style>
+    <Style Selector="Border">
+        <Setter Property="BorderBrush" Value="DarkGreen"/>
+    </Style>
+    <Style Selector="SplitView">
+        <!--<Setter Property="PaneBackground" Value="Black"/>-->
+        <Setter Property="Foreground" Value="GreenYellow"/>
+        <Setter Property="BorderThickness" Value="1"/>
+    </Style>
+    <Style Selector="TextBlock">
+        <Setter Property="Height" Value="12"/>
+        <Setter Property="FontSize" Value="10"/>
+    </Style>
+</Styles>

+ 30 - 13
Workbench/QMonitor/qmonlib.ui/ViewModels/Navigator/NavSearchViewModel.cs

@@ -4,8 +4,10 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Diagnostics;
 using System.Linq;
+using System.Reactive;
 using System.Reactive.Linq;
 using qmonlib.ui.Models.General;
+using qmonlib.ui.Models.QMonitor;
 using Quadarax.Foundation.Core.QMonitor;
 using Quadarax.Foundation.Core.Value;
 using Quadarax.Foundation.Core.Value.Extensions;
@@ -18,10 +20,21 @@ namespace qmonlib.ui.ViewModels.Navigator
 
         #region *** Private Fields ***
         private readonly ObservableCollection<MonGeneral> _allData;
-        private readonly ConcurrentDictionary<string,CheckBoxListItem> _instancesCache = new ConcurrentDictionary<string, CheckBoxListItem>();
+        private readonly ConcurrentDictionary<string,CheckBoxListItemModel> _instancesCache = new ConcurrentDictionary<string, CheckBoxListItemModel>();
         private string? _searchText;
         #endregion
 
+
+        #region *** Commands ***
+        public ReactiveCommand<MonItemGeneralModel, Unit> CmdOpenChannel { get; }
+
+        private void OnCmdOpenChannel(MonItemGeneralModel item)
+        {
+            throw new NotImplementedException();
+        }
+
+        #endregion
+
         /// <summary>
         /// Filter pattern expression
         /// </summary>
@@ -34,7 +47,7 @@ namespace qmonlib.ui.ViewModels.Navigator
         /// <summary>
         /// List of general metadata (filtered by <see cref="SearchText"/>)
         /// </summary>
-        public ObservableCollection<MonItemGeneral> DataFiltered
+        public ObservableCollection<MonItemGeneralModel> DataFiltered
         {
             get
             {
@@ -44,8 +57,8 @@ namespace qmonlib.ui.ViewModels.Navigator
                         string.Equals(y.Name, x.InstanceIdentifier, StringComparison.InvariantCultureIgnoreCase) &&
                         y.IsChecked));
                 Debug.WriteLine($"*DataFiltered.dataInstances cnt = {dataInstances.Count()}");
-                var result = new ObservableCollection<MonItemGeneral>(
-                    dataInstances.SelectMany(x => x.Items).Where(x => x.Name.Like(SearchText))
+                var result = new ObservableCollection<MonItemGeneralModel>(
+                    dataInstances.SelectMany(x => x.Items).Where(x => x.Name.Like(SearchText)).Select(x => new MonItemGeneralModel(x))
                 );
                 Debug.WriteLine($"*DataFiltered cnt = {result.Count}");
                 return result;
@@ -56,11 +69,11 @@ namespace qmonlib.ui.ViewModels.Navigator
         /// <summary>
         /// List of general metadata source instances
         /// </summary>
-        public ObservableCollection<CheckBoxListItem> DataInstances
+        public ObservableCollection<CheckBoxListItemModel> DataInstances
         {
             get
             {
-                var newInstances = _allData.Select(x => x.InstanceIdentifier).Distinct().Select(x => new CheckBoxListItem(x));
+                var newInstances = _allData.Select(x => x.InstanceIdentifier).Distinct().Select(x => new CheckBoxListItemModel(x));
                 foreach (var newInstance in newInstances)
                 {
                     if (_instancesCache.ContainsKey(newInstance.Name))
@@ -69,7 +82,7 @@ namespace qmonlib.ui.ViewModels.Navigator
                     _instancesCache.TryAdd(newInstance.Name, newInstance);
                 }
 
-                return new ObservableCollection<CheckBoxListItem>(_instancesCache.Select(x=>x.Value));
+                return new ObservableCollection<CheckBoxListItemModel>(_instancesCache.Select(x=>x.Value));
             }
             set => throw new NotSupportedException();
         }
@@ -105,6 +118,10 @@ namespace qmonlib.ui.ViewModels.Navigator
 
         public NavSearchViewModel()
         {
+            // Commands binding
+            CmdOpenChannel = ReactiveCommand.Create<MonItemGeneralModel>(OnCmdOpenChannel);
+
+
             _allData = new ObservableCollection<MonGeneral>();
 
             // refresh handling subscriptions
@@ -124,16 +141,16 @@ namespace qmonlib.ui.ViewModels.Navigator
             {
                 InstanceIdentifier = "inst1",
             };
-            gen1.Items.Add(new MonItemGeneral() { Name = "Fee.Foo.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item });
-            gen1.Items.Add(new MonItemGeneral() { Name = "Fee.Foo.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.List });
-            gen1.Items.Add(new MonItemGeneral() { Name = "Fee.Foo.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item });
+            gen1.Items.Add(new MonItemGeneralModel() { Name = "Fee.Foo.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item });
+            gen1.Items.Add(new MonItemGeneralModel() { Name = "Fee.Foo.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.List });
+            gen1.Items.Add(new MonItemGeneralModel() { Name = "Fee.Foo.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item });
             var gen2 = new MonGeneral()
             {
                 InstanceIdentifier = "inst2",
             };
-            gen2.Items.Add(new MonItemGeneral() { Name = "Fee.Frr.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item });
-            gen2.Items.Add(new MonItemGeneral() { Name = "Fee.Frr.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.Item });
-            gen2.Items.Add(new MonItemGeneral() { Name = "Fee.Frr.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item });
+            gen2.Items.Add(new MonItemGeneralModel() { Name = "Fee.Frr.Item1", Caption = "this is item1", ViewType = MonItemGeneral.MonViewType.Item });
+            gen2.Items.Add(new MonItemGeneralModel() { Name = "Fee.Frr.Item2", Caption = "this is item2", ViewType = MonItemGeneral.MonViewType.Item });
+            gen2.Items.Add(new MonItemGeneralModel() { Name = "Fee.Frr.Item3", Caption = "this is item3", ViewType = MonItemGeneral.MonViewType.Item });
 
             _allData.Add(gen1);
             _allData.Add(gen2);

+ 0 - 4
Workbench/QMonitor/qmonlib.ui/Views/Monitor/MonitoCaptionView.axaml

@@ -8,8 +8,6 @@
       Margin="1"
       Padding="1"
       BorderThickness="2"
-      BorderBrush="Yellow"
-      Background="DarkBlue"
       >
           <Grid>
               <Grid.ColumnDefinitions>
@@ -21,8 +19,6 @@
               </Grid.RowDefinitions>     
               
               <TextBlock 
-                  FontFamily="{StaticResource BasicDotsFont}" 
-                  FontSize="12" 
                   Foreground="White" 
                   Text="MyCaption is dome" 
                   Grid.Column="0"

+ 33 - 1
Workbench/QMonitor/qmonlib.ui/Views/Navigator/NavGeneralMetadata.axaml

@@ -20,7 +20,39 @@
         <ListBox Grid.Row="1" ItemsSource="{Binding DataFiltered}" >
             <ListBox.ItemTemplate>
                 <DataTemplate>
-                    <TextBlock Text="{Binding Name}"/>
+                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
+                        <Button Width="10" Height="10" HotKey="Enter" Command="{Binding $parent[ListBox].DataContext.CmdOpenChannel}" CommandParameter="{Binding }">
+                            <Button.Content>
+                                <Image Source="{Binding ViewTypeImageSource}" />
+                            </Button.Content>
+                        </Button>
+                        <Button Width="10" Height="10" HotKey="T">
+                            <Button.Content>
+                                <Image Source="/Images/32/information.png" />
+                            </Button.Content>
+                        </Button>
+                        <TextBlock Text="{Binding Name}">
+                            <ToolTip.Tip>
+                                <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
+                                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
+                                        <Image Source="{Binding ViewTypeImageSource}" Width="12" Height="12"/>
+                                        <TextBlock Classes="tooltip caption" Text="{Binding Caption}"/>
+                                    </StackPanel>
+                                    <TextBlock Classes="tooltip name" Text="{Binding Name}"/>
+                                    <TextBlock Classes="tooltip description" Text="{Binding Description}"/>
+                                    <TextBlock Classes="tooltip content">
+                                        <TextBlock.Text>
+                                            <MultiBinding StringFormat="{}Items [{0}]: {1}">
+                                                <Binding Path="ItemsCount" />
+                                                <Binding Path="ItemsListString" />
+                                            </MultiBinding>
+                                        </TextBlock.Text>
+                                    </TextBlock>
+                                </StackPanel>
+                            </ToolTip.Tip>
+                        </TextBlock>
+                    </StackPanel>
+                    
                 </DataTemplate>
             </ListBox.ItemTemplate>
         </ListBox>

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

@@ -17,7 +17,11 @@
   
   <ItemGroup>
     <None Remove="Images\32\adjust.png" />
+    <None Remove="Images\32\document.png" />
     <None Remove="Images\32\gear.png" />
+    <None Remove="Images\32\information.png" />
+    <None Remove="Images\32\link-broken.png" />
+    <None Remove="Images\32\list.png" />
     <None Remove="Images\32\log.png" />
     <None Remove="Images\32\tag.png" />
     <None Remove="Images\32\tag_cyan.png" />
@@ -40,7 +44,11 @@
 
   <ItemGroup>
     <AvaloniaResource Include="Images\32\adjust.png" />
+    <AvaloniaResource Include="Images\32\document.png" />
     <AvaloniaResource Include="Images\32\gear.png" />
+    <AvaloniaResource Include="Images\32\information.png" />
+    <AvaloniaResource Include="Images\32\link-broken.png" />
+    <AvaloniaResource Include="Images\32\list.png" />
     <AvaloniaResource Include="Images\32\log.png" />
     <AvaloniaResource Include="Images\32\tag.png" />
     <AvaloniaResource Include="Images\32\tag_cyan.png" />