From 2c7670f06c7512a813a6711289f5dd550ac8bf38 Mon Sep 17 00:00:00 2001 From: Codex CLI Date: Mon, 1 Sep 2025 02:59:03 -0500 Subject: [PATCH 1/2] fix: prevent double insertion from functions list\n\n- Remove flyout-level tap wiring that duplicated item taps\n- Keep a single per-item tap handler for function rows --- src/AdvancedCalculator/Views/MainView.axaml | 6 ++-- .../Views/MainView.axaml.cs | 28 ++----------------- 2 files changed, 4 insertions(+), 30 deletions(-) diff --git a/src/AdvancedCalculator/Views/MainView.axaml b/src/AdvancedCalculator/Views/MainView.axaml index e9b804d..5274b5a 100644 --- a/src/AdvancedCalculator/Views/MainView.axaml +++ b/src/AdvancedCalculator/Views/MainView.axaml @@ -136,9 +136,7 @@ + Placement="BottomEdgeAlignedLeft"> @@ -162,7 +160,7 @@ + Tapped="OnFunctionsItemTapped"> diff --git a/src/AdvancedCalculator/Views/MainView.axaml.cs b/src/AdvancedCalculator/Views/MainView.axaml.cs index 5a3bbd9..bb86741 100644 --- a/src/AdvancedCalculator/Views/MainView.axaml.cs +++ b/src/AdvancedCalculator/Views/MainView.axaml.cs @@ -21,7 +21,7 @@ public partial class MainView : UserControl private MainViewModel? _vm; private ListBox? _historyList; - private Border? _functionsPanelRoot; + // Functions flyout is handled via per-item Tapped in XAML private void OnAttachedToVisualTree(object? sender, VisualTreeAttachmentEventArgs e) { @@ -53,12 +53,6 @@ public partial class MainView : UserControl _historyList.RemoveHandler(InputElement.TappedEvent, OnHistoryTapped); _historyList = null; } - // Detach functions panel tap handler if still attached - if (_functionsPanelRoot is not null) - { - _functionsPanelRoot.RemoveHandler(InputElement.TappedEvent, OnFunctionsItemTapped); - _functionsPanelRoot = null; - } _vm = null; } @@ -104,23 +98,5 @@ public partial class MainView : UserControl } } - - private void OnFunctionsFlyoutOpened(object? sender, EventArgs e) -{ - if (sender is Flyout flyout && sender is ContentPresenter presenter) - { - _functionsPanelRoot = presenter.FindControl("FunctionsPanelRoot"); - _functionsPanelRoot?.AddHandler(InputElement.TappedEvent, OnFunctionsItemTapped, - RoutingStrategies.Tunnel | RoutingStrategies.Bubble); - } -} - - private void OnFunctionsFlyoutClosed(object? sender, EventArgs e) - { - if (_functionsPanelRoot is not null) - { - _functionsPanelRoot.RemoveHandler(InputElement.TappedEvent, OnFunctionsItemTapped); - _functionsPanelRoot = null; - } - } + // Removed Opened/Closed dynamic wiring; handled directly in XAML. } From b8ba57a7073e841ecf532719d47628c272a519ac Mon Sep 17 00:00:00 2001 From: Codex CLI Date: Mon, 1 Sep 2025 03:01:10 -0500 Subject: [PATCH 2/2] feat: place caret inside inserted function parentheses\n\n- Add CaretIndex to MainViewModel and bind TextBox.CaretIndex\n- After function insertion, set caret to inside parentheses\n- Return focus to input box for immediate typing --- src/AdvancedCalculator/ViewModels/MainViewModel.cs | 9 +++++++++ src/AdvancedCalculator/Views/MainView.axaml | 4 +++- src/AdvancedCalculator/Views/MainView.axaml.cs | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/AdvancedCalculator/ViewModels/MainViewModel.cs b/src/AdvancedCalculator/ViewModels/MainViewModel.cs index 222de45..76f2a35 100644 --- a/src/AdvancedCalculator/ViewModels/MainViewModel.cs +++ b/src/AdvancedCalculator/ViewModels/MainViewModel.cs @@ -35,6 +35,10 @@ public partial class MainViewModel : ViewModelBase [ObservableProperty] private int _selectedHistoryIndex = -1; + // Caret position in the input TextBox + [ObservableProperty] + private int _caretIndex; + public ObservableCollection History { get; } public ObservableCollection Variables { get; } @@ -61,6 +65,11 @@ public partial class MainViewModel : ViewModelBase if (string.IsNullOrWhiteSpace(functionDefintionItem.FunctionName)) return; InsertToken(functionDefintionItem.FunctionName + "()"); + // Place caret inside the parentheses + if (!string.IsNullOrEmpty(InputText)) + { + CaretIndex = Math.Max(0, InputText.Length - 1); + } // Close the functions flyout after insertion for smoother UX IsFunctionsPanelOpen = false; } diff --git a/src/AdvancedCalculator/Views/MainView.axaml b/src/AdvancedCalculator/Views/MainView.axaml index 5274b5a..ecef799 100644 --- a/src/AdvancedCalculator/Views/MainView.axaml +++ b/src/AdvancedCalculator/Views/MainView.axaml @@ -183,7 +183,9 @@ - diff --git a/src/AdvancedCalculator/Views/MainView.axaml.cs b/src/AdvancedCalculator/Views/MainView.axaml.cs index bb86741..d6c645e 100644 --- a/src/AdvancedCalculator/Views/MainView.axaml.cs +++ b/src/AdvancedCalculator/Views/MainView.axaml.cs @@ -94,6 +94,9 @@ public partial class MainView : UserControl _vm?.InsertFunctionCommand.CanExecute(item) == true) { _vm.InsertFunctionCommand.Execute(item); + // Return focus to the input box so the caret is active + var input = this.FindControl("InputBox"); + input?.Focus(); e.Handled = true; } }