added FusionCalculator as submodule
This commit is contained in:
parent
b0c5bf8965
commit
f4166a7b19
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "FusionCalculator"]
|
||||
path = FusionCalculator
|
||||
url = https://github.com/Timerix22/FusionCalculator.git
|
||||
1
FusionCalculator
Submodule
1
FusionCalculator
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 5907457907b864c084199929b8f04d3d5fa1f3cf
|
||||
19
README.md
Normal file
19
README.md
Normal file
@ -0,0 +1,19 @@
|
||||
# SharpCalculator
|
||||
A calculator application written in C# and Fusion.
|
||||
Using Avalonia to draw GUI.
|
||||
|
||||
## Building
|
||||
1. ensure that [FusionCalculator](https://github.com/Timerix22/FusionCalculator) submodule is up-to-date.
|
||||
```shell
|
||||
git submodule init && git submodule update
|
||||
```
|
||||
2. Translate FusionCalculator to C#
|
||||
```shell
|
||||
cd FusionCalculator
|
||||
./build_cs.sh --translate-only
|
||||
cd ..
|
||||
```
|
||||
3. Build graphical application
|
||||
```shell
|
||||
dotnet build -c release SharpCalculator.Avalonia/SharpCalculator.Avalonia.csproj
|
||||
```
|
||||
@ -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>
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
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()
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -2,7 +2,14 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCalculator.Avalonia", "SharpCalculator.Avalonia\SharpCalculator.Avalonia.csproj", "{93E7D002-22D7-4C4F-AE6B-F1E0D938BCBA}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpCalculator", "SharpCalculator\SharpCalculator.csproj", "{F41EEE99-5319-4AAF-BB10-C82FE4E0557B}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FusionCalculator", "FusionCalculator\FusionCalculator.csproj", "{8EA39217-DEBD-493B-A19C-5505B58E03FA}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution_items", "solution_items", "{381D7A67-4F32-4BE7-AA83-65E338E1819F}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
.gitignore = .gitignore
|
||||
.gitmodules = .gitmodules
|
||||
README.md = README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@ -14,9 +21,9 @@ Global
|
||||
{93E7D002-22D7-4C4F-AE6B-F1E0D938BCBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{93E7D002-22D7-4C4F-AE6B-F1E0D938BCBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{93E7D002-22D7-4C4F-AE6B-F1E0D938BCBA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F41EEE99-5319-4AAF-BB10-C82FE4E0557B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F41EEE99-5319-4AAF-BB10-C82FE4E0557B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F41EEE99-5319-4AAF-BB10-C82FE4E0557B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F41EEE99-5319-4AAF-BB10-C82FE4E0557B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8EA39217-DEBD-493B-A19C-5505B58E03FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8EA39217-DEBD-493B-A19C-5505B58E03FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8EA39217-DEBD-493B-A19C-5505B58E03FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8EA39217-DEBD-493B-A19C-5505B58E03FA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
namespace SharpCalculator;
|
||||
|
||||
public interface IExpression
|
||||
{
|
||||
public double Calculate();
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
namespace SharpCalculator;
|
||||
|
||||
public class NumericExpression : IExpression
|
||||
{
|
||||
private double n;
|
||||
|
||||
public NumericExpression(double n)
|
||||
{
|
||||
this.n = n;
|
||||
}
|
||||
|
||||
public double Calculate() => n;
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<LangVersion>12</LangVersion>
|
||||
<ImplicitUsings>disable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="local" value="./packages/" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
Loading…
Reference in New Issue
Block a user