diff --git a/src/Sidekick.Common.Blazor/Initialization/Initialization.razor b/src/Sidekick.Common.Blazor/Initialization/Initialization.razor index 2b8fb10e7..6421d224d 100644 --- a/src/Sidekick.Common.Blazor/Initialization/Initialization.razor +++ b/src/Sidekick.Common.Blazor/Initialization/Initialization.razor @@ -26,13 +26,13 @@ @if (Count != Completed) { - @Resources.Exit + @Resources["Exit"] } else { - @Resources.Close + @Resources["Close"] } diff --git a/src/Sidekick.Common.Blazor/Initialization/Initialization.razor.cs b/src/Sidekick.Common.Blazor/Initialization/Initialization.razor.cs index 98ffa7d18..7b01ff657 100644 --- a/src/Sidekick.Common.Blazor/Initialization/Initialization.razor.cs +++ b/src/Sidekick.Common.Blazor/Initialization/Initialization.razor.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using Microsoft.AspNetCore.Components; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Sidekick.Common.Browser; @@ -18,7 +19,7 @@ namespace Sidekick.Common.Blazor.Initialization public partial class Initialization : SidekickView { [Inject] - private InitializationResources Resources { get; set; } = null!; + private IStringLocalizer Resources { get; set; } = null!; [Inject] private ILogger Logger { get; set; } = null!; @@ -65,7 +66,7 @@ protected override async Task OnInitializedAsync() InitializationTask = Handle(); var keyOpenPriceCheck = await SettingsService.GetString(SettingKeys.KeyOpenPriceCheck); var keyClose = await SettingsService.GetString(SettingKeys.KeyClose); - WelcomeMessage = string.Format(Resources.Notification, keyOpenPriceCheck.ToKeybindString(), keyClose.ToKeybindString()); + WelcomeMessage = string.Format(Resources["Notification"], keyOpenPriceCheck.ToKeybindString(), keyClose.ToKeybindString()); await base.OnInitializedAsync(); await InitializationTask; } @@ -149,12 +150,12 @@ private Task ReportProgress() Percentage = Count == 0 ? 0 : Completed * 100 / Count; if (Percentage >= 100) { - Step = Resources.Ready; + Step = Resources["Ready"]; Percentage = 100; } else { - Step = Resources.Title(Completed, Count); + Step = Resources["Title", Completed, Count]; } StateHasChanged(); @@ -175,7 +176,7 @@ private void InitializeTray() menuItems.AddRange(new List() { new(label: "Sidekick - " + GetVersion()), - new(label: "Open Website", + new(label: Resources["Open_Website"], onClick: () => { BrowserProvider.OpenSidekickWebsite(); @@ -184,8 +185,8 @@ private void InitializeTray() // new(label: "Wealth", onClick: () => ViewLocator.Open("/wealth")), - new(label: "Settings", onClick: () => ViewLocator.Open("/settings")), - new(label: "Exit", + new(label: Resources["Settings"], onClick: () => ViewLocator.Open("/settings")), + new(label: Resources["Exit"], onClick: () => { ApplicationService.Shutdown(); diff --git a/src/Sidekick.Common.Blazor/Initialization/InitializationResources.cs b/src/Sidekick.Common.Blazor/Initialization/InitializationResources.cs index 59f08ba60..dd3b4ccbf 100644 --- a/src/Sidekick.Common.Blazor/Initialization/InitializationResources.cs +++ b/src/Sidekick.Common.Blazor/Initialization/InitializationResources.cs @@ -1,15 +1,6 @@ -using Microsoft.Extensions.Localization; - namespace Sidekick.Common.Blazor.Initialization; -public class InitializationResources(IStringLocalizer localizer) +public class InitializationResources() { - public string Close => localizer["Close"]; - public string Error => localizer["Error"]; - public string Exit => localizer["Exit"]; - public string Notification => localizer["Notification"]; - public string Ready => localizer["Ready"]; - - public string Title(int completed, int count) => localizer["Title", completed, count]; } diff --git a/src/Sidekick.Common.Blazor/Initialization/InitializationResources.fr.resx b/src/Sidekick.Common.Blazor/Initialization/InitializationResources.fr.resx index 6dd13f680..5c3cebfa5 100644 --- a/src/Sidekick.Common.Blazor/Initialization/InitializationResources.fr.resx +++ b/src/Sidekick.Common.Blazor/Initialization/InitializationResources.fr.resx @@ -129,9 +129,15 @@ Faites {0} sur un item dans le jeu et {1} pour fermer la fenêtre. + + Ouvrir le site web + Prêt + + Configurations + Initialisation ({0} de {1}) diff --git a/src/Sidekick.Common.Blazor/Initialization/InitializationResources.resx b/src/Sidekick.Common.Blazor/Initialization/InitializationResources.resx index b89546b47..77d1c2775 100644 --- a/src/Sidekick.Common.Blazor/Initialization/InitializationResources.resx +++ b/src/Sidekick.Common.Blazor/Initialization/InitializationResources.resx @@ -129,9 +129,15 @@ Press {0} over an item in-game to use. Press {1} to close overlay. + + Open website + Ready + + Settings + Initializing ({0} of {1}) diff --git a/src/Sidekick.Common.Blazor/Settings/About/About.razor b/src/Sidekick.Common.Blazor/Settings/About/About.razor new file mode 100644 index 000000000..45355bd89 --- /dev/null +++ b/src/Sidekick.Common.Blazor/Settings/About/About.razor @@ -0,0 +1,33 @@ +@page "/settings/about" +@layout SettingsLayout +@inherits Sidekick.Common.Ui.Views.SidekickView +@using Sidekick.Common.Browser +@using Sidekick.Common.Folder + + + + + + @Resources["Official_Website"] + @Resources["GitHub_Repository"] + + + + @Resources["Open_Settings_Folder"] + @FolderProvider.GetDataFolderPath() + + + +@inject IStringLocalizer Resources +@inject IBrowserProvider BrowserProvider +@inject IFolderProvider FolderProvider + +@code +{ + private string? Title { get; set; } = string.Empty; + + protected override void OnInitialized() + { + Title = AppDomain.CurrentDomain.GetAssemblies().Select(x => x.GetName()).FirstOrDefault(x => x.Name == "Sidekick")?.Version?.ToString(); + } +} diff --git a/src/Sidekick.Common.Blazor/Settings/SettingsLayout.razor b/src/Sidekick.Common.Blazor/Settings/SettingsLayout.razor index 1866633d4..4524e5539 100644 --- a/src/Sidekick.Common.Blazor/Settings/SettingsLayout.razor +++ b/src/Sidekick.Common.Blazor/Settings/SettingsLayout.razor @@ -18,6 +18,7 @@ @Resources["Map_Check"] @Resources["Wiki"] @Resources["Chat_Commands"] + @Resources["About"] @if (Debugger.IsAttached) { diff --git a/src/Sidekick.Common.Blazor/Settings/SettingsResources.fr.resx b/src/Sidekick.Common.Blazor/Settings/SettingsResources.fr.resx index 62b351aa0..7b2199d12 100644 --- a/src/Sidekick.Common.Blazor/Settings/SettingsResources.fr.resx +++ b/src/Sidekick.Common.Blazor/Settings/SettingsResources.fr.resx @@ -318,4 +318,17 @@ Sidekick supporte à la fois Path of Exile 1 et Path of Exile 2, veuillez choisir la ligue correspondante lorsque vous jouez à l'un ou l'autre. + + À propos + + + Site officiel + + + + + + + Ouvrir le répertoire des configurations + \ No newline at end of file diff --git a/src/Sidekick.Common.Blazor/Settings/SettingsResources.resx b/src/Sidekick.Common.Blazor/Settings/SettingsResources.resx index e6ec8c181..78298440a 100644 --- a/src/Sidekick.Common.Blazor/Settings/SettingsResources.resx +++ b/src/Sidekick.Common.Blazor/Settings/SettingsResources.resx @@ -324,4 +324,16 @@ For convenience, Sidekick supports both Path of Exile 2 and Path of Exile 1, simply choose the appropriate league when playing either of them. + + About + + + Official website + + + GitHub Repository + + + Open the settings folder + \ No newline at end of file diff --git a/src/Sidekick.Common.Ui/wwwroot/css/app.css b/src/Sidekick.Common.Ui/wwwroot/css/app.css index 37a29a7ea..166a64364 100644 --- a/src/Sidekick.Common.Ui/wwwroot/css/app.css +++ b/src/Sidekick.Common.Ui/wwwroot/css/app.css @@ -1508,6 +1508,11 @@ video { margin-bottom: 0px; } +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + .my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; @@ -1535,6 +1540,10 @@ video { margin-bottom: 0.75rem; } +.mb-4 { + margin-bottom: 1rem; +} + .ml-0 { margin-left: 0px; } @@ -1559,10 +1568,22 @@ video { margin-left: auto; } +.mr-1 { + margin-right: 0.25rem; +} + .mr-2 { margin-right: 0.5rem; } +.mr-3 { + margin-right: 0.75rem; +} + +.mr-4 { + margin-right: 1rem; +} + .mt-1 { margin-top: 0.25rem; } @@ -1579,6 +1600,10 @@ video { margin-top: 1rem; } +.mt-6 { + margin-top: 1.5rem; +} + .mt-9 { margin-top: 2.25rem; } @@ -1903,6 +1928,10 @@ video { flex-grow: 1; } +.flex-grow-0 { + flex-grow: 0; +} + .grow { flex-grow: 1; } @@ -3292,11 +3321,20 @@ video { padding-bottom: 0.5rem; } +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + .py-4 { padding-top: 1rem; padding-bottom: 1rem; } +.pb-0 { + padding-bottom: 0px; +} + .pb-2 { padding-bottom: 0.5rem; } @@ -3317,6 +3355,10 @@ video { padding-bottom: 4px; } +.pl-12 { + padding-left: 3rem; +} + .pl-2 { padding-left: 0.5rem; } @@ -3333,10 +3375,22 @@ video { padding-right: 0.5rem; } +.pr-4 { + padding-right: 1rem; +} + +.pt-0 { + padding-top: 0px; +} + .pt-2 { padding-top: 0.5rem; } +.pt-4 { + padding-top: 1rem; +} + .pt-\[4px\] { padding-top: 4px; } diff --git a/src/Sidekick.Common/Browser/BrowserProvider.cs b/src/Sidekick.Common/Browser/BrowserProvider.cs index c01b06eec..f51b658d5 100644 --- a/src/Sidekick.Common/Browser/BrowserProvider.cs +++ b/src/Sidekick.Common/Browser/BrowserProvider.cs @@ -21,4 +21,9 @@ public void OpenSidekickWebsite() { OpenUri(new Uri("https://sidekick-poe.github.io/")); } + + public void OpenGitHubRepository() + { + OpenUri(new Uri("https://github.com/Sidekick-Poe/Sidekick")); + } } diff --git a/src/Sidekick.Common/Browser/IBrowserProvider.cs b/src/Sidekick.Common/Browser/IBrowserProvider.cs index 9dd3bb561..6d5471a79 100644 --- a/src/Sidekick.Common/Browser/IBrowserProvider.cs +++ b/src/Sidekick.Common/Browser/IBrowserProvider.cs @@ -12,4 +12,9 @@ public interface IBrowserProvider /// Opens the sidekick website in the user's browser. /// void OpenSidekickWebsite(); + + /// + /// Opens the Sidekick GitHub repository in the user's browser. + /// + void OpenGitHubRepository(); } diff --git a/src/Sidekick.Common/Folder/FolderProvider.cs b/src/Sidekick.Common/Folder/FolderProvider.cs new file mode 100644 index 000000000..b2026d667 --- /dev/null +++ b/src/Sidekick.Common/Folder/FolderProvider.cs @@ -0,0 +1,31 @@ +using System.Diagnostics; +using Microsoft.Extensions.Logging; + +namespace Sidekick.Common.Folder; + +public class FolderProvider(ILogger logger) : IFolderProvider +{ + public void OpenDataFolderPath() + { + try + { + var process = new Process(); + process.StartInfo = new ProcessStartInfo + { + FileName = SidekickPaths.GetDataFilePath(), + UseShellExecute = true, + Verb = "open" + }; + process.Start(); + } + catch + { + logger.LogError("[Folder] Failed to open data file path."); + } + } + + public string GetDataFolderPath() + { + return SidekickPaths.GetDataFilePath(); + } +} diff --git a/src/Sidekick.Common/Folder/IFolderProvider.cs b/src/Sidekick.Common/Folder/IFolderProvider.cs new file mode 100644 index 000000000..d3ac32a15 --- /dev/null +++ b/src/Sidekick.Common/Folder/IFolderProvider.cs @@ -0,0 +1,18 @@ +namespace Sidekick.Common.Folder; + +public interface IFolderProvider +{ + /// + /// Opens the folder where the data files are stored. + /// + /// Windows: C:\Users\___\AppData\Roaming + /// Linux: /home/___/.config + /// OSX: /Users/___/.config + /// + void OpenDataFolderPath(); + + /// + /// Gets the folder path where the data files are stored. + /// + public string GetDataFolderPath(); +} diff --git a/src/Sidekick.Common/ServiceCollectionExtensions.cs b/src/Sidekick.Common/ServiceCollectionExtensions.cs index 826e0b151..f3cb398fc 100644 --- a/src/Sidekick.Common/ServiceCollectionExtensions.cs +++ b/src/Sidekick.Common/ServiceCollectionExtensions.cs @@ -5,6 +5,7 @@ using Serilog.Events; using Sidekick.Common.Browser; using Sidekick.Common.Cache; +using Sidekick.Common.Folder; using Sidekick.Common.Game.GameLogs; using Sidekick.Common.Game.Languages; using Sidekick.Common.Initialization; @@ -30,6 +31,7 @@ public static IServiceCollection AddSidekickCommon( { services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSidekickInitializableService();