Browse Source

💌 UI: Routing and Settings

pull/3073/head
database64128 3 years ago
parent
commit
641a19763e
No known key found for this signature in database GPG Key ID: 1CA27546BEDB8B01
6 changed files with 306 additions and 42 deletions
  1. +14
    -0
      Shadowsocks.WPF/ViewModels/MainWindowViewModel.cs
  2. +21
    -10
      Shadowsocks.WPF/Views/DashboardView.xaml
  3. +17
    -2
      Shadowsocks.WPF/Views/MainWindow.xaml.cs
  4. +92
    -10
      Shadowsocks.WPF/Views/RoutingView.xaml
  5. +21
    -10
      Shadowsocks.WPF/Views/ServersView.xaml
  6. +141
    -10
      Shadowsocks.WPF/Views/SettingsView.xaml

+ 14
- 0
Shadowsocks.WPF/ViewModels/MainWindowViewModel.cs View File

@@ -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; }
} }
} }

+ 21
- 10
Shadowsocks.WPF/Views/DashboardView.xaml View File

@@ -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>

+ 17
- 2
Shadowsocks.WPF/Views/MainWindow.xaml.cs View File

@@ -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);
}); });
} }
} }


+ 92
- 10
Shadowsocks.WPF/Views/RoutingView.xaml View File

@@ -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>

+ 21
- 10
Shadowsocks.WPF/Views/ServersView.xaml View File

@@ -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>

+ 141
- 10
Shadowsocks.WPF/Views/SettingsView.xaml View File

@@ -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>

Loading…
Cancel
Save