mirror of
https://github.com/2dust/v2rayN.git
synced 2025-11-02 13:32:51 +00:00
Code clean
This commit is contained in:
parent
18ea6fdc00
commit
1b5069a933
23 changed files with 102 additions and 102 deletions
|
|
@ -9,7 +9,7 @@ public partial class App : Application
|
||||||
|
|
||||||
public App()
|
public App()
|
||||||
{
|
{
|
||||||
this.DispatcherUnhandledException += App_DispatcherUnhandledException;
|
DispatcherUnhandledException += App_DispatcherUnhandledException;
|
||||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
||||||
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
|
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
|
||||||
}
|
}
|
||||||
|
|
@ -23,7 +23,7 @@ public partial class App : Application
|
||||||
var exePathKey = Utils.GetMd5(Utils.GetExePath());
|
var exePathKey = Utils.GetMd5(Utils.GetExePath());
|
||||||
|
|
||||||
var rebootas = (e.Args ?? Array.Empty<string>()).Any(t => t == Global.RebootAs);
|
var rebootas = (e.Args ?? Array.Empty<string>()).Any(t => t == Global.RebootAs);
|
||||||
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew);
|
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out var bCreatedNew);
|
||||||
if (!rebootas && !bCreatedNew)
|
if (!rebootas && !bCreatedNew)
|
||||||
{
|
{
|
||||||
ProgramStarted.Set();
|
ProgramStarted.Set();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
namespace v2rayN;
|
namespace v2rayN.Common;
|
||||||
|
|
||||||
internal class UI
|
internal class UI
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ using System.Windows.Media;
|
||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
|
|
||||||
namespace v2rayN;
|
namespace v2rayN.Common;
|
||||||
|
|
||||||
internal static class WindowsUtils
|
internal static class WindowsUtils
|
||||||
{
|
{
|
||||||
|
|
@ -40,13 +40,13 @@ internal static class WindowsUtils
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("dwmapi.dll")]
|
[DllImport("dwmapi.dll")]
|
||||||
public static extern int DwmSetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attribute, ref int attributeValue, uint attributeSize);
|
public static extern int DwmSetWindowAttribute(nint hwnd, DWMWINDOWATTRIBUTE attribute, ref int attributeValue, uint attributeSize);
|
||||||
|
|
||||||
public static ImageSource IconToImageSource(Icon icon)
|
public static ImageSource IconToImageSource(Icon icon)
|
||||||
{
|
{
|
||||||
return Imaging.CreateBitmapSourceFromHIcon(
|
return Imaging.CreateBitmapSourceFromHIcon(
|
||||||
icon.Handle,
|
icon.Handle,
|
||||||
new System.Windows.Int32Rect(0, 0, icon.Width, icon.Height),
|
new Int32Rect(0, 0, icon.Width, icon.Height),
|
||||||
BitmapSizeOptions.FromEmptyOptions());
|
BitmapSizeOptions.FromEmptyOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -65,9 +65,9 @@ internal static class WindowsUtils
|
||||||
private static void SetDarkBorder(Window window, bool dark)
|
private static void SetDarkBorder(Window window, bool dark)
|
||||||
{
|
{
|
||||||
// Make sure the handle is created before the window is shown
|
// Make sure the handle is created before the window is shown
|
||||||
IntPtr hWnd = new WindowInteropHelper(window).EnsureHandle();
|
var hWnd = new WindowInteropHelper(window).EnsureHandle();
|
||||||
int attribute = dark ? 1 : 0;
|
var attribute = dark ? 1 : 0;
|
||||||
uint attributeSize = (uint)Marshal.SizeOf(attribute);
|
var attributeSize = (uint)Marshal.SizeOf(attribute);
|
||||||
DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ref attribute, attributeSize);
|
DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ref attribute, attributeSize);
|
||||||
DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref attribute, attributeSize);
|
DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref attribute, attributeSize);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ public sealed class HotkeyManager
|
||||||
modifiers |= KeyModifiers.Alt;
|
modifiers |= KeyModifiers.Alt;
|
||||||
}
|
}
|
||||||
|
|
||||||
key = key << 16 | (int)modifiers;
|
key = (key << 16) | (int)modifiers;
|
||||||
if (!_hotkeyTriggerDic.ContainsKey(key))
|
if (!_hotkeyTriggerDic.ContainsKey(key))
|
||||||
{
|
{
|
||||||
_hotkeyTriggerDic.Add(key, new() { item.EGlobalHotkey });
|
_hotkeyTriggerDic.Add(key, new() { item.EGlobalHotkey });
|
||||||
|
|
@ -103,7 +103,7 @@ public sealed class HotkeyManager
|
||||||
private (int fsModifiers, int vKey, string hotkeyStr, List<string> Names) GetHotkeyInfo(int hotkeyCode)
|
private (int fsModifiers, int vKey, string hotkeyStr, List<string> Names) GetHotkeyInfo(int hotkeyCode)
|
||||||
{
|
{
|
||||||
var fsModifiers = hotkeyCode & 0xffff;
|
var fsModifiers = hotkeyCode & 0xffff;
|
||||||
var vKey = hotkeyCode >> 16 & 0xffff;
|
var vKey = (hotkeyCode >> 16) & 0xffff;
|
||||||
var hotkeyStr = new StringBuilder();
|
var hotkeyStr = new StringBuilder();
|
||||||
var names = new List<string>();
|
var names = new List<string>();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,18 +60,18 @@ public sealed class WindowsManager
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Color color = ColorTranslator.FromHtml("#3399CC");
|
var color = ColorTranslator.FromHtml("#3399CC");
|
||||||
int index = (int)config.SystemProxyItem.SysProxyType;
|
var index = (int)config.SystemProxyItem.SysProxyType;
|
||||||
if (index > 0)
|
if (index > 0)
|
||||||
{
|
{
|
||||||
color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1];
|
color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
int width = 128;
|
var width = 128;
|
||||||
int height = 128;
|
var height = 128;
|
||||||
|
|
||||||
Bitmap bitmap = new(width, height);
|
Bitmap bitmap = new(width, height);
|
||||||
Graphics graphics = Graphics.FromImage(bitmap);
|
var graphics = Graphics.FromImage(bitmap);
|
||||||
SolidBrush drawBrush = new(color);
|
SolidBrush drawBrush = new(color);
|
||||||
|
|
||||||
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
||||||
|
|
@ -79,7 +79,7 @@ public sealed class WindowsManager
|
||||||
graphics.DrawImage(new Bitmap(item.CustomIcon), 0, 0, width, height);
|
graphics.DrawImage(new Bitmap(item.CustomIcon), 0, 0, width, height);
|
||||||
graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2);
|
graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2);
|
||||||
|
|
||||||
Icon createdIcon = Icon.FromHandle(bitmap.GetHicon());
|
var createdIcon = Icon.FromHandle(bitmap.GetHicon());
|
||||||
|
|
||||||
drawBrush.Dispose();
|
drawBrush.Dispose();
|
||||||
graphics.Dispose();
|
graphics.Dispose();
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ public partial class AddGroupServerWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
this.PreviewKeyDown += AddGroupServerWindow_PreviewKeyDown;
|
PreviewKeyDown += AddGroupServerWindow_PreviewKeyDown;
|
||||||
lstChild.SelectionChanged += LstChild_SelectionChanged;
|
lstChild.SelectionChanged += LstChild_SelectionChanged;
|
||||||
menuSelectAllChild.Click += MenuSelectAllChild_Click;
|
menuSelectAllChild.Click += MenuSelectAllChild_Click;
|
||||||
|
|
||||||
|
|
@ -27,11 +27,11 @@ public partial class AddGroupServerWindow
|
||||||
switch (profileItem.ConfigType)
|
switch (profileItem.ConfigType)
|
||||||
{
|
{
|
||||||
case EConfigType.PolicyGroup:
|
case EConfigType.PolicyGroup:
|
||||||
this.Title = ResUI.TbConfigTypePolicyGroup;
|
Title = ResUI.TbConfigTypePolicyGroup;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EConfigType.ProxyChain:
|
case EConfigType.ProxyChain:
|
||||||
this.Title = ResUI.TbConfigTypeProxyChain;
|
Title = ResUI.TbConfigTypeProxyChain;
|
||||||
gridPolicyGroup.Visibility = Visibility.Collapsed;
|
gridPolicyGroup.Visibility = Visibility.Collapsed;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -61,7 +61,7 @@ public partial class AddGroupServerWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ public partial class AddServer2Window
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
ViewModel = new AddServer2ViewModel(profileItem, UpdateViewHandler);
|
ViewModel = new AddServer2ViewModel(profileItem, UpdateViewHandler);
|
||||||
|
|
||||||
cmbCoreType.ItemsSource = Utils.GetEnumNames<ECoreType>().Where(t => t != ECoreType.v2rayN.ToString()).ToList().AppendEmpty();
|
cmbCoreType.ItemsSource = Utils.GetEnumNames<ECoreType>().Where(t => t != ECoreType.v2rayN.ToString()).ToList().AppendEmpty();
|
||||||
|
|
@ -32,11 +32,11 @@ public partial class AddServer2Window
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EViewAction.BrowseServer:
|
case EViewAction.BrowseServer:
|
||||||
if (UI.OpenFileDialog(out string fileName, "Config|*.json|YAML|*.yaml;*.yml|All|*.*") != true)
|
if (UI.OpenFileDialog(out var fileName, "Config|*.json|YAML|*.yaml;*.yml|All|*.*") != true)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ public partial class AddServerWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged;
|
cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged;
|
||||||
cmbStreamSecurity.SelectionChanged += CmbStreamSecurity_SelectionChanged;
|
cmbStreamSecurity.SelectionChanged += CmbStreamSecurity_SelectionChanged;
|
||||||
btnGUID.Click += btnGUID_Click;
|
btnGUID.Click += btnGUID_Click;
|
||||||
|
|
@ -191,7 +191,7 @@ public partial class AddServerWindow
|
||||||
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.Title = $"{profileItem.ConfigType}";
|
Title = $"{profileItem.ConfigType}";
|
||||||
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme);
|
WindowsUtils.SetDarkBorder(this, AppManager.Instance.Config.UiItem.CurrentTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -200,7 +200,7 @@ public partial class AddServerWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ public partial class BackupAndRestoreView
|
||||||
|
|
||||||
private void MenuLocalBackup_Click(object sender, RoutedEventArgs e)
|
private void MenuLocalBackup_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (UI.SaveFileDialog(out string fileName, "Zip|*.zip") != true)
|
if (UI.SaveFileDialog(out var fileName, "Zip|*.zip") != true)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -37,7 +37,7 @@ public partial class BackupAndRestoreView
|
||||||
|
|
||||||
private void MenuLocalRestore_Click(object sender, RoutedEventArgs e)
|
private void MenuLocalRestore_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (UI.OpenFileDialog(out string fileName, "Zip|*.zip|All|*.*") != true)
|
if (UI.OpenFileDialog(out var fileName, "Zip|*.zip|All|*.*") != true)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ public partial class DNSSettingWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
_config = AppManager.Instance.Config;
|
_config = AppManager.Instance.Config;
|
||||||
|
|
||||||
ViewModel = new DNSSettingViewModel(UpdateViewHandler);
|
ViewModel = new DNSSettingViewModel(UpdateViewHandler);
|
||||||
|
|
@ -78,7 +78,7 @@ public partial class DNSSettingWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ public partial class FullConfigTemplateWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
_config = AppManager.Instance.Config;
|
_config = AppManager.Instance.Config;
|
||||||
|
|
||||||
ViewModel = new FullConfigTemplateViewModel(UpdateViewHandler);
|
ViewModel = new FullConfigTemplateViewModel(UpdateViewHandler);
|
||||||
|
|
@ -35,7 +35,7 @@ public partial class FullConfigTemplateWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -11,14 +11,14 @@ public partial class GlobalHotkeySettingWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
|
|
||||||
ViewModel = new GlobalHotkeySettingViewModel(UpdateViewHandler);
|
ViewModel = new GlobalHotkeySettingViewModel(UpdateViewHandler);
|
||||||
|
|
||||||
btnReset.Click += btnReset_Click;
|
btnReset.Click += btnReset_Click;
|
||||||
|
|
||||||
HotkeyManager.Instance.IsPause = true;
|
HotkeyManager.Instance.IsPause = true;
|
||||||
this.Closing += (s, e) => HotkeyManager.Instance.IsPause = false;
|
Closing += (s, e) => HotkeyManager.Instance.IsPause = false;
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
|
|
@ -35,7 +35,7 @@ public partial class GlobalHotkeySettingWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ public partial class MainWindow
|
||||||
ThreadPool.RegisterWaitForSingleObject(App.ProgramStarted, OnProgramStarted, null, -1, false);
|
ThreadPool.RegisterWaitForSingleObject(App.ProgramStarted, OnProgramStarted, null, -1, false);
|
||||||
|
|
||||||
App.Current.SessionEnding += Current_SessionEnding;
|
App.Current.SessionEnding += Current_SessionEnding;
|
||||||
this.Closing += MainWindow_Closing;
|
Closing += MainWindow_Closing;
|
||||||
this.PreviewKeyDown += MainWindow_PreviewKeyDown;
|
PreviewKeyDown += MainWindow_PreviewKeyDown;
|
||||||
menuSettingsSetUWP.Click += menuSettingsSetUWP_Click;
|
menuSettingsSetUWP.Click += menuSettingsSetUWP_Click;
|
||||||
menuPromotion.Click += menuPromotion_Click;
|
menuPromotion.Click += menuPromotion_Click;
|
||||||
menuClose.Click += menuClose_Click;
|
menuClose.Click += menuClose_Click;
|
||||||
|
|
@ -150,10 +150,10 @@ public partial class MainWindow
|
||||||
.DisposeWith(disposables);
|
.DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
|
Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}";
|
||||||
if (_config.UiItem.AutoHideStartup)
|
if (_config.UiItem.AutoHideStartup)
|
||||||
{
|
{
|
||||||
this.WindowState = WindowState.Minimized;
|
WindowState = WindowState.Minimized;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_config.GuiItem.EnableHWA)
|
if (!_config.GuiItem.EnableHWA)
|
||||||
|
|
@ -187,35 +187,35 @@ public partial class MainWindow
|
||||||
case EViewAction.AddServerWindow:
|
case EViewAction.AddServerWindow:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new AddServerWindow((ProfileItem)obj)).ShowDialog() ?? false;
|
return new AddServerWindow((ProfileItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.AddServer2Window:
|
case EViewAction.AddServer2Window:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new AddServer2Window((ProfileItem)obj)).ShowDialog() ?? false;
|
return new AddServer2Window((ProfileItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.AddGroupServerWindow:
|
case EViewAction.AddGroupServerWindow:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new AddGroupServerWindow((ProfileItem)obj)).ShowDialog() ?? false;
|
return new AddGroupServerWindow((ProfileItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.DNSSettingWindow:
|
case EViewAction.DNSSettingWindow:
|
||||||
return (new DNSSettingWindow().ShowDialog() ?? false);
|
return new DNSSettingWindow().ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.RoutingSettingWindow:
|
case EViewAction.RoutingSettingWindow:
|
||||||
return (new RoutingSettingWindow().ShowDialog() ?? false);
|
return new RoutingSettingWindow().ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.OptionSettingWindow:
|
case EViewAction.OptionSettingWindow:
|
||||||
return (new OptionSettingWindow().ShowDialog() ?? false);
|
return new OptionSettingWindow().ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.FullConfigTemplateWindow:
|
case EViewAction.FullConfigTemplateWindow:
|
||||||
return (new FullConfigTemplateWindow().ShowDialog() ?? false);
|
return new FullConfigTemplateWindow().ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.GlobalHotkeySettingWindow:
|
case EViewAction.GlobalHotkeySettingWindow:
|
||||||
return (new GlobalHotkeySettingWindow().ShowDialog() ?? false);
|
return new GlobalHotkeySettingWindow().ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.SubSettingWindow:
|
case EViewAction.SubSettingWindow:
|
||||||
return (new SubSettingWindow().ShowDialog() ?? false);
|
return new SubSettingWindow().ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.ScanScreenTask:
|
case EViewAction.ScanScreenTask:
|
||||||
await ScanScreenTaskAsync();
|
await ScanScreenTaskAsync();
|
||||||
|
|
@ -372,7 +372,7 @@ public partial class MainWindow
|
||||||
this?.Show();
|
this?.Show();
|
||||||
if (this?.WindowState == WindowState.Minimized)
|
if (this?.WindowState == WindowState.Minimized)
|
||||||
{
|
{
|
||||||
this.WindowState = WindowState.Normal;
|
WindowState = WindowState.Normal;
|
||||||
}
|
}
|
||||||
this?.Activate();
|
this?.Activate();
|
||||||
this?.Focus();
|
this?.Focus();
|
||||||
|
|
|
||||||
|
|
@ -31,10 +31,10 @@ public partial class MsgView
|
||||||
case EViewAction.DispatcherShowMsg:
|
case EViewAction.DispatcherShowMsg:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
Application.Current?.Dispatcher.Invoke((() =>
|
Application.Current?.Dispatcher.Invoke(() =>
|
||||||
{
|
{
|
||||||
ShowMsg(obj);
|
ShowMsg(obj);
|
||||||
}), DispatcherPriority.ApplicationIdle);
|
}, DispatcherPriority.ApplicationIdle);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ public partial class OptionSettingWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
_config = AppManager.Instance.Config;
|
_config = AppManager.Instance.Config;
|
||||||
|
|
||||||
ViewModel = new OptionSettingViewModel(UpdateViewHandler);
|
ViewModel = new OptionSettingViewModel(UpdateViewHandler);
|
||||||
|
|
@ -136,7 +136,7 @@ public partial class OptionSettingWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EViewAction.InitSettingFont:
|
case EViewAction.InitSettingFont:
|
||||||
|
|
@ -168,12 +168,12 @@ public partial class OptionSettingWindow
|
||||||
foreach (var ttf in files)
|
foreach (var ttf in files)
|
||||||
{
|
{
|
||||||
var families = Fonts.GetFontFamilies(Utils.GetFontsPath(ttf));
|
var families = Fonts.GetFontFamilies(Utils.GetFontsPath(ttf));
|
||||||
foreach (FontFamily family in families)
|
foreach (var family in families)
|
||||||
{
|
{
|
||||||
var typefaces = family.GetTypefaces();
|
var typefaces = family.GetTypefaces();
|
||||||
foreach (Typeface typeface in typefaces)
|
foreach (var typeface in typefaces)
|
||||||
{
|
{
|
||||||
typeface.TryGetGlyphTypeface(out GlyphTypeface glyph);
|
typeface.TryGetGlyphTypeface(out var glyph);
|
||||||
//var fontFace = glyph.Win32FaceNames[new CultureInfo("en-us")];
|
//var fontFace = glyph.Win32FaceNames[new CultureInfo("en-us")];
|
||||||
//if (!fontFace.Equals("Regular") && !fontFace.Equals("Normal"))
|
//if (!fontFace.Equals("Regular") && !fontFace.Equals("Normal"))
|
||||||
//{
|
//{
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ public partial class ProfilesSelectWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ public partial class ProfilesView
|
||||||
case EViewAction.SaveFileDialog:
|
case EViewAction.SaveFileDialog:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
if (UI.SaveFileDialog(out string fileName, "Config|*.json") != true)
|
if (UI.SaveFileDialog(out var fileName, "Config|*.json") != true)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -137,17 +137,17 @@ public partial class ProfilesView
|
||||||
case EViewAction.AddServerWindow:
|
case EViewAction.AddServerWindow:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new AddServerWindow((ProfileItem)obj)).ShowDialog() ?? false;
|
return new AddServerWindow((ProfileItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.AddServer2Window:
|
case EViewAction.AddServer2Window:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new AddServer2Window((ProfileItem)obj)).ShowDialog() ?? false;
|
return new AddServer2Window((ProfileItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.AddGroupServerWindow:
|
case EViewAction.AddGroupServerWindow:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new AddGroupServerWindow((ProfileItem)obj)).ShowDialog() ?? false;
|
return new AddGroupServerWindow((ProfileItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.ShareServer:
|
case EViewAction.ShareServer:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
|
|
@ -158,7 +158,7 @@ public partial class ProfilesView
|
||||||
case EViewAction.SubEditWindow:
|
case EViewAction.SubEditWindow:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new SubEditWindow((SubItem)obj)).ShowDialog() ?? false;
|
return new SubEditWindow((SubItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.DispatcherRefreshServersBiz:
|
case EViewAction.DispatcherRefreshServersBiz:
|
||||||
Application.Current?.Dispatcher.Invoke(RefreshServersBiz, DispatcherPriority.Normal);
|
Application.Current?.Dispatcher.Invoke(RefreshServersBiz, DispatcherPriority.Normal);
|
||||||
|
|
@ -415,8 +415,8 @@ public partial class ProfilesView
|
||||||
private void LstProfiles_MouseMove(object sender, MouseEventArgs e)
|
private void LstProfiles_MouseMove(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
// Get the current mouse position
|
// Get the current mouse position
|
||||||
Point mousePos = e.GetPosition(null);
|
var mousePos = e.GetPosition(null);
|
||||||
Vector diff = startPoint - mousePos;
|
var diff = startPoint - mousePos;
|
||||||
|
|
||||||
if (e.LeftButton == MouseButtonState.Pressed &&
|
if (e.LeftButton == MouseButtonState.Pressed &&
|
||||||
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
|
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
|
||||||
|
|
@ -429,7 +429,7 @@ public partial class ProfilesView
|
||||||
if (listViewItem == null)
|
if (listViewItem == null)
|
||||||
return; // Abort
|
return; // Abort
|
||||||
// Find the data behind the ListViewItem
|
// Find the data behind the ListViewItem
|
||||||
ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem);
|
var item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem);
|
||||||
if (item == null)
|
if (item == null)
|
||||||
return; // Abort
|
return; // Abort
|
||||||
// Initialize the drag & drop operation
|
// Initialize the drag & drop operation
|
||||||
|
|
@ -462,7 +462,7 @@ public partial class ProfilesView
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Find the data behind the Item
|
// Find the data behind the Item
|
||||||
ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem);
|
var item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem);
|
||||||
if (item == null)
|
if (item == null)
|
||||||
return;
|
return;
|
||||||
// Move item into observable collection
|
// Move item into observable collection
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ public partial class RoutingRuleDetailsWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
clbProtocol.SelectionChanged += ClbProtocol_SelectionChanged;
|
clbProtocol.SelectionChanged += ClbProtocol_SelectionChanged;
|
||||||
clbInboundTag.SelectionChanged += ClbInboundTag_SelectionChanged;
|
clbInboundTag.SelectionChanged += ClbInboundTag_SelectionChanged;
|
||||||
|
|
||||||
|
|
@ -54,7 +54,7 @@ public partial class RoutingRuleDetailsWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ public partial class RoutingRuleSettingWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
this.PreviewKeyDown += RoutingRuleSettingWindow_PreviewKeyDown;
|
PreviewKeyDown += RoutingRuleSettingWindow_PreviewKeyDown;
|
||||||
lstRules.SelectionChanged += lstRules_SelectionChanged;
|
lstRules.SelectionChanged += lstRules_SelectionChanged;
|
||||||
lstRules.MouseDoubleClick += LstRules_MouseDoubleClick;
|
lstRules.MouseDoubleClick += LstRules_MouseDoubleClick;
|
||||||
menuRuleSelectAll.Click += menuRuleSelectAll_Click;
|
menuRuleSelectAll.Click += menuRuleSelectAll_Click;
|
||||||
|
|
@ -57,7 +57,7 @@ public partial class RoutingRuleSettingWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EViewAction.ShowYesNo:
|
case EViewAction.ShowYesNo:
|
||||||
|
|
@ -80,11 +80,11 @@ public partial class RoutingRuleSettingWindow
|
||||||
|
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new RoutingRuleDetailsWindow((RulesItem)obj)).ShowDialog() ?? false;
|
return new RoutingRuleDetailsWindow((RulesItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.ImportRulesFromFile:
|
case EViewAction.ImportRulesFromFile:
|
||||||
|
|
||||||
if (UI.OpenFileDialog(out string fileName, "Rules|*.json|All|*.*") != true)
|
if (UI.OpenFileDialog(out var fileName, "Rules|*.json|All|*.*") != true)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -174,7 +174,7 @@ public partial class RoutingRuleSettingWindow
|
||||||
|
|
||||||
private void btnBrowseCustomIcon_Click(object sender, System.Windows.RoutedEventArgs e)
|
private void btnBrowseCustomIcon_Click(object sender, System.Windows.RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (UI.OpenFileDialog(out string fileName,
|
if (UI.OpenFileDialog(out var fileName,
|
||||||
"PNG,ICO|*.png;*.ico") != true)
|
"PNG,ICO|*.png;*.ico") != true)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
@ -185,7 +185,7 @@ public partial class RoutingRuleSettingWindow
|
||||||
|
|
||||||
private void btnBrowseCustomRulesetPath4Singbox_Click(object sender, RoutedEventArgs e)
|
private void btnBrowseCustomRulesetPath4Singbox_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (UI.OpenFileDialog(out string fileName,
|
if (UI.OpenFileDialog(out var fileName,
|
||||||
"Config|*.json|All|*.*") != true)
|
"Config|*.json|All|*.*") != true)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ public partial class RoutingSettingWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Closing += RoutingSettingWindow_Closing;
|
Closing += RoutingSettingWindow_Closing;
|
||||||
this.PreviewKeyDown += RoutingSettingWindow_PreviewKeyDown;
|
PreviewKeyDown += RoutingSettingWindow_PreviewKeyDown;
|
||||||
lstRoutings.SelectionChanged += lstRoutings_SelectionChanged;
|
lstRoutings.SelectionChanged += lstRoutings_SelectionChanged;
|
||||||
lstRoutings.MouseDoubleClick += LstRoutings_MouseDoubleClick;
|
lstRoutings.MouseDoubleClick += LstRoutings_MouseDoubleClick;
|
||||||
menuRoutingAdvancedSelectAll.Click += menuRoutingAdvancedSelectAll_Click;
|
menuRoutingAdvancedSelectAll.Click += menuRoutingAdvancedSelectAll_Click;
|
||||||
|
|
@ -44,7 +44,7 @@ public partial class RoutingSettingWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EViewAction.ShowYesNo:
|
case EViewAction.ShowYesNo:
|
||||||
|
|
@ -58,7 +58,7 @@ public partial class RoutingSettingWindow
|
||||||
|
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new RoutingRuleSettingWindow((RoutingItem)obj)).ShowDialog() ?? false;
|
return new RoutingRuleSettingWindow((RoutingItem)obj).ShowDialog() ?? false;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
}
|
}
|
||||||
|
|
@ -67,7 +67,7 @@ public partial class RoutingSettingWindow
|
||||||
{
|
{
|
||||||
if (ViewModel?.IsModified == true)
|
if (ViewModel?.IsModified == true)
|
||||||
{
|
{
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -122,11 +122,11 @@ public partial class RoutingSettingWindow
|
||||||
{
|
{
|
||||||
if (ViewModel?.IsModified == true)
|
if (ViewModel?.IsModified == true)
|
||||||
{
|
{
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.Close();
|
Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -71,11 +71,11 @@ public partial class StatusBarView
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.DispatcherRefreshIcon:
|
case EViewAction.DispatcherRefreshIcon:
|
||||||
Application.Current?.Dispatcher.Invoke((async () =>
|
Application.Current?.Dispatcher.Invoke(async () =>
|
||||||
{
|
{
|
||||||
tbNotify.Icon = await WindowsManager.Instance.GetNotifyIcon(_config);
|
tbNotify.Icon = await WindowsManager.Instance.GetNotifyIcon(_config);
|
||||||
Application.Current.MainWindow.Icon = WindowsManager.Instance.GetAppIcon(_config);
|
Application.Current.MainWindow.Icon = WindowsManager.Instance.GetAppIcon(_config);
|
||||||
}), DispatcherPriority.Normal);
|
}, DispatcherPriority.Normal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EViewAction.SetClipboardData:
|
case EViewAction.SetClipboardData:
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ public partial class SubEditWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
this.Loaded += Window_Loaded;
|
Loaded += Window_Loaded;
|
||||||
|
|
||||||
ViewModel = new SubEditViewModel(subItem, UpdateViewHandler);
|
ViewModel = new SubEditViewModel(subItem, UpdateViewHandler);
|
||||||
|
|
||||||
|
|
@ -39,7 +39,7 @@ public partial class SubEditWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return await Task.FromResult(true);
|
return await Task.FromResult(true);
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@ public partial class SubSettingWindow
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
this.Owner = Application.Current.MainWindow;
|
Owner = Application.Current.MainWindow;
|
||||||
|
|
||||||
ViewModel = new SubSettingViewModel(UpdateViewHandler);
|
ViewModel = new SubSettingViewModel(UpdateViewHandler);
|
||||||
this.Closing += SubSettingWindow_Closing;
|
Closing += SubSettingWindow_Closing;
|
||||||
lstSubscription.MouseDoubleClick += LstSubscription_MouseDoubleClick;
|
lstSubscription.MouseDoubleClick += LstSubscription_MouseDoubleClick;
|
||||||
lstSubscription.SelectionChanged += LstSubscription_SelectionChanged;
|
lstSubscription.SelectionChanged += LstSubscription_SelectionChanged;
|
||||||
menuClose.Click += menuClose_Click;
|
menuClose.Click += menuClose_Click;
|
||||||
|
|
@ -34,7 +34,7 @@ public partial class SubSettingWindow
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case EViewAction.CloseWindow:
|
case EViewAction.CloseWindow:
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EViewAction.ShowYesNo:
|
case EViewAction.ShowYesNo:
|
||||||
|
|
@ -47,7 +47,7 @@ public partial class SubSettingWindow
|
||||||
case EViewAction.SubEditWindow:
|
case EViewAction.SubEditWindow:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
return false;
|
return false;
|
||||||
return (new SubEditWindow((SubItem)obj)).ShowDialog() ?? false;
|
return new SubEditWindow((SubItem)obj).ShowDialog() ?? false;
|
||||||
|
|
||||||
case EViewAction.ShareSub:
|
case EViewAction.ShareSub:
|
||||||
if (obj is null)
|
if (obj is null)
|
||||||
|
|
@ -78,7 +78,7 @@ public partial class SubSettingWindow
|
||||||
{
|
{
|
||||||
if (ViewModel?.IsModified == true)
|
if (ViewModel?.IsModified == true)
|
||||||
{
|
{
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,11 +99,11 @@ public partial class SubSettingWindow
|
||||||
{
|
{
|
||||||
if (ViewModel?.IsModified == true)
|
if (ViewModel?.IsModified == true)
|
||||||
{
|
{
|
||||||
this.DialogResult = true;
|
DialogResult = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.Close();
|
Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue