From 334cfffda874920465e59f982a7350fb8732109a Mon Sep 17 00:00:00 2001 From: ShahzaibAhmad05 Date: Mon, 13 Jul 2026 16:37:09 +0500 Subject: [PATCH] ui: remake demux component as a trapezium --- .../Components/DemultiplexerViewModel.cs | 12 +-- .../Components/DemultiplexerView.axaml | 73 +++++++++---------- .../Components/DemultiplexerView.axaml.cs | 24 ++++++ .../Components/MultiplexerView.axaml.cs | 1 + src/Views/Main/LeftSidebarView.axaml | 26 ++----- 5 files changed, 75 insertions(+), 61 deletions(-) diff --git a/src/ViewModels/Main/Canvas/CircuitObjects/Components/DemultiplexerViewModel.cs b/src/ViewModels/Main/Canvas/CircuitObjects/Components/DemultiplexerViewModel.cs index 4c9eb52..8b57635 100644 --- a/src/ViewModels/Main/Canvas/CircuitObjects/Components/DemultiplexerViewModel.cs +++ b/src/ViewModels/Main/Canvas/CircuitObjects/Components/DemultiplexerViewModel.cs @@ -5,7 +5,6 @@ using CommunityToolkit.Mvvm.ComponentModel; using IRis.Models.CircuitObjects.Components; using IRis.Models.Core; -using IRis.Services; using IRis.ViewModels.Main.Canvas.Core; namespace IRis.ViewModels.Main.Canvas.CircuitObjects.Components; @@ -131,12 +130,15 @@ public override void UpdateTerminals() for (int i = 0; i < Selects.Count; i++) { - double unrotatedX = X + ((i + 0.5) * (Width / Selects.Count)); - double unrotatedY = Y + Height + 10; + // DISCLAIMER: this calculation for placing the select lines on the + // bottom of the trapezium was done by Cursor Grok 4.5 + // it works, so we keep it. + + double u = (i + 0.5) / Selects.Count; Point selectPos = _simulationService.RotateTerminalPosition( - unrotatedX, - unrotatedY, + X + (u * Width), + Y + (Height * (0.8 + (0.2 * u))), Rotation, Width, Height, diff --git a/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml b/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml index 15ad6a7..b87456c 100644 --- a/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml +++ b/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml @@ -5,25 +5,22 @@ x:DataType="vm:DemultiplexerViewModel" x:Class="IRis.Views.Main.Canvas.CircuitObjects.Components.DemultiplexerView" xmlns:core="using:IRis.Views.Main.Canvas.Core" + xmlns:corevm="using:IRis.ViewModels.Main.Canvas.Core" + xmlns:components="using:IRis.Views.Main.Canvas.CircuitObjects.Components" ClipToBounds="False" > - + - - - - - - - + Fill="{DynamicResource ComponentFillBrush}" + Stroke="{DynamicResource ComponentBorderBrush}" + StrokeThickness="2" + Stretch="Fill" + Data="M 0,20 L 100,0 L 100,100 L 0,80 Z" + /> - + - + + + + + + + + - - - - - + + @@ -107,7 +104,7 @@ diff --git a/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml.cs b/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml.cs index ba984a8..7acf8cf 100644 --- a/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml.cs +++ b/src/Views/Main/Canvas/CircuitObjects/Components/DemultiplexerView.axaml.cs @@ -1,11 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; using Avalonia.Controls; +using Avalonia.Data.Converters; namespace IRis.Views.Main.Canvas.CircuitObjects.Components; public partial class DemultiplexerView : UserControl { + public static readonly IMultiValueConverter CanvasOffset = new SelectCanvasOffsetConverter(); + public DemultiplexerView() { InitializeComponent(); } + + // DISCLAIMER: this is AI-generated, binds in the axaml + private sealed class SelectCanvasOffsetConverter : IMultiValueConverter + { + public object? Convert( + IList values, + Type targetType, + object? parameter, + CultureInfo culture + ) + { + if (values.Count < 2 || values.Any(v => v is not double)) + return 0.0; + + return (double)values[0]! - (double)values[1]! - 5; + } + } } diff --git a/src/Views/Main/Canvas/CircuitObjects/Components/MultiplexerView.axaml.cs b/src/Views/Main/Canvas/CircuitObjects/Components/MultiplexerView.axaml.cs index 8f02814..b40f0a9 100644 --- a/src/Views/Main/Canvas/CircuitObjects/Components/MultiplexerView.axaml.cs +++ b/src/Views/Main/Canvas/CircuitObjects/Components/MultiplexerView.axaml.cs @@ -16,6 +16,7 @@ public MultiplexerView() InitializeComponent(); } + // DISCLAIMER: this is AI-generated, binds in the axaml private sealed class SelectCanvasOffsetConverter : IMultiValueConverter { public object? Convert( diff --git a/src/Views/Main/LeftSidebarView.axaml b/src/Views/Main/LeftSidebarView.axaml index 12a21dc..c41b6d1 100644 --- a/src/Views/Main/LeftSidebarView.axaml +++ b/src/Views/Main/LeftSidebarView.axaml @@ -321,25 +321,15 @@ Data="M 0,0 L 100,20 L 100,80 L 0,100 Z" /> - - + - +