From 07c8ed8460ce45fff1ff5fe22a030b9609a72a51 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Sat, 20 Jun 2020 21:00:44 -0500 Subject: [PATCH] Polish Adding polish to the outputs, such as icons and better alignment. --- src/AdvancedCalculator.csproj | 9 ++++++ src/FunctionDefinitonItem.cs | 30 ++++++++--------- src/MainWindow.xaml | 54 ++++++++++++++++++------------- src/MainWindow.xaml.cs | 14 ++------ src/VariableItem.cs | 13 +++----- src/calculator-variant-black.png | Bin 0 -> 629 bytes src/icon.ico | Bin 0 -> 92478 bytes 7 files changed, 63 insertions(+), 57 deletions(-) create mode 100644 src/calculator-variant-black.png create mode 100644 src/icon.ico diff --git a/src/AdvancedCalculator.csproj b/src/AdvancedCalculator.csproj index 6347acd..f1825ea 100644 --- a/src/AdvancedCalculator.csproj +++ b/src/AdvancedCalculator.csproj @@ -33,6 +33,9 @@ prompt 4 + + icon.ico + packages\csmic.1.1.4\lib\net40\csmic.dll @@ -105,5 +108,11 @@ + + + + + + \ No newline at end of file diff --git a/src/FunctionDefinitonItem.cs b/src/FunctionDefinitonItem.cs index 1d02047..7a30815 100644 --- a/src/FunctionDefinitonItem.cs +++ b/src/FunctionDefinitonItem.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; namespace AdvancedCalculator { @@ -14,29 +10,31 @@ namespace AdvancedCalculator public string FunctionDescription { get; private set; } + public string Icon { get; private set; } + public IEnumerable> FunctionArguments { get; private set; } public static IEnumerable DefinedFunctions { get { - yield return new FunctionDefinitonItem() { FunctionName = "sin", FunctionDescription = "Returns the sine value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "cos", FunctionDescription = "Returns the cosine value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "tan", FunctionDescription = "Returns the tangent value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "round", FunctionDescription = "Rounds an expression to the nearest whole number.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "sqrt", FunctionDescription = "Returns the square root of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "abs", FunctionDescription = "Returns the absolute value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "exp", FunctionDescription = "Returns the constant e to a given power.", FunctionArguments = new[] { new KeyValuePair("power", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "log", FunctionDescription = "Returns the log of the first expression to the base of the second expression.", FunctionArguments = new[] { new KeyValuePair("value", "An expression to compute."), new KeyValuePair("base", "An expression to compute.") } }; - yield return new FunctionDefinitonItem() { FunctionName = "precision", FunctionDescription = "Returns the value of expression1 to a given precision. For example, precision(12.3456789, 4) will return 12.3456.", FunctionArguments = new[] { new KeyValuePair("value", "An expression to compute."), new KeyValuePair("precision", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "sin", Icon = IconFont.SineWave, FunctionDescription = "Returns the sine value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "cos", Icon = IconFont.CosineWave, FunctionDescription = "Returns the cosine value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "tan", Icon = IconFont.MathTan, FunctionDescription = "Returns the tangent value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "round", Icon = IconFont.RoundedCorner, FunctionDescription = "Rounds an expression to the nearest whole number.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "sqrt", Icon = IconFont.SquareRoot, FunctionDescription = "Returns the square root of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "abs", Icon = IconFont.PlusCircle, FunctionDescription = "Returns the absolute value of a given expression.", FunctionArguments = new[] { new KeyValuePair("expression", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "exp", Icon = IconFont.AlphaECircle, FunctionDescription = "Returns the constant e to a given power.", FunctionArguments = new[] { new KeyValuePair("power", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "log", Icon = IconFont.MathLog, FunctionDescription = "Returns the log of the first expression to the base of the second expression.", FunctionArguments = new[] { new KeyValuePair("value", "An expression to compute."), new KeyValuePair("base", "An expression to compute.") } }; + yield return new FunctionDefinitonItem() { FunctionName = "precision", Icon = IconFont.DecimalIncrease, FunctionDescription = "Returns the value of expression1 to a given precision. For example, precision(12.3456789, 4) will return 12.3456.", FunctionArguments = new[] { new KeyValuePair("value", "An expression to compute."), new KeyValuePair("precision", "An expression to compute.") } }; } } - #endregion + #endregion Properties private FunctionDefinitonItem() { // } } -} +} \ No newline at end of file diff --git a/src/MainWindow.xaml b/src/MainWindow.xaml index 7564aa5..0bda146 100644 --- a/src/MainWindow.xaml +++ b/src/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:AdvancedCalculator" mc:Ignorable="d" - Title="MainWindow" Height="450" Width="800"> + Title="Advanced Calculator" Height="450" Width="800" Icon="calculator-variant-black.png"> @@ -19,19 +19,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -51,7 +51,10 @@ - + + + + @@ -80,7 +83,7 @@ - + @@ -89,15 +92,22 @@ - + - - - - + + + + + + + + + + + @@ -113,4 +123,4 @@ - + \ No newline at end of file diff --git a/src/MainWindow.xaml.cs b/src/MainWindow.xaml.cs index 8defa41..e326051 100644 --- a/src/MainWindow.xaml.cs +++ b/src/MainWindow.xaml.cs @@ -1,18 +1,9 @@ using csmic; -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; namespace AdvancedCalculator { @@ -42,11 +33,12 @@ namespace AdvancedCalculator { this.interpreter.Interpret(input); this.historyItems.Add(new HistoryItem() { Input = input, Output = this.interpreter.Output }); - this.variableItems = this.interpreter.Variables.Select(kp => new VariableItem() { VariableName = kp.Key, Value = kp.Value.Value.ToString(), ExpressionVisibility = kp.Value.Type == VariableType.Equation ? Visibility.Visible : Visibility.Hidden, ExpressionComputation = "" }).ToList(); + this.variableItems = this.interpreter.Variables.Select(kp => new VariableItem() { VariableName = kp.Key, Value = kp.Value.Value.ToString(), ExpressionVisibility = kp.Value.Type == VariableType.Equation ? Visibility.Visible : Visibility.Hidden, ExpressionComputation = "", Icon = IconFont.Variable }).ToList(); foreach(var expressionVariable in this.variableItems.Where(v => v.ExpressionVisibility == Visibility.Visible)) { this.interpreter.Interpret(expressionVariable.Value); expressionVariable.ExpressionComputation = this.interpreter.Output; + expressionVariable.Icon = IconFont.Function; } }); @@ -75,4 +67,4 @@ namespace AdvancedCalculator } } } -} +} \ No newline at end of file diff --git a/src/VariableItem.cs b/src/VariableItem.cs index ea8f597..226907d 100644 --- a/src/VariableItem.cs +++ b/src/VariableItem.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; +using System.Windows; namespace AdvancedCalculator { @@ -13,12 +8,14 @@ namespace AdvancedCalculator public string VariableName { get; set; } + public string Icon { get; set; } + public string Value { get; set; } public Visibility ExpressionVisibility { get; set; } public string ExpressionComputation { get; set; } - #endregion + #endregion Properties } -} +} \ No newline at end of file diff --git a/src/calculator-variant-black.png b/src/calculator-variant-black.png new file mode 100644 index 0000000000000000000000000000000000000000..f70daac892b5b9faf4d5b463c0274a7fd80c1e62 GIT binary patch literal 629 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5sCVBk9f!i-b3`J@>b7=t`r978hhy`6E;@2~+++kT~U)l6k_mmb`;_~f;~)B62^ z*9r~|S3WV^PFx!zG~FU{+J>|9pLoyu*Y{MVl(#L><4mLI1;*&5r3a)ULN0urQ{!q; z@OJlgjis+QS{*oR-we%T%eM4i zeJj9R@K$gKYn*%X`vbBc3_kX`nICQP$c+AWe%gWP{Kp%^9%@u6u6*wqxSP9-+3Tdk zMTTS1X$S5Gg>Ji`Sf8?!FSYDk9{1d%iqqCzl)b$r9>rW)@5;A@&v7}VhBqH1? z`Px*E3#L8YsqBa5`8aP|Zq)<~a@7*oh?11Vl2ohYqEsNoU}Ruqple{JYh)N=U}$A( zVr5{cZD3$!VDQ3o(>@dpx%nxXX_dG&%oO2b0&0*1*$|wcR#Ki=l*&+EUaps!mtCBk aSdglhUz9%kosASw5re0zpUXO@geCwIDDc_< literal 0 HcmV?d00001 diff --git a/src/icon.ico b/src/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1494c628e4a31ef117d37c2eaec676cc688d0bc1 GIT binary patch literal 92478 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 D5K#gw literal 0 HcmV?d00001