From 24fa234c9bb61cad0b927eccda608053e546b152 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 11 Dec 2019 19:42:10 +0100 Subject: [PATCH 01/15] Allow comma in input expression Calculator now supports a comma as decimal seperator. --- Plugins/Wox.Plugin.Calculator/Main.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index fab0b8e03..010ff0b6f 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows; @@ -34,7 +34,8 @@ public List Query(Query query) try { - var result = MagesEngine.Interpret(query.Search); + var expression = query.Search.Replace(",", "."); + var result = MagesEngine.Interpret(expression); if (result.ToString() == "NaN") result = Context.API.GetTranslation("wox_plugin_calculator_not_a_number"); From d204df2b18a0448b62d38ced7de44c81a89743e6 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 11 Dec 2019 19:42:27 +0100 Subject: [PATCH 02/15] Improve format --- Plugins/Wox.Plugin.Calculator/Main.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index 010ff0b6f..c8c7fcb0b 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows; @@ -28,7 +28,8 @@ static Main() public List Query(Query query) { - if (query.Search.Length <= 2 // don't affect when user only input "e" or "i" keyword + // Don't affect when user only input "e" or "i" keyword + if (query.Search.Length <= 2 || !RegValidExpressChar.IsMatch(query.Search) || !IsBracketComplete(query.Search)) return new List(); @@ -43,7 +44,6 @@ public List Query(Query query) if (result is Function) result = Context.API.GetTranslation("wox_plugin_calculator_expression_not_complete"); - if (!string.IsNullOrEmpty(result?.ToString())) { return new List From 2e714a8d7b91c9a73786389ac5903b2fa647f196 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:38:47 +0100 Subject: [PATCH 03/15] Create localization helper classes --- Wox.Core/Resource/LocalizationConverter.cs | 37 +++++++++++++++++++ .../Resource/LocalizedDescriptionAttribute.cs | 27 ++++++++++++++ Wox.Core/Wox.Core.csproj | 2 + 3 files changed, 66 insertions(+) create mode 100644 Wox.Core/Resource/LocalizationConverter.cs create mode 100644 Wox.Core/Resource/LocalizedDescriptionAttribute.cs diff --git a/Wox.Core/Resource/LocalizationConverter.cs b/Wox.Core/Resource/LocalizationConverter.cs new file mode 100644 index 000000000..d86bf5f7e --- /dev/null +++ b/Wox.Core/Resource/LocalizationConverter.cs @@ -0,0 +1,37 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using System.Windows.Data; + +namespace Wox.Core +{ + public class LocalizationConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType == typeof(string) && value != null) + { + FieldInfo fi = value.GetType().GetField(value.ToString()); + if (fi != null) + { + string localizedDescription = string.Empty; + var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); + if ((attributes.Length > 0) && (!String.IsNullOrEmpty(attributes[0].Description))) + { + localizedDescription = attributes[0].Description; + } + + return (!String.IsNullOrEmpty(localizedDescription)) ? localizedDescription : value.ToString(); + } + } + + return string.Empty; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Wox.Core/Resource/LocalizedDescriptionAttribute.cs b/Wox.Core/Resource/LocalizedDescriptionAttribute.cs new file mode 100644 index 000000000..ef1257220 --- /dev/null +++ b/Wox.Core/Resource/LocalizedDescriptionAttribute.cs @@ -0,0 +1,27 @@ +using System.ComponentModel; +using Wox.Core.Resource; + +namespace Wox.Core +{ + public class LocalizedDescriptionAttribute : DescriptionAttribute + { + private readonly Internationalization _translator; + private readonly string _resourceKey; + + public LocalizedDescriptionAttribute(string resourceKey) + { + _translator = InternationalizationManager.Instance; + _resourceKey = resourceKey; + } + + public override string Description + { + get + { + string description = _translator.GetTranslation(_resourceKey); + return string.IsNullOrWhiteSpace(description) ? + string.Format("[[{0}]]", _resourceKey) : description; + } + } + } +} diff --git a/Wox.Core/Wox.Core.csproj b/Wox.Core/Wox.Core.csproj index 9d8f1e794..bec5a13a6 100644 --- a/Wox.Core/Wox.Core.csproj +++ b/Wox.Core/Wox.Core.csproj @@ -109,6 +109,8 @@ + + From 73a264b00d8cbbd58cc3f689e3ff22016e5f215e Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:43:12 +0100 Subject: [PATCH 04/15] Create DecimalSeperator enum Localization is handled using the LocalizedDescription attribute and the LocalizationConverter. --- .../Wox.Plugin.Calculator/DecimalSeparator.cs | 24 +++++++++++++++++++ .../Wox.Plugin.Calculator/Languages/de.xaml | 5 +++- .../Wox.Plugin.Calculator/Languages/en.xaml | 5 +++- .../Wox.Plugin.Calculator.csproj | 5 +++- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 Plugins/Wox.Plugin.Calculator/DecimalSeparator.cs diff --git a/Plugins/Wox.Plugin.Calculator/DecimalSeparator.cs b/Plugins/Wox.Plugin.Calculator/DecimalSeparator.cs new file mode 100644 index 000000000..5aad9b39a --- /dev/null +++ b/Plugins/Wox.Plugin.Calculator/DecimalSeparator.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Wox.Core; + +namespace Wox.Plugin.Caculator +{ + [TypeConverter(typeof(LocalizationConverter))] + public enum DecimalSeparator + { + [LocalizedDescription("wox_plugin_calculator_decimal_seperator_use_system_locale")] + UseSystemLocale, + + [LocalizedDescription("wox_plugin_calculator_decimal_seperator_dot")] + Dot, + + [LocalizedDescription("wox_plugin_calculator_decimal_seperator_comma")] + Comma + } +} \ No newline at end of file diff --git a/Plugins/Wox.Plugin.Calculator/Languages/de.xaml b/Plugins/Wox.Plugin.Calculator/Languages/de.xaml index 286e4bc9b..1f550de84 100644 --- a/Plugins/Wox.Plugin.Calculator/Languages/de.xaml +++ b/Plugins/Wox.Plugin.Calculator/Languages/de.xaml @@ -1,4 +1,4 @@ - @@ -7,4 +7,7 @@ Keine Zahl (NaN) Ausdruck falsch oder nicht vollständig (Klammern vergessen?) Diese Zahl in die Zwischenablage kopieren + Systemeinstellung nutzen + Komma (,) + Punkt (.) \ No newline at end of file diff --git a/Plugins/Wox.Plugin.Calculator/Languages/en.xaml b/Plugins/Wox.Plugin.Calculator/Languages/en.xaml index 3b5fa32b3..0de9225b3 100644 --- a/Plugins/Wox.Plugin.Calculator/Languages/en.xaml +++ b/Plugins/Wox.Plugin.Calculator/Languages/en.xaml @@ -1,4 +1,4 @@ - @@ -7,4 +7,7 @@ Not a number (NaN) Expression wrong or incomplete (Did you forget some parentheses?) Copy this number to the clipboard + Use system locale + Comma (,) + Dot (.) \ No newline at end of file diff --git a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj index cf7ce1241..a257caed6 100644 --- a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj +++ b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj @@ -1,4 +1,4 @@ - + @@ -46,11 +46,14 @@ + + Properties\SolutionAssemblyInfo.cs + From b37669b77e50c937f84e2d211009428c696e0a53 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:45:43 +0100 Subject: [PATCH 05/15] Create user control for Calculator settings --- .../Wox.Plugin.Calculator/Languages/de.xaml | 4 +- .../Wox.Plugin.Calculator/Languages/en.xaml | 4 +- Plugins/Wox.Plugin.Calculator/Settings.cs | 13 +++++ .../ViewModels/SettingsViewModel.cs | 28 +++++++++ .../Views/CalculatorSettings.xaml | 44 ++++++++++++++ .../Views/CalculatorSettings.xaml.cs | 42 ++++++++++++++ .../Wox.Plugin.Calculator.csproj | 17 +++++- Wox.Infrastructure/UI/EnumBindingSource.cs | 57 +++++++++++++++++++ Wox.Infrastructure/Wox.Infrastructure.csproj | 1 + 9 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 Plugins/Wox.Plugin.Calculator/Settings.cs create mode 100644 Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs create mode 100644 Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml create mode 100644 Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs create mode 100644 Wox.Infrastructure/UI/EnumBindingSource.cs diff --git a/Plugins/Wox.Plugin.Calculator/Languages/de.xaml b/Plugins/Wox.Plugin.Calculator/Languages/de.xaml index 1f550de84..f5f1b27b5 100644 --- a/Plugins/Wox.Plugin.Calculator/Languages/de.xaml +++ b/Plugins/Wox.Plugin.Calculator/Languages/de.xaml @@ -1,4 +1,4 @@ - @@ -7,6 +7,8 @@ Keine Zahl (NaN) Ausdruck falsch oder nicht vollständig (Klammern vergessen?) Diese Zahl in die Zwischenablage kopieren + Dezimaltrennzeichen + Das Dezimaltrennzeichen, welches bei der Ausgabe verwendet werden soll. Systemeinstellung nutzen Komma (,) Punkt (.) diff --git a/Plugins/Wox.Plugin.Calculator/Languages/en.xaml b/Plugins/Wox.Plugin.Calculator/Languages/en.xaml index 0de9225b3..e214919d1 100644 --- a/Plugins/Wox.Plugin.Calculator/Languages/en.xaml +++ b/Plugins/Wox.Plugin.Calculator/Languages/en.xaml @@ -1,4 +1,4 @@ - @@ -7,6 +7,8 @@ Not a number (NaN) Expression wrong or incomplete (Did you forget some parentheses?) Copy this number to the clipboard + Decimal separator + The decimal separator to be used in the output. Use system locale Comma (,) Dot (.) diff --git a/Plugins/Wox.Plugin.Calculator/Settings.cs b/Plugins/Wox.Plugin.Calculator/Settings.cs new file mode 100644 index 000000000..a45405b29 --- /dev/null +++ b/Plugins/Wox.Plugin.Calculator/Settings.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wox.Plugin.Caculator +{ + public class Settings + { + public DecimalSeparator DecimalSeparator { get; set; } = DecimalSeparator.UseSystemLocale; + } +} diff --git a/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs b/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs new file mode 100644 index 000000000..e06ad675c --- /dev/null +++ b/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Wox.Infrastructure.Storage; +using Wox.Infrastructure.UserSettings; + +namespace Wox.Plugin.Caculator.ViewModels +{ + public class SettingsViewModel : BaseModel, ISavable + { + private readonly PluginJsonStorage _storage; + + public SettingsViewModel() + { + _storage = new PluginJsonStorage(); + Settings = _storage.Load(); + } + + public Settings Settings { get; set; } + + public void Save() + { + _storage.Save(); + } + } +} diff --git a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml new file mode 100644 index 000000000..b9404710d --- /dev/null +++ b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs new file mode 100644 index 000000000..c002243c5 --- /dev/null +++ b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Wox.Plugin.Caculator.ViewModels; + +namespace Wox.Plugin.Caculator.Views +{ + /// + /// Interaction logic for CalculatorSettings.xaml + /// + public partial class CalculatorSettings : UserControl + { + private SettingsViewModel _viewModel; + private Settings _settings; + + public CalculatorSettings(SettingsViewModel viewModel) + { + _viewModel = viewModel; + _settings = viewModel.Settings; + DataContext = viewModel; + InitializeComponent(); + } + + private void CalculatorSettings_Loaded(object sender, RoutedEventArgs e) + { + DecimalSeparatorComboBox.SelectedItem = _settings.DecimalSeparator; + } + } + + +} diff --git a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj index a257caed6..4f7590273 100644 --- a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj +++ b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj @@ -1,4 +1,4 @@ - + @@ -57,6 +57,11 @@ + + + + CalculatorSettings.xaml + @@ -65,6 +70,10 @@ + + {B749F0DB-8E75-47DB-9E5E-265D16D0C0D2} + Wox.Core + {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3} Wox.Infrastructure @@ -121,6 +130,12 @@ PreserveNewest + + + Designer + MSBuild:Compile + + diff --git a/Wox.Infrastructure/UI/EnumBindingSource.cs b/Wox.Infrastructure/UI/EnumBindingSource.cs new file mode 100644 index 000000000..c23aacd81 --- /dev/null +++ b/Wox.Infrastructure/UI/EnumBindingSource.cs @@ -0,0 +1,57 @@ +using System; +using System.Windows.Markup; + +namespace Wox.Infrastructure.UI +{ + public class EnumBindingSourceExtension : MarkupExtension + { + private Type _enumType; + public Type EnumType + { + get { return _enumType; } + set + { + if (value != _enumType) + { + if (value != null) + { + Type enumType = Nullable.GetUnderlyingType(value) ?? value; + if (!enumType.IsEnum) + { + throw new ArgumentException("Type must represent an enum."); + } + } + + _enumType = value; + } + } + } + + public EnumBindingSourceExtension() { } + + public EnumBindingSourceExtension(Type enumType) + { + EnumType = enumType; + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + if (_enumType == null) + { + throw new InvalidOperationException("The EnumType must be specified."); + } + + Type actualEnumType = Nullable.GetUnderlyingType(_enumType) ?? _enumType; + Array enumValues = Enum.GetValues(actualEnumType); + + if (actualEnumType == _enumType) + { + return enumValues; + } + + Array tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1); + enumValues.CopyTo(tempArray, 1); + return tempArray; + } + } +} diff --git a/Wox.Infrastructure/Wox.Infrastructure.csproj b/Wox.Infrastructure/Wox.Infrastructure.csproj index af76894ed..ab8976fb8 100644 --- a/Wox.Infrastructure/Wox.Infrastructure.csproj +++ b/Wox.Infrastructure/Wox.Infrastructure.csproj @@ -87,6 +87,7 @@ + From 3d3d9435dc35201f4e17c92dc5e2e156cb284375 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:48:18 +0100 Subject: [PATCH 06/15] Set minimum expression lenght to 2 Calculations like 8! haven't been possible before due to a validation on the minimum query lenght. --- Plugins/Wox.Plugin.Calculator/Main.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index c8c7fcb0b..113240c5e 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows; @@ -29,9 +29,12 @@ static Main() public List Query(Query query) { // Don't affect when user only input "e" or "i" keyword - if (query.Search.Length <= 2 + if (query.Search.Length < 2 || !RegValidExpressChar.IsMatch(query.Search) - || !IsBracketComplete(query.Search)) return new List(); + || !IsBracketComplete(query.Search)) + { + return new List(); + } try { From 570c1d9a5f027d12fde127966b9bda083aa916e8 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:50:50 +0100 Subject: [PATCH 07/15] Integrate calculator settings Save & load settings when plugin is in use & specify user control. --- Plugins/Wox.Plugin.Calculator/Main.cs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index 113240c5e..9ebdd36c1 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -2,11 +2,15 @@ using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows; +using System.Windows.Controls; using Mages.Core; +using Wox.Infrastructure.Storage; +using Wox.Plugin.Caculator.ViewModels; +using Wox.Plugin.Caculator.Views; namespace Wox.Plugin.Caculator { - public class Main : IPlugin, IPluginI18n + public class Main : IPlugin, IPluginI18n, ISavable, ISettingProvider { private static readonly Regex RegValidExpressChar = new Regex( @"^(" + @@ -21,11 +25,22 @@ public class Main : IPlugin, IPluginI18n private static readonly Engine MagesEngine; private PluginInitContext Context { get; set; } + private static Settings _settings; + private static SettingsViewModel _viewModel; + static Main() { MagesEngine = new Engine(); } + public void Init(PluginInitContext context) + { + Context = context; + + _viewModel = new SettingsViewModel(); + _settings = _viewModel.Settings; + } + public List Query(Query query) { // Don't affect when user only input "e" or "i" keyword @@ -115,5 +130,15 @@ public string GetTranslatedPluginDescription() { return Context.API.GetTranslation("wox_plugin_caculator_plugin_description"); } + + public Control CreateSettingPanel() + { + return new CalculatorSettings(_viewModel); + } + + public void Save() + { + _viewModel.Save(); + } } } From 5ae3262279f13df92c3a0dda6e3602abefd2cad8 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:53:18 +0100 Subject: [PATCH 08/15] Adjust decimal separator based on setting The output decimal separator selected will be used for the output. The input can also handle comma and dot as separator now. --- Plugins/Wox.Plugin.Calculator/Main.cs | 41 ++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index 9ebdd36c1..78ccfcac6 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -64,11 +64,12 @@ public List Query(Query query) if (!string.IsNullOrEmpty(result?.ToString())) { + string newResult = ChangeDecimalSeparator(result, GetDecimalSeparator()); return new List { new Result { - Title = result.ToString(), + Title = newResult, IcoPath = "Images/calculator.png", Score = 300, SubTitle = Context.API.GetTranslation("wox_plugin_calculator_copy_number_to_clipboard"), @@ -76,7 +77,7 @@ public List Query(Query query) { try { - Clipboard.SetText(result.ToString()); + Clipboard.SetText(newResult); return true; } catch (ExternalException) @@ -97,6 +98,37 @@ public List Query(Query query) return new List(); } + private string ChangeDecimalSeparator(object value, string newDecimalSeparator) + { + if (value == null || String.IsNullOrEmpty(value.ToString())) + { + return string.Empty; + } + + if (String.IsNullOrEmpty(newDecimalSeparator)) + { + return value.ToString(); + } + + var numberFormatInfo = new NumberFormatInfo + { + NumberDecimalSeparator = newDecimalSeparator + }; + return Convert.ToDecimal(value).ToString(numberFormatInfo); + } + + private string GetDecimalSeparator() + { + string systemDecimalSeperator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; + switch (_settings.DecimalSeparator) + { + case DecimalSeparator.UseSystemLocale: return systemDecimalSeperator; + case DecimalSeparator.Dot: return "."; + case DecimalSeparator.Comma: return ","; + default: return systemDecimalSeperator; + } + } + private bool IsBracketComplete(string query) { var matchs = RegBrackets.Matches(query); @@ -116,11 +148,6 @@ private bool IsBracketComplete(string query) return leftBracketCount == 0; } - public void Init(PluginInitContext context) - { - Context = context; - } - public string GetTranslatedPluginTitle() { return Context.API.GetTranslation("wox_plugin_caculator_plugin_name"); From 4f4e423a4bf3e7880f58361a33c816db2f376a3c Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Tue, 25 Feb 2020 17:55:04 +0100 Subject: [PATCH 09/15] Add missing using directives --- Plugins/Wox.Plugin.Calculator/Main.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index 78ccfcac6..db3016fad 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Generic; +using System.Globalization; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows; @@ -30,9 +32,9 @@ public class Main : IPlugin, IPluginI18n, ISavable, ISettingProvider static Main() { - MagesEngine = new Engine(); + MagesEngine = new Engine(); } - + public void Init(PluginInitContext context) { Context = context; @@ -147,7 +149,7 @@ private bool IsBracketComplete(string query) return leftBracketCount == 0; } - + public string GetTranslatedPluginTitle() { return Context.API.GetTranslation("wox_plugin_caculator_plugin_name"); From 3d917e02581ffc6df6c5449d7c1344071230f899 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 26 Feb 2020 19:40:20 +0100 Subject: [PATCH 10/15] Extract validation to method --- Plugins/Wox.Plugin.Calculator/Main.cs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index db3016fad..5d7b347d1 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -45,10 +45,7 @@ public void Init(PluginInitContext context) public List Query(Query query) { - // Don't affect when user only input "e" or "i" keyword - if (query.Search.Length < 2 - || !RegValidExpressChar.IsMatch(query.Search) - || !IsBracketComplete(query.Search)) + if (!CanCalculate(query)) { return new List(); } @@ -100,6 +97,27 @@ public List Query(Query query) return new List(); } + private bool CanCalculate(Query query) + { + // Don't execute when user only input "e" or "i" keyword + if (query.Search.Length < 2) + { + return false; + } + + if (!RegValidExpressChar.IsMatch(query.Search)) + { + return false; + } + + if (!IsBracketComplete(query.Search)) + { + return false; + } + + return true; + } + private string ChangeDecimalSeparator(object value, string newDecimalSeparator) { if (value == null || String.IsNullOrEmpty(value.ToString())) From 54191d6d88bb812aeb6c46228d3f0a61f855b568 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 26 Feb 2020 20:00:07 +0100 Subject: [PATCH 11/15] Replace static text with localized label --- .../Views/CalculatorSettings.xaml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml index b9404710d..a02fdffec 100644 --- a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml +++ b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml @@ -26,13 +26,14 @@ - + + Grid.Row="0" + x:Name="DecimalSeparatorComboBox" + Width="200" + HorizontalAlignment="Left" + SelectedItem="{Binding Settings.DecimalSeparator}" + ItemsSource="{Binding Source={ui:EnumBindingSource {x:Type calculator:DecimalSeparator}}}"> From f18256ab398e480e203cd9b8ae9c7e99459af224 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 26 Feb 2020 20:46:27 +0100 Subject: [PATCH 12/15] Add "Max. decimal places" setting --- Plugins/Wox.Plugin.Calculator/Settings.cs | 1 + .../ViewModels/SettingsViewModel.cs | 2 ++ .../Views/CalculatorSettings.xaml | 25 +++++++++++++------ .../Views/CalculatorSettings.xaml.cs | 5 ++-- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Settings.cs b/Plugins/Wox.Plugin.Calculator/Settings.cs index a45405b29..ce01f2da0 100644 --- a/Plugins/Wox.Plugin.Calculator/Settings.cs +++ b/Plugins/Wox.Plugin.Calculator/Settings.cs @@ -9,5 +9,6 @@ namespace Wox.Plugin.Caculator public class Settings { public DecimalSeparator DecimalSeparator { get; set; } = DecimalSeparator.UseSystemLocale; + public int MaxDecimalPlaces { get; set; } = 10; } } diff --git a/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs b/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs index e06ad675c..8550f47a5 100644 --- a/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs +++ b/Plugins/Wox.Plugin.Calculator/ViewModels/SettingsViewModel.cs @@ -20,6 +20,8 @@ public SettingsViewModel() public Settings Settings { get; set; } + public IEnumerable MaxDecimalPlacesRange => Enumerable.Range(1, 20); + public void Save() { _storage.Save(); diff --git a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml index a02fdffec..0cb21c550 100644 --- a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml +++ b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml @@ -3,11 +3,10 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="clr-namespace:Wox.Plugin.Caculator.Views" - xmlns:infrastructure="clr-namespace:Wox.Infrastructure;assembly=Wox.Infrastructure" xmlns:ui="clr-namespace:Wox.Infrastructure.UI;assembly=Wox.Infrastructure" xmlns:calculator="clr-namespace:Wox.Plugin.Caculator" xmlns:core="clr-namespace:Wox.Core;assembly=Wox.Core" + xmlns:viewModels="clr-namespace:Wox.Plugin.Caculator.ViewModels" mc:Ignorable="d" Loaded="CalculatorSettings_Loaded" d:DesignHeight="450" d:DesignWidth="800"> @@ -19,18 +18,19 @@ - + + - + - @@ -40,6 +40,17 @@ + + + + + diff --git a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs index c002243c5..c15bdda77 100644 --- a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs +++ b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml.cs @@ -21,8 +21,8 @@ namespace Wox.Plugin.Caculator.Views /// public partial class CalculatorSettings : UserControl { - private SettingsViewModel _viewModel; - private Settings _settings; + private readonly SettingsViewModel _viewModel; + private readonly Settings _settings; public CalculatorSettings(SettingsViewModel viewModel) { @@ -35,6 +35,7 @@ public CalculatorSettings(SettingsViewModel viewModel) private void CalculatorSettings_Loaded(object sender, RoutedEventArgs e) { DecimalSeparatorComboBox.SelectedItem = _settings.DecimalSeparator; + MaxDecimalPlaces.SelectedItem = _settings.MaxDecimalPlaces; } } From 0933eab4b0c1243c3d63fc714ff48f2bbb524d44 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 26 Feb 2020 20:46:47 +0100 Subject: [PATCH 13/15] Update Mages version --- Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj index c682cd19a..f24ad118e 100644 --- a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj +++ b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj @@ -134,7 +134,7 @@ 10.3.0 - 1.5.0 + 1.6.0 4.0.0 From cc743aeeeaadfd8fa11a57b0b8070849d258d3a6 Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 26 Feb 2020 20:47:14 +0100 Subject: [PATCH 14/15] Round result using new introduced setting --- Plugins/Wox.Plugin.Calculator/Main.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index 5d7b347d1..f2f7f7e18 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -63,7 +63,9 @@ public List Query(Query query) if (!string.IsNullOrEmpty(result?.ToString())) { - string newResult = ChangeDecimalSeparator(result, GetDecimalSeparator()); + decimal roundedResult = Math.Round(Convert.ToDecimal(result), _settings.MaxDecimalPlaces, MidpointRounding.AwayFromZero); + string newResult = ChangeDecimalSeparator(roundedResult, GetDecimalSeparator()); + return new List { new Result @@ -118,13 +120,8 @@ private bool CanCalculate(Query query) return true; } - private string ChangeDecimalSeparator(object value, string newDecimalSeparator) + private string ChangeDecimalSeparator(decimal value, string newDecimalSeparator) { - if (value == null || String.IsNullOrEmpty(value.ToString())) - { - return string.Empty; - } - if (String.IsNullOrEmpty(newDecimalSeparator)) { return value.ToString(); @@ -134,7 +131,7 @@ private string ChangeDecimalSeparator(object value, string newDecimalSeparator) { NumberDecimalSeparator = newDecimalSeparator }; - return Convert.ToDecimal(value).ToString(numberFormatInfo); + return value.ToString(numberFormatInfo); } private string GetDecimalSeparator() From 9d447ca63fd0628d8aa95d1e9dcbb717d14c790e Mon Sep 17 00:00:00 2001 From: SysC0mp Date: Wed, 26 Feb 2020 20:49:39 +0100 Subject: [PATCH 15/15] Replace static text with localized label --- Plugins/Wox.Plugin.Calculator/Languages/de.xaml | 1 + Plugins/Wox.Plugin.Calculator/Languages/en.xaml | 1 + Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Plugins/Wox.Plugin.Calculator/Languages/de.xaml b/Plugins/Wox.Plugin.Calculator/Languages/de.xaml index f5f1b27b5..eb6847af0 100644 --- a/Plugins/Wox.Plugin.Calculator/Languages/de.xaml +++ b/Plugins/Wox.Plugin.Calculator/Languages/de.xaml @@ -12,4 +12,5 @@ Systemeinstellung nutzen Komma (,) Punkt (.) + Max. Nachkommastellen \ No newline at end of file diff --git a/Plugins/Wox.Plugin.Calculator/Languages/en.xaml b/Plugins/Wox.Plugin.Calculator/Languages/en.xaml index e214919d1..0df0d3342 100644 --- a/Plugins/Wox.Plugin.Calculator/Languages/en.xaml +++ b/Plugins/Wox.Plugin.Calculator/Languages/en.xaml @@ -12,4 +12,5 @@ Use system locale Comma (,) Dot (.) + Max. decimal places \ No newline at end of file diff --git a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml index 0cb21c550..183f10e5f 100644 --- a/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml +++ b/Plugins/Wox.Plugin.Calculator/Views/CalculatorSettings.xaml @@ -41,7 +41,7 @@ - +