From 05d5382d41ef4bacad6630bedcd75c29b2fda327 Mon Sep 17 00:00:00 2001 From: atouu <67765922+atouu@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:14:37 +0800 Subject: [PATCH 1/3] Pianoroll focus fixes --- OpenUtau/Controls/LyricBox.axaml.cs | 1 - OpenUtau/Controls/PianoRoll.axaml | 2 +- OpenUtau/Controls/PianoRoll.axaml.cs | 4 ++++ OpenUtau/Views/MainWindow.axaml.cs | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenUtau/Controls/LyricBox.axaml.cs b/OpenUtau/Controls/LyricBox.axaml.cs index 8c60844e2..b39ac6a0e 100644 --- a/OpenUtau/Controls/LyricBox.axaml.cs +++ b/OpenUtau/Controls/LyricBox.axaml.cs @@ -181,7 +181,6 @@ public void EndEdit(bool commit = false) { viewModel.NoteOrPhoneme = null; viewModel.IsVisible = false; viewModel.Text = string.Empty; - this.Focus(); } } } diff --git a/OpenUtau/Controls/PianoRoll.axaml b/OpenUtau/Controls/PianoRoll.axaml index a89b2bb0c..6cf9b812c 100644 --- a/OpenUtau/Controls/PianoRoll.axaml +++ b/OpenUtau/Controls/PianoRoll.axaml @@ -751,7 +751,7 @@ - + openPianoRollWindow = true; } else { viewModel.ShowPianoRoll = true; + pianoRoll.Focus(); } int tick = viewModel.TracksViewModel.PointToTick(args.GetPosition(canvas)); DocManager.Inst.ExecuteCmd(new LoadPartNotification(partControl.part, DocManager.Inst.Project, tick)); From e919ff424394b36bf673cb5e08f2ccf6676d0fd1 Mon Sep 17 00:00:00 2001 From: atouu <67765922+atouu@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:55:01 +0800 Subject: [PATCH 2/3] Remove old pianoroll window focus workaround --- OpenUtau/Views/MainWindow.axaml.cs | 38 +++++++++++------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/OpenUtau/Views/MainWindow.axaml.cs b/OpenUtau/Views/MainWindow.axaml.cs index 60c6d3c26..dfd431c05 100644 --- a/OpenUtau/Views/MainWindow.axaml.cs +++ b/OpenUtau/Views/MainWindow.axaml.cs @@ -35,7 +35,6 @@ public partial class MainWindow : Window, ICmdSubscriber { private PianoRollDetachedWindow? pianoRollWindow; private PianoRoll? pianoRoll; - private bool openPianoRollWindow; private PartEditState? partEditState; private readonly DispatcherTimer timer; @@ -1174,26 +1173,19 @@ public void PartsCanvasPointerMoved(object sender, PointerEventArgs args) { } public void PartsCanvasPointerReleased(object sender, PointerReleasedEventArgs args) { - if (partEditState != null) { - if (partEditState.MouseButton != args.InitialPressMouseButton) { - return; - } - var control = (Control)sender; - var point = args.GetCurrentPoint(control); - partEditState.Update(point.Pointer, point.Position); - partEditState.End(point.Pointer, point.Position); - partEditState = null; - Cursor = null; - } - if (openPianoRollWindow) { - pianoRollWindow?.Show(); - pianoRollWindow?.Activate(); - openPianoRollWindow = false; + if (partEditState?.MouseButton != args.InitialPressMouseButton) { + return; } + var control = (Control)sender; + var point = args.GetCurrentPoint(control); + partEditState.Update(point.Pointer, point.Position); + partEditState.End(point.Pointer, point.Position); + partEditState = null; + Cursor = null; } public async void PartsCanvasDoubleTapped(object sender, TappedEventArgs args) { - if (!(sender is Canvas canvas)) { + if (sender is not Canvas canvas) { return; } var control = canvas.InputHitTest(args.GetPosition(canvas)); @@ -1209,11 +1201,9 @@ public async void PartsCanvasDoubleTapped(object sender, TappedEventArgs args) { }; if (Preferences.Default.DetachPianoRoll) { - viewModel!.ShowPianoRoll = false; + viewModel.ShowPianoRoll = false; pianoRollWindow = new(pianoRoll); - pianoRollWindow.Show(); } else { - viewModel!.ShowPianoRoll = true; PianoRollContainer.Content = pianoRoll; } @@ -1224,9 +1214,9 @@ await Task.Run(() => pianoRoll.ViewModel.PlaybackViewModel = viewModel.PlaybackViewModel; } - // Workaround for new window losing focus. if (pianoRollWindow != null) { - openPianoRollWindow = true; + pianoRollWindow.Show(); + pianoRollWindow.Activate(); } else { viewModel.ShowPianoRoll = true; pianoRoll.Focus(); @@ -1245,11 +1235,11 @@ public void SetPianoRollAttachment() { pianoRollWindow?.ForceClose(); pianoRollWindow = null; PianoRollContainer.Content = pianoRoll; - viewModel!.ShowPianoRoll = true; + viewModel.ShowPianoRoll = true; Preferences.Default.DetachPianoRoll = false; } else { PianoRollContainer.Content = null; - viewModel!.ShowPianoRoll = false; + viewModel.ShowPianoRoll = false; if (pianoRollWindow == null) { pianoRollWindow = new(pianoRoll); pianoRollWindow.Show(); From ecf285ee6f387bcca29c7a68bffbe530453b748e Mon Sep 17 00:00:00 2001 From: atouu <67765922+atouu@users.noreply.github.com> Date: Fri, 27 Mar 2026 15:41:22 +0800 Subject: [PATCH 3/3] Transfer focus to pianoroll in detached window --- OpenUtau/Views/PianoRollDetachedWindow.axaml | 2 +- OpenUtau/Views/PianoRollDetachedWindow.axaml.cs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenUtau/Views/PianoRollDetachedWindow.axaml b/OpenUtau/Views/PianoRollDetachedWindow.axaml index e662874e9..0a793bddf 100644 --- a/OpenUtau/Views/PianoRollDetachedWindow.axaml +++ b/OpenUtau/Views/PianoRollDetachedWindow.axaml @@ -9,7 +9,7 @@ x:Class="OpenUtau.App.Views.PianoRollDetachedWindow" Icon="/Assets/open-utau.ico" Title="{Binding NotesViewModel.WindowTitle}" MinWidth="300" MinHeight="200" Width="{Binding Width}" Height="{Binding Height}" - Focusable="True" TransparencyLevelHint="None" + Focusable="True" GotFocus="WindowGotFocus" TransparencyLevelHint="None" Closing="WindowClosing" Deactivated="WindowDeactivated"> \ No newline at end of file diff --git a/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs b/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs index 52addd00f..48d4e7d06 100644 --- a/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs +++ b/OpenUtau/Views/PianoRollDetachedWindow.axaml.cs @@ -1,6 +1,7 @@ using System; using Avalonia; using Avalonia.Controls; +using Avalonia.Input; using OpenUtau.App.Controls; using OpenUtau.Core.Util; @@ -22,6 +23,10 @@ public PianoRollDetachedWindow(PianoRoll pianoRoll) { WindowState = (WindowState)Preferences.Default.PianorollWindowSize.State; } + public void WindowGotFocus(object sender, GotFocusEventArgs e) { + pianoRoll.Focus(); + } + public void WindowClosing(object? sender, WindowClosingEventArgs e) { Preferences.Default.PianorollWindowSize.Set(Width, Height, Position.X, Position.Y, (int)WindowState); Preferences.Save();