@@ -1,4 +1,6 @@ | |||||
using ReactiveUI; | using ReactiveUI; | ||||
using ReactiveUI.Fody.Helpers; | |||||
using Shadowsocks.WPF.Views; | |||||
namespace Shadowsocks.WPF.ViewModels | namespace Shadowsocks.WPF.ViewModels | ||||
{ | { | ||||
@@ -6,6 +8,18 @@ namespace Shadowsocks.WPF.ViewModels | |||||
{ | { | ||||
public MainWindowViewModel() | public MainWindowViewModel() | ||||
{ | { | ||||
GetDashboardView = new(); | |||||
GetServersView = new(); | |||||
GetRoutingView = new(); | |||||
GetSettingsView = new(); | |||||
} | } | ||||
public DashboardView GetDashboardView { get; } | |||||
public ServersView GetServersView { get; } | |||||
public RoutingView GetRoutingView { get; } | |||||
public SettingsView GetSettingsView { get; } | |||||
} | } | ||||
} | } |
@@ -8,20 +8,31 @@ | |||||
xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | ||||
xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | ||||
xmlns:reactiveui="http://reactiveui.net" | xmlns:reactiveui="http://reactiveui.net" | ||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" | |||||
xmlns:lex="http://wpflocalizeextension.codeplex.com" | xmlns:lex="http://wpflocalizeextension.codeplex.com" | ||||
lex:LocalizeDictionary.DesignCulture="en" | lex:LocalizeDictionary.DesignCulture="en" | ||||
lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | ||||
lex:ResxLocalizationProvider.DefaultDictionary="Strings" | lex:ResxLocalizationProvider.DefaultDictionary="Strings" | ||||
mc:Ignorable="d" | mc:Ignorable="d" | ||||
d:DesignHeight="450" d:DesignWidth="800"> | d:DesignHeight="450" d:DesignWidth="800"> | ||||
<Grid Margin="8"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<ScrollViewer materialDesign:ScrollViewerAssist.IsAutoHideEnabled="True" | |||||
HorizontalScrollBarVisibility="Auto" | |||||
VerticalScrollBarVisibility="Auto"> | |||||
<Grid Margin="16"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Grid.Row="0" | |||||
Grid.Column="0" | |||||
Margin="8 0 8 8" | |||||
FontSize="28"> | |||||
Dashboard | |||||
</TextBlock> | |||||
</Grid> | |||||
</ScrollViewer> | |||||
</reactiveui:ReactiveUserControl> | </reactiveui:ReactiveUserControl> |
@@ -1,6 +1,6 @@ | |||||
using ReactiveUI; | using ReactiveUI; | ||||
using Shadowsocks.WPF.ViewModels; | using Shadowsocks.WPF.ViewModels; | ||||
using System.Reactive.Disposables; | |||||
namespace Shadowsocks.WPF.Views | namespace Shadowsocks.WPF.Views | ||||
{ | { | ||||
@@ -15,7 +15,22 @@ namespace Shadowsocks.WPF.Views | |||||
ViewModel = new MainWindowViewModel(); | ViewModel = new MainWindowViewModel(); | ||||
this.WhenActivated(disposables => | this.WhenActivated(disposables => | ||||
{ | { | ||||
this.OneWayBind(ViewModel, | |||||
viewModel => viewModel.GetDashboardView, | |||||
view => view.dashboardTabItem.Content) | |||||
.DisposeWith(disposables); | |||||
this.OneWayBind(ViewModel, | |||||
viewModel => viewModel.GetServersView, | |||||
view => view.serversTabItem.Content) | |||||
.DisposeWith(disposables); | |||||
this.OneWayBind(ViewModel, | |||||
viewModel => viewModel.GetRoutingView, | |||||
view => view.routingTabItem.Content) | |||||
.DisposeWith(disposables); | |||||
this.OneWayBind(ViewModel, | |||||
viewModel => viewModel.GetSettingsView, | |||||
view => view.settingsTabItem.Content) | |||||
.DisposeWith(disposables); | |||||
}); | }); | ||||
} | } | ||||
} | } | ||||
@@ -8,20 +8,102 @@ | |||||
xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | ||||
xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | ||||
xmlns:reactiveui="http://reactiveui.net" | xmlns:reactiveui="http://reactiveui.net" | ||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" | |||||
xmlns:lex="http://wpflocalizeextension.codeplex.com" | xmlns:lex="http://wpflocalizeextension.codeplex.com" | ||||
lex:LocalizeDictionary.DesignCulture="en" | lex:LocalizeDictionary.DesignCulture="en" | ||||
lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | ||||
lex:ResxLocalizationProvider.DefaultDictionary="Strings" | lex:ResxLocalizationProvider.DefaultDictionary="Strings" | ||||
mc:Ignorable="d" | mc:Ignorable="d" | ||||
d:DesignHeight="450" d:DesignWidth="800"> | d:DesignHeight="450" d:DesignWidth="800"> | ||||
<Grid Margin="8"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<ScrollViewer materialDesign:ScrollViewerAssist.IsAutoHideEnabled="True" | |||||
HorizontalScrollBarVisibility="Auto" | |||||
VerticalScrollBarVisibility="Auto"> | |||||
<Grid Margin="16"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="*" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Grid.Row="0" | |||||
Grid.Column="0" | |||||
Margin="8 0 8 8" | |||||
FontSize="28"> | |||||
Routing | |||||
</TextBlock> | |||||
<TextBlock Grid.Row="1" | |||||
Grid.Column="0" | |||||
Margin="8" | |||||
Style="{StaticResource MaterialDesignSubtitle1TextBlock}" | |||||
FontWeight="Medium" | |||||
VerticalAlignment="Center"> | |||||
Preset | |||||
</TextBlock> | |||||
<StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal"> | |||||
<ListBox Margin="8" | |||||
x:Name="presetListBox" | |||||
Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineListBox}"/> | |||||
<Button x:Name="addPresetButton" | |||||
Style="{StaticResource MaterialDesignIconForegroundButton}" | |||||
ToolTip="Add a preset"> | |||||
<materialDesign:PackIcon Kind="Plus"/> | |||||
</Button> | |||||
<Button x:Name="deletePresetButton" | |||||
Style="{StaticResource MaterialDesignIconForegroundButton}" | |||||
ToolTip="Delete the preset"> | |||||
<materialDesign:PackIcon Kind="Minus"/> | |||||
</Button> | |||||
<Button x:Name="editPresetButton" | |||||
Style="{StaticResource MaterialDesignIconForegroundButton}" | |||||
ToolTip="Edit the preset"> | |||||
<materialDesign:PackIcon Kind="Edit"/> | |||||
</Button> | |||||
</StackPanel> | |||||
<TextBlock Grid.Row="2" | |||||
Grid.Column="0" | |||||
Margin="8" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center"> | |||||
Domain strategy | |||||
</TextBlock> | |||||
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal"> | |||||
<RadioButton Style="{StaticResource MaterialDesignChoiceChipAccentOutlineRadioButton}" | |||||
GroupName="DomainStrategy" | |||||
FontFamily="pack://application:,,,/Resources/RobotoMono/#Roboto Mono"> | |||||
AsIs | |||||
</RadioButton> | |||||
<RadioButton Style="{StaticResource MaterialDesignChoiceChipAccentOutlineRadioButton}" | |||||
GroupName="DomainStrategy" | |||||
FontFamily="pack://application:,,,/Resources/RobotoMono/#Roboto Mono"> | |||||
IPIfNonMatch | |||||
</RadioButton> | |||||
<RadioButton Style="{StaticResource MaterialDesignChoiceChipAccentOutlineRadioButton}" | |||||
GroupName="DomainStrategy" | |||||
FontFamily="pack://application:,,,/Resources/RobotoMono/#Roboto Mono"> | |||||
IPOnDemand | |||||
</RadioButton> | |||||
</StackPanel> | |||||
<TextBlock Grid.Row="3" | |||||
Grid.Column="0" | |||||
Margin="8" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center"> | |||||
Rules | |||||
</TextBlock> | |||||
<ListBox Grid.Row="4" | |||||
Grid.Column="0" | |||||
Grid.ColumnSpan="2" | |||||
Margin="8" | |||||
x:Name="rulesListBox" | |||||
Style="{StaticResource MaterialDesignCardsListBox}"/> | |||||
</Grid> | |||||
</ScrollViewer> | |||||
</reactiveui:ReactiveUserControl> | </reactiveui:ReactiveUserControl> |
@@ -8,20 +8,31 @@ | |||||
xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | ||||
xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | ||||
xmlns:reactiveui="http://reactiveui.net" | xmlns:reactiveui="http://reactiveui.net" | ||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" | |||||
xmlns:lex="http://wpflocalizeextension.codeplex.com" | xmlns:lex="http://wpflocalizeextension.codeplex.com" | ||||
lex:LocalizeDictionary.DesignCulture="en" | lex:LocalizeDictionary.DesignCulture="en" | ||||
lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | ||||
lex:ResxLocalizationProvider.DefaultDictionary="Strings" | lex:ResxLocalizationProvider.DefaultDictionary="Strings" | ||||
mc:Ignorable="d" | mc:Ignorable="d" | ||||
d:DesignHeight="450" d:DesignWidth="800"> | d:DesignHeight="450" d:DesignWidth="800"> | ||||
<Grid Margin="8"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<ScrollViewer materialDesign:ScrollViewerAssist.IsAutoHideEnabled="True" | |||||
HorizontalScrollBarVisibility="Auto" | |||||
VerticalScrollBarVisibility="Auto"> | |||||
<Grid Margin="16"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Grid.Row="0" | |||||
Grid.Column="0" | |||||
Margin="8 0 8 8" | |||||
FontSize="28"> | |||||
Servers | |||||
</TextBlock> | |||||
</Grid> | |||||
</ScrollViewer> | |||||
</reactiveui:ReactiveUserControl> | </reactiveui:ReactiveUserControl> |
@@ -8,20 +8,151 @@ | |||||
xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | xmlns:local="clr-namespace:Shadowsocks.WPF.Views" | ||||
xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" | ||||
xmlns:reactiveui="http://reactiveui.net" | xmlns:reactiveui="http://reactiveui.net" | ||||
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" | |||||
xmlns:lex="http://wpflocalizeextension.codeplex.com" | xmlns:lex="http://wpflocalizeextension.codeplex.com" | ||||
lex:LocalizeDictionary.DesignCulture="en" | lex:LocalizeDictionary.DesignCulture="en" | ||||
lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" | ||||
lex:ResxLocalizationProvider.DefaultDictionary="Strings" | lex:ResxLocalizationProvider.DefaultDictionary="Strings" | ||||
mc:Ignorable="d" | mc:Ignorable="d" | ||||
d:DesignHeight="450" d:DesignWidth="800"> | d:DesignHeight="450" d:DesignWidth="800"> | ||||
<Grid Margin="8"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<ScrollViewer materialDesign:ScrollViewerAssist.IsAutoHideEnabled="True" | |||||
HorizontalScrollBarVisibility="Auto" | |||||
VerticalScrollBarVisibility="Auto"> | |||||
<Grid Margin="16"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
<RowDefinition Height="Auto" /> | |||||
</Grid.RowDefinitions> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
<ColumnDefinition Width="Auto" /> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Grid.Row="0" | |||||
Grid.Column="0" | |||||
Margin="8 0 8 8" | |||||
FontSize="28"> | |||||
Settings | |||||
</TextBlock> | |||||
<TextBlock Grid.Row="1" | |||||
Grid.Column="0" | |||||
Margin="8" | |||||
Style="{StaticResource MaterialDesignHeadline6TextBlock}"> | |||||
UI | |||||
</TextBlock> | |||||
<TextBlock Grid.Row="2" | |||||
Grid.Column="0" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center" | |||||
Margin="8"> | |||||
Color Mode | |||||
</TextBlock> | |||||
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal"> | |||||
<RadioButton Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineRadioButton}" | |||||
GroupName="ColorMode"> | |||||
System | |||||
</RadioButton> | |||||
<RadioButton Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineRadioButton}" | |||||
GroupName="ColorMode"> | |||||
Light | |||||
</RadioButton> | |||||
<RadioButton Style="{StaticResource MaterialDesignChoiceChipPrimaryOutlineRadioButton}" | |||||
GroupName="ColorMode"> | |||||
Dark | |||||
</RadioButton> | |||||
</StackPanel> | |||||
<TextBlock Grid.Row="3" | |||||
Grid.Column="0" | |||||
Margin="8" | |||||
Style="{StaticResource MaterialDesignHeadline6TextBlock}"> | |||||
Backend | |||||
</TextBlock> | |||||
<TextBlock Grid.Row="4" | |||||
Grid.Column="0" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center" | |||||
Margin="8"> | |||||
Start on boot | |||||
</TextBlock> | |||||
<ToggleButton Grid.Row="4" | |||||
Grid.Column="1" | |||||
x:Name="startOnBootToggleButton" | |||||
Margin="8" | |||||
HorizontalAlignment="Left"/> | |||||
<TextBlock Grid.Row="5" | |||||
Grid.Column="0" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center" | |||||
Margin="8"> | |||||
<Span FontFamily="pack://application:,,,/Resources/RobotoMono/#Roboto Mono">shadowsocks-rust</Span> Path | |||||
</TextBlock> | |||||
<TextBox Grid.Row="5" | |||||
Grid.Column="1" | |||||
x:Name="ssRustPathTextBox" | |||||
Margin="2,8,2,8" | |||||
Width="400" | |||||
materialDesign:HintAssist.Hint="Path to shadowsocks-rust executable"/> | |||||
<Button Grid.Row="5" | |||||
Grid.Column="2" | |||||
x:Name="ssRustPathBrowseButton" | |||||
Margin="2,0,8,0" | |||||
Style="{StaticResource MaterialDesignFlatButton}"> | |||||
Browse | |||||
</Button> | |||||
<TextBlock Grid.Row="6" | |||||
Grid.Column="0" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center" | |||||
Margin="8,8,8,8"> | |||||
<Span FontFamily="pack://application:,,,/Resources/RobotoMono/#Roboto Mono">V2Ray</Span> Path | |||||
</TextBlock> | |||||
<TextBox Grid.Row="6" | |||||
Grid.Column="1" | |||||
x:Name="v2rayPathTextBox" | |||||
Margin="2,8,2,8" | |||||
Width="400" | |||||
materialDesign:HintAssist.Hint="Path to v2ray-core executable"/> | |||||
<Button Grid.Row="6" | |||||
Grid.Column="2" | |||||
x:Name="v2rayPathBrowseButton" | |||||
Margin="2,0,8,0" | |||||
Style="{StaticResource MaterialDesignFlatButton}"> | |||||
Browse | |||||
</Button> | |||||
<TextBlock Grid.Row="7" | |||||
Grid.Column="0" | |||||
Margin="8" | |||||
Style="{StaticResource MaterialDesignHeadline6TextBlock}"> | |||||
Network | |||||
</TextBlock> | |||||
<TextBlock Grid.Row="8" | |||||
Grid.Column="0" | |||||
Style="{StaticResource MaterialDesignBody2TextBlock}" | |||||
VerticalAlignment="Center" | |||||
Margin="8,8,8,8"> | |||||
Forward Proxy | |||||
</TextBlock> | |||||
<Button Grid.Row="8" | |||||
Grid.Column="1" | |||||
x:Name="forwardProxySettingsButton" | |||||
Margin="2,0,8,0" | |||||
Style="{StaticResource MaterialDesignRaisedAccentButton}"> | |||||
Open settings | |||||
</Button> | |||||
</Grid> | |||||
</ScrollViewer> | |||||
</reactiveui:ReactiveUserControl> | </reactiveui:ReactiveUserControl> |