Implemented search results window for AppID search

This commit is contained in:
Jeddunk 2021-01-09 22:11:49 +01:00
parent 418e4fa86c
commit 99b9c52b40
5 changed files with 163 additions and 9 deletions

View File

@ -75,13 +75,23 @@ namespace GoldbergGUI.Core.Services
{ {
var listOfAppsByName = _cache.Search(x => x.Name) var listOfAppsByName = _cache.Search(x => x.Name)
.SetCulture(StringComparison.OrdinalIgnoreCase) .SetCulture(StringComparison.OrdinalIgnoreCase)
.ContainingAll(name.Split(' ')).ToHashSet(); .ContainingAll(name.Split(' '));
return listOfAppsByName;
/*var filteredList = new HashSet<SteamApp>();
foreach (var steamApp in listOfAppsByName) foreach (var steamApp in listOfAppsByName)
{ {
var sa = Task.Run(async () => await AppDetails.GetAsync(steamApp.AppId).ConfigureAwait(false)).Result; try
if (sa.Type != AppType.Game) listOfAppsByName.Remove(steamApp); {
var task = AppDetails.GetAsync(steamApp.AppId);
var details = await task.ConfigureAwait(false);
if (details?.Type != null && details.Type == AppType.Game) filteredList.Add(steamApp);
}
catch (Exception e)
{
_log.Debug($"{e.GetType()}: {steamApp}");
}
} }
return listOfAppsByName; return filteredList;*/
} }
public SteamApp GetAppByName(string name) public SteamApp GetAppByName(string name)

View File

@ -8,6 +8,7 @@
using Microsoft.Win32; using Microsoft.Win32;
using MvvmCross.Commands; using MvvmCross.Commands;
using MvvmCross.Logging; using MvvmCross.Logging;
using MvvmCross.Navigation;
using MvvmCross.ViewModels; using MvvmCross.ViewModels;
namespace GoldbergGUI.Core.ViewModels namespace GoldbergGUI.Core.ViewModels
@ -15,6 +16,7 @@
// ReSharper disable once ClassNeverInstantiated.Global // ReSharper disable once ClassNeverInstantiated.Global
public class MainViewModel : MvxViewModel public class MainViewModel : MvxViewModel
{ {
private readonly IMvxNavigationService _navigationService;
private string _dllPath; private string _dllPath;
private string _gameName; private string _gameName;
@ -34,11 +36,13 @@
private bool _mainWindowEnabled; private bool _mainWindowEnabled;
private bool _goldbergApplied; private bool _goldbergApplied;
public MainViewModel(ISteamService steam, IGoldbergService goldberg, IMvxLog log) public MainViewModel(ISteamService steam, IGoldbergService goldberg, IMvxLogProvider logProvider,
IMvxNavigationService navigationService)
{ {
_steam = steam; _steam = steam;
_goldberg = goldberg; _goldberg = goldberg;
_log = log; _log = logProvider.GetLogFor(typeof(MainViewModel));
_navigationService = navigationService;
} }
public override void Prepare() public override void Prepare()
@ -212,15 +216,16 @@
await ReadConfig().ConfigureAwait(false); await ReadConfig().ConfigureAwait(false);
} }
public IMvxCommand FindIdCommand => new MvxCommand(FindId); public IMvxCommand FindIdCommand => new MvxAsyncCommand(FindId);
private void FindId() private async Task FindId()
{ {
if (GameName.Contains("Game name...")) if (GameName.Contains("Game name..."))
{ {
_log.Error("No game name entered!"); _log.Error("No game name entered!");
return; return;
} }
MainWindowEnabled = false;
var appByName = _steam.GetAppByName(_gameName); var appByName = _steam.GetAppByName(_gameName);
if (appByName != null) if (appByName != null)
{ {
@ -229,8 +234,26 @@
} }
else else
{ {
_log.Warn("Steam app could not be found!"); var list = _steam.GetListOfAppsByName(GameName);
var steamApps = list as SteamApp[] ?? list.ToArray();
if (steamApps.Length == 1)
{
GameName = steamApps[0].Name;
AppId = steamApps[0].AppId;
}
else
{
var navigateTask = _navigationService
.Navigate<SearchResultViewModel, IEnumerable<SteamApp>, SteamApp>(steamApps);
var navigateResult = await navigateTask.ConfigureAwait(false);
if (navigateResult != null)
{
GameName = navigateResult.Name;
AppId = navigateResult.AppId;
}
}
} }
MainWindowEnabled = true;
} }
//public IMvxCommand GetNameByIdCommand => new MvxAsyncCommand(GetNameById); //public IMvxCommand GetNameByIdCommand => new MvxAsyncCommand(GetNameById);

View File

@ -0,0 +1,74 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using GoldbergGUI.Core.Models;
using MvvmCross.Commands;
using MvvmCross.Logging;
using MvvmCross.Navigation;
using MvvmCross.ViewModels;
namespace GoldbergGUI.Core.ViewModels
{
public class SearchResultViewModel : MvxNavigationViewModel<IEnumerable<SteamApp>>, IMvxViewModel<IEnumerable<SteamApp>, SteamApp>
{
private readonly IMvxNavigationService _navigationService;
private readonly IMvxLog _log;
private IEnumerable<SteamApp> _apps;
public SearchResultViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigationService) :
base(logProvider, navigationService)
{
_log = logProvider.GetLogFor(typeof(SearchResultViewModel));
_navigationService = navigationService;
}
public override void Prepare(IEnumerable<SteamApp> parameter)
{
Apps = parameter;
}
public IEnumerable<SteamApp> Apps
{
get => _apps;
set
{
_apps = value;
RaisePropertyChanged(() => Apps);
}
}
public SteamApp Selected
{
get;
set;
}
public IMvxCommand SaveCommand => new MvxAsyncCommand(Save);
public IMvxCommand CloseCommand => new MvxAsyncCommand(Close);
public TaskCompletionSource<object> CloseCompletionSource { get; set; }
public override void ViewDestroy(bool viewFinishing = true)
{
if (viewFinishing && CloseCompletionSource != null && !CloseCompletionSource.Task.IsCompleted &&
!CloseCompletionSource.Task.IsFaulted)
CloseCompletionSource?.TrySetCanceled();
base.ViewDestroy(viewFinishing);
}
private async Task Save()
{
if (Selected != null)
{
_log.Info($"Successfully got app {Selected}");
await _navigationService.Close(this, Selected).ConfigureAwait(false);
}
}
private async Task Close()
{
await _navigationService.Close(this).ConfigureAwait(false);
}
}
}

View File

@ -0,0 +1,33 @@
<views:MvxWindow x:Class="GoldbergGUI.WPF.Views.SearchResultView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:MvvmCross.Platforms.Wpf.Views;assembly=MvvmCross.Platforms.Wpf"
xmlns:viewModels="clr-namespace:GoldbergGUI.Core.ViewModels;assembly=GoldbergGUI.Core"
d:DataContext="{d:DesignInstance Type=viewModels:SearchResultViewModel}"
mc:Ignorable="d"
Title="Auto-CreamAPI 2: Search Results" Width="420" Height="540" MinWidth="420" MinHeight="540">
<Grid Margin="10,10,10,10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Select a game..." HorizontalAlignment="Left" Margin="0,0,0,10" VerticalAlignment="Top" />
<DataGrid Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True" SelectionMode="Single"
ItemsSource="{Binding Apps}" SelectedItem="{Binding Selected}">
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding SaveCommand}" />
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Header="AppID" Binding="{Binding AppId}" />
<DataGridTextColumn Header="Game Name" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
<Button Content="OK" Command="{Binding SaveCommand}" HorizontalAlignment="Right" Margin="0,10,70,0"
Grid.Row="2" VerticalAlignment="Top" Width="60" />
<Button Content="Cancel" Command="{Binding CloseCommand}" HorizontalAlignment="Right" Margin="0,10,0,0"
Grid.Row="2" VerticalAlignment="Top" Width="60" />
</Grid>
</views:MvxWindow>

View File

@ -0,0 +1,14 @@
using MvvmCross.Platforms.Wpf.Presenters.Attributes;
using MvvmCross.Platforms.Wpf.Views;
namespace GoldbergGUI.WPF.Views
{
[MvxWindowPresentation(Identifier = nameof(SearchResultView), Modal = false)]
public partial class SearchResultView
{
public SearchResultView()
{
InitializeComponent();
}
}
}