made buttons square and added hotkeys
This commit is contained in:
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,3 +1,3 @@
|
|||||||
[submodule "FusionCalculator"]
|
[submodule "FusionCalculator"]
|
||||||
path = FusionCalculator
|
path = FusionCalculator
|
||||||
url = https://timerix.ddns.net:3322/Timerix/FusionCalculator.git
|
url = https://timerix.ddns.net/git/Timerix/FusionCalculator.git
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Requirements: git, bash, [dotnet8](https://dotnet.microsoft.com/en-us/download/d
|
|||||||
|
|
||||||
1. ensure that [FusionCalculator](https://github.com/Timerix22/FusionCalculator) submodule is up-to-date.
|
1. ensure that [FusionCalculator](https://github.com/Timerix22/FusionCalculator) submodule is up-to-date.
|
||||||
```shell
|
```shell
|
||||||
git submodule init && git submodule update
|
it submodule update --init
|
||||||
```
|
```
|
||||||
2. Translate FusionCalculator to C#
|
2. Translate FusionCalculator to C#
|
||||||
```shell
|
```shell
|
||||||
|
|||||||
@@ -11,14 +11,14 @@
|
|||||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style Selector="Button.cirlce">
|
<Style Selector="Button.button">
|
||||||
<Setter Property="Height" Value="60"/>
|
<Setter Property="HorizontalAlignment" Value="Stretch"/>
|
||||||
<Setter Property="Width" Value="60"/>
|
<Setter Property="VerticalAlignment" Value="Stretch"/>
|
||||||
<Setter Property="CornerRadius" Value="30"/>
|
|
||||||
<Setter Property="HorizontalAlignment" Value="Center"/>
|
|
||||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
|
||||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||||
|
<Setter Property="BorderThickness" Value="0"/>
|
||||||
|
<Setter Property="Margin" Value="1"/>
|
||||||
|
<Setter Property="Padding" Value="0"/>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style Selector="Button.gray">
|
<Style Selector="Button.gray">
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
Title="SharpCalculator"
|
Title="SharpCalculator"
|
||||||
Icon="avares://SharpCalculator.Avalonia/assets/icon.ico"
|
Icon="avares://SharpCalculator.Avalonia/assets/icon.ico"
|
||||||
FontFamily="Consolas" FontSize="24"
|
FontFamily="Consolas" FontSize="24"
|
||||||
|
MinWidth="460" MinHeight="570"
|
||||||
Width="460" Height="570">
|
Width="460" Height="570">
|
||||||
|
|
||||||
<Grid Margin="10">
|
<Grid Margin="10">
|
||||||
@@ -14,7 +15,9 @@
|
|||||||
TextChanged="Input_OnTextChanged"
|
TextChanged="Input_OnTextChanged"
|
||||||
BorderThickness="2"
|
BorderThickness="2"
|
||||||
BorderBrush="#AAAAAA"
|
BorderBrush="#AAAAAA"
|
||||||
TextWrapping="Wrap"/>
|
TextWrapping="Wrap"
|
||||||
|
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
|
||||||
|
ScrollViewer.VerticalScrollBarVisibility="Auto"/>
|
||||||
|
|
||||||
<TextBlock Grid.Row="1"
|
<TextBlock Grid.Row="1"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
@@ -26,7 +29,9 @@
|
|||||||
VerticalContentAlignment="Center"
|
VerticalContentAlignment="Center"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
BorderThickness="0"
|
BorderThickness="0"
|
||||||
TextWrapping="NoWrap"/>
|
TextWrapping="NoWrap"
|
||||||
|
ScrollViewer.HorizontalScrollBarVisibility="Auto"
|
||||||
|
ScrollViewer.VerticalScrollBarVisibility="Disabled"/>
|
||||||
|
|
||||||
<TextBox Name="History" Grid.Row="2"
|
<TextBox Name="History" Grid.Row="2"
|
||||||
Foreground="Gray"
|
Foreground="Gray"
|
||||||
@@ -34,7 +39,9 @@
|
|||||||
BorderBrush="Gray"
|
BorderBrush="Gray"
|
||||||
IsReadOnly="True"
|
IsReadOnly="True"
|
||||||
TextWrapping="NoWrap"
|
TextWrapping="NoWrap"
|
||||||
FontSize="18"/>
|
FontSize="18"
|
||||||
|
ScrollViewer.HorizontalScrollBarVisibility="Auto"
|
||||||
|
ScrollViewer.VerticalScrollBarVisibility="Auto"/>
|
||||||
|
|
||||||
<Grid Grid.Row="3" VerticalAlignment="Bottom"
|
<Grid Grid.Row="3" VerticalAlignment="Bottom"
|
||||||
MinWidth="440" MaxWidth="440" MinHeight="320" MaxHeight="320">
|
MinWidth="440" MaxWidth="440" MinHeight="320" MaxHeight="320">
|
||||||
@@ -43,119 +50,119 @@
|
|||||||
|
|
||||||
<!-- 1st row -->
|
<!-- 1st row -->
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="0" Grid.Row="0"
|
<Button Classes="button gray" Grid.Column="0" Grid.Row="0"
|
||||||
Click="ClearButton_OnClick" Content="AC"/>
|
Click="ClearButton_OnClick" Content="AC"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="1" Grid.Row="0"
|
<Button Classes="button gray" Grid.Column="1" Grid.Row="0"
|
||||||
Click="MathButton_OnClick" Content="("/>
|
Click="MathButton_OnClick" Content="("/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="2" Grid.Row="0"
|
<Button Classes="button gray" Grid.Column="2" Grid.Row="0"
|
||||||
Click="MathButton_OnClick" Content=")" />
|
Click="MathButton_OnClick" Content=")" />
|
||||||
|
|
||||||
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="0"
|
<Button Classes="button orange" Grid.Column="3" Grid.Row="0"
|
||||||
Click="MathButton_OnClick" Content="/"/>
|
Click="MathButton_OnClick" Content="/"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="0"
|
<Button Classes="button gray" Grid.Column="4" Grid.Row="0"
|
||||||
Click="MathButton_OnClick" Content="1/x"/>
|
Click="MathButton_OnClick" Content="1/x"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="0"
|
<Button Classes="button gray" Grid.Column="5" Grid.Row="0"
|
||||||
Click="MathButton_OnClick" Content="sin"/>
|
Click="MathButton_OnClick" Content="sin"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="0"
|
<Button Classes="button gray" Grid.Column="6" Grid.Row="0"
|
||||||
Click="MathButton_OnClick" Content="asin"/>
|
Click="MathButton_OnClick" Content="asin"/>
|
||||||
|
|
||||||
<!-- 2nd row -->
|
<!-- 2nd row -->
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="0" Grid.Row="1"
|
<Button Classes="button" Grid.Column="0" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="7"/>
|
Click="MathButton_OnClick" Content="7"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="1" Grid.Row="1"
|
<Button Classes="button" Grid.Column="1" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="8"/>
|
Click="MathButton_OnClick" Content="8"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="2" Grid.Row="1"
|
<Button Classes="button" Grid.Column="2" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="9"/>
|
Click="MathButton_OnClick" Content="9"/>
|
||||||
|
|
||||||
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="1"
|
<Button Classes="button orange" Grid.Column="3" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="*"/>
|
Click="MathButton_OnClick" Content="*"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="1"
|
<Button Classes="button gray" Grid.Column="4" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="^"/>
|
Click="MathButton_OnClick" Content="^"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="1"
|
<Button Classes="button gray" Grid.Column="5" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="cos"/>
|
Click="MathButton_OnClick" Content="cos"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="1"
|
<Button Classes="button gray" Grid.Column="6" Grid.Row="1"
|
||||||
Click="MathButton_OnClick" Content="acos"/>
|
Click="MathButton_OnClick" Content="acos"/>
|
||||||
|
|
||||||
<!-- 3th row -->
|
<!-- 3th row -->
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="0" Grid.Row="2"
|
<Button Classes="button" Grid.Column="0" Grid.Row="2"
|
||||||
Click="MathButton_OnClick" Content="4"/>
|
Click="MathButton_OnClick" Content="4"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="1" Grid.Row="2"
|
<Button Classes="button" Grid.Column="1" Grid.Row="2"
|
||||||
Click="MathButton_OnClick" Content="5"/>
|
Click="MathButton_OnClick" Content="5"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="2" Grid.Row="2"
|
<Button Classes="button" Grid.Column="2" Grid.Row="2"
|
||||||
Click="MathButton_OnClick" Content="6"/>
|
Click="MathButton_OnClick" Content="6"/>
|
||||||
|
|
||||||
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="2"
|
<Button Classes="button orange" Grid.Column="3" Grid.Row="2"
|
||||||
Click="MathButton_OnClick" Content="-"/>
|
Click="MathButton_OnClick" Content="-"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="2"
|
<Button Classes="button gray" Grid.Column="4" Grid.Row="2"
|
||||||
FontSize="22"
|
FontSize="22"
|
||||||
Click="MathButton_OnClick" Content="10^x"/>
|
Click="MathButton_OnClick" Content="10^x"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="2"
|
<Button Classes="button gray" Grid.Column="5" Grid.Row="2"
|
||||||
Click="MathButton_OnClick" Content="tg"/>
|
Click="MathButton_OnClick" Content="tg"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="2"
|
<Button Classes="button gray" Grid.Column="6" Grid.Row="2"
|
||||||
Click="MathButton_OnClick" Content="atg"/>
|
Click="MathButton_OnClick" Content="atg"/>
|
||||||
|
|
||||||
<!-- 4th row -->
|
<!-- 4th row -->
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="0" Grid.Row="3"
|
<Button Classes="button" Grid.Column="0" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="1"/>
|
Click="MathButton_OnClick" Content="1"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="1" Grid.Row="3"
|
<Button Classes="button" Grid.Column="1" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="2"/>
|
Click="MathButton_OnClick" Content="2"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="2" Grid.Row="3"
|
<Button Classes="button" Grid.Column="2" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="3"/>
|
Click="MathButton_OnClick" Content="3"/>
|
||||||
|
|
||||||
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="3"
|
<Button Classes="button orange" Grid.Column="3" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="+"/>
|
Click="MathButton_OnClick" Content="+"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="3"
|
<Button Classes="button gray" Grid.Column="4" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="e"/>
|
Click="MathButton_OnClick" Content="e"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="3"
|
<Button Classes="button gray" Grid.Column="5" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="ctg"/>
|
Click="MathButton_OnClick" Content="ctg"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="3"
|
<Button Classes="button gray" Grid.Column="6" Grid.Row="3"
|
||||||
Click="MathButton_OnClick" Content="actg"/>
|
Click="MathButton_OnClick" Content="actg"/>
|
||||||
|
|
||||||
<!-- 5th row -->
|
<!-- 5th row -->
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="0" Grid.Row="4"
|
<Button Classes="button" Grid.Column="0" Grid.Row="4"
|
||||||
Click="MathButton_OnClick" Content="0"/>
|
Click="MathButton_OnClick" Content="0"/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="1" Grid.Row="4"
|
<Button Classes="button" Grid.Column="1" Grid.Row="4"
|
||||||
Click="MathButton_OnClick" Content="."/>
|
Click="MathButton_OnClick" Content="."/>
|
||||||
|
|
||||||
<Button Classes="cirlce" Grid.Column="2" Grid.Row="4"
|
<Button Classes="button" Grid.Column="2" Grid.Row="4"
|
||||||
Click="MathButton_OnClick" Content="%"/>
|
Click="MathButton_OnClick" Content="%"/>
|
||||||
|
|
||||||
<Button Classes="cirlce orange" Grid.Column="3" Grid.Row="4"
|
<Button Classes="button orange" Grid.Column="3" Grid.Row="4"
|
||||||
Click="ResultButton_OnClick" Content="="/>
|
Click="ResultButton_OnClick" Content="="/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="4" Grid.Row="4"
|
<Button Classes="button gray" Grid.Column="4" Grid.Row="4"
|
||||||
Click="MathButton_OnClick" Content="π"/>
|
Click="MathButton_OnClick" Content="π"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="5" Grid.Row="4"
|
<Button Classes="button gray" Grid.Column="5" Grid.Row="4"
|
||||||
FontSize="22"
|
FontSize="22"
|
||||||
Click="MathButton_OnClick" Content="rand"/>
|
Click="MathButton_OnClick" Content="rand"/>
|
||||||
|
|
||||||
<Button Classes="cirlce gray" Grid.Column="6" Grid.Row="4"
|
<Button Classes="button gray" Grid.Column="6" Grid.Row="4"
|
||||||
Click="MathButton_OnClick" Content="ln"/>
|
Click="MathButton_OnClick" Content="ln"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Avalonia.Input;
|
||||||
using FusionCalculator;
|
using FusionCalculator;
|
||||||
|
|
||||||
namespace SharpCalculator.Avalonia;
|
namespace SharpCalculator.Avalonia;
|
||||||
@@ -9,6 +10,31 @@ public partial class MainWindow : Window
|
|||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
// https://github.com/AvaloniaUI/Avalonia/discussions/12179
|
||||||
|
KeyDownEvent.AddClassHandler<TopLevel>(GlobalOnKeyDown, handledEventsToo: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GlobalOnKeyDown(object? sender, KeyEventArgs e)
|
||||||
|
{
|
||||||
|
switch (e.Key)
|
||||||
|
{
|
||||||
|
case Key.Enter:
|
||||||
|
CalculateResult();
|
||||||
|
break;
|
||||||
|
case Key.Delete:
|
||||||
|
Clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CalculateResult()
|
||||||
|
{
|
||||||
|
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 AppendToHistory(string line) //function of appending expression to the history list
|
private void AppendToHistory(string line) //function of appending expression to the history list
|
||||||
@@ -24,6 +50,23 @@ public partial class MainWindow : Window
|
|||||||
.Replace(" ", " ");
|
.Replace(" ", " ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Clear()
|
||||||
|
{
|
||||||
|
Input.Clear();
|
||||||
|
Output.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResultButton_OnClick(object? sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
CalculateResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void ClearButton_OnClick(object? sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
private void MathButton_OnClick(object? sender, RoutedEventArgs e)
|
private void MathButton_OnClick(object? sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (sender is not Button button)
|
if (sender is not Button button)
|
||||||
@@ -48,30 +91,6 @@ public partial class MainWindow : Window
|
|||||||
_ => buttonText
|
_ => buttonText
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClearButton_OnClick(object? sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
Input.Text = "";
|
|
||||||
Output.Text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UndoButton_OnClick(object? sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
// delete last digit
|
|
||||||
// if (!string.IsNullOrEmpty(Input.Text))
|
|
||||||
// Input.Text = Input.Text.Remove(Input.Text.Length - 1);
|
|
||||||
Input.Undo();
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
private void Input_OnTextChanged(object? sender, TextChangedEventArgs e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,10 +11,10 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Avalonia" Version="11.0.6" />
|
<PackageReference Include="Avalonia" Version="11.3.10" />
|
||||||
<PackageReference Include="Avalonia.Desktop" Version="11.0.6" />
|
<PackageReference Include="Avalonia.Desktop" Version="11.3.10" />
|
||||||
<PackageReference Include="Avalonia.Themes.Simple" Version="11.0.6" />
|
<PackageReference Include="Avalonia.Themes.Simple" Version="11.3.10" />
|
||||||
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.0.6" />
|
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.3.10" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -9,13 +9,13 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
|
||||||
<PackageReference Include="xunit" Version="2.6.4" />
|
<PackageReference Include="xunit" Version="2.9.3" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
|
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="coverlet.collector" Version="6.0.0">
|
<PackageReference Include="coverlet.collector" Version="6.0.4">
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
Reference in New Issue
Block a user