Files
TunnelX/AppTunnel/Views/AppsTabView.xaml
T
2026-05-18 12:59:33 +03:30

326 lines
19 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<UserControl x:Class="AppTunnel.Views.AppsTabView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<Style x:Key="CompactToggleSwitch" TargetType="CheckBox">
<Setter Property="Width" Value="32"/>
<Setter Property="Height" Value="18"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<Grid Width="32" Height="18">
<Border x:Name="track"
Width="32"
Height="18"
CornerRadius="9"
Background="#555"
Cursor="Hand"/>
<Border x:Name="thumb"
Width="14"
Height="14"
CornerRadius="7"
Background="White"
HorizontalAlignment="Left"
Margin="2,0,0,0"
VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="track" Property="Background" Value="{StaticResource SuccessBrush}"/>
<Setter TargetName="thumb" Property="HorizontalAlignment" Value="Right"/>
<Setter TargetName="thumb" Property="Margin" Value="0,0,2,0"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="CompactIconButton" TargetType="Button" BasedOn="{StaticResource SecondaryButton}">
<Setter Property="MinWidth" Value="24"/>
<Setter Property="Width" Value="24"/>
<Setter Property="Height" Value="22"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style x:Key="AppRowCard" TargetType="Border">
<Setter Property="Background" Value="#0EFFFFFF"/>
<Setter Property="BorderBrush" Value="#10FFFFFF"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="CornerRadius" Value="10"/>
<Setter Property="Padding" Value="8,6"/>
<Setter Property="Margin" Value="0,0,0,6"/>
<Setter Property="MinHeight" Value="50"/>
<Setter Property="FlowDirection" Value="LeftToRight"/>
</Style>
</UserControl.Resources>
<Grid Margin="12,8,12,4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- LEFT: Selected Apps (Tunnel List) -->
<Border Grid.Column="0" Style="{StaticResource CardPanel}" Margin="0" BorderBrush="#2233C481">
<DockPanel>
<Grid DockPanel.Dock="Top" Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="✅ برنامه‌های داخل تونل" FontSize="14" FontWeight="SemiBold"
Foreground="{StaticResource TextPrimaryBrush}"
TextTrimming="CharacterEllipsis"/>
<TextBlock Text="برنامه‌های فعال‌شده از مسیر تونل عبور می‌کنند"
Foreground="{StaticResource TextSecondaryBrush}"
FontSize="10" Margin="0,2,0,0"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
<Button Grid.Column="2" Style="{StaticResource SecondaryButton}"
Content="افزودن دستی"
ToolTip="افزودن دستی فایل exe"
Command="{Binding AddAppCommand}"
FontSize="10" Padding="10,6"
VerticalAlignment="Center"/>
</Grid>
<!-- Tunnel Search -->
<TextBox x:Name="TunnelSearchBox"
Style="{StaticResource ModernTextBox}"
Text="{Binding TunnelSearchText, UpdateSourceTrigger=PropertyChanged}"
Tag="فیلتر برنامه‌های تونل..."
DockPanel.Dock="Top"
Margin="0,0,0,7"
FontSize="12" Padding="9,6"
PreviewMouseDoubleClick="OnSearchBoxPreviewMouseDoubleClick"/>
<!-- Tunnel Apps List -->
<ListView ItemsSource="{Binding FilteredTunnelApps}"
SelectedItem="{Binding SelectedApp}"
Background="Transparent"
BorderThickness="0"
FlowDirection="{Binding AppFlowDirection}"
Cursor="Arrow"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemTemplate>
<DataTemplate>
<Border Style="{StaticResource AppRowCard}" Cursor="Arrow">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!-- App Icon -->
<Image Grid.Column="0" Source="{Binding Icon}"
Width="28" Height="28"
VerticalAlignment="Center"/>
<!-- App Name & Exe -->
<StackPanel Grid.Column="2" VerticalAlignment="Center">
<TextBlock Text="{Binding DisplayName}"
Foreground="{StaticResource TextPrimaryBrush}"
FontSize="10.8"
FontWeight="Normal"
TextOptions.TextFormattingMode="Display"
TextOptions.TextRenderingMode="ClearType"
TextOptions.TextHintingMode="Fixed"
TextWrapping="Wrap"
FlowDirection="LeftToRight"
TextAlignment="Left"/>
<TextBlock Text="{Binding ExecutableName}"
Foreground="{StaticResource TextSecondaryBrush}"
FontSize="8.5"
Margin="0,2,0,0"
FlowDirection="LeftToRight"
TextAlignment="Left"/>
</StackPanel>
<!-- Compact actions -->
<Grid Grid.Column="4"
Width="76"
VerticalAlignment="Center"
FlowDirection="LeftToRight">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0"
Orientation="Horizontal"
HorizontalAlignment="Right">
<CheckBox Style="{StaticResource CompactToggleSwitch}"
IsChecked="{Binding IsEnabled, Mode=OneWay}"
Command="{Binding DataContext.ToggleAppCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"
VerticalAlignment="Center"
Margin="0,0,4,0"/>
<Button Style="{StaticResource CompactIconButton}"
Content="×"
ToolTip="حذف"
Foreground="#FF8A80"
Command="{Binding DataContext.RemoveAppCommand,
RelativeSource={RelativeSource AncestorType=UserControl}}"
CommandParameter="{Binding}"/>
</StackPanel>
<Border Grid.Row="1"
Background="#15121212"
CornerRadius="6"
Padding="4,1"
Margin="0,4,0,0"
HorizontalAlignment="Right">
<TextBlock Text="{Binding TrafficDisplay}"
Foreground="{StaticResource AccentBrush}"
FontSize="8.5"
FlowDirection="LeftToRight"/>
</Border>
</Grid>
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</DockPanel>
</Border>
<!-- RIGHT: Available Apps (Discovery) -->
<Border Grid.Column="2" Style="{StaticResource CardPanel}" Margin="0" BorderBrush="#22E8803A">
<DockPanel>
<Grid DockPanel.Dock="Top" Margin="0,0,0,8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<TextBlock Text="🔍 برنامه‌های نصب‌شده" FontSize="14" FontWeight="SemiBold"
Foreground="{StaticResource TextPrimaryBrush}"
TextTrimming="CharacterEllipsis"/>
<TextBlock Text="روی برنامه کلیک کنید تا به لیست تونل اضافه شود"
Foreground="{StaticResource TextSecondaryBrush}"
FontSize="10" Margin="0,2,0,0"
TextTrimming="CharacterEllipsis"/>
</StackPanel>
<Button Grid.Column="2" Style="{StaticResource SecondaryButton}"
Content="بروزرسانی"
ToolTip="بارگذاری مجدد لیست برنامه‌ها"
Command="{Binding RefreshAppsCommand}"
FontSize="10" Padding="10,6"
VerticalAlignment="Center"/>
</Grid>
<TextBox x:Name="AvailableSearchBox"
Style="{StaticResource ModernTextBox}"
Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"
Tag="جستجوی برنامه..."
DockPanel.Dock="Top"
Margin="0,0,0,7"
FontSize="12"
Padding="9,6"
PreviewMouseDoubleClick="OnSearchBoxPreviewMouseDoubleClick"/>
<!-- Available Apps List -->
<ListView ItemsSource="{Binding FilteredAvailableApps}"
Background="Transparent"
BorderThickness="0"
FlowDirection="{Binding AppFlowDirection}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.ItemTemplate>
<DataTemplate>
<Border x:Name="itemBorder"
Style="{StaticResource AppRowCard}"
Cursor="Hand"
MouseLeftButtonUp="OnAvailableAppClick">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="{Binding Icon}"
Width="26" Height="26"
VerticalAlignment="Center"/>
<StackPanel Grid.Column="2" VerticalAlignment="Center">
<TextBlock Text="{Binding DisplayName}"
Foreground="{StaticResource TextPrimaryBrush}"
FontSize="10.8"
FontWeight="Normal"
TextOptions.TextFormattingMode="Display"
TextOptions.TextRenderingMode="ClearType"
TextOptions.TextHintingMode="Fixed"
TextWrapping="Wrap"
FlowDirection="LeftToRight"
TextAlignment="Left"/>
<TextBlock Text="{Binding ExecutableName}"
Foreground="{StaticResource TextSecondaryBrush}"
FontSize="8.5"
Margin="0,2,0,0"
FlowDirection="LeftToRight"
TextAlignment="Left"/>
</StackPanel>
<Button Grid.Column="4"
x:Name="addBadge"
Style="{StaticResource CompactIconButton}"
Content="+"
ToolTip="افزودن"
Foreground="{StaticResource PrimaryBrush}"
Click="OnAvailableAppAddClick"/>
</Grid>
</Border>
<DataTemplate.Triggers>
<Trigger SourceName="itemBorder" Property="IsMouseOver" Value="True">
<Setter TargetName="itemBorder" Property="Background" Value="#18FFFFFF"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</DockPanel>
</Border>
</Grid>
</UserControl>