* Multi Profile * VM and wpf * avalonia * Fix right click not working * Exclude specific profile types from selection * Rename * Add Policy Group support * Add generate policy group * Adjust UI * Add Proxy Chain support * Fix * Add fallback support * Add PolicyGroup include other Group support * Add group in traffic splitting support * Avoid duplicate tags * Refactor * Adjust chained proxy, actual outbound is at the top Based on actual network flow instead of data packets * Add helper function * Refactor * Add chain selection control to group outbounds * Avoid self-reference * Fix * Improves Tun2Socks address handling * Avoids circular dependency in profile groups Adds cycle detection to prevent infinite loops when evaluating profile groups. This ensures that profile group configurations don't result in stack overflow errors when groups reference each other, directly or indirectly. * Fix * Fix * Update ProfileGroupItem.cs * Refactor * Remove unnecessary checks --------- Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
214 lines
9.6 KiB
XML
214 lines
9.6 KiB
XML
<base:WindowBase
|
|
x:Class="v2rayN.Views.AddGroupServerWindow"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:base="clr-namespace:v2rayN.Base"
|
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
xmlns:reactiveui="http://reactiveui.net"
|
|
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
|
|
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
|
|
Title="{x:Static resx:ResUI.menuServers}"
|
|
Width="900"
|
|
Height="700"
|
|
x:TypeArguments="vms:AddGroupServerViewModel"
|
|
ResizeMode="CanResize"
|
|
ShowInTaskbar="False"
|
|
Style="{StaticResource WindowGlobal}"
|
|
WindowStartupLocation="CenterScreen"
|
|
mc:Ignorable="d">
|
|
|
|
<DockPanel Margin="{StaticResource Margin8}">
|
|
<StackPanel
|
|
Margin="{StaticResource Margin4}"
|
|
HorizontalAlignment="Center"
|
|
DockPanel.Dock="Bottom"
|
|
Orientation="Horizontal">
|
|
<Button
|
|
x:Name="btnSave"
|
|
Width="100"
|
|
Content="{x:Static resx:ResUI.TbConfirm}"
|
|
IsDefault="True"
|
|
Style="{StaticResource DefButton}" />
|
|
<Button
|
|
x:Name="btnCancel"
|
|
Width="100"
|
|
Margin="{StaticResource MarginLeftRight8}"
|
|
Content="{x:Static resx:ResUI.TbCancel}"
|
|
IsCancel="true"
|
|
Style="{StaticResource DefButton}" />
|
|
</StackPanel>
|
|
<Grid DockPanel.Dock="Top">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="*" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
</Grid.RowDefinitions>
|
|
|
|
<Grid Grid.Row="0">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
<RowDefinition Height="Auto" />
|
|
</Grid.RowDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="180" />
|
|
<ColumnDefinition Width="Auto" />
|
|
<ColumnDefinition Width="Auto" />
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<TextBlock
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
Margin="{StaticResource Margin4}"
|
|
Style="{StaticResource ModuleTitle}"
|
|
Text="{x:Static resx:ResUI.menuServers}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="1"
|
|
Grid.Column="0"
|
|
Margin="{StaticResource Margin4}"
|
|
VerticalAlignment="Center"
|
|
Style="{StaticResource ToolbarTextBlock}"
|
|
Text="{x:Static resx:ResUI.TbRemarks}" />
|
|
<TextBox
|
|
x:Name="txtRemarks"
|
|
Grid.Row="1"
|
|
Grid.Column="1"
|
|
Width="400"
|
|
Margin="{StaticResource Margin4}"
|
|
Style="{StaticResource DefTextBox}" />
|
|
|
|
<TextBlock
|
|
Grid.Row="2"
|
|
Grid.Column="0"
|
|
Margin="{StaticResource Margin4}"
|
|
VerticalAlignment="Center"
|
|
Style="{StaticResource ToolbarTextBlock}"
|
|
Text="{x:Static resx:ResUI.TbCoreType}" />
|
|
<ComboBox
|
|
x:Name="cmbCoreType"
|
|
Grid.Row="2"
|
|
Grid.Column="1"
|
|
Width="200"
|
|
Margin="{StaticResource Margin4}"
|
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.TbCoreType}"
|
|
Style="{StaticResource DefComboBox}" />
|
|
|
|
<Grid
|
|
x:Name="gridPolicyGroup"
|
|
Grid.Row="3"
|
|
Grid.Column="0"
|
|
Grid.ColumnSpan="3">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="180" />
|
|
<ColumnDefinition Width="Auto" />
|
|
<ColumnDefinition Width="Auto" />
|
|
</Grid.ColumnDefinitions>
|
|
<TextBlock
|
|
Grid.Row="3"
|
|
Grid.Column="0"
|
|
Margin="{StaticResource Margin4}"
|
|
VerticalAlignment="Center"
|
|
Style="{StaticResource ToolbarTextBlock}"
|
|
Text="{x:Static resx:ResUI.TbPolicyGroupType}" />
|
|
<ComboBox
|
|
x:Name="cmbPolicyGroupType"
|
|
Grid.Row="3"
|
|
Grid.Column="1"
|
|
Width="200"
|
|
Margin="{StaticResource Margin4}"
|
|
materialDesign:HintAssist.Hint="{x:Static resx:ResUI.TbPolicyGroupType}"
|
|
Style="{StaticResource DefComboBox}" />
|
|
</Grid>
|
|
</Grid>
|
|
</Grid>
|
|
<TabControl>
|
|
<TabItem HorizontalAlignment="Left" Header="{x:Static resx:ResUI.menuServerList}">
|
|
<DataGrid
|
|
x:Name="lstChild"
|
|
AutoGenerateColumns="False"
|
|
BorderThickness="1"
|
|
CanUserAddRows="False"
|
|
CanUserResizeRows="False"
|
|
CanUserSortColumns="False"
|
|
EnableRowVirtualization="True"
|
|
GridLinesVisibility="All"
|
|
HeadersVisibility="Column"
|
|
IsReadOnly="True"
|
|
Style="{StaticResource DefDataGrid}">
|
|
<DataGrid.ContextMenu>
|
|
<ContextMenu Style="{StaticResource DefContextMenu}">
|
|
<MenuItem
|
|
x:Name="menuAddChildServer"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Click="MenuAddChild_Click"
|
|
Header="{x:Static resx:ResUI.menuAddChildServer}" />
|
|
<MenuItem
|
|
x:Name="menuRemoveChildServer"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Header="{x:Static resx:ResUI.menuRemoveChildServer}" />
|
|
<MenuItem
|
|
x:Name="menuSelectAllChild"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Header="{x:Static resx:ResUI.menuSelectAll}" />
|
|
<Separator />
|
|
<MenuItem
|
|
x:Name="menuMoveTop"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Header="{x:Static resx:ResUI.menuMoveTop}" />
|
|
<MenuItem
|
|
x:Name="menuMoveUp"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Header="{x:Static resx:ResUI.menuMoveUp}" />
|
|
<MenuItem
|
|
x:Name="menuMoveDown"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Header="{x:Static resx:ResUI.menuMoveDown}" />
|
|
<MenuItem
|
|
x:Name="menuMoveBottom"
|
|
Height="{StaticResource MenuItemHeight}"
|
|
Header="{x:Static resx:ResUI.menuMoveBottom}" />
|
|
</ContextMenu>
|
|
</DataGrid.ContextMenu>
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn
|
|
Width="150"
|
|
Binding="{Binding ConfigType}"
|
|
Header="{x:Static resx:ResUI.LvServiceType}" />
|
|
<DataGridTextColumn
|
|
Width="150"
|
|
Binding="{Binding Remarks}"
|
|
Header="{x:Static resx:ResUI.LvRemarks}" />
|
|
<DataGridTextColumn
|
|
Width="120"
|
|
Binding="{Binding Address}"
|
|
Header="{x:Static resx:ResUI.LvAddress}" />
|
|
<DataGridTextColumn
|
|
Width="100"
|
|
Binding="{Binding Port}"
|
|
Header="{x:Static resx:ResUI.LvPort}" />
|
|
<DataGridTextColumn
|
|
Width="100"
|
|
Binding="{Binding Network}"
|
|
Header="{x:Static resx:ResUI.LvTransportProtocol}" />
|
|
<DataGridTextColumn
|
|
Width="100"
|
|
Binding="{Binding StreamSecurity}"
|
|
Header="{x:Static resx:ResUI.LvTLS}" />
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</TabItem>
|
|
</TabControl>
|
|
</DockPanel>
|
|
</base:WindowBase>
|