合并参数设置页面优化

master
tayttt 3 days ago
commit b4b6b9fb4b

@ -16,6 +16,7 @@ namespace Txgy.EWS.Client.MainModule.ViewModels
{ {
private const string SystemSettingsTargetView = "SystemSettingsView"; private const string SystemSettingsTargetView = "SystemSettingsView";
private const string AdvancedSystemSettingsTargetView = "SystemSettingsAdvanced"; private const string AdvancedSystemSettingsTargetView = "SystemSettingsAdvanced";
private const string SystemSettingsMenuHeader = "参数设置";
public List<MenuItemModel> Menus { get; set; } = new List<MenuItemModel>(); public List<MenuItemModel> Menus { get; set; } = new List<MenuItemModel>();
@ -53,7 +54,9 @@ namespace Txgy.EWS.Client.MainModule.ViewModels
MenuItemModel mm = new MenuItemModel(_regionManager) MenuItemModel mm = new MenuItemModel(_regionManager)
{ {
MenuHeader = item.MenuHeader, MenuHeader = string.Equals(item.TargetView, SystemSettingsTargetView, StringComparison.OrdinalIgnoreCase)
? SystemSettingsMenuHeader
: item.MenuHeader,
MenuIcon = item.MenuIcon, MenuIcon = item.MenuIcon,
TargetView = item.TargetView TargetView = item.TargetView
}; };
@ -73,7 +76,7 @@ namespace Txgy.EWS.Client.MainModule.ViewModels
Menus.Add(new MenuItemModel(_regionManager) Menus.Add(new MenuItemModel(_regionManager)
{ {
MenuHeader = "系统设置", MenuHeader = SystemSettingsMenuHeader,
MenuIcon = "\ue64c", MenuIcon = "\ue64c",
TargetView = SystemSettingsTargetView, TargetView = SystemSettingsTargetView,
Children = new List<MenuItemModel>() Children = new List<MenuItemModel>()

@ -5,11 +5,11 @@
"paths": { "paths": {
"alarmSetting": "\\resources\\alarmsetting.json", "alarmSetting": "\\resources\\alarmsetting.json",
"alarmLevelConfig": "\\resources\\alarmlevel.json", "alarmLevelConfig": "\\resources\\alarmlevel.json",
"reportEventLevelSetting": "resources\\ReportEventLevelSettings.json", "reportEventLevelSetting": "\\resources\\ReportEventLevelSettings.json",
"workAreaFilePath": "\\resources\\WorkAreaSettings-N2107.json", "workAreaFilePath": "\\resources\\WorkAreaSettings-N2107.json",
"stationsCsvFilePath": "\\resources\\N2107_1116.csv", "stationsCsvFilePath": "\\resources\\N2107_1116.csv",
"cadDwgFilePath": "\\resources\\N2107_V2013_1117.dwg", "cadDwgFilePath": "\\resources\\N2107_V2013_1117.dwg",
"dwgJsonSetting": "resources\\DwgSetting.json", "dwgJsonSetting": "\\resources\\DwgSetting.json",
"wavesMseedFilePath": "D:\\EwsCache\\Mseed", "wavesMseedFilePath": "D:\\EwsCache\\Mseed",
"wavesTxtFilePath": "D:\\EwsCache\\Txt", "wavesTxtFilePath": "D:\\EwsCache\\Txt",
"localSqLiteDb": "EwsLocalSqLite.db", "localSqLiteDb": "EwsLocalSqLite.db",

@ -47,6 +47,7 @@
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath> <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference> </Reference>

@ -4,6 +4,7 @@ using Prism.Mvvm;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
@ -11,12 +12,16 @@ using System.Windows.Media;
using Txgy.EWS.Client.Common; using Txgy.EWS.Client.Common;
using Txgy.EWS.Client.Common.MessageEvents; using Txgy.EWS.Client.Common.MessageEvents;
using Txgy.EWS.Client.Entity; using Txgy.EWS.Client.Entity;
using Microsoft.Win32;
using Forms = System.Windows.Forms;
namespace Txgy.EWS.Client.SysModule.ViewModels namespace Txgy.EWS.Client.SysModule.ViewModels
{ {
public class SystemSettingsViewModel : BindableBase public class SystemSettingsViewModel : BindableBase
{ {
private const string AdvancedSettingsTargetView = "SystemSettingsAdvanced"; private const string AdvancedSettingsTargetView = "SystemSettingsAdvanced";
private const string ResourcesDirectoryName = "resources";
private const string ResourcesRelativePrefix = "\\resources\\";
private static readonly string[] AdvancedSettingsFallbackTargetViews = private static readonly string[] AdvancedSettingsFallbackTargetViews =
{ {
"MenuManagementView", "MenuManagementView",
@ -27,6 +32,7 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
private readonly IEventAggregator _eventAggregator; private readonly IEventAggregator _eventAggregator;
private string _statusMessage; private string _statusMessage;
private Brush _statusBrush = Brushes.Gray; private Brush _statusBrush = Brushes.Gray;
private bool _canEditSystemSettings;
public SystemSettingsViewModel(IEventAggregator eventAggregator) public SystemSettingsViewModel(IEventAggregator eventAggregator)
{ {
@ -51,6 +57,21 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
public bool CanEditAdvancedSettings { get; } public bool CanEditAdvancedSettings { get; }
public Visibility AdvancedSettingsVisibility => CanEditAdvancedSettings ? Visibility.Visible : Visibility.Collapsed; public Visibility AdvancedSettingsVisibility => CanEditAdvancedSettings ? Visibility.Visible : Visibility.Collapsed;
public bool CanEditSystemSettings
{
get => _canEditSystemSettings;
set
{
if (SetProperty(ref _canEditSystemSettings, value))
{
RaisePropertyChanged(nameof(SystemSettingsReadOnly));
RaisePropertyChanged(nameof(SystemSettingsEditButtonText));
}
}
}
public bool SystemSettingsReadOnly => !CanEditSystemSettings;
public string SystemSettingsEditButtonText => CanEditSystemSettings ? "保存" : "高级修改";
public string ApiDomain { get; set; } public string ApiDomain { get; set; }
public string AlarmSetting { get; set; } public string AlarmSetting { get; set; }
@ -91,6 +112,10 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
public ICommand ReloadCommand => new DelegateCommand(ReloadFromConfig); public ICommand ReloadCommand => new DelegateCommand(ReloadFromConfig);
public ICommand ApplyCommand => new DelegateCommand(ApplyConfig); public ICommand ApplyCommand => new DelegateCommand(ApplyConfig);
public ICommand BrowseResourceFileCommand => new DelegateCommand<string>(BrowseResourceFile);
public ICommand BrowseLocalFileCommand => new DelegateCommand<string>(BrowseLocalFile);
public ICommand BrowseFolderCommand => new DelegateCommand<string>(BrowseFolder);
public ICommand ToggleSystemSettingsEditCommand => new DelegateCommand(ToggleSystemSettingsEdit);
private void ReloadFromConfig() private void ReloadFromConfig()
{ {
@ -106,6 +131,11 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
} }
private void ApplyConfig() private void ApplyConfig()
{
TryApplyConfig();
}
private bool TryApplyConfig()
{ {
try try
{ {
@ -121,11 +151,277 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
} }
Load(savedConfig); Load(savedConfig);
SetStatus($"配置已应用:{DateTime.Now:HH:mm:ss}", Brushes.Green); SetStatus($"配置已应用:{DateTime.Now:HH:mm:ss}", Brushes.Green);
return true;
} }
catch (Exception ex) catch (Exception ex)
{ {
SetStatus($"应用失败:{ex.Message}", Brushes.Red); SetStatus($"应用失败:{ex.Message}", Brushes.Red);
return false;
}
}
private void ToggleSystemSettingsEdit()
{
if (CanEditSystemSettings)
{
if (TryApplyConfig())
{
CanEditSystemSettings = false;
SetStatus($"系统参数已保存:{DateTime.Now:HH:mm:ss}", Brushes.Green);
}
return;
}
var result = MessageBox.Show(
"系统参数会影响系统名称显示和缓存目录,是否确认修改系统参数?",
"高级修改",
MessageBoxButton.YesNo,
MessageBoxImage.Warning);
if (result != MessageBoxResult.Yes)
{
return;
}
CanEditSystemSettings = true;
SetStatus("系统参数已解锁", Brushes.Gray);
}
private void BrowseResourceFile(string targetName)
{
var resourcesDirectory = GetResourcesDirectory();
if (!Directory.Exists(resourcesDirectory))
{
SetStatus($"resources目录不存在{resourcesDirectory}", Brushes.Red);
return;
}
var dialog = new OpenFileDialog
{
CheckFileExists = true,
Multiselect = false,
Title = "选择resources目录下的文件",
Filter = GetFileFilter(targetName),
InitialDirectory = GetInitialDirectory(GetPathValue(targetName), true)
};
if (dialog.ShowDialog() != true)
{
return;
}
if (!TryGetResourcesRelativePath(dialog.FileName, out var relativePath))
{
SetStatus("请选择resources目录下的文件", Brushes.Red);
return;
}
SetPathValue(targetName, relativePath);
SetStatus($"已选择:{relativePath}", Brushes.Gray);
}
private void BrowseLocalFile(string targetName)
{
var dialog = new OpenFileDialog
{
CheckFileExists = true,
Multiselect = false,
Title = "选择文件",
Filter = GetFileFilter(targetName),
InitialDirectory = GetInitialDirectory(GetPathValue(targetName), false)
};
if (dialog.ShowDialog() != true)
{
return;
}
SetPathValue(targetName, dialog.FileName);
SetStatus($"已选择:{dialog.FileName}", Brushes.Gray);
}
private void BrowseFolder(string targetName)
{
using (var dialog = new Forms.FolderBrowserDialog())
{
dialog.Description = "选择目录";
dialog.SelectedPath = GetInitialDirectory(GetPathValue(targetName), false);
if (dialog.ShowDialog() != Forms.DialogResult.OK || string.IsNullOrWhiteSpace(dialog.SelectedPath))
{
return;
}
SetPathValue(targetName, dialog.SelectedPath);
SetStatus($"已选择:{dialog.SelectedPath}", Brushes.Gray);
}
}
private string GetFileFilter(string targetName)
{
switch (targetName)
{
case nameof(StationsCsvFilePath):
return "CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*";
case nameof(CadDwgFilePath):
return "DWG文件 (*.dwg)|*.dwg|所有文件 (*.*)|*.*";
case nameof(LocalSqLiteDb):
return "SQLite数据库 (*.db;*.sqlite;*.sqlite3)|*.db;*.sqlite;*.sqlite3|所有文件 (*.*)|*.*";
case nameof(WorkAreaFilePath):
case nameof(DwgJsonSetting):
case nameof(AlarmSetting):
case nameof(AlarmLevelConfig):
case nameof(ReportEventLevelSetting):
return "JSON文件 (*.json)|*.json|所有文件 (*.*)|*.*";
default:
return "所有文件 (*.*)|*.*";
}
}
private string GetInitialDirectory(string currentPath, bool resourcesOnly)
{
if (resourcesOnly)
{
var resourceFilePath = ResolveAppRelativePath(currentPath);
if (!string.IsNullOrWhiteSpace(resourceFilePath) && File.Exists(resourceFilePath))
{
return Path.GetDirectoryName(resourceFilePath);
}
return GetResourcesDirectory();
} }
if (!string.IsNullOrWhiteSpace(currentPath))
{
var path = ResolveAppRelativePath(currentPath);
if (Directory.Exists(path))
{
return path;
}
if (File.Exists(path))
{
return Path.GetDirectoryName(path);
}
}
return AppDomain.CurrentDomain.BaseDirectory;
}
private string ResolveAppRelativePath(string path)
{
if (string.IsNullOrWhiteSpace(path))
{
return null;
}
if (Path.IsPathRooted(path) && !path.StartsWith("\\", StringComparison.Ordinal))
{
return path;
}
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path.TrimStart('\\', '/'));
}
private string GetResourcesDirectory()
{
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ResourcesDirectoryName);
}
private bool TryGetResourcesRelativePath(string selectedFile, out string relativePath)
{
relativePath = null;
var resourcesDirectory = Path.GetFullPath(GetResourcesDirectory())
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) + Path.DirectorySeparatorChar;
var filePath = Path.GetFullPath(selectedFile);
if (!filePath.StartsWith(resourcesDirectory, StringComparison.OrdinalIgnoreCase))
{
return false;
}
var relativePart = filePath.Substring(resourcesDirectory.Length)
.Replace(Path.DirectorySeparatorChar, '\\')
.Replace(Path.AltDirectorySeparatorChar, '\\');
relativePath = ResourcesRelativePrefix + relativePart;
return true;
}
private string GetPathValue(string targetName)
{
switch (targetName)
{
case nameof(AlarmSetting):
return AlarmSetting;
case nameof(AlarmLevelConfig):
return AlarmLevelConfig;
case nameof(ReportEventLevelSetting):
return ReportEventLevelSetting;
case nameof(WorkAreaFilePath):
return WorkAreaFilePath;
case nameof(StationsCsvFilePath):
return StationsCsvFilePath;
case nameof(CadDwgFilePath):
return CadDwgFilePath;
case nameof(DwgJsonSetting):
return DwgJsonSetting;
case nameof(WavesMseedFilePath):
return WavesMseedFilePath;
case nameof(WavesTxtFilePath):
return WavesTxtFilePath;
case nameof(LocalSqLiteDb):
return LocalSqLiteDb;
case nameof(DwgSettings):
return DwgSettings;
case nameof(CadSettingsFileName):
return CadSettingsFileName;
default:
throw new InvalidOperationException($"未知的路径参数:{targetName}");
}
}
private void SetPathValue(string targetName, string value)
{
switch (targetName)
{
case nameof(AlarmSetting):
AlarmSetting = value;
break;
case nameof(AlarmLevelConfig):
AlarmLevelConfig = value;
break;
case nameof(ReportEventLevelSetting):
ReportEventLevelSetting = value;
break;
case nameof(WorkAreaFilePath):
WorkAreaFilePath = value;
break;
case nameof(StationsCsvFilePath):
StationsCsvFilePath = value;
break;
case nameof(CadDwgFilePath):
CadDwgFilePath = value;
break;
case nameof(DwgJsonSetting):
DwgJsonSetting = value;
break;
case nameof(WavesMseedFilePath):
WavesMseedFilePath = value;
break;
case nameof(WavesTxtFilePath):
WavesTxtFilePath = value;
break;
case nameof(LocalSqLiteDb):
LocalSqLiteDb = value;
break;
case nameof(DwgSettings):
DwgSettings = value;
break;
case nameof(CadSettingsFileName):
CadSettingsFileName = value;
break;
default:
throw new InvalidOperationException($"未知的路径参数:{targetName}");
}
RaisePropertyChanged(targetName);
} }
private bool ShouldReloadWarningData(BusinessConfig previousConfig, BusinessConfig savedConfig) private bool ShouldReloadWarningData(BusinessConfig previousConfig, BusinessConfig savedConfig)
@ -183,7 +479,7 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
{ {
DateTime.Parse(Require(DailyReportStartTime, "日报起始时间")); DateTime.Parse(Require(DailyReportStartTime, "日报起始时间"));
var dataLookbackHours = ParseDouble(DataLookbackHours, "数据回看时长"); var dataLookbackHours = ParseDouble(DataLookbackHours, "数据时长");
DataCacheTimeLenMins = ((int)Math.Round(dataLookbackHours * 60.0)).ToString(CultureInfo.InvariantCulture); DataCacheTimeLenMins = ((int)Math.Round(dataLookbackHours * 60.0)).ToString(CultureInfo.InvariantCulture);
var endpointSettings = BuildEndpointSettings(currentConfig); var endpointSettings = BuildEndpointSettings(currentConfig);
var databaseSettings = BuildDatabaseSettings(currentConfig); var databaseSettings = BuildDatabaseSettings(currentConfig);
@ -197,14 +493,14 @@ namespace Txgy.EWS.Client.SysModule.ViewModels
AlarmLevelConfig = Require(AlarmLevelConfig, "报警等级配置"), AlarmLevelConfig = Require(AlarmLevelConfig, "报警等级配置"),
ReportEventLevelSetting = Require(ReportEventLevelSetting, "报表事件分级"), ReportEventLevelSetting = Require(ReportEventLevelSetting, "报表事件分级"),
WorkAreaFilePath = Require(WorkAreaFilePath, "工区配置"), WorkAreaFilePath = Require(WorkAreaFilePath, "工区配置"),
StationsCsvFilePath = Require(StationsCsvFilePath, "台站 CSV"), StationsCsvFilePath = Require(StationsCsvFilePath, "台站CSV"),
CadDwgFilePath = Require(CadDwgFilePath, "CAD DWG"), CadDwgFilePath = Require(CadDwgFilePath, "CAD DWG"),
DwgJsonSetting = Require(DwgJsonSetting, "DWG 图层配置"), DwgJsonSetting = Require(DwgJsonSetting, "DWG图层设置"),
WavesMseedFilePath = Require(WavesMseedFilePath, "Mseed 缓存目录"), WavesMseedFilePath = Require(WavesMseedFilePath, "Mseed缓存目录"),
WavesTxtFilePath = Require(WavesTxtFilePath, "Txt 缓存目录"), WavesTxtFilePath = Require(WavesTxtFilePath, "Txt缓存目录"),
LocalSqLiteDb = CanEditAdvancedSettings ? Require(LocalSqLiteDb, "本地 SQLite") : currentConfig.Paths.LocalSqLiteDb, LocalSqLiteDb = CanEditAdvancedSettings ? Require(LocalSqLiteDb, "本地 SQLite") : currentConfig.Paths.LocalSqLiteDb,
DwgSettings = EmptyToNull(DwgSettings), DwgSettings = CanEditAdvancedSettings ? EmptyToNull(DwgSettings) : currentConfig.Paths.DwgSettings,
CadSettingsFileName = EmptyToNull(CadSettingsFileName) CadSettingsFileName = CanEditAdvancedSettings ? EmptyToNull(CadSettingsFileName) : currentConfig.Paths.CadSettingsFileName
}, },
Runtime = new RuntimeSettings Runtime = new RuntimeSettings
{ {

@ -25,17 +25,41 @@
<Style x:Key="SettingLabelStyle" TargetType="TextBlock"> <Style x:Key="SettingLabelStyle" TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Foreground" Value="#666"/> <Setter Property="Foreground" Value="#666"/>
<Setter Property="Margin" Value="0,5"/> <Setter Property="Margin" Value="24,5,0,5"/>
</Style> </Style>
<Style x:Key="SettingTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource NormalTextBoxStyle}"> <Style x:Key="SettingTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource NormalTextBoxStyle}">
<Setter Property="Height" Value="32"/> <Setter Property="Height" Value="32"/>
<Setter Property="Margin" Value="0,5"/> <Setter Property="Margin" Value="0,5"/>
<Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/>
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="True">
<Setter Property="Background" Value="#FFF2F4F7"/>
<Setter Property="BorderBrush" Value="#FFD0D5DD"/>
<Setter Property="Foreground" Value="#FF7A8491"/>
</Trigger>
</Style.Triggers>
</Style> </Style>
<Style x:Key="SettingCheckBoxStyle" TargetType="CheckBox"> <Style x:Key="SettingCheckBoxStyle" TargetType="CheckBox">
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="0,5"/> <Setter Property="Margin" Value="0,5"/>
</Style> </Style>
<Style x:Key="BrowseButtonStyle" TargetType="Button" BasedOn="{StaticResource NormalButtonStyle}">
<Setter Property="Width" Value="58"/>
<Setter Property="Height" Value="32"/>
<Setter Property="Margin" Value="6,5,0,5"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Background" Value="#FFE9F7FD"/>
<Setter Property="Foreground" Value="#FF0886B8"/>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#FFF2F4F7"/>
<Setter Property="Foreground" Value="#FF98A2B3"/>
<Setter Property="BorderBrush" Value="#FFD0D5DD"/>
<Setter Property="Opacity" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary> </ResourceDictionary>
</UserControl.Resources> </UserControl.Resources>
<Grid Margin="24"> <Grid Margin="24">
@ -47,7 +71,7 @@
<DockPanel Margin="0,0,0,16"> <DockPanel Margin="0,0,0,16">
<StackPanel DockPanel.Dock="Left"> <StackPanel DockPanel.Dock="Left">
<TextBlock Text="系统设置" FontSize="24" FontWeight="Bold" Foreground="#333"/> <TextBlock Text="参数设置" FontSize="24" FontWeight="Bold" Foreground="#333"/>
<TextBlock Text="{Binding ConfigPath}" Margin="0,6,0,0" Foreground="#888"/> <TextBlock Text="{Binding ConfigPath}" Margin="0,6,0,0" Foreground="#888"/>
</StackPanel> </StackPanel>
<TextBlock DockPanel.Dock="Right" <TextBlock DockPanel.Dock="Right"
@ -60,7 +84,7 @@
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto"> <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel> <StackPanel>
<GroupBox Header="常用参数" Style="{StaticResource SettingGroupStyle}"> <GroupBox Header="工区参数" Style="{StaticResource SettingGroupStyle}">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="170"/> <ColumnDefinition Width="170"/>
@ -71,18 +95,56 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Text="刷新间隔(秒)" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Text="工区名称" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="1" Text="{Binding RefreshInterval, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Column="1" Text="{Binding WorkAreaName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Column="2" Text="数据时长(小时)" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Column="2" Text="工区配置" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="3" Text="{Binding DataLookbackHours, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <DockPanel Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="WorkAreaFilePath" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding WorkAreaFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="1" Text="台站CSV" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Row="1" Grid.Column="1">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="StationsCsvFilePath" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding StationsCsvFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="1" Grid.Column="2" Text="CAD DWG" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Row="1" Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="CadDwgFilePath" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding CadDwgFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="2" Text="DWG图层设置" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Row="2" Grid.Column="1">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="DwgJsonSetting" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding DwgJsonSetting, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="2" Grid.Column="2" Text="BaseX" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="2" Grid.Column="3" Text="{Binding BaseX, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="1" Grid.Column="2" Text="数据缓存时长(分钟)" Style="{StaticResource SettingLabelStyle}" Visibility="Collapsed"/> <TextBlock Grid.Row="3" Text="BaseY" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="1" Grid.Column="3" Text="{Binding DataCacheTimeLenMins, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}" Visibility="Collapsed"/> <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding BaseY, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="3" Grid.Column="2" Text="BaseZ" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="3" Grid.Column="3" Text="{Binding BaseZ, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="4" Text="平面图横向偏移" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="4" Grid.Column="1" Text="{Binding DailyReportPlanOffsetX, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="4" Grid.Column="2" Text="平面图纵向偏移" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="4" Grid.Column="3" Text="{Binding DailyReportPlanOffsetY, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="5" Text="刷新间隔(秒)" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="5" Grid.Column="1" Text="{Binding RefreshInterval, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="5" Grid.Column="2" Text="数据时长(小时)" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="5" Grid.Column="3" Text="{Binding DataLookbackHours, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Header="路径" Style="{StaticResource SettingGroupStyle}"> <GroupBox Header="预警配置" Style="{StaticResource SettingGroupStyle}">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="170"/> <ColumnDefinition Width="170"/>
@ -90,41 +152,34 @@
<ColumnDefinition Width="170"/> <ColumnDefinition Width="170"/>
<ColumnDefinition/> <ColumnDefinition/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="报警配置" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Text="报警配置" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="1" Text="{Binding AlarmSetting, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <DockPanel Grid.Column="1">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="AlarmSetting" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding AlarmSetting, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Column="2" Text="报警等级配置" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Column="2" Text="报警等级配置" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="3" Text="{Binding AlarmLevelConfig, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <DockPanel Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="AlarmLevelConfig" Style="{StaticResource BrowseButtonStyle}"/>
<TextBlock Grid.Row="1" Text="报表事件分级" Style="{StaticResource SettingLabelStyle}"/> <TextBox Text="{Binding AlarmLevelConfig, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding ReportEventLevelSetting, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> </DockPanel>
<TextBlock Grid.Row="1" Grid.Column="2" Text="工区配置" Style="{StaticResource SettingLabelStyle}"/> </Grid>
<TextBox Grid.Row="1" Grid.Column="3" Text="{Binding WorkAreaFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> </GroupBox>
<TextBlock Grid.Row="2" Text="台站 CSV" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding StationsCsvFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="2" Grid.Column="2" Text="CAD DWG" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="2" Grid.Column="3" Text="{Binding CadDwgFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="3" Text="DWG 图层配置" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding DwgJsonSetting, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="3" Grid.Column="2" Text="Mseed 缓存目录" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="3" Grid.Column="3" Text="{Binding WavesMseedFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="4" Text="Txt 缓存目录" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="4" Grid.Column="1" Text="{Binding WavesTxtFilePath, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="5" Text="DWG 显示设置" Style="{StaticResource SettingLabelStyle}"/> <GroupBox Header="报表" Style="{StaticResource SettingGroupStyle}">
<TextBox Grid.Row="5" Grid.Column="1" Text="{Binding DwgSettings, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <Grid>
<TextBlock Grid.Row="5" Grid.Column="2" Text="CAD 设置文件" Style="{StaticResource SettingLabelStyle}"/> <Grid.ColumnDefinitions>
<TextBox Grid.Row="5" Grid.Column="3" Text="{Binding CadSettingsFileName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <ColumnDefinition Width="170"/>
<ColumnDefinition/>
<ColumnDefinition Width="170"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="日报起始时间" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="1" Text="{Binding DailyReportStartTime, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Column="2" Text="报表事件分级" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="ReportEventLevelSetting" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding ReportEventLevelSetting, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
</Grid> </Grid>
</GroupBox> </GroupBox>
@ -139,16 +194,31 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Text="API 域名" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Text="API 域名" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="1" Text="{Binding ApiDomain, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Column="1" Text="{Binding ApiDomain, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Column="2" Text="本地 SQLite" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Column="2" Text="本地 SQLite" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="3" Text="{Binding LocalSqLiteDb, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <DockPanel Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseLocalFileCommand}" CommandParameter="LocalSqLiteDb" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding LocalSqLiteDb, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="1" Text="设计模式" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Row="1" Text="设计模式" Style="{StaticResource SettingLabelStyle}"/>
<CheckBox Grid.Row="1" Grid.Column="1" IsChecked="{Binding IsDesign}" Style="{StaticResource SettingCheckBoxStyle}"/> <CheckBox Grid.Row="1" Grid.Column="1" IsChecked="{Binding IsDesign}" Style="{StaticResource SettingCheckBoxStyle}"/>
<TextBlock Grid.Row="1" Grid.Column="2" Text="实时模式" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Row="1" Grid.Column="2" Text="实时模式" Style="{StaticResource SettingLabelStyle}"/>
<CheckBox Grid.Row="1" Grid.Column="3" IsChecked="{Binding IsRealtime}" Style="{StaticResource SettingCheckBoxStyle}"/> <CheckBox Grid.Row="1" Grid.Column="3" IsChecked="{Binding IsRealtime}" Style="{StaticResource SettingCheckBoxStyle}"/>
<TextBlock Grid.Row="2" Text="DWG显示设置" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Row="2" Grid.Column="1">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="DwgSettings" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding DwgSettings, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="2" Grid.Column="2" Text="CAD设置文件" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Row="2" Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseResourceFileCommand}" CommandParameter="CadSettingsFileName" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding CadSettingsFileName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
</Grid> </Grid>
</GroupBox> </GroupBox>
@ -184,7 +254,7 @@
</Grid> </Grid>
</GroupBox> </GroupBox>
<GroupBox Header="品牌与报表" Style="{StaticResource SettingGroupStyle}"> <GroupBox Header="系统参数" Style="{StaticResource SettingGroupStyle}">
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="170"/> <ColumnDefinition Width="170"/>
@ -197,47 +267,46 @@
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
<RowDefinition/> <RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Text="公司名称" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Text="公司名称" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="1" Text="{Binding CommpanyName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Column="1" Text="{Binding CommpanyName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Column="2" Text="工区名称" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Column="2" Text="系统中文名" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="3" Text="{Binding WorkAreaName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Column="3" Text="{Binding SystemNameCn, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="1" Text="系统中文名" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Row="1" Text="系统简称" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SystemNameCn, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SystemShortName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="1" Grid.Column="2" Text="系统英文名" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Row="1" Grid.Column="2" Text="系统英文名" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="1" Grid.Column="3" Text="{Binding SystemNameEn, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Row="1" Grid.Column="3" Text="{Binding SystemNameEn, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Row="2" Text="系统简称" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Row="2" Text="Mseed缓存目录" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SystemShortName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <DockPanel Grid.Row="2" Grid.Column="1">
<TextBlock Grid.Row="2" Grid.Column="2" Text="日报起始时间" Style="{StaticResource SettingLabelStyle}"/> <Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseFolderCommand}" CommandParameter="WavesMseedFilePath" IsEnabled="{Binding CanEditSystemSettings}" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Grid.Row="2" Grid.Column="3" Text="{Binding DailyReportStartTime, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Text="{Binding WavesMseedFilePath, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="2" Grid.Column="2" Text="Txt缓存目录" Style="{StaticResource SettingLabelStyle}"/>
<DockPanel Grid.Row="2" Grid.Column="3">
<Button Content="浏览" DockPanel.Dock="Right" Command="{Binding BrowseFolderCommand}" CommandParameter="WavesTxtFilePath" IsEnabled="{Binding CanEditSystemSettings}" Style="{StaticResource BrowseButtonStyle}"/>
<TextBox Text="{Binding WavesTxtFilePath, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}"/>
</DockPanel>
<TextBlock Grid.Row="3" Text="平面图横向偏移" Style="{StaticResource SettingLabelStyle}"/> <TextBlock Grid.Row="3" Grid.Column="2" Text="数据缓存时长(分钟)" Style="{StaticResource SettingLabelStyle}" Visibility="Collapsed"/>
<TextBox Grid.Row="3" Grid.Column="1" Text="{Binding DailyReportPlanOffsetX, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/> <TextBox Grid.Row="3" Grid.Column="3" Text="{Binding DataCacheTimeLenMins, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding SystemSettingsReadOnly}" Style="{StaticResource SettingTextBoxStyle}" Visibility="Collapsed"/>
<TextBlock Grid.Row="3" Grid.Column="2" Text="平面图纵向偏移" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Row="3" Grid.Column="3" Text="{Binding DailyReportPlanOffsetY, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</Grid>
</GroupBox>
<GroupBox Header="坐标" Style="{StaticResource SettingGroupStyle}"> <Button Grid.Row="4"
<Grid> Grid.Column="0"
<Grid.ColumnDefinitions> Content="{Binding SystemSettingsEditButtonText}"
<ColumnDefinition Width="170"/> Width="86"
<ColumnDefinition/> Height="30"
<ColumnDefinition Width="170"/> Margin="24,10,0,0"
<ColumnDefinition/> HorizontalAlignment="Left"
<ColumnDefinition Width="170"/> Style="{StaticResource NormalButtonStyle}"
<ColumnDefinition/> Background="#FFE9F7FD"
</Grid.ColumnDefinitions> Foreground="#FF0886B8"
<TextBlock Text="BaseX" Style="{StaticResource SettingLabelStyle}"/> Command="{Binding ToggleSystemSettingsEditCommand}"/>
<TextBox Grid.Column="1" Text="{Binding BaseX, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Column="2" Text="BaseY" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="3" Text="{Binding BaseY, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
<TextBlock Grid.Column="4" Text="BaseZ" Style="{StaticResource SettingLabelStyle}"/>
<TextBox Grid.Column="5" Text="{Binding BaseZ, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource SettingTextBoxStyle}"/>
</Grid> </Grid>
</GroupBox> </GroupBox>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>

Loading…
Cancel
Save