Initial commit
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
<Window xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:vm="using:DelauneyTriangulation.ViewModels"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:models="using:DelauneyTriangulation.Models"
|
||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||
x:Class="DelauneyTriangulation.Views.MainWindow"
|
||||
x:DataType="vm:MainWindowViewModel"
|
||||
Icon="/Assets/avalonia-logo.ico"
|
||||
Title="Delaunay Triangulation"
|
||||
SystemDecorations="Full"
|
||||
ExtendClientAreaToDecorationsHint="True"
|
||||
ExtendClientAreaChromeHints="Default"
|
||||
ExtendClientAreaTitleBarHeightHint="32"
|
||||
TransparencyLevelHint="AcrylicBlur, Blur, Transparent"
|
||||
Background="Transparent"
|
||||
Width="{Binding Width}"
|
||||
Height="{Binding Height}"
|
||||
>
|
||||
|
||||
<Design.DataContext>
|
||||
<!-- This only sets the DataContext for the previewer in an IDE,
|
||||
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
|
||||
<vm:MainWindowViewModel/>
|
||||
</Design.DataContext>
|
||||
|
||||
<Window.Styles>
|
||||
<Style Selector="Border.InnerCard">
|
||||
<Setter Property="CornerRadius" Value="7.5"/>
|
||||
<Setter Property="Background" Value="#30000000"/>
|
||||
<Setter Property="BorderBrush" Value="#20FFFFFF"/>
|
||||
<Setter Property="BorderThickness" Value="2"/>
|
||||
<Setter Property="Padding" Value="10"/>
|
||||
<Setter Property="Margin" Value="5"/>
|
||||
</Style>
|
||||
</Window.Styles>
|
||||
<Panel>
|
||||
<Grid RowDefinitions="30,*">
|
||||
<Border ZIndex="1000" Grid.Row="0" Background="#30000000" PointerPressed="OnTitleBarPointerPressed" DoubleTapped="OnTitleBarDoubleTapped">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Background="Transparent" Foreground="White" Text="Delaunay Triangulation - Timo Niemann"/>
|
||||
</Border>
|
||||
<Grid Grid.Row="1" ZIndex="1000" Margin="20">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Border Classes="InnerCard">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect BlurRadius="20" Color="#aa000000" OffsetX="5" OffsetY="5"/>
|
||||
</Border.Effect>
|
||||
<StackPanel Orientation="Vertical">
|
||||
<Border Classes="InnerCard">
|
||||
<TextBlock Text="Delaunay Triangulation" FontSize="18" Foreground="White"/>
|
||||
</Border>
|
||||
<Border Classes="InnerCard">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="4*"/>
|
||||
<ColumnDefinition Width="1*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Slider Grid.Column="0" Value="{Binding PointCount, Mode=TwoWay}" Margin="5" Minimum="20" Maximum="500"/>
|
||||
<TextBox Grid.Column="1" Text="{Binding PointCount, Mode=TwoWay}" FontSize="18" Foreground="White" Background="#30ffffff" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
<Canvas Grid.Row="0" Grid.RowSpan="2"
|
||||
x:Name="Scene"
|
||||
Background="#dd000000"
|
||||
ClipToBounds="True"
|
||||
PointerPressed="Scene_OnPointerPressed"
|
||||
PointerMoved="Scene_OnPointerMoved"
|
||||
PointerReleased="Scene_OnPointerReleased"
|
||||
PointerWheelChanged="Scene_OnWheel"
|
||||
>
|
||||
<Canvas x:Name="SceneContent">
|
||||
<Canvas.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform ScaleX="{Binding Zoom}" ScaleY="{Binding Zoom}"/>
|
||||
<TranslateTransform X="{Binding PanX}" Y="{Binding PanY}"/>
|
||||
</TransformGroup>
|
||||
</Canvas.RenderTransform>
|
||||
<ItemsControl ItemsSource="{Binding Edges}">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate><Canvas/></ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="models:Geometries+GeomEdge">
|
||||
<Line StartPoint="{Binding Start}"
|
||||
EndPoint="{Binding End}"
|
||||
Stroke="LightGray"
|
||||
StrokeThickness="1"/>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
<ItemsControl ItemsSource="{Binding Circles}">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate><Canvas/></ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="models:Geometries+GeomCircle">
|
||||
<Ellipse Stroke="Lime" StrokeThickness="1.5"
|
||||
Width="{Binding Diameter}"
|
||||
Height="{Binding Diameter}"
|
||||
Canvas.Left="{Binding Left}"
|
||||
Canvas.Top="{Binding Top}"/>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
<ItemsControl ItemsSource="{Binding Points}">
|
||||
<ItemsControl.ItemsPanel>
|
||||
<ItemsPanelTemplate><Canvas/></ItemsPanelTemplate>
|
||||
</ItemsControl.ItemsPanel>
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="models:Geometries+GeomPoint">
|
||||
<Ellipse Fill="White" Stroke="Black" StrokeThickness="1"
|
||||
Width="{Binding Size}"
|
||||
Height="{Binding Size}"
|
||||
Canvas.Left="{Binding Left}"
|
||||
Canvas.Top="{Binding Top}"
|
||||
/>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</Canvas>
|
||||
</Canvas>
|
||||
</Grid>
|
||||
</Panel>
|
||||
</Window>
|
||||
@@ -0,0 +1,69 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.Shapes;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Media;
|
||||
|
||||
namespace DelauneyTriangulation.Views;
|
||||
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
private bool _isPanning;
|
||||
private Point _panStart;
|
||||
private Vector _panOffset = new();
|
||||
private readonly TranslateTransform _panTransform = new();
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
SceneContent.RenderTransform = _panTransform;
|
||||
}
|
||||
|
||||
private void OnTitleBarPointerPressed(object? sender, PointerPressedEventArgs e)
|
||||
{
|
||||
if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return;
|
||||
BeginMoveDrag(e);
|
||||
}
|
||||
private void OnTitleBarDoubleTapped(object? sender, RoutedEventArgs e) => WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
|
||||
private void Scene_OnPointerPressed(object? sender, PointerPressedEventArgs e)
|
||||
{
|
||||
if (!e.GetCurrentPoint(Scene).Properties.IsLeftButtonPressed)
|
||||
return;
|
||||
|
||||
_isPanning = true;
|
||||
_panStart = e.GetPosition(this);
|
||||
Scene.Cursor = new Cursor(StandardCursorType.SizeAll);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void Scene_OnPointerMoved(object? sender, PointerEventArgs e)
|
||||
{
|
||||
if (!_isPanning) return;
|
||||
|
||||
var pos = e.GetPosition(this);
|
||||
var delta = pos - _panStart;
|
||||
var current = _panOffset + delta;
|
||||
_panTransform.X = current.X;
|
||||
_panTransform.Y = current.Y;
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void Scene_OnPointerReleased(object? sender, PointerReleasedEventArgs e)
|
||||
{
|
||||
if (!_isPanning) return;
|
||||
|
||||
var pos = e.GetPosition(this);
|
||||
var delta = pos - _panStart;
|
||||
_panOffset += delta;
|
||||
|
||||
_isPanning = false;
|
||||
Scene.Cursor = new Cursor(StandardCursorType.Arrow);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void Scene_OnWheel(object? sender, PointerWheelEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user