added FusionCalculator as submodule

This commit is contained in:
2023-12-23 00:15:00 +06:00
parent b0c5bf8965
commit f4166a7b19
12 changed files with 98 additions and 129 deletions

View File

@@ -9,34 +9,41 @@
FontSize="24">
<Grid Margin="16">
<Grid.RowDefinitions>4* 1* 4*</Grid.RowDefinitions>
<TextBox Name="Input" IsReadOnly="True"></TextBox>
<TextBlock Name="Output" Grid.Row="1" VerticalAlignment="Center">= 0</TextBlock>
<TextBox Name="Input" TextChanged="Input_OnTextChanged"/>
<TextBlock Grid.Row="1" VerticalAlignment="Center">=</TextBlock>
<TextBox Name="Output" Grid.Row="1"
Margin="16 0 0 0"
VerticalAlignment="Center"
IsReadOnly="True"
BorderThickness="0"
/>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions> * * * * </Grid.ColumnDefinitions>
<Grid.RowDefinitions> * * * * * </Grid.RowDefinitions>
<Button Grid.Row="1" Grid.Column="0" Name="SevenButton" Click="NumberButton_OnClick">7</Button>
<Button Grid.Row="1" Grid.Column="1" Name="EightButton" Click="NumberButton_OnClick">8</Button>
<Button Grid.Row="1" Grid.Column="2" Name="NineButton" Click="NumberButton_OnClick">9</Button>
<Button Grid.Row="1" Grid.Column="0" Click="MathButton_OnClick">7</Button>
<Button Grid.Row="1" Grid.Column="1" Click="MathButton_OnClick">8</Button>
<Button Grid.Row="1" Grid.Column="2" Click="MathButton_OnClick">9</Button>
<Button Grid.Row="2" Grid.Column="0" Name="FourButton" Click="NumberButton_OnClick">4</Button>
<Button Grid.Row="2" Grid.Column="1" Name="FiveButton" Click="NumberButton_OnClick">5</Button>
<Button Grid.Row="2" Grid.Column="2" Name="SixButton" Click="NumberButton_OnClick">6</Button>
<Button Grid.Row="2" Grid.Column="0" Click="MathButton_OnClick">4</Button>
<Button Grid.Row="2" Grid.Column="1" Click="MathButton_OnClick">5</Button>
<Button Grid.Row="2" Grid.Column="2" Click="MathButton_OnClick">6</Button>
<Button Grid.Row="3" Grid.Column="0" Name="OneButton" Click="NumberButton_OnClick">1</Button>
<Button Grid.Row="3" Grid.Column="1" Name="TwoButton" Click="NumberButton_OnClick">2</Button>
<Button Grid.Row="3" Grid.Column="2" Name="ThreeButton" Click="NumberButton_OnClick">3</Button>
<Button Grid.Row="3" Grid.Column="0" Click="MathButton_OnClick">1</Button>
<Button Grid.Row="3" Grid.Column="1" Click="MathButton_OnClick">2</Button>
<Button Grid.Row="3" Grid.Column="2" Click="MathButton_OnClick">3</Button>
<Button Grid.Row="4" Grid.Column="0" Name="ZeroButton" Click="NumberButton_OnClick">0</Button>
<Button Grid.Row="4" Grid.Column="1" Name="PointButton" Click="NumberButton_OnClick">.</Button>
<Button Grid.Row="4" Grid.Column="2" Name="PowerButton" Click="OperationButton_OnClick">^</Button>
<Button Grid.Row="4" Grid.Column="0" Click="MathButton_OnClick">0</Button>
<Button Grid.Row="4" Grid.Column="1" Click="MathButton_OnClick">.</Button>
<Button Grid.Row="4" Grid.Column="2" Click="MathButton_OnClick">^</Button>
<Button Grid.Row="1" Grid.Column="3" Name="DivideButton" Click="OperationButton_OnClick">/</Button>
<Button Grid.Row="2" Grid.Column="3" Name="MultiplyButton" Click="OperationButton_OnClick">*</Button>
<Button Grid.Row="3" Grid.Column="3" Name="SubstractButton" Click="OperationButton_OnClick">-</Button>
<Button Grid.Row="4" Grid.Column="3" Name="AddButton" Click="OperationButton_OnClick">+</Button>
<Button Grid.Row="1" Grid.Column="3" Click="MathButton_OnClick">/</Button>
<Button Grid.Row="2" Grid.Column="3" Click="MathButton_OnClick">*</Button>
<Button Grid.Row="3" Grid.Column="3" Click="MathButton_OnClick">-</Button>
<Button Grid.Row="4" Grid.Column="3" Click="MathButton_OnClick">+</Button>
<Button Grid.Row="0" Grid.Column="2" Name="ClearButton" Click="ClearButton_OnClick">CLR</Button>
<Button Grid.Row="0" Grid.Column="3" Name="EqualButton" Click="OperationButton_OnClick">=</Button>
<Button Grid.Row="0" Grid.Column="0" Click="ClearButton_OnClick">CLR</Button>
<Button Grid.Row="0" Grid.Column="2" Click="MathButton_OnClick">(</Button>
<Button Grid.Row="0" Grid.Column="3" Click="MathButton_OnClick">)</Button>
</Grid>
</Grid>
</Window>

View File

@@ -1,8 +1,9 @@
using System;
using System.Diagnostics;
using System.Globalization;
using System.Text;
using Avalonia.Controls;
using Avalonia.Interactivity;
using FusionCalculator;
namespace SharpCalculator.Avalonia;
@@ -10,80 +11,37 @@ public partial class MainWindow : Window
{
public MainWindow()
{
_currentOperation = _initialOperation;
InitializeComponent();
}
private double _prevNumber;
private StringBuilder _currentNumberB = new();
private double ParseCurrentNumber() => double.Parse(_currentNumberB.ToString(), CultureInfo.InvariantCulture);
readonly Func<double, double, double> _initialOperation = (_, firstN) => firstN;
private Func<double, double, double> _currentOperation;
private void NewOperation(Func<double, double, double> operation, Func<string> operationText)
{
// operation replacement
if (_currentNumberB.Length == 0)
Input.Redo();
else
{
_prevNumber = _currentOperation( _prevNumber, ParseCurrentNumber());
Output.Text = _prevNumber.ToString(CultureInfo.InvariantCulture);
_currentNumberB.Clear();
}
Input.Text += operationText();
_currentOperation = operation;
}
private void NumberButton_OnClick(object? sender, RoutedEventArgs e)
private void MathButton_OnClick(object? sender, RoutedEventArgs e)
{
if (sender is not Button button)
throw new Exception();
string text = button.Content!.ToString()!;
Input.Text += text;
_currentNumberB.Append(text);
Output.Text = "= " + _currentOperation(_prevNumber, ParseCurrentNumber()).ToString(CultureInfo.InvariantCulture);
}
private void OperationButton_OnClick(object? sender, RoutedEventArgs e)
{
if (sender is not Button button)
throw new Exception();
string text = button.Content?.ToString()!;
switch (text)
{
case "+":
NewOperation((a, b) => a + b, () => text);
break;
case "-":
NewOperation((a, b) => a - b, () => text);
break;
case "*":
NewOperation((a, b) => a * b, () => text);
break;
case "/":
NewOperation((a, b) => a / b, () => text);
break;
case "^":
NewOperation(Math.Pow, () => text);
break;
case "=":
NewOperation((_, newNumber) => newNumber, () => $"={_prevNumber}\n");
break;
default:
throw new Exception("incorrect button text: ");
}
}
private void ClearButton_OnClick(object? sender, RoutedEventArgs e)
{
_prevNumber = 0;
_currentOperation = _initialOperation;
_currentNumberB.Clear();
Input.Text = "";
Output.Text = "= 0";
Output.Text = "";
}
private void Input_OnTextChanged(object? sender, TextChangedEventArgs e)
{
if(Input.Text == null)
return;
string exprStr = Input.Text;
try
{
double rezult = Calculator.Calculate(exprStr);
if(!double.IsNaN(rezult))
Output.Text = rezult.ToString(CultureInfo.InvariantCulture);
}
catch (Exception exception)
{
Debug.WriteLine(exception.ToString());
}
}
}

View File

@@ -1,5 +1,6 @@
using Avalonia;
using System;
using System.Globalization;
namespace SharpCalculator.Avalonia;
@@ -9,8 +10,12 @@ class Program
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
public static void Main(string[] args)
{
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
}
// Avalonia configuration, don't remove; also used by visual designer.
private static AppBuilder BuildAvaloniaApp()

View File

@@ -10,9 +10,13 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.0.5"/>
<PackageReference Include="Avalonia.Desktop" Version="11.0.5"/>
<PackageReference Include="Avalonia.Themes.Simple" Version="11.0.5" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.5"/>
<PackageReference Include="Avalonia" Version="11.0.6" />
<PackageReference Include="Avalonia.Desktop" Version="11.0.6" />
<PackageReference Include="Avalonia.Themes.Simple" Version="11.0.6" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.6" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\FusionCalculator\FusionCalculator.csproj" />
</ItemGroup>
</Project>