Skip to content

Commit

Permalink
Misc & fix
Browse files Browse the repository at this point in the history
  • Loading branch information
AigioL committed Jun 7, 2022
1 parent 50cd52d commit 441a5a5
Show file tree
Hide file tree
Showing 8 changed files with 289 additions and 48 deletions.
1 change: 1 addition & 0 deletions src/ST.Client.Desktop.Avalonia.App/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ static int Main(string[] args)
finally
{
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
PlatformApp?.Dispose();
DI.Dispose();
}
}
Expand Down
1 change: 1 addition & 0 deletions src/ST.Client.Maui.App/MauiProgram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ static int Main(string[] args)
}
finally
{
PlatformApp?.Dispose();
DI.Dispose();
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/ST.Client.Maui/ST.Client.Maui.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@
<Link>UI\Views\Base\BaseContentPage.cs</Link>
</Compile>
<Compile Include="..\ST.Client.Desktop.Avalonia\ServiceCollectionExtensions.AddWindowManager.cs" />
<Compile Include="..\ST.Client.XamarinForms\Services\IPlatformPageRouteService.cs">
<Link>Services\IPlatformPageRouteService.cs</Link>
</Compile>
</ItemGroup>

<ItemGroup>
Expand Down
3 changes: 1 addition & 2 deletions src/ST.Client.Maui/UI/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ public App(IApplication.IDesktopProgramHost host)
AppTheme = PlatformAppTheme;
RequestedThemeChanged += (_, e) => AppTheme = e.RequestedTheme;

MainPage = new AppShell();
Initialize();
}

Expand Down Expand Up @@ -73,7 +72,7 @@ void Initialize()
//MainWindow = new MainWindow();
break;
}
MainPage!.BindingContext = vmService.MainWindow;
MainPage = new AppShell((MainWindowViewModel)vmService.MainWindow);
}, isTrace: isTrace);
}

Expand Down
43 changes: 1 addition & 42 deletions src/ST.Client.Maui/UI/AppShell.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
xmlns:resx="clr-namespace:System.Application.UI.Resx;assembly=System.Application.SteamTools.Client"
xmlns:vm="clr-namespace:System.Application.UI.ViewModels;assembly=System.Application.SteamTools.Client"
Title="{Binding Title}"
x:DataType="vm:MainWindowViewModel"
Shell.FlyoutBehavior="Disabled">
x:DataType="vm:MainWindowViewModel">
<Shell.FlyoutHeaderTemplate>
<DataTemplate>
<StackLayout Padding="16" Orientation="Horizontal">
Expand All @@ -30,45 +29,5 @@
</StackLayout>
</DataTemplate>
</Shell.FlyoutHeaderTemplate>
<FlyoutItem Title="{x:Static resx:AppResources.CommunityFix}"
Icon="CommunityProxyPageViewModel"
BindingContext="{x:Binding Path=CommunityProxyPage,Mode=OneWay}">
<ShellContent Route="CommunityProxyPage"
ContentTemplate="{DataTemplate local:UnderConstructionPage}" />
</FlyoutItem>
<FlyoutItem Title="{x:Static resx:AppResources.ScriptConfig}"
Icon="ProxyScriptManagePageViewModel"
BindingContext="{x:Binding Path=ProxyScriptPage,Mode=OneWay}">
<ShellContent Route="ProxyScriptManagePage"
ContentTemplate="{DataTemplate local:UnderConstructionPage}" />
</FlyoutItem>
<FlyoutItem Title="{x:Static resx:AppResources.GameList}"
Icon="GameListPageViewModel"
BindingContext="{x:Binding Path=GameListPage,Mode=OneWay}">
<ShellContent Route="GameListPage"
ContentTemplate="{DataTemplate local:UnderConstructionPage}" />
</FlyoutItem>
<FlyoutItem Title="{x:Static resx:AppResources.LocalAuth}"
Icon="LocalAuthPageViewModel"
BindingContext="{x:Binding Path=LocalAuthPage,Mode=OneWay}">
<ShellContent Route="LocalAuthPage"
ContentTemplate="{DataTemplate local:UnderConstructionPage}" />
</FlyoutItem>
<FlyoutItem Title="{x:Static resx:AppResources.ArchiSteamFarmPlus}"
Icon="ArchiSteamFarmPlusPageViewModel"
BindingContext="{x:Binding Path=ASFPage,Mode=OneWay}">
<ShellContent Route="ArchiSteamFarmPlusPage"
ContentTemplate="{DataTemplate local:UnderConstructionPage}" />
</FlyoutItem>

<MenuItem
Text="{x:Static resx:AppResources.Settings}"
IconImageSource="SettingsPageViewModel" />
<FlyoutItem Title="{x:Static resx:AppResources.Settings}"
Icon="SettingsPageViewModel"
BindingContext="{Binding Mode=OneWay,Source={x:Static vm:SettingsPageViewModel.Instance}}">
<ShellContent Route="SettingsPage"
ContentTemplate="{DataTemplate local:UnderConstructionPage}" />
</FlyoutItem>
</Shell>

264 changes: 262 additions & 2 deletions src/ST.Client.Maui/UI/AppShell.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,276 @@
using ReactiveUI;
using System.Application.Services;
using System.Application.UI.Resx;
using System.Application.UI.ViewModels;
using System.Application.UI.Views;
using static System.Application.UI.ViewModels.TabItemViewModel;

namespace System.Application.UI;

public partial class AppShell : Shell
public partial class AppShell : Shell, IViewFor<MainWindowViewModel>
{
public AppShell()
/// <summary>
/// 是否使用底部导航菜单
/// </summary>
internal static bool IsUseBottomNav { private get; set; }

readonly IPlatformPageRouteService? pageRouteService = IPlatformPageRouteService.Instance;

MainWindowViewModel viewModel;

public MainWindowViewModel ViewModel
{
get => viewModel;
set => BindingContext = viewModel = value;
}

MainWindowViewModel? IViewFor<MainWindowViewModel>.ViewModel
{
get => (MainWindowViewModel)BindingContext;
set => BindingContext = value;
}

object? IViewFor.ViewModel
{
get => BindingContext;
set => BindingContext = value;
}

public AppShell(MainWindowViewModel viewModel)
{
BindingContext = this.viewModel = viewModel;

InitializeComponent();

if (!IsUseBottomNav)
{
#region Flyout

var topTabs = IApplication.IsDesktopPlatform ? Array.Empty<TabItemId>() : new[] { TabItemId.LocalAuth, TabItemId.ArchiSteamFarmPlus };
InitTabItems(viewModel, topTabs);

AddPage(MyPageViewModel.Instance, isVisible: false);
#if DEBUG
AddPage(new LoginOrRegisterWindowViewModel());
#endif

#endregion
}
else
{
#region BottomNav

FlyoutBehavior = FlyoutBehavior.Disabled;
InitButtomTabItems(viewModel);
AddPage(SettingsPageViewModel.Instance, isVisible: false);
AddPage(AboutPageViewModel.Instance, isVisible: false);

#endregion
}
}

#region Flyout(左侧导航菜单)

void InitTabItems(MainWindowViewModel mainWindow, params TabItemId[] topTabs)
{
IEnumerable<TabItemId> topTabs_ = topTabs;
InitTabItems(mainWindow, topTabs_);
}

void InitTabItems(MainWindowViewModel mainWindow, IEnumerable<TabItemId>? topTabs = null)
{
var tabItems = mainWindow.AllTabItems.Where(x => x.Id != TabItemId.GameList);
if (topTabs.Any_Nullable())
{
tabItems = tabItems.Where(x => topTabs.Contains(x.Id)).Concat(tabItems.Where(x => !topTabs.Contains(x.Id)));
}
foreach (var item in tabItems)
{
InitTabItem(item);
}

void InitTabItem(TabItemViewModel tab)
{
if (pageRouteService?.IsUseNativePage(tab.Id) ?? false)
{
var tab_item = new MenuItem
{
IconImageSource = tab.IconKey,
BindingContext = tab,
};
tab_item.Clicked += (_, _) => pageRouteService!.GoToNativePage(tab.Id);
tab_item.SetBinding(MenuItem.TextProperty, nameof(tab.Name), BindingMode.OneWay);
Items.Add(tab_item);
}
else
{
var tab_item = new FlyoutItem
{
Icon = tab.IconKey,
BindingContext = tab,
};
tab_item.SetBinding(BaseShellItem.TitleProperty, nameof(tab.Name), BindingMode.OneWay);
tab_item.Items.Add(new ShellContent
{
Route = tab.IconKey!.TrimEnd("ViewModel"),
ContentTemplate = new DataTemplate(GetPageType(tab)),
});
Items.Add(tab_item);
}
}
}

void AddPage(ViewModelBase vm, bool isVisible = true)
{
var data = GetShellItemData(vm);
if (data == default) return;
var tab_item = new FlyoutItem
{
BindingContext = vm,
FlyoutItemIsVisible = isVisible,
};
tab_item.SetBinding(BaseShellItem.TitleProperty, data.bindingPathName, BindingMode.OneWay);
var pageType = GetPageType(vm);
var content = new ShellContent
{
ContentTemplate = new DataTemplate(pageType),
};
if (data.route != null) content.Route = pageType.Name;
tab_item.Items.Add(content);
Items.Add(tab_item);
}

#endregion

#region BottomNav(底部导航菜单)

void InitButtomTabItems(MainWindowViewModel mainWindow)
{
var tabItems = new ViewModelBase[] {
mainWindow.LocalAuthPage,
mainWindow.ASFPage,
MyPageViewModel.Instance,
};
TabBar tabBar = new();
foreach (var tab in tabItems)
{
var data = GetShellItemData(tab);
if (data == default) continue;
var tab_item = new Tab
{
BindingContext = tab,
Icon = data.icon,
};
tab_item.SetBinding(BaseShellItem.TitleProperty, data.bindingPathName, BindingMode.OneWay);
var content = new ShellContent
{
ContentTemplate = new DataTemplate(GetPageType(tab)),
};
if (data.route != null) content.Route = data.route;
tab_item.Items.Add(content);
tabBar.Items.Add(tab_item);
}
Items.Add(tabBar);
}

#endregion

static (string icon, string bindingPathName, string route) GetShellItemData(ViewModelBase vm, bool rSubscribe = true)
{
string? icon = null;
string? bindingPathName = null;
string? route = null;
if (vm is TabItemViewModel tabItemVM)
{
if (tabItemVM.IconKey == null) return default;
if (IsUseBottomNav)
{
if (tabItemVM is LocalAuthPageViewModel)
{
icon = "baseline_verified_user_black_24";
}
else if (tabItemVM is ArchiSteamFarmPlusPageViewModel)
{
icon = "icon_asf_24";
}
else
{
return default;
}
}
else
{
icon = tabItemVM.IconKey;
}
bindingPathName = nameof(tabItemVM.Name);
route = tabItemVM.IconKey.TrimEnd("ViewModel");
if (tabItemVM is SettingsPageViewModel || tabItemVM is AboutPageViewModel)
{
route = $"MyPage/{route}";
//route = null;
}
rSubscribe = false;
}
else if (vm is PageViewModel pageVM)
{
bindingPathName = nameof(pageVM.Title);
route = pageVM.GetType().Name.TrimEnd("ViewModel");
if (pageVM is MyPageViewModel)
{
icon = "baseline_person_black_24";
}
}
if (icon == null || bindingPathName == null || route == null) return default;
if (rSubscribe)
{
R.Subscribe(() =>
{
vm.RaisePropertyChanged(nameof(PageViewModel.Title));
}).AddTo(vm);
}
return (icon, bindingPathName, route);
}

static Type GetPageType(ViewModelBase vm)
{
//if (OperatingSystem2.IsAndroid())
//{
// if (vm is TabItemViewModel tabItem)
// {
// switch (tabItem.Id)
// {
// case TabItemId.LocalAuth:
// return typeof(n.LocalAuthPage);
// case TabItemId.ArchiSteamFarmPlus:
// return typeof(n.ArchiSteamFarmPlusPage);
// case TabItemId.Settings:
// return typeof(n.SettingsPage);
// case TabItemId.About:
// return typeof(n.AboutPage);
// }
// }
// else if (vm is MyPageViewModel)
// {
// return typeof(n.MyPage);
// }
// else if (vm is LoginOrRegisterWindowViewModel)
// {
// return typeof(LoginOrRegisterPage);
// }
//}
return typeof(UnderConstructionPage);
}

void OnFlyoutHeaderTapped(object? sender, EventArgs e)
{
Current.FlyoutIsPresented = false;
}

public static Task PopAsync()
{
// https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/shell/navigation#backwards-navigation
return Current.GoToAsync("..");
}

public static async void Pop() => await PopAsync();
}
4 changes: 2 additions & 2 deletions src/ST.Client.XamarinForms/UI/AppShell.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
using System.Collections.Generic;
using System.Linq;
using Xamarin.Forms;
using n = System.Application.UI.Views.Native;
using static System.Application.UI.ViewModels.TabItemViewModel;
using System.Threading.Tasks;
using static System.Application.UI.ViewModels.TabItemViewModel;
using n = System.Application.UI.Views.Native;

namespace System.Application.UI
{
Expand Down
Loading

0 comments on commit 441a5a5

Please sign in to comment.