Idk, dev work goin on

This commit is contained in:
2026-09-09 16:19:45 +03:00 Unverified
parent b0d8bcd742
commit 17a0a9f7a6
318 changed files with 11908 additions and 81 deletions
@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:Class="WinWARP.Ui.Views.Components.ServerListElement"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WinWARP.Ui.Views.Components"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ct="using:CommunityToolkit.WinUI.Controls"
xmlns:w="using:WinWARP.Core.ViewModels.Wrappers"
xmlns:conv="using:WinWARP.Ui.Converters"
xmlns:h="using:WinWARP.Ui.Helpers"
Height="64" Width="300"
mc:Ignorable="d">
<UserControl.Resources>
<DataTemplate x:DataType="w:StandaloneServerViewModel" x:Key="StandaloneServerTemplate">
<StackPanel>
</StackPanel>
</DataTemplate>
<DataTemplate x:DataType="w:SubscriptionServerViewModel" x:Key="SubscriptionServerTemplate">
<StackPanel>
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<UserControl.ContextFlyout>
<MenuFlyout x:Name="ServerListFlyout">
<MenuFlyoutItem Text="Option 1"/>
<MenuFlyoutItem Text="Option 2"/>
</MenuFlyout>
</UserControl.ContextFlyout>
<Grid MaxHeight="64">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="64"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Rectangle Grid.RowSpan="3" Height="64"/>
<Border Grid.RowSpan="3" MinHeight="64" MaxHeight="64" VerticalAlignment="Top">
<Border Width="48" Height="48" VerticalAlignment="Center" HorizontalAlignment="Center" CornerRadius="24">
<Image Stretch="UniformToFill">
<Image.Source>
<SvgImageSource UriSource="{x:Bind CountryCodeToUri(ServerData.Region), Mode=OneWay}"/>
</Image.Source>
</Image>
</Border>
</Border>
<!--<Rectangle Grid.Column="1" Fill="Aqua"/>
<Rectangle Grid.Column="1" Grid.Row="1" Fill="Beige"/>
<Rectangle Grid.Column="1" Grid.Row="2" Fill="Brown"/>-->
<StackPanel Grid.Column="1">
<TextBlock Text="{x:Bind Title(ServerData), Mode=OneWay}" Style="{StaticResource BodyTextBlockStyle}"/>
<TextBlock Text="{x:Bind ServerData.DefaultTitle, Mode=OneWay}" Style="{StaticResource CaptionTextBlockStyle}" Visibility="{x:Bind IsNotDefaultTitle(ServerData), Mode=OneWay}"/>
</StackPanel>
<Button Grid.Column="2" Height="24" Width="24" Padding="0" Margin="4" VerticalAlignment="Top" Click="MenuButton_Click">
<FontIcon Glyph="&#xE712;" FontSize="10"/>
</Button>
<ItemsView Grid.Column="1" Grid.Row="1" ItemsSource="{x:Bind ServerData.Tags, Mode=OneWay}" VerticalAlignment="Center" SelectionMode="None">
<ItemsView.Layout>
<ct:WrapLayout Orientation="Horizontal" HorizontalSpacing="4" VerticalSpacing="4"/>
</ItemsView.Layout>
<ItemsView.ItemTemplate>
<DataTemplate x:DataType="x:String">
<ItemContainer>
<Border Background="{ThemeResource SystemControlBackgroundAccentBrush}" CornerRadius="4" Padding="4,0">
<TextBlock Text="{x:Bind}" Style="{StaticResource CaptionTextBlockStyle}"/>
</Border>
</ItemContainer>
</DataTemplate>
</ItemsView.ItemTemplate>
</ItemsView>
<!--<TextBlock Grid.Column="1" Text="both server"/>-->
<!--<ContentPresenter Grid.Column="1" Grid.Row="1" Content="{x:Bind ServerData}" ContentTemplate="{x:Bind ChooseTemplate(ServerData), Mode=OneWay}"/>-->
</Grid>
</UserControl>
@@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels;
using WinWARP.Core.ViewModels.Wrappers;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace WinWARP.Ui.Views.Components;
public sealed partial class ServerListElement : UserControl
{
public static readonly DependencyProperty ServerDataProperty =
DependencyProperty.Register(nameof(ServerData), typeof(ServerItemViewModel),
typeof(ServerListElement), new PropertyMetadata(null));
public ServerItemViewModel ServerData
{
get => (ServerItemViewModel)GetValue(ServerDataProperty);
set => SetValue(ServerDataProperty, value);
}
public string Title(ServerItemViewModel serverData) => string.IsNullOrEmpty(serverData?.Title) ? (string.IsNullOrEmpty(serverData?.DefaultTitle) ? string.Empty : serverData.DefaultTitle) : serverData.Title;
public Visibility IsNotDefaultTitle(ServerItemViewModel serverData) => (!string.IsNullOrEmpty(serverData?.Title) && serverData?.Title != serverData?.DefaultTitle) ? Visibility.Visible : Visibility.Collapsed;
public ServerListElement()
{
InitializeComponent();
}
private DataTemplate ChooseTemplate(ServerItemViewModel data)
{
if (data == null) return null;
return data switch
{
StandaloneServerViewModel => (DataTemplate)Resources["StandaloneServerTemplate"],
SubscriptionServerViewModel => (DataTemplate)Resources["SubscriptionServerTemplate"],
_ => (DataTemplate)Resources["StandaloneServerTemplate"]
};
}
private Uri CountryCodeToUri(string countryCode)
{
if (!string.IsNullOrWhiteSpace(countryCode))
{
return new Uri($"ms-appx:///Assets/Flags/{countryCode.ToLower()}.svg", UriKind.Absolute);
}
else
{
return new Uri("ms-appx:///Assets/Flags/xx.svg", UriKind.Absolute);
}
}
private void MenuButton_Click(object sender, RoutedEventArgs e)
{
if (sender is Button button)
{
var options = new FlyoutShowOptions
{
Placement = FlyoutPlacementMode.LeftEdgeAlignedTop,
ShowMode = FlyoutShowMode.Standard
};
ServerListFlyout.ShowAt(button, options);
}
}
}
@@ -3,8 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +11,9 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.ConfigSettings;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class DnsSettingsPage : Page
{
public DnsSettingsPage()
public DnsSettingsViewModel ViewModel { get; }
public DnsSettingsPage() : this(App.Services.GetRequiredService<DnsSettingsViewModel>()) {}
public DnsSettingsPage(DnsSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
@@ -3,8 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +11,9 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.ConfigSettings;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class InboundSettingsPage : Page
{
public InboundSettingsPage()
public InboundSettingsViewModel ViewModel { get; }
public InboundSettingsPage() : this(App.Services.GetRequiredService<InboundSettingsViewModel>()) {}
public InboundSettingsPage(InboundSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
}
@@ -3,8 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +11,9 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.ConfigSettings;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class RoutingSettingsPage : Page
{
public RoutingSettingsPage()
public RoutingSettingsViewModel ViewModel { get; }
public RoutingSettingsPage() : this(App.Services.GetRequiredService<RoutingSettingsViewModel>()) {}
public RoutingSettingsPage(RoutingSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
@@ -3,8 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +11,9 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.ConfigSettings;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class TlsSettingsPage : Page
{
public TlsSettingsPage()
public TlsSettingsViewModel ViewModel { get; }
public TlsSettingsPage() : this(App.Services.GetRequiredService < TlsSettingsViewModel>()) {}
public TlsSettingsPage(TlsSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
@@ -12,6 +12,8 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using WinWARP.Core.ViewModels.ConfigSettings;
using Microsoft.Extensions.DependencyInjection;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class WarpSettingsPage : Page
{
public WarpSettingsPage()
public WarpSettingsViewModel ViewModel { get; }
public WarpSettingsPage() : this(App.Services.GetRequiredService<WarpSettingsViewModel>()) {}
public WarpSettingsPage(WarpSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
+9 -1
View File
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +13,7 @@ using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -22,8 +24,14 @@ namespace WinWARP.Ui.Views;
/// </summary>
public sealed partial class ConfigSettingsPage : Page
{
public ConfigSettingsPage()
public ConfigSettingsViewModel ViewModel { get; }
public ConfigSettingsPage() : this(App.Services.GetRequiredService<ConfigSettingsViewModel>()) {}
public ConfigSettingsPage(ConfigSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<ContentDialog
x:Class="WinWARP.Ui.Views.Dialogs.AddSubscriptionDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:WinWARP.Ui.Views.Dialogs"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:conv="using:WinWARP.Ui.Converters"
xmlns:u="using:WinUI3Localizer"
DefaultButton="Primary"
mc:Ignorable="d" Height="300" Width="400"
u:Uids.Uid="AddSubscriptionDialog"
IsPrimaryButtonEnabled="{x:Bind ViewModel.CanSubmit, Mode=OneWay}">
<ContentDialog.Resources>
<conv:UpdateIntervalToTextConverter x:Key="UpdateIntervalToTextConverter"/>
</ContentDialog.Resources>
<StackPanel Spacing="12" Width="400">
<TextBox u:Uids.Uid="AddSubscriptionDialogCustomName" Text="{x:Bind ViewModel.CustomName, Mode=TwoWay}"/>
<TextBox u:Uids.Uid="AddSubscriptionDialogUrl" Text="{x:Bind ViewModel.SubscriptionLink, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<Slider Minimum="-1" Maximum="48" x:Name="UpdateIntervalSlider" IsThumbToolTipEnabled="False"
Value="{x:Bind ViewModel.UpdateInterval, Mode=TwoWay}">
<Slider.Header>
<TextBlock>
<Run u:Uids.Uid="AddSubscriptionDialogUpdateInterval"/><Run Text=": "/><Run Text="{x:Bind UpdateIntervalSlider.Value, Converter={StaticResource UpdateIntervalToTextConverter}, Mode=OneWay}"/>
</TextBlock>
</Slider.Header>
</Slider>
</StackPanel>
</ContentDialog>
@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.Dialogs;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace WinWARP.Ui.Views.Dialogs;
public sealed partial class AddSubscriptionDialog : ContentDialog
{
public AddSubscriptionViewModel ViewModel { get; }
public AddSubscriptionDialog() : this(App.Services.GetRequiredService<AddSubscriptionViewModel>()) {}
public AddSubscriptionDialog(AddSubscriptionViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
}
}
+4 -3
View File
@@ -26,11 +26,12 @@ public sealed partial class HomePage : Page
{
public HomeViewModel ViewModel { get; }
public HomePage()
public HomePage() : this(App.Services.GetRequiredService<HomeViewModel>()) {}
public HomePage(HomeViewModel viewModel)
{
InitializeComponent();
ViewModel = App.Services.GetRequiredService<HomeViewModel>();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
@@ -3,8 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +11,9 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.Settings;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class GeneralSettingsPage : Page
{
public GeneralSettingsPage()
public GeneralSettingsViewModel ViewModel { get; }
public GeneralSettingsPage() : this(App.Services.GetRequiredService<GeneralSettingsViewModel>()) {}
public GeneralSettingsPage(GeneralSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
@@ -3,8 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
@@ -12,6 +11,9 @@ using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinWARP.Core.ViewModels.Settings;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -23,8 +25,14 @@ namespace WinWARP.Ui.Views.Settings;
/// </summary>
public sealed partial class UpdateSettingsPage : Page
{
public UpdateSettingsPage()
public UpdateSettingsViewModel ViewModel { get; }
public UpdateSettingsPage() : this(App.Services.GetRequiredService<UpdateSettingsViewModel>()) { }
public UpdateSettingsPage(UpdateSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
+5 -6
View File
@@ -24,16 +24,15 @@ namespace WinWARP.Ui.Views;
/// </summary>
public sealed partial class SettingsPage : Page
{
public SettingsViewModel ViewModel
{
get;
}
public SettingsViewModel ViewModel { get; }
public SettingsPage()
public SettingsPage() : this(App.Services.GetRequiredService<SettingsViewModel>()) {}
public SettingsPage(SettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = App.Services.GetRequiredService<SettingsViewModel>();
ViewModel = viewModel;
DataContext = ViewModel;
}
}
+20 -4
View File
@@ -6,10 +6,26 @@
xmlns:local="using:WinWARP.Ui.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:m="using:WinWARP.Core.Models.Entities"
xmlns:c="using:WinWARP.Ui.Views.Components"
xmlns:vm="using:WinWARP.Core.ViewModels"
mc:Ignorable="d">
<Grid>
</Grid>
<StackPanel>
<Button Command="{x:Bind ViewModel.AddSubscriptionCommand}" Content="Add Subscription"/>
<GridView ItemsSource="{x:Bind ViewModel.Servers}" SelectionMode="None">
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem" BasedOn="{StaticResource DefaultGridViewItemStyle}">
<Setter Property="Margin" Value="6"/>
</Style>
</GridView.ItemContainerStyle>
<GridView.ItemTemplate>
<DataTemplate x:DataType="vm:ServerItemViewModel">
<c:ServerListElement ServerData="{x:Bind}"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
<ProgressRing IsActive="{x:Bind ViewModel.ShowLoadingIndicator, Mode=OneWay}"/>
</StackPanel>
</Page>
+6 -2
View File
@@ -26,12 +26,16 @@ public sealed partial class SubsSettingsPage : Page
{
public SubsSettingsViewModel ViewModel { get; }
public SubsSettingsPage()
public SubsSettingsPage() : this(App.Services.GetRequiredService<SubsSettingsViewModel>()) {}
public SubsSettingsPage(SubsSettingsViewModel viewModel)
{
InitializeComponent();
ViewModel = App.Services.GetRequiredService<SubsSettingsViewModel>();
ViewModel = viewModel;
DataContext = ViewModel;
ViewModel.ShowLoadingIndicator = true;
ViewModel.LoadSubscriptionsAsync().ConfigureAwait(false);
}
}