From bb155de6d4b901c349b29acf743ca63869b6ddcf Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Tue, 17 Oct 2023 11:40:42 +0200 Subject: [PATCH 1/7] Added comment to explain freeze behavior to Xbox shortcuts icons --- src/GamesLauncher.Platforms/SyncEngines/XboxSyncEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GamesLauncher.Platforms/SyncEngines/XboxSyncEngine.cs b/src/GamesLauncher.Platforms/SyncEngines/XboxSyncEngine.cs index f207f5b..d4343cd 100644 --- a/src/GamesLauncher.Platforms/SyncEngines/XboxSyncEngine.cs +++ b/src/GamesLauncher.Platforms/SyncEngines/XboxSyncEngine.cs @@ -70,7 +70,7 @@ private Func> GetGameRunTask(string cmd) if (bitmapSource == null || bitmapSource.CanFreeze == false) return null; - bitmapSource.Freeze(); + bitmapSource.Freeze(); //This is needed. Otherwise FL throws exception for some users. return delegate () { From ee1d1710d7ef911487a403448d3964c3bbc152de Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Tue, 10 Oct 2023 17:38:42 +0200 Subject: [PATCH 2/7] Feature: Hide specific games from plugin list #28 - Add "Hide" context menu --- .../Settings/HidenGames.cs | 41 ++++++++++++++++ .../PlatformsManager.cs | 5 ++ src/GamesLauncher/GamesLauncher.csproj | 7 +++ src/GamesLauncher/Images/excludeindexpath.png | Bin 0 -> 2807 bytes src/GamesLauncher/Main.cs | 44 +++++++++++++++--- src/GamesLauncher/Views/SettingsView.xaml | 22 +++++++++ src/GamesLauncher/Views/SettingsView.xaml.cs | 4 +- 7 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 src/GamesLauncher.Common/Settings/HidenGames.cs create mode 100644 src/GamesLauncher/Images/excludeindexpath.png diff --git a/src/GamesLauncher.Common/Settings/HidenGames.cs b/src/GamesLauncher.Common/Settings/HidenGames.cs new file mode 100644 index 0000000..38fef6a --- /dev/null +++ b/src/GamesLauncher.Common/Settings/HidenGames.cs @@ -0,0 +1,41 @@ +namespace GamesLauncher.Common.Settings +{ + public class HidenGames + { + public List Items { get; set; } = new List(); //This property and class needs to be public to be retrieved by FL Settings + + public void Hide(string title, string platform, string internalGameId) + { + if (!Items.Any(x => x.InternalGameId == internalGameId)) + { + Items.Add(new HidenGame + { + InternalGameId = internalGameId, + Platform = platform, + Title = title + }); + } + } + + public void Unhide(string internalGameId) + { + if (Items.Any(x => x.InternalGameId == internalGameId)) + { + Items.Remove(Items.First(x => x.InternalGameId == internalGameId)); + } + } + + public bool IsHiden(string internalGameId) + { + return Items.Any(x => x.InternalGameId == internalGameId); + } + } + + public class HidenGame + { + public string Title { get; set; } = string.Empty; + public string Platform { get; set; } = string.Empty; + public string InternalGameId { get; set; } = string.Empty; + } + +} diff --git a/src/GamesLauncher.Platforms/PlatformsManager.cs b/src/GamesLauncher.Platforms/PlatformsManager.cs index 46098ad..021411c 100644 --- a/src/GamesLauncher.Platforms/PlatformsManager.cs +++ b/src/GamesLauncher.Platforms/PlatformsManager.cs @@ -30,6 +30,11 @@ public IEnumerable GetSynchronizedGames() return Games; } + public Game? GetGame(string title, string platform) + { + return Games.FirstOrDefault(x=> x.Title == title && x.Platform == platform); + } + private IEnumerable InitializeEngines(MainSettings settings) { var engines = new List(); diff --git a/src/GamesLauncher/GamesLauncher.csproj b/src/GamesLauncher/GamesLauncher.csproj index 6e602df..4578118 100644 --- a/src/GamesLauncher/GamesLauncher.csproj +++ b/src/GamesLauncher/GamesLauncher.csproj @@ -45,6 +45,13 @@ Always + + Always + + + + + diff --git a/src/GamesLauncher/Images/excludeindexpath.png b/src/GamesLauncher/Images/excludeindexpath.png new file mode 100644 index 0000000000000000000000000000000000000000..19b7025a5a700093afff4fe64fe54b069f656f38 GIT binary patch literal 2807 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 _lastPlayedGames = _publicApi.LoadSettingJsonStorage(); + _hidenGames = _publicApi.LoadSettingJsonStorage(); _platformsManager = new PlatformsManager(context.API); @@ -45,16 +47,47 @@ public Task> QueryAsync(Query query, CancellationToken token) var search = query.Search.Trim(); - return Task.FromResult(gamesQuery.Select(x => CreateResultFromGame(x, search)).ToList()); + return Task.FromResult( + gamesQuery.Select(x => + CreateQueryResultFromGame(x, search)) + .Where(x => x != null).Select(x => x!).ToList()); + } + + public List LoadContextMenus(Result selectedResult) + { + var results = new List(); + + var game = _platformsManager.GetGame(selectedResult.Title, selectedResult.SubTitle); + + if (game is null) + return results; + + results.Add(new Result + { + Title = "Hide", + SubTitle = "The game can be unhidden in settings panel", + IcoPath = @"Images\excludeindexpath.png", + Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ued1a"), + AsyncAction = (context) => + { + _hidenGames.Hide(game.Title, game.Platform, game.InternalGameId); + return ValueTask.FromResult(false); + } + }); + + return results; } public Control CreateSettingPanel() { - return new SettingsView(_settings, _publicApi); + return new SettingsView(_settings, _hidenGames, _publicApi); } - private Result CreateResultFromGame(Game game, string search) + private Result? CreateQueryResultFromGame(Game game, string search) { + if (_hidenGames.IsHiden(game.InternalGameId)) + return null; + var result = new Result { Title = game.Title, @@ -84,6 +117,5 @@ private Result CreateResultFromGame(Game game, string search) return result; } - } } \ No newline at end of file diff --git a/src/GamesLauncher/Views/SettingsView.xaml b/src/GamesLauncher/Views/SettingsView.xaml index 8afd320..93cfc04 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml +++ b/src/GamesLauncher/Views/SettingsView.xaml @@ -7,6 +7,7 @@ d:DesignHeight="300" d:DesignWidth="300" Loaded="SettingsView_OnLoaded" + DataContext="{Binding RelativeSource={RelativeSource Self}}" mc:Ignorable="d"> @@ -16,6 +17,7 @@ + Place shortcuts (.lnk/.url) in this directory. They will be available in the games list. + + + + + + + + + + + diff --git a/src/GamesLauncher/Views/SettingsView.xaml.cs b/src/GamesLauncher/Views/SettingsView.xaml.cs index 824f990..5e22e24 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml.cs +++ b/src/GamesLauncher/Views/SettingsView.xaml.cs @@ -9,12 +9,14 @@ namespace GamesLauncher.Views public partial class SettingsView : UserControl { private readonly MainSettings _settings; + private readonly HidenGames _hidenGames; private readonly IPublicAPI _publicAPI; - public SettingsView(MainSettings settings, IPublicAPI publicAPI) + public SettingsView(MainSettings settings, HidenGames hidenGames, IPublicAPI publicAPI) { InitializeComponent(); _settings = settings; + _hidenGames = hidenGames; _publicAPI = publicAPI; } From acd6a126cca49dda93890cde1d6100af65b8922c Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Sat, 21 Oct 2023 17:22:15 +0200 Subject: [PATCH 3/7] Feature: Hide specific games from plugin list #28 - Add option to unhide hidden games in settings view --- .../SyncEngines/Steam/SteamGamesConsts.cs | 14 ------ .../SyncEngines/Steam/SteamSyncEngine.cs | 3 +- src/GamesLauncher/Views/SettingsView.xaml | 49 ++++++++++++++++--- src/GamesLauncher/Views/SettingsView.xaml.cs | 19 +++++++ 4 files changed, 62 insertions(+), 23 deletions(-) delete mode 100644 src/GamesLauncher.Platforms/SyncEngines/Steam/SteamGamesConsts.cs diff --git a/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamGamesConsts.cs b/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamGamesConsts.cs deleted file mode 100644 index d8e8445..0000000 --- a/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamGamesConsts.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Immutable; - -namespace GamesLauncher.Platforms.SyncEngines.Steam -{ - internal static class SteamGamesConsts - { - //TODO: When hiding games from list feature will be implemented this will be no longer needed - internal static readonly IImmutableList AppIdsToIgnore = new List() - { - 228980 //Steamworks Common Redistributables - } - .ToImmutableList(); - } -} diff --git a/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamSyncEngine.cs b/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamSyncEngine.cs index b5cb34e..5ef5231 100644 --- a/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamSyncEngine.cs +++ b/src/GamesLauncher.Platforms/SyncEngines/Steam/SteamSyncEngine.cs @@ -21,8 +21,7 @@ public SteamSyncEngine(IPublicAPI publicApi) public async IAsyncEnumerable GetGames() { var result = handler.FindAllGames(); - var games = result.Where(x => x.IsGame()).Select(x => x.AsGame()) - .Where(x => SteamGamesConsts.AppIdsToIgnore.Contains(x.AppId.Value) == false); + var games = result.Where(x => x.IsGame()).Select(x => x.AsGame()); foreach (var game in games) { diff --git a/src/GamesLauncher/Views/SettingsView.xaml b/src/GamesLauncher/Views/SettingsView.xaml index 93cfc04..cc95889 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml +++ b/src/GamesLauncher/Views/SettingsView.xaml @@ -18,6 +18,7 @@ + Place shortcuts (.lnk/.url) in this directory. They will be available in the games list. + + Name="HidenGamesStackPanel" + Visibility="Collapsed" + Grid.Row="7"> + ItemsSource="{Binding _hidenGames.Items}" VerticalAlignment="Center"> - - + + + + + + + + + + + + + + + + + + + + + - diff --git a/src/GamesLauncher/Views/SettingsView.xaml.cs b/src/GamesLauncher/Views/SettingsView.xaml.cs index 5e22e24..ab13925 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml.cs +++ b/src/GamesLauncher/Views/SettingsView.xaml.cs @@ -1,6 +1,8 @@ using Flow.Launcher.Plugin; using GamesLauncher.Common; using GamesLauncher.Common.Settings; +using System; +using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; @@ -10,6 +12,7 @@ public partial class SettingsView : UserControl { private readonly MainSettings _settings; private readonly HidenGames _hidenGames; + private readonly IPublicAPI _publicAPI; public SettingsView(MainSettings settings, HidenGames hidenGames, IPublicAPI publicAPI) @@ -18,6 +21,8 @@ public SettingsView(MainSettings settings, HidenGames hidenGames, IPublicAPI pub _settings = settings; _hidenGames = hidenGames; _publicAPI = publicAPI; + + HidenGames.ItemsSource = new ObservableCollection(_hidenGames.Items); } private void SettingsView_OnLoaded(object sender, RoutedEventArgs re) @@ -68,5 +73,19 @@ private void BtnOpenCustomShortcutsDirectory_Click(object sender, RoutedEventArg { _publicAPI.ShellRun(Paths.CustomShortcutsDirectory, "explorer.exe"); } + + private void BtnShowHiddenGames_Click(object sender, RoutedEventArgs e) + { + HidenGamesStackPanel.Visibility = HidenGamesStackPanel.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; + } + + private void BtnUnhideGame_Click(object sender, EventArgs e) + { + if ((sender as Button)?.CommandParameter is not HidenGame gameToUnhide) + return; + + _hidenGames.Unhide(gameToUnhide.InternalGameId); + HidenGames.ItemsSource = new ObservableCollection(_hidenGames.Items); + } } } From 641012a4729c596c9611b0a7b33bdbaca70cba46 Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Sat, 21 Oct 2023 17:30:26 +0200 Subject: [PATCH 4/7] Feature: Hide specific games from plugin list #28 - Corrected typo - Added "Steamwork Common Redistributables" as default hidden game --- .../Settings/{HidenGames.cs => HiddenGames.cs} | 18 +++++++++++++----- src/GamesLauncher/Main.cs | 10 +++++----- src/GamesLauncher/Views/SettingsView.xaml | 6 +++--- src/GamesLauncher/Views/SettingsView.xaml.cs | 16 ++++++++-------- 4 files changed, 29 insertions(+), 21 deletions(-) rename src/GamesLauncher.Common/Settings/{HidenGames.cs => HiddenGames.cs} (63%) diff --git a/src/GamesLauncher.Common/Settings/HidenGames.cs b/src/GamesLauncher.Common/Settings/HiddenGames.cs similarity index 63% rename from src/GamesLauncher.Common/Settings/HidenGames.cs rename to src/GamesLauncher.Common/Settings/HiddenGames.cs index 38fef6a..67c1b3f 100644 --- a/src/GamesLauncher.Common/Settings/HidenGames.cs +++ b/src/GamesLauncher.Common/Settings/HiddenGames.cs @@ -1,14 +1,22 @@ namespace GamesLauncher.Common.Settings { - public class HidenGames + public class HiddenGames { - public List Items { get; set; } = new List(); //This property and class needs to be public to be retrieved by FL Settings + public List Items { get; set; } = new List() //This property and class needs to be public to be retrieved by FL Settings + { + new HiddenGame + { + InternalGameId = "Steam_Steamworks Common Redistributables", + Platform = "Steam", + Title = "Steamworks Common Redistributables" + } + }; public void Hide(string title, string platform, string internalGameId) { if (!Items.Any(x => x.InternalGameId == internalGameId)) { - Items.Add(new HidenGame + Items.Add(new HiddenGame { InternalGameId = internalGameId, Platform = platform, @@ -25,13 +33,13 @@ public void Unhide(string internalGameId) } } - public bool IsHiden(string internalGameId) + public bool IsHidden(string internalGameId) { return Items.Any(x => x.InternalGameId == internalGameId); } } - public class HidenGame + public class HiddenGame { public string Title { get; set; } = string.Empty; public string Platform { get; set; } = string.Empty; diff --git a/src/GamesLauncher/Main.cs b/src/GamesLauncher/Main.cs index 0f6eb70..0132236 100644 --- a/src/GamesLauncher/Main.cs +++ b/src/GamesLauncher/Main.cs @@ -16,7 +16,7 @@ public class Main : IAsyncPlugin, ISettingProvider, IAsyncReloadable, IContextMe #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. private MainSettings _settings; private LastPlayedGames _lastPlayedGames; - private HidenGames _hidenGames; + private HiddenGames _hiddenGames; private IPublicAPI _publicApi; private PlatformsManager _platformsManager; @@ -29,7 +29,7 @@ public async Task InitAsync(PluginInitContext context) _publicApi = context.API; _settings = _publicApi.LoadSettingJsonStorage(); _lastPlayedGames = _publicApi.LoadSettingJsonStorage(); - _hidenGames = _publicApi.LoadSettingJsonStorage(); + _hiddenGames = _publicApi.LoadSettingJsonStorage(); _platformsManager = new PlatformsManager(context.API); @@ -70,7 +70,7 @@ public List LoadContextMenus(Result selectedResult) Glyph = new GlyphInfo(FontFamily: "/Resources/#Segoe Fluent Icons", Glyph: "\ued1a"), AsyncAction = (context) => { - _hidenGames.Hide(game.Title, game.Platform, game.InternalGameId); + _hiddenGames.Hide(game.Title, game.Platform, game.InternalGameId); return ValueTask.FromResult(false); } }); @@ -80,12 +80,12 @@ public List LoadContextMenus(Result selectedResult) public Control CreateSettingPanel() { - return new SettingsView(_settings, _hidenGames, _publicApi); + return new SettingsView(_settings, _hiddenGames, _publicApi); } private Result? CreateQueryResultFromGame(Game game, string search) { - if (_hidenGames.IsHiden(game.InternalGameId)) + if (_hiddenGames.IsHidden(game.InternalGameId)) return null; var result = new Result diff --git a/src/GamesLauncher/Views/SettingsView.xaml b/src/GamesLauncher/Views/SettingsView.xaml index cc95889..37dd32a 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml +++ b/src/GamesLauncher/Views/SettingsView.xaml @@ -69,16 +69,16 @@ Content="Hidden Games"> + ItemsSource="{Binding _hiddenGames.Items}" VerticalAlignment="Center"> diff --git a/src/GamesLauncher/Views/SettingsView.xaml.cs b/src/GamesLauncher/Views/SettingsView.xaml.cs index ab13925..e24a14c 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml.cs +++ b/src/GamesLauncher/Views/SettingsView.xaml.cs @@ -11,18 +11,18 @@ namespace GamesLauncher.Views public partial class SettingsView : UserControl { private readonly MainSettings _settings; - private readonly HidenGames _hidenGames; + private readonly HiddenGames _hiddenGames; private readonly IPublicAPI _publicAPI; - public SettingsView(MainSettings settings, HidenGames hidenGames, IPublicAPI publicAPI) + public SettingsView(MainSettings settings, HiddenGames hiddenGames, IPublicAPI publicAPI) { InitializeComponent(); _settings = settings; - _hidenGames = hidenGames; + _hiddenGames = hiddenGames; _publicAPI = publicAPI; - HidenGames.ItemsSource = new ObservableCollection(_hidenGames.Items); + HiddenGames.ItemsSource = new ObservableCollection(_hiddenGames.Items); } private void SettingsView_OnLoaded(object sender, RoutedEventArgs re) @@ -76,16 +76,16 @@ private void BtnOpenCustomShortcutsDirectory_Click(object sender, RoutedEventArg private void BtnShowHiddenGames_Click(object sender, RoutedEventArgs e) { - HidenGamesStackPanel.Visibility = HidenGamesStackPanel.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; + HiddenGamesStackPanel.Visibility = HiddenGamesStackPanel.Visibility == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; } private void BtnUnhideGame_Click(object sender, EventArgs e) { - if ((sender as Button)?.CommandParameter is not HidenGame gameToUnhide) + if ((sender as Button)?.CommandParameter is not HiddenGame gameToUnhide) return; - _hidenGames.Unhide(gameToUnhide.InternalGameId); - HidenGames.ItemsSource = new ObservableCollection(_hidenGames.Items); + _hiddenGames.Unhide(gameToUnhide.InternalGameId); + HiddenGames.ItemsSource = new ObservableCollection(_hiddenGames.Items); } } } From 511e40ef0d0a3cb42d0085afeb3dd184b6bade6e Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Sat, 21 Oct 2023 17:41:36 +0200 Subject: [PATCH 5/7] Feature: Hide specific games from plugin list #28 - Updated README.md --- README.md | 9 ++++++++- docs/hide.png | Bin 0 -> 4825 bytes 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 docs/hide.png diff --git a/README.md b/README.md index b0683ba..a28817d 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ You can disable specific platforms via settings menu. ### Custom shortcuts If you have retail games (or on an unsupported platform) you can add your own shortcuts files (.lnk / .uri) to the plugin games list. -To do this, go to Settings -> Plugins -> GamesLauncher -> Open Custom Shortcuts Directory +To do this, go to `Settings -> Plugins -> GamesLauncher -> Open Custom Shortcuts Directory` Place your shortcut in the opened directory and... That's it! You can now `Reload Plugin Data` to update your library. @@ -51,3 +51,10 @@ Place your shortcut in the opened directory and... That's it! You can now `Reloa If you have (un)installed a game, you can update the plugin without restarting Flow Launcher by using the `Reload Plugin Data` command. ![Reload](docs/reload.png) + +### Hide an item +You can hide a specific game from the plugin list by accessing the context menu (`right arrow`) and using the `Hide` command. + +![Hide Game](docs/hide.png) + +The game can be unhidden later from the settings menu. \ No newline at end of file diff --git a/docs/hide.png b/docs/hide.png new file mode 100644 index 0000000000000000000000000000000000000000..b299e865a3f598ee8bcb8f51dd9e3efb47ddc44a GIT binary patch literal 4825 zcmb7Ic|4SFw0~79SFoPL;gBH>v8Ea&TA-e`+5HtNK zLdY`qAqg?fNX!s1_vQDw_jCWazx%oOk9p@k&-=XRoadbL{XXY;A6Z#k7UUP_2LM12 zYHDNy06U=I{k^@r!K=+VS0wnygR!}60F-x0%z?tLTl(hu06>fv_~XF~%6xvN&KLmr zt9k3k(~2(i1P473c1~DZ6vEH^Cf38#1M2~f0YLbP8$Jj>D>MRy#hlQDg`WsHp?OaE zL@0R0DQ`=V3y}X&RyqHlGya*sCA;A&8+5z?K!gWsq;D7E&ZIlvcD0viT}-St@2&3a zRUgPtci=r__r7@Vnb^m%xv?C5VgFF;pT^7ji~45L$~Hgs_p_mQtlkR}a}^x?Dzr%V z9>ZjeN2|@r1fnmJ9UR7OYh%`FoKJkAmAJfqx8sxBOjqXl#5(Fr4C_U~`1rWtnV$as zZy-NpV+&VdEp1L;0pE{ zhyZ}zuH$?FaO~dmT>!9O-*g86ME5KdAOLT3XDVevVQYHMj94s(MQ7Cb41ZPk1&wU3 zqq&UrxIa&%xAa(H)^OF5T0yHYUYQMkE{8d~A@qZBOJ7`gOLKpcK@SDDe&?LoXk$1z zTUW%IaH;mPjY??Pu=hR_|deoTE$LV_B5PwY3u11S6kb}42X9M zHO@N9#;Uj96k?`E<^iJ8Z7!s1hu3(c(UvI^ZTDmHzf?*B<3UyUWO`%91u=gmY6i!3hM#e{Wh_DdmdLS(bS?mr5Jf?x4K?> zwk1?^b6c#DD3p}0TnCt@_JaLYk=#vB)YXAsYP|VfU0q{2p07&2`zLL$<@)@cGMCh} zBj>$jSALPItCJ*>9wWm<|M9}0cdQPRSf|3TQ{PXu8=;I(DHL&(w%3qzogXSGDXF6{ zEVqF)fW5h`xHeDPvEXCG~qj=V8MvmWp3=l40de4rMZJn-wgzj&I> zdfVv3drt1L#k;pWOcRSsAn40N%t%c(`M4P6V+i*yN7+I) zwL~jIlr5|K(E}c+zLL^4#bb!tsD>^&&0ss0efg`z83?Z&O*z>t55u@+{%Z$*O?x=R zY});zBj2{Iq*ALy(k1i1O{psmW_mWQKTqtyZ$UusgP7CxR7Q!SPcHoTA=(9BdOd_J zgx`U0x!!BXkgwUlT^Cnh8Q+kdL!RfAH=oxa+!S9@h`(nY85s%Xfs#y(Wn{rBgj&a0 zTUy2oned+%zZ#J1A`K}K+_z87M^9wiz8X#3IY)82{d}}+;6T@PM7~eJ`j2)g= zM%lf0G7a4htKa-vf)cG)`Iz}~m8|ixE!FjJX4Kf)HphDH1L$;mbliP4;q43y@E#B3 z=uAEk9sBy>2|d^N$)EUd>IVN9EIdj(rYKgV4kfcu*9Epf1|y%@g3-A^P@sn~%G$I+ z&=)wY;e&b;nP@%@1Jx=zY zYVl;fd29&g`yEzT0J??Pf7STk$wx)gqPNC(6mJX?)aBG@fkUbmpbkC7tswpHjP>tc z+q_SQc#pl#j!6F$7u;vAQ70X-`gfTVv8h{kWegLc6JJA94^sv!Q+zKp5j*G>Tvyel zsq|te0Q4Dm8ukvtBbn~uOp@ncAPXQ1Lrv!y49x4yppj}pGvbUo%nJ+%y3*?@mWf zY6p;WSFHCW;?(XfsQW{-)yrJ#REJMk-2GlsK?$g!ZiZF9|9wuZS3UC2V(aZ$bdNf} z8J4vh$Waj+@DI<;srDIG4PN|k=&gN;!|&1aT^D4WZKdA^F~!TK`A*XI-y}xm$+sxi zbZSi8nL@|$7BDKP;}bi8sI^ndvQT9Ox6tWi*4qUNrdyZW5Y8FCg){xkRH|tBI#2;$ z7!R2e3~mHkfbsQ>|6!CjHwI`=Ki0QJj zIu-wRWg>Dyo852A$_i&KlC$spdNfMGz18~tEs=gBUVCP+ME-Sx^M%S|VmC$~Y$P;6 z4Z+4FYE9{qEIoJvr?VQ%o1f|))<%!yZm{NFXLIgfnCFa#F9bTe`bSqF*1(}LVyhIx zJ!FzMxK%QEwN?ED<6#md{q)Q35qWJ>IRLQz0BV>oZ{&=4qMmjwrMd+eA}Y zjNJU)=1SxjgbHadKd(^K^!pMO{w?9M+5D%*K!(GFT0WCqyGQ!Y=Y`kSMSVdbkPHLM zwR!bX`F%!VZu5JLLGrmOS9Pm9$j!|S-1lY4y2P#(;<04ozZoq@(b$ujSer^hNOUv- zhN}BO4;uAFEsQs^y0jLsXs{}r9UBqh+9>YkMuhGNT*e0TqTIDA!X&6D(scB;^Uzsn zzlS7!f;}|BB z$>NNnr3HC&ci?6-gI!^;456$17NPy<*$;={%jl1gLD#96m>4_++|X|qFIvY8)%xeX zoi8rAll^sT_YN%HO z#iiEoRixl610>#|!kyVFx%TD0Pz$eY^htIP0)bfMwKI#uOK}Ha=sFe)MTLVsg7iRt zP3V%B#-&R?f>>j778j?JJeg_K&9#n)Iaoa;Hu`~VV69DO{2Kj%Sb$iNSlAirpI`Wl z@qS&XBZXEXa|i$qdn2pT^ENjlfNPt}xKjIte;o)dbi7bxp2Pt+xn+Zp$Uq2MnTN^%Ma>PRHS4clX! zM~j(*GK^Me0#egG_Co5gU}Y;ftrW<_f6oc55qGh;b5pzB^*z zjc&asJXum2x10b+#XDDdbqbR#Ln#}a(RBD`c7FNsxko3ne&$)8b*t~kfgFRP728MX z8Pk#O9VAMUjv2`BG`o-2@S;6JL+-)!Kvc`qBW?KRjbyct-C)d&Al%ePov)Y=-AF}u9xwLi_kPhd!{?hC(a;mgn3F#s*p$Cw(9ta2E|_h|o%5#F zxHHtO2IW#+RW;#li-c_3QA9Yzc!+WnY*q%bu{DGCF__sdcH)q?X`g?|Bbqy=R@yqW zBo5ZgFyO2~h8s8~Q=}DTWycb}9#!)ZvbNJEL?_ zD%0r4MRthfeN^Ce{*_lM=X|8=@9DSZ{Rnk3Cw z$XBIlI@kC(FB=uN7D<%WJ1mKZx~=zwA54jxVP3SOxV*;AlL|kP+?P&aNEM_0(F<`> z+3fMycD?n%MW>t|np9Y6yTQ%!Ukc>XACUP7CsbIr+Odqrh&Pt!lVWJ zj6BTh&Vna$Zbr&zsyC9^fBxEK6}d*~yO#E z9!Zsavhf<#)M}2+<%>67VLDY?N@nzEHhN{=={TVCuw7m(#Xc;vEgY=|xU7aXGqI(b zGk)Q8p^lQ5mHg9<@_8F`b)}!|Yzak4Q>W}5eorTNu;_0$%4pwiXX@BGH?_`Fa3=C= z5?+!SxEjOsL6x0)Suy<3{M!Vu^H5OX$dyA+#$ewmMoX0(BZ%IY$IUrbN-MHMDlJAF z1Uy=EMW2cUr`W{Xp6vF6Ny0)(MN+);i~UQd_coV7glG$+j=qJ+N^t&7`wGW!j3P)8IP+Ie6iL=%3 z?9BA4x<7jAK0Nj0XP`I#I+I85Q_?=@b$zH|t_Hu>tA|`U24!=nMPKB5P3tsUOKnJ< z24|uw)2P~Q74BcuuATL!$b`HWKRQH2hRSuSwWM1Ztyjy}Ec4N`CZ3%nBo-uJ&cB&> za-osvbxN!Jjn9Eyc5gj4N{rU|I*2LDl$chTQza*!DOI>u>R_CCPIHbBeVI7LSxjMp zzxJ6w${*VKf!+ciQxV>Lll25xU<66@xjb&t+d19fuKeg3g6O>g=cQQ6r)KfgfF#VN zwX^grTXOm!@w-FowGJiigFTNrpBb+c(|PE~@qxKeyQ%$J2_sO;(K+_jnUL%9Vd$m+ zvq4Hxkin}?sgeNOGGpQ11riJ93mx}Y{4%6Te115l_|doID?b`ZE86mxx|VMd@ZBD3 zLuzx78Ofc1so_4JsAldF#+8Ob(Nk95{4&n^8c&cR%7h(y30Nr$A)a&j-uMDh$ei6< zlU;>}XsdgL^_{re^+tfe%G8S37m@h&g7l20s0Du}>7?m4b GyZ0aBF5=t( literal 0 HcmV?d00001 From 74552cdf89b64061b40ded2811affe2ccc47248c Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Sat, 21 Oct 2023 17:58:54 +0200 Subject: [PATCH 6/7] Feature: Hide specific games from plugin list #28 - Refactored method HiddenGames.Unhide to pass HiddenGame as parameter --- src/GamesLauncher.Common/Settings/HiddenGames.cs | 7 ++----- src/GamesLauncher/Views/SettingsView.xaml.cs | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/GamesLauncher.Common/Settings/HiddenGames.cs b/src/GamesLauncher.Common/Settings/HiddenGames.cs index 67c1b3f..4f77059 100644 --- a/src/GamesLauncher.Common/Settings/HiddenGames.cs +++ b/src/GamesLauncher.Common/Settings/HiddenGames.cs @@ -25,12 +25,9 @@ public void Hide(string title, string platform, string internalGameId) } } - public void Unhide(string internalGameId) + public void Unhide(HiddenGame hiddenGame) { - if (Items.Any(x => x.InternalGameId == internalGameId)) - { - Items.Remove(Items.First(x => x.InternalGameId == internalGameId)); - } + Items.Remove(hiddenGame); } public bool IsHidden(string internalGameId) diff --git a/src/GamesLauncher/Views/SettingsView.xaml.cs b/src/GamesLauncher/Views/SettingsView.xaml.cs index e24a14c..a5f09c2 100644 --- a/src/GamesLauncher/Views/SettingsView.xaml.cs +++ b/src/GamesLauncher/Views/SettingsView.xaml.cs @@ -84,7 +84,7 @@ private void BtnUnhideGame_Click(object sender, EventArgs e) if ((sender as Button)?.CommandParameter is not HiddenGame gameToUnhide) return; - _hiddenGames.Unhide(gameToUnhide.InternalGameId); + _hiddenGames.Unhide(gameToUnhide); HiddenGames.ItemsSource = new ObservableCollection(_hiddenGames.Items); } } From eb2882a1c1ecebed39d9a70e6257a0bd41e00c47 Mon Sep 17 00:00:00 2001 From: "krystian.lesniak" Date: Sat, 21 Oct 2023 20:15:51 +0200 Subject: [PATCH 7/7] Bumped version to 1.5.0 --- docs/settings.png | Bin 18399 -> 19856 bytes src/GamesLauncher/plugin.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/settings.png b/docs/settings.png index d82fc90db06563e1a1ec87adadbccb32ab6dd668..e78dd6f70845195d23bfd9a34078fdaee82a4f71 100644 GIT binary patch literal 19856 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 literal 18399 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