app logic restored

This commit is contained in:
Timerix22 2023-12-25 21:40:40 +06:00
parent bf2c734baf
commit 04d258c5a3
4 changed files with 165 additions and 157 deletions

@ -1 +1 @@
Subproject commit 2a4f92fe351882a489c330ba82504d319df14c73 Subproject commit 7dab069aa6c58ea4a5270e8983663076eb35dbf2

View File

@ -15,7 +15,6 @@
<Setter Property="Height" Value="60"/> <Setter Property="Height" Value="60"/>
<Setter Property="Width" Value="60"/> <Setter Property="Width" Value="60"/>
<Setter Property="CornerRadius" Value="30"/> <Setter Property="CornerRadius" Value="30"/>
<Setter Property="Margin" Value="5"/>
<Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="HorizontalContentAlignment" Value="Center"/>

View File

@ -4,148 +4,158 @@
x:Class="SharpCalculator.Avalonia.MainWindow" x:Class="SharpCalculator.Avalonia.MainWindow"
Title="SharpCalculator" Title="SharpCalculator"
FontFamily="Consolas" FontSize="24" FontFamily="Consolas" FontSize="24"
Width="600" Height="750" Width="460" Height="570">
MinWidth="600" MinHeight="750">
<Grid Classes="center" Margin="20"> <Grid Margin="10">
<Grid.ColumnDefinitions>* * * * * * *</Grid.ColumnDefinitions> <Grid.RowDefinitions>1* 40 1* 330</Grid.RowDefinitions>
<Grid.RowDefinitions>* * * * * * * * * *</Grid.RowDefinitions> <TextBox Name="Input" Grid.Row="0"
TextChanged="Input_OnTextChanged"
<!-- 1st row --> BorderThickness="2"
BorderBrush="#AAAAAA"
<TextBox Name="Input" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="7" TextWrapping="Wrap"/>
HorizontalAlignment="Right"
Text=""/>
<!-- 2nd row -->
<Button Classes="cirlce gray" Grid.Column="0" Grid.Row="2"
Click="ClearButton_OnClick" Content="AC"/>
<Button Classes="cirlce gray" Grid.Column="1" Grid.Row="2"
Click="MathButton_OnClick" Content="("/>
<Button Classes="cirlce gray" Grid.Column="2" Grid.Row="2" <TextBlock Grid.Row="1"
Click="MathButton_OnClick" Content=")" /> VerticalAlignment="Center"
Foreground="#AAAAAA"
Text="="/>
<TextBox Name="Output" Grid.Row="1"
Margin="16 0 0 0"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
IsReadOnly="True"
BorderThickness="0"
TextWrapping="NoWrap"/>
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="2" <TextBox Name="History" Grid.Row="2"
Click="MathButton_OnClick" Content="/"/> Foreground="Gray"
BorderThickness="1"
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="2" BorderBrush="Gray"
Click="MathButton_OnClick" Content="^"/> IsReadOnly="True"
TextWrapping="NoWrap"
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="2" FontSize="18"/>
Click="MathButton_OnClick" Content="sin"/>
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="2"
Click="MathButton_OnClick" Content="asin"/>
<!-- 3rd row -->
<Button Classes="cirlce" Grid.Column="0" Grid.Row="3"
Click="MathButton_OnClick" Content="7"/>
<Button Classes="cirlce" Grid.Column="1" Grid.Row="3"
Click="MathButton_OnClick" Content="8"/>
<Button Classes="cirlce" Grid.Column="2" Grid.Row="3" <Grid Grid.Row="3" VerticalAlignment="Bottom"
Click="MathButton_OnClick" Content="9"/> MinWidth="440" MaxWidth="440" MinHeight="320" MaxHeight="320">
<Grid.ColumnDefinitions>* * * * * * *</Grid.ColumnDefinitions>
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="3" <Grid.RowDefinitions>* * * * *</Grid.RowDefinitions>
Click="MathButton_OnClick" Content="*"/>
<!-- 1st row -->
<Button Classes="cirlce gray" Grid.Column="0" Grid.Row="0"
Click="ClearButton_OnClick" Content="AC"/>
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="3" <Button Classes="cirlce gray" Grid.Column="1" Grid.Row="0"
Click="MathButton_OnClick" Content="e"/> Click="MathButton_OnClick" Content="("/>
<Button Classes="cirlce gray" Grid.Column="2" Grid.Row="0"
Click="MathButton_OnClick" Content=")" />
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="0"
Click="MathButton_OnClick" Content="/"/>
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="3" <Button Classes="cirlce gray" Grid.Column="4" Grid.Row="0"
Click="MathButton_OnClick" Content="cos"/> Click="MathButton_OnClick" Content="1/x"/>
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="3" <Button Classes="cirlce gray" Grid.Column="5" Grid.Row="0"
Click="MathButton_OnClick" Content="acos"/> Click="MathButton_OnClick" Content="sin"/>
<!-- 4th row --> <Button Classes="cirlce gray" Grid.Column="6" Grid.Row="0"
Click="MathButton_OnClick" Content="asin"/>
<Button Classes="cirlce" Grid.Column="0" Grid.Row="4" <!-- 2nd row -->
Click="MathButton_OnClick" Content="4"/>
<Button Classes="cirlce" Grid.Column="1" Grid.Row="4" <Button Classes="cirlce" Grid.Column="0" Grid.Row="1"
Click="MathButton_OnClick" Content="5"/> Click="MathButton_OnClick" Content="7"/>
<Button Classes="cirlce" Grid.Column="2" Grid.Row="4" <Button Classes="cirlce" Grid.Column="1" Grid.Row="1"
Click="MathButton_OnClick" Content="6"/> Click="MathButton_OnClick" Content="8"/>
<Button Classes="cirlce" Grid.Column="2" Grid.Row="1"
Click="MathButton_OnClick" Content="9"/>
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="1"
Click="MathButton_OnClick" Content="*"/>
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="4" <Button Classes="cirlce gray" Grid.Column="4" Grid.Row="1"
Click="MathButton_OnClick" Content="-"/> Click="MathButton_OnClick" Content="^"/>
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="4" <Button Classes="cirlce gray" Grid.Column="5" Grid.Row="1"
Click="MathButton_OnClick" Content="10^x"/> Click="MathButton_OnClick" Content="cos"/>
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="4" <Button Classes="cirlce gray" Grid.Column="6" Grid.Row="1"
Click="MathButton_OnClick" Content="tan"/> Click="MathButton_OnClick" Content="acos"/>
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="4" <!-- 3th row -->
Click="MathButton_OnClick" Content="atan"/>
<!-- 5th row --> <Button Classes="cirlce" Grid.Column="0" Grid.Row="2"
Click="MathButton_OnClick" Content="4"/>
<Button Classes="cirlce" Grid.Column="0" Grid.Row="5" <Button Classes="cirlce" Grid.Column="1" Grid.Row="2"
Click="MathButton_OnClick" Content="1"/> Click="MathButton_OnClick" Content="5"/>
<Button Classes="cirlce" Grid.Column="1" Grid.Row="5" <Button Classes="cirlce" Grid.Column="2" Grid.Row="2"
Click="MathButton_OnClick" Content="2"/> Click="MathButton_OnClick" Content="6"/>
<Button Classes="cirlce" Grid.Column="2" Grid.Row="5" <Button Classes="cirlce orange" Grid.Column="3" Grid.Row="2"
Click="MathButton_OnClick" Content="3"/> Click="MathButton_OnClick" Content="-"/>
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="5" <Button Classes="cirlce gray" Grid.Column="4" Grid.Row="2"
Click="MathButton_OnClick" Content="+"/> FontSize="22"
Click="MathButton_OnClick" Content="10^x"/>
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="5" <Button Classes="cirlce gray" Grid.Column="5" Grid.Row="2"
Click="MathButton_OnClick" Content="rand"/> Click="MathButton_OnClick" Content="tg"/>
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="5" <Button Classes="cirlce gray" Grid.Column="6" Grid.Row="2"
Click="MathButton_OnClick" Content="ctg"/> Click="MathButton_OnClick" Content="atg"/>
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="5" <!-- 4th row -->
Click="MathButton_OnClick" Content="actg"/>
<!-- 6th row --> <Button Classes="cirlce" Grid.Column="0" Grid.Row="3"
Click="MathButton_OnClick" Content="1"/>
<Button Classes="cirlce" Grid.Column="0" Grid.Row="6" <Button Classes="cirlce" Grid.Column="1" Grid.Row="3"
Click="MathButton_OnClick" Content="0"/> Click="MathButton_OnClick" Content="2"/>
<Button Classes="cirlce" Grid.Column="1" Grid.Row="6" <Button Classes="cirlce" Grid.Column="2" Grid.Row="3"
Click="MathButton_OnClick" Content="%"/> Click="MathButton_OnClick" Content="3"/>
<Button Classes="cirlce" Grid.Column="2" Grid.Row="6" <Button Classes="cirlce orange" Grid.Column="3" Grid.Row="3"
Click="MathButton_OnClick" Content="."/> Click="MathButton_OnClick" Content="+"/>
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="6" <Button Classes="cirlce gray" Grid.Column="4" Grid.Row="3"
Click="ResultButton_OnClick" Content="="/> Click="MathButton_OnClick" Content="e"/>
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="6" <Button Classes="cirlce gray" Grid.Column="5" Grid.Row="3"
Click="MathButton_OnClick" Content="π"/> Click="MathButton_OnClick" Content="ctg"/>
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="6" <Button Classes="cirlce gray" Grid.Column="6" Grid.Row="3"
Click="MathButton_OnClick" Content="1/x"/> Click="MathButton_OnClick" Content="actg"/>
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="6" <!-- 5th row -->
Click="MathButton_OnClick" Content="log"/>
<!-- 7th row --> <Button Classes="cirlce" Grid.Column="0" Grid.Row="4"
Click="MathButton_OnClick" Content="0"/>
<TextBlock Grid.Column="0" Grid.Row="7" Grid.ColumnSpan="7" Name="History1" <Button Classes="cirlce" Grid.Column="1" Grid.Row="4"
Text=""/> Click="MathButton_OnClick" Content="."/>
<!-- 8th row --> <Button Classes="cirlce" Grid.Column="2" Grid.Row="4"
Click="MathButton_OnClick" Content="%"/>
<TextBlock Name="History2" Grid.Column="0" Grid.Row="8" Grid.ColumnSpan="7" <Button Classes="cirlce orange" Grid.Column="3" Grid.Row="4"
Text=""/> Click="ResultButton_OnClick" Content="="/>
<!-- 9th row --> <Button Classes="cirlce gray" Grid.Column="4" Grid.Row="4"
Click="MathButton_OnClick" Content="π"/>
<TextBlock Name="History3" Grid.Column="0" Grid.Row="9" Grid.ColumnSpan="7" <Button Classes="cirlce gray" Grid.Column="5" Grid.Row="4"
Text=""/> FontSize="22"
Click="MathButton_OnClick" Content="rand"/>
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="4"
Click="MathButton_OnClick" Content="ln"/>
</Grid>
</Grid> </Grid>
</Window> </Window>

View File

@ -4,29 +4,24 @@ namespace SharpCalculator.Avalonia;
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private static readonly Random Random = new(); private readonly Random Random = new();
private readonly List<string> _history = new(); // History list to append expressions
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
} }
private void AppendToHistory(string calculation) //function of appending expression to the history list private void AppendToHistory(string line) //function of appending expression to the history list
{ {
_history.Add(calculation); // begin new line if not empty
UpdateHistoryText(); if (!string.IsNullOrEmpty(History.Text))
} History.Text += '\n';
/// add line without space characters
private void UpdateHistoryText() //function to update history list History.Text += line
{ .Replace("\t", " ")
int lastIndex = _history.Count - 1; .Replace("\n", " ")
if (lastIndex >= 0) .Replace("\r", " ")
History1.Text = _history[lastIndex]; .Replace(" ", " ");
if (lastIndex - 1 >= 0)
History2.Text = _history[lastIndex - 1];
if (lastIndex - 2 >= 0)
History3.Text = _history[lastIndex - 2];
} }
private void MathButton_OnClick(object? sender, RoutedEventArgs e) private void MathButton_OnClick(object? sender, RoutedEventArgs e)
@ -34,39 +29,30 @@ public partial class MainWindow : Window
if (sender is not Button button) if (sender is not Button button)
throw new Exception(); throw new Exception();
switch (Input.Text) // Switch case for checking the inputting functions string buttonText = button.Content!.ToString()!; // declaring text for using it in switch case
Input.Text += buttonText switch
{ {
case "rand": // rand function add random variable from 0 to 1 into Input "rand" => // random number from 0 to 1 into Input
Input.Text = ""; Random.NextDouble().ToString("0.#####", CultureInfo.InvariantCulture),
Input.Text += Random.NextDouble().ToString(CultureInfo.InvariantCulture); "π" => // Pi constant
break; "3.14159",
case "π": // Pi function add pi value into Input "e" => // E constant
Input.Text = ""; "2.71828",
Input.Text += "3.1415"; "10^x" => // ten in power of x function
break; "10^",
case "e": // euler function add e value into Input "1/x" => // one over x function
Input.Text = ""; "1/",
Input.Text += "2.71828"; "sin" or "cos" or "tg" or "ctg"
break; or "asin" or "acos" or "atg" or "actg"
case "10^x": // ten in power of x function or "ln" => buttonText+'(',
Input.Text = ""; _ => buttonText
Input.Text += "10^"; };
break;
case "1/x": // one over x function
Input.Text = "";
Input.Text += "1/";
break;
default: // if there is no function input, then just input Button content
string text = button.Content!.ToString()!; // declaring text for using it in switch case
Input.Text += text;
break;
}
} }
private void ClearButton_OnClick(object? sender, RoutedEventArgs e) private void ClearButton_OnClick(object? sender, RoutedEventArgs e)
{ {
Input.Text = ""; Input.Text = "";
Output.Text = "";
} }
private void UndoButton_OnClick(object? sender, RoutedEventArgs e) private void UndoButton_OnClick(object? sender, RoutedEventArgs e)
@ -78,6 +64,16 @@ public partial class MainWindow : Window
} }
private void ResultButton_OnClick(object? sender, RoutedEventArgs e) private void ResultButton_OnClick(object? sender, RoutedEventArgs e)
{
if(Input.Text == null || Output.Text == null || Output.Text.StartsWith("Error"))
return;
string expression = Input.Text;
string result = Output.Text;
AppendToHistory($"{expression}={result}");
Input.Text = result;
}
private void Input_OnTextChanged(object? sender, TextChangedEventArgs e)
{ {
if(Input.Text == null) if(Input.Text == null)
return; return;
@ -85,16 +81,19 @@ public partial class MainWindow : Window
string exprStr = Input.Text; // mathematical expression string exprStr = Input.Text; // mathematical expression
try try
{ {
double result = Calculator.Calculate(exprStr); // result being processed by calculator object that implemented in FusionCalculator Module // expression is being processed by Calculator class that implemented in FusionCalculator Module
if (!double.IsNaN(result)) double result = Calculator.Calculate(exprStr);
{ if (double.IsNaN(result))
AppendToHistory($"{exprStr} = {result}"); Output.Text = "";
Input.Text = result.ToString(CultureInfo.InvariantCulture); // scientific notation with 5-digit precision for big and small numbers
} else if (result > 10e+15 || result < 10e-5)
Output.Text = result.ToString("0.#####E0", CultureInfo.InvariantCulture);
// decimal number with 5-digit precision for regular numbers
else Output.Text = result.ToString("0.#####", CultureInfo.InvariantCulture);
} }
catch (Exception exception) catch (Exception exception)
{ {
AppendToHistory($"Error: {exception.Message}"); Output.Text = $"Error: {exception.Message}";
} }
} }
} }