luo 3 місяців тому
батько
коміт
d3040e548f

+ 23 - 0
Avalonia/ShakerApp/ViewModels/Log/LogItemViewModel.cs

@@ -0,0 +1,23 @@
+using Shaker.Models;
+using ShakerApp.Models;
+using System;
+
+namespace ShakerApp.ViewModels
+{
+    public class LogItemViewModel:ViewModelBase<LogItemModel>
+    {
+        public LogItemViewModel(string message, LogType logType= LogType.Info)
+        {
+            UpDateModel(new LogItemModel()
+            {
+                DateTime = DateTime.Now,
+                Message = message,
+                LogType = logType
+            });
+        }
+
+        public DateTime DateTime => Model.DateTime;
+        public string Message => Model.Message;
+        public LogType LogType => Model.LogType;
+    }
+}

+ 9 - 0
Avalonia/ShakerApp/ViewModels/Log/LogType.cs

@@ -0,0 +1,9 @@
+namespace ShakerApp.ViewModels
+{
+    public enum LogType
+    {
+        Info,
+        Warn,
+        Error,
+    }
+}

+ 46 - 0
Avalonia/ShakerApp/ViewModels/Log/LogViewModel.cs

@@ -0,0 +1,46 @@
+using Avalonia.Collections;
+using Shaker.Models;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ShakerApp.ViewModels
+{
+    internal class LogViewModel:ViewModelBase<IModel>
+    {
+        private object locker = new object();
+        public AvaloniaList<IndexValueItemViewModel<LogItemViewModel>> Logs { get; } = new AvaloniaList<IndexValueItemViewModel<LogItemViewModel>>();
+        private LogViewModel()
+        {
+            ButtonVisibily = false;
+            Content = typeof(Views.LogsView);
+            GetEvent<Models.LogItemModel>().Subscrip((sender, args) =>
+            {
+                lock (locker)
+                {
+                    Tools.DispatherInovke.Inovke(()=> Logs.Add(new IndexValueItemViewModel<LogItemViewModel>(Logs.Count+1,new LogItemViewModel(args.Data.Message,args.Data.LogType))));
+                }
+            });
+            GetEvent(nameof(Models.LogItemModel)).Subscrip((sender, args) =>
+            {
+                if(args.Data.Length >=2 && args.Data[0] is string msg && args.Data[1] is LogType type)
+                {
+                    AddLog(msg, type);
+                }
+            });
+        }
+        static LogViewModel()
+        {
+
+        }
+        public void AddLog(string msg,LogType logType = LogType.Info)
+        {
+            lock (locker)
+            {
+               Tools.DispatherInovke.Inovke(()=>  Logs.Add(new IndexValueItemViewModel<LogItemViewModel>(Logs.Count + 1, new LogItemViewModel(msg, logType))));
+            }
+        }
+        public static LogViewModel Instance { get; } = new LogViewModel();
+    }
+}

+ 67 - 0
Avalonia/ShakerApp/Views/Log/LogsView.axaml

@@ -0,0 +1,67 @@
+<UserControl
+    x:Class="ShakerApp.Views.LogsView"
+    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="using:ShakerApp.ViewModels"
+    d:DesignHeight="450"
+    d:DesignWidth="800"
+    x:DataType="vm:LogViewModel"
+    Background="Transparent"
+    DataContext="{Binding Source={x:Static vm:LogViewModel.Instance}}"
+    mc:Ignorable="d">
+    <StackPanel Background="Transparent">
+        <Grid
+            Height="{StaticResource ItemHeight}"
+            Background="LightGray"
+            ColumnDefinitions="40,0.5*,*">
+            <TextBlock
+                HorizontalAlignment="Center"
+                VerticalAlignment="Center"
+                Text="{DynamicResource ServoValveIndex}" />
+            <TextBlock
+                Grid.Column="1"
+                HorizontalAlignment="Center"
+                VerticalAlignment="Center"
+                Text="{DynamicResource Time}" />
+            <TextBlock
+                Grid.Column="2"
+                HorizontalAlignment="Center"
+                VerticalAlignment="Center"
+                Text="{DynamicResource Message}" />
+        </Grid>
+        <ScrollViewer Height="{Binding $parent.Bounds.Height, Converter={StaticResource SubtractionConverter}, ConverterParameter={StaticResource ItemHeight}}">
+            <ItemsControl ItemsSource="{Binding Logs}">
+                <ItemsControl.ItemTemplate>
+                    <DataTemplate>
+                        <Grid Height="{StaticResource ItemHeight}" ColumnDefinitions="40,0.5*,*">
+                            <Grid.Styles>
+                                <Style Selector="TextBlock.Error">
+                                    <Setter Property="Foreground" Value="Red" />
+                                </Style>
+                            </Grid.Styles>
+                            <TextBlock
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Classes.Error="{Binding Value.LogType, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static vm:LogType.Error}}"
+                                Text="{Binding Index}" />
+                            <TextBlock
+                                Grid.Column="1"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Classes.Error="{Binding Value.LogType, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static vm:LogType.Error}}"
+                                Text="{Binding Value.DateTime, StringFormat='{}{0:yyyy-MM-dd HH:mm:ss.fff}'}" />
+                            <TextBlock
+                                Grid.Column="2"
+                                HorizontalAlignment="Center"
+                                VerticalAlignment="Center"
+                                Classes.Error="{Binding Value.LogType, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static vm:LogType.Error}}"
+                                Text="{Binding Value.Message}" />
+                        </Grid>
+                    </DataTemplate>
+                </ItemsControl.ItemTemplate>
+            </ItemsControl>
+        </ScrollViewer>
+    </StackPanel>
+</UserControl>

+ 13 - 0
Avalonia/ShakerApp/Views/Log/LogsView.axaml.cs

@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace ShakerApp.Views;
+
+public partial class LogsView : UserControl
+{
+    public LogsView()
+    {
+        InitializeComponent();
+    }
+}