mirror of https://github.com/2dust/v2rayN
Add theme options for desktop
parent
127858d582
commit
edbd168dcf
|
@ -0,0 +1,13 @@
|
||||||
|
namespace ServiceLib.Enums
|
||||||
|
{
|
||||||
|
public enum ETheme
|
||||||
|
{
|
||||||
|
FollowSystem,
|
||||||
|
Dark,
|
||||||
|
Light,
|
||||||
|
Aquatic,
|
||||||
|
Desert,
|
||||||
|
Dusk,
|
||||||
|
NightSky
|
||||||
|
}
|
||||||
|
}
|
|
@ -105,6 +105,7 @@
|
||||||
public bool ColorModeDark { get; set; }
|
public bool ColorModeDark { get; set; }
|
||||||
public bool FollowSystemTheme { get; set; }
|
public bool FollowSystemTheme { get; set; }
|
||||||
public string? ColorPrimaryName { get; set; }
|
public string? ColorPrimaryName { get; set; }
|
||||||
|
public string? CurrentTheme { get; set; }
|
||||||
public string CurrentLanguage { get; set; }
|
public string CurrentLanguage { get; set; }
|
||||||
public string CurrentFontFamily { get; set; }
|
public string CurrentFontFamily { get; set; }
|
||||||
public int CurrentFontSize { get; set; }
|
public int CurrentFontSize { get; set; }
|
||||||
|
|
|
@ -3463,6 +3463,15 @@ namespace ServiceLib.Resx {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 Theme 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
public static string TbSettingsTheme {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("TbSettingsTheme", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查找类似 Enable Security Protocol TLS v1.3 (subscription/update) 的本地化字符串。
|
/// 查找类似 Enable Security Protocol TLS v1.3 (subscription/update) 的本地化字符串。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1402,4 +1402,7 @@
|
||||||
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
||||||
<value>socks:پورت محلی، socks2: پورت دوم محلی، socks3: پورت LAN</value>
|
<value>socks:پورت محلی، socks2: پورت دوم محلی، socks3: پورت LAN</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
<data name="TbSettingsTheme" xml:space="preserve">
|
||||||
|
<value>Theme</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
|
@ -1402,4 +1402,7 @@
|
||||||
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
||||||
<value>socks: local port, socks2: second local port, socks3: LAN port</value>
|
<value>socks: local port, socks2: second local port, socks3: LAN port</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsTheme" xml:space="preserve">
|
||||||
|
<value>Theme</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1402,4 +1402,7 @@
|
||||||
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
||||||
<value>socks: local port, socks2: second local port, socks3: LAN port</value>
|
<value>socks: local port, socks2: second local port, socks3: LAN port</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsTheme" xml:space="preserve">
|
||||||
|
<value>Theme</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1402,4 +1402,7 @@
|
||||||
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
||||||
<value>socks: local port, socks2: second local port, socks3: LAN port</value>
|
<value>socks: local port, socks2: second local port, socks3: LAN port</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsTheme" xml:space="preserve">
|
||||||
|
<value>Theme</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1399,4 +1399,7 @@
|
||||||
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
||||||
<value>socks:本地端口,socks2:第二个本地端口,socks3:局域网端口</value>
|
<value>socks:本地端口,socks2:第二个本地端口,socks3:局域网端口</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsTheme" xml:space="preserve">
|
||||||
|
<value>主题</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1400,4 +1400,7 @@
|
||||||
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
<data name="TbRoutingInboundTagTips" xml:space="preserve">
|
||||||
<value>socks:本地端口,socks2:第二個本地端口,socks3:區域網路端口</value>
|
<value>socks:本地端口,socks2:第二個本地端口,socks3:區域網路端口</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="TbSettingsTheme" xml:space="preserve">
|
||||||
|
<value>主題</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -6,14 +6,14 @@ using Avalonia.Media;
|
||||||
using Avalonia.Styling;
|
using Avalonia.Styling;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
using ReactiveUI.Fody.Helpers;
|
using ReactiveUI.Fody.Helpers;
|
||||||
|
using Semi.Avalonia;
|
||||||
using System.Reactive.Linq;
|
using System.Reactive.Linq;
|
||||||
|
|
||||||
namespace v2rayN.Desktop.ViewModels
|
namespace v2rayN.Desktop.ViewModels
|
||||||
{
|
{
|
||||||
public class ThemeSettingViewModel : MyReactiveObject
|
public class ThemeSettingViewModel : MyReactiveObject
|
||||||
{
|
{
|
||||||
[Reactive] public bool ColorModeDark { get; set; }
|
[Reactive] public string CurrentTheme { get; set; }
|
||||||
[Reactive] public bool FollowSystemTheme { get; set; }
|
|
||||||
|
|
||||||
[Reactive] public int CurrentFontSize { get; set; }
|
[Reactive] public int CurrentFontSize { get; set; }
|
||||||
|
|
||||||
|
@ -36,28 +36,16 @@ namespace v2rayN.Desktop.ViewModels
|
||||||
|
|
||||||
private void BindingUI()
|
private void BindingUI()
|
||||||
{
|
{
|
||||||
ColorModeDark = _config.UiItem.ColorModeDark;
|
CurrentTheme = _config.UiItem.CurrentTheme;
|
||||||
FollowSystemTheme = _config.UiItem.FollowSystemTheme;
|
|
||||||
CurrentFontSize = _config.UiItem.CurrentFontSize;
|
CurrentFontSize = _config.UiItem.CurrentFontSize;
|
||||||
CurrentLanguage = _config.UiItem.CurrentLanguage;
|
CurrentLanguage = _config.UiItem.CurrentLanguage;
|
||||||
|
|
||||||
this.WhenAnyValue(x => x.ColorModeDark)
|
this.WhenAnyValue(x => x.CurrentTheme)
|
||||||
.Subscribe(c =>
|
.Subscribe(c =>
|
||||||
{
|
{
|
||||||
if (_config.UiItem.ColorModeDark != ColorModeDark)
|
if (_config.UiItem.CurrentTheme != CurrentTheme)
|
||||||
{
|
{
|
||||||
_config.UiItem.ColorModeDark = ColorModeDark;
|
_config.UiItem.CurrentTheme = CurrentTheme;
|
||||||
ModifyTheme();
|
|
||||||
ConfigHandler.SaveConfig(_config);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.WhenAnyValue(x => x.FollowSystemTheme,
|
|
||||||
y => y == true)
|
|
||||||
.Subscribe(c =>
|
|
||||||
{
|
|
||||||
if (_config.UiItem.FollowSystemTheme != FollowSystemTheme)
|
|
||||||
{
|
|
||||||
_config.UiItem.FollowSystemTheme = FollowSystemTheme;
|
|
||||||
ModifyTheme();
|
ModifyTheme();
|
||||||
ConfigHandler.SaveConfig(_config);
|
ConfigHandler.SaveConfig(_config);
|
||||||
}
|
}
|
||||||
|
@ -96,7 +84,16 @@ namespace v2rayN.Desktop.ViewModels
|
||||||
var app = Application.Current;
|
var app = Application.Current;
|
||||||
if (app is not null)
|
if (app is not null)
|
||||||
{
|
{
|
||||||
app.RequestedThemeVariant = FollowSystemTheme ? ThemeVariant.Default : (ColorModeDark ? ThemeVariant.Dark : ThemeVariant.Light);
|
app.RequestedThemeVariant = CurrentTheme switch
|
||||||
|
{
|
||||||
|
nameof(ETheme.Dark) => ThemeVariant.Dark,
|
||||||
|
nameof(ETheme.Light) => ThemeVariant.Light,
|
||||||
|
nameof(ETheme.Aquatic) => SemiTheme.Aquatic,
|
||||||
|
nameof(ETheme.Desert) => SemiTheme.Desert,
|
||||||
|
nameof(ETheme.Dusk) => SemiTheme.Dusk,
|
||||||
|
nameof(ETheme.NightSky) => SemiTheme.NightSky,
|
||||||
|
_ => ThemeVariant.Default,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,15 @@
|
||||||
d:DesignWidth="800"
|
d:DesignWidth="800"
|
||||||
x:DataType="vms:ThemeSettingViewModel"
|
x:DataType="vms:ThemeSettingViewModel"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
|
<UserControl.Styles>
|
||||||
|
<Style Selector="TextBlock">
|
||||||
|
<Setter Property="Width" Value="100" />
|
||||||
|
</Style>
|
||||||
|
<Style Selector="ComboBox">
|
||||||
|
<Setter Property="Width" Value="150" />
|
||||||
|
</Style>
|
||||||
|
</UserControl.Styles>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
Width="30"
|
Width="30"
|
||||||
Height="30"
|
Height="30"
|
||||||
|
@ -27,40 +36,32 @@
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Width="100"
|
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Classes="Margin8"
|
Classes="Margin8"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsColorMode}" />
|
Text="{x:Static resx:ResUI.TbSettingsTheme}" />
|
||||||
<ToggleSwitch x:Name="togDarkMode" Classes="Margin8" />
|
<ComboBox
|
||||||
|
x:Name="cmbCurrentTheme"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
Classes="Margin8" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Width="100"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Classes="Margin8"
|
|
||||||
Text="{x:Static resx:ResUI.TbSettingsFollowSystemTheme}" />
|
|
||||||
<ToggleSwitch x:Name="togFollowSystemTheme" Classes="Margin8" />
|
|
||||||
</StackPanel>
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock
|
|
||||||
Width="100"
|
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Classes="Margin8"
|
Classes="Margin8"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsFontSize}" />
|
Text="{x:Static resx:ResUI.TbSettingsFontSize}" />
|
||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbCurrentFontSize"
|
x:Name="cmbCurrentFontSize"
|
||||||
Width="100"
|
HorizontalAlignment="Center"
|
||||||
Classes="Margin8" />
|
Classes="Margin8" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Width="100"
|
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Classes="Margin8"
|
Classes="Margin8"
|
||||||
Text="{x:Static resx:ResUI.TbSettingsLanguage}" />
|
Text="{x:Static resx:ResUI.TbSettingsLanguage}" />
|
||||||
<ComboBox
|
<ComboBox
|
||||||
x:Name="cmbCurrentLanguage"
|
x:Name="cmbCurrentLanguage"
|
||||||
Width="100"
|
HorizontalAlignment="Center"
|
||||||
Classes="Margin8" />
|
Classes="Margin8" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
|
@ -16,6 +16,11 @@ namespace v2rayN.Desktop.Views
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
ViewModel = new ThemeSettingViewModel();
|
ViewModel = new ThemeSettingViewModel();
|
||||||
|
|
||||||
|
foreach (ETheme it in Enum.GetValues(typeof(ETheme)))
|
||||||
|
{
|
||||||
|
cmbCurrentTheme.Items.Add(it.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++)
|
for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++)
|
||||||
{
|
{
|
||||||
cmbCurrentFontSize.Items.Add(i);
|
cmbCurrentFontSize.Items.Add(i);
|
||||||
|
@ -28,8 +33,7 @@ namespace v2rayN.Desktop.Views
|
||||||
|
|
||||||
this.WhenActivated(disposables =>
|
this.WhenActivated(disposables =>
|
||||||
{
|
{
|
||||||
this.Bind(ViewModel, vm => vm.ColorModeDark, v => v.togDarkMode.IsChecked).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CurrentTheme, v => v.cmbCurrentTheme.SelectedValue).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.FollowSystemTheme, v => v.togFollowSystemTheme.IsChecked).DisposeWith(disposables);
|
|
||||||
this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.SelectedValue).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.SelectedValue).DisposeWith(disposables);
|
||||||
this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.SelectedValue).DisposeWith(disposables);
|
this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.SelectedValue).DisposeWith(disposables);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue