From d242d02ececb9880f2c44592931f5ec1373fbb13 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Mon, 3 Oct 2022 18:13:07 +0200 Subject: [PATCH] Added the generator mode setting --- .../Database/SettingGeneratorMode.cs | 7 ++ .../DataModel/Database/SettingNames.cs | 3 +- I18N Commander/Processor/AppSettings.cs | 78 ++++++++++++++++++ .../UI WinForms/Components/Setting.cs | 46 +++++++++++ .../UI WinForms/Resources/Icons.Designer.cs | 10 +++ .../UI WinForms/Resources/Icons.resx | 3 + .../UI WinForms/Resources/icons8-code-512.png | Bin 0 -> 4576 bytes 7 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 I18N Commander/DataModel/Database/SettingGeneratorMode.cs create mode 100644 I18N Commander/UI WinForms/Resources/icons8-code-512.png diff --git a/I18N Commander/DataModel/Database/SettingGeneratorMode.cs b/I18N Commander/DataModel/Database/SettingGeneratorMode.cs new file mode 100644 index 0000000..bcfab42 --- /dev/null +++ b/I18N Commander/DataModel/Database/SettingGeneratorMode.cs @@ -0,0 +1,7 @@ +namespace DataModel.Database; + +public enum SettingGeneratorMode +{ + AUTOMATIC, + MANUAL, +} \ No newline at end of file diff --git a/I18N Commander/DataModel/Database/SettingNames.cs b/I18N Commander/DataModel/Database/SettingNames.cs index d4ee3fb..734eaed 100644 --- a/I18N Commander/DataModel/Database/SettingNames.cs +++ b/I18N Commander/DataModel/Database/SettingNames.cs @@ -2,9 +2,10 @@ public static class SettingNames { - public static readonly string DEEPL_SOURCE_CULTURE = "DeepL Source Culture"; public static readonly string CULTURE = "Culture"; public static readonly string DEEPL_ACTION = "DeepL Action"; public static readonly string DEEPL_API_KEY = "DeepL API Key"; + public static readonly string DEEPL_SOURCE_CULTURE = "DeepL Source Culture"; public static readonly string DEEPL_MODE = "DeepL Mode"; + public static readonly string GENERATOR_MODE = "Generator Mode"; } \ No newline at end of file diff --git a/I18N Commander/Processor/AppSettings.cs b/I18N Commander/Processor/AppSettings.cs index 9b75cb0..8526d7a 100644 --- a/I18N Commander/Processor/AppSettings.cs +++ b/I18N Commander/Processor/AppSettings.cs @@ -460,4 +460,82 @@ public static class AppSettings #endregion #endregion + + #region Generator Settings + + #region Generator Mode + + private static SettingGeneratorMode CACHE_GENERATOR_MODE = SettingGeneratorMode.MANUAL; + private static bool CACHE_GENERATOR_MODE_IS_LOADED = false; + + public static async Task GetGeneratorMode() + { + // When possible, use the cache: + if (CACHE_GENERATOR_MODE_IS_LOADED) + return CACHE_GENERATOR_MODE; + + var generatorMode = SettingGeneratorMode.MANUAL; + try + { + // Get the database: + await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); + + // Check, if the setting is already set: + if (await db.Settings.FirstOrDefaultAsync(n => n.Code == SettingNames.GENERATOR_MODE) is { } existingSetting) + { + generatorMode = (SettingGeneratorMode) existingSetting.IntegerValue; + return generatorMode; + } + + // Does not exist, so create it: + var setting = new Setting + { + Code = SettingNames.GENERATOR_MODE, + IntegerValue = (int) generatorMode, + }; + + await db.Settings.AddAsync(setting); + await db.SaveChangesAsync(); + return generatorMode; + } + finally + { + CACHE_GENERATOR_MODE_IS_LOADED = true; + CACHE_GENERATOR_MODE = generatorMode; + } + } + + public static async Task SetGeneratorMode(SettingGeneratorMode mode) + { + // Update the cache: + CACHE_GENERATOR_MODE = mode; + CACHE_GENERATOR_MODE_IS_LOADED = true; + + // Get the database: + await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); + + // Check, if the setting is already set: + if (await db.Settings.FirstOrDefaultAsync(n => n.Code == SettingNames.GENERATOR_MODE) is { } existingSetting) + { + existingSetting.IntegerValue = (int) mode; + await db.SaveChangesAsync(); + } + + // Does not exist, so create it: + else + { + var setting = new Setting + { + Code = SettingNames.GENERATOR_MODE, + IntegerValue = (int) mode, + }; + + await db.Settings.AddAsync(setting); + await db.SaveChangesAsync(); + } + } + + #endregion + + #endregion } \ No newline at end of file diff --git a/I18N Commander/UI WinForms/Components/Setting.cs b/I18N Commander/UI WinForms/Components/Setting.cs index 2bee739..c354430 100644 --- a/I18N Commander/UI WinForms/Components/Setting.cs +++ b/I18N Commander/UI WinForms/Components/Setting.cs @@ -388,9 +388,55 @@ public sealed partial class Setting : UserControl cultureIndices.Remove(innerLoopIndex); } } + + private static async Task ShowGeneratorModeSettingAsync() + { + var currentSetting = await AppSettings.GetGeneratorMode(); + + var settingData = new SettingUIData( + Icon: Icons.icons8_code_512, + SettingName: () => "Generator Mode", + ChangeNeedsRestart: false, + SettingExplanation: () => "The generator mode determines how the translation files are generated.", + SettingExplanationLink: () => (string.Empty, string.Empty), + SetupDataControl: (changeTrigger) => + { + // We set up a combo box with the available actions: + var dropdown = new ComboBox(); + dropdown.Items.Add("Automatic generation"); + dropdown.Items.Add("Manual generation"); + dropdown.SelectedIndex = currentSetting switch + { + SettingGeneratorMode.AUTOMATIC => 0, + SettingGeneratorMode.MANUAL => 1, + + _ => 0, + }; + + // Setup the change event handler: + dropdown.SelectedValueChanged += (sender, args) => changeTrigger(); + dropdown.SelectedValueChanged += async (sender, args) => await AppSettings.SetGeneratorMode(dropdown.SelectedIndex switch + { + 0 => SettingGeneratorMode.AUTOMATIC, + 1 => SettingGeneratorMode.MANUAL, + + _ => SettingGeneratorMode.AUTOMATIC, + }); + + // Apply the desired layout: + dropdown.Dock = DockStyle.Fill; + dropdown.DropDownStyle = ComboBoxStyle.DropDownList; + + return dropdown; + } + ); + + return new Setting(settingData); + } public static IEnumerable> GetAllSettings() { + yield return ShowGeneratorModeSettingAsync(); yield return ShowDeepLSourceCultureSettingAsync(); foreach (var setting in ShowCultureSettingsAsync()) { diff --git a/I18N Commander/UI WinForms/Resources/Icons.Designer.cs b/I18N Commander/UI WinForms/Resources/Icons.Designer.cs index cedf6c1..95a9b6e 100644 --- a/I18N Commander/UI WinForms/Resources/Icons.Designer.cs +++ b/I18N Commander/UI WinForms/Resources/Icons.Designer.cs @@ -140,6 +140,16 @@ namespace UI_WinForms.Resources { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap icons8_code_512 { + get { + object obj = ResourceManager.GetObject("icons8_code_512", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/I18N Commander/UI WinForms/Resources/Icons.resx b/I18N Commander/UI WinForms/Resources/Icons.resx index 9cfa843..15f9723 100644 --- a/I18N Commander/UI WinForms/Resources/Icons.resx +++ b/I18N Commander/UI WinForms/Resources/Icons.resx @@ -142,6 +142,9 @@ icons8-chat-bubble-512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + icons8-code-512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + icons8-collectibles-512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/I18N Commander/UI WinForms/Resources/icons8-code-512.png b/I18N Commander/UI WinForms/Resources/icons8-code-512.png new file mode 100644 index 0000000000000000000000000000000000000000..00d10ebc55ac5cd23b3f3be92e09ef56d0e358ea GIT binary patch literal 4576 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 literal 0 HcmV?d00001