fix(claude-do): merge Open diff viewer and merge window as independent top-level w

ClaudeDo-Task: 29564718-d27e-40ad-a61e-9e2b79ede53d
This commit is contained in:
mika kuns
2026-10-01 14:52:38 +02:00
6 changed files with 35 additions and 5 deletions
@@ -161,7 +161,8 @@ public partial class DetailsIslandView : UserControl
var window = new DiffViewerView { DataContext = diffVm };
window.Closed += (_, _) => _diffViewerWindow = null;
_diffViewerWindow = window;
window.Show(owner);
window.CenterOn(owner);
window.Show(); // no owner: an owned window would be pinned above the main window
return System.Threading.Tasks.Task.CompletedTask;
};
@@ -11,7 +11,6 @@
WindowDecorations="BorderOnly"
ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaTitleBarHeightHint="-1"
WindowStartupLocation="CenterOwner"
Background="{DynamicResource SurfaceBrush}">
<Window.KeyBindings>
@@ -11,7 +11,6 @@
WindowDecorations="BorderOnly"
ExtendClientAreaToDecorationsHint="True"
ExtendClientAreaTitleBarHeightHint="-1"
WindowStartupLocation="CenterOwner"
Background="{DynamicResource SurfaceBrush}">
<Window.KeyBindings>
@@ -41,7 +41,9 @@ public partial class MergeModalView : Window
OpenWindows.Remove(vm.TaskId);
window._closed.TrySetResult();
};
window.Show(owner);
// Independent top-level (no owner): an owned window is pinned above its owner by the OS.
window.CenterOn(owner);
window.Show();
return window._closed.Task;
}
}
+2 -1
View File
@@ -143,7 +143,8 @@ public sealed class WindowDialogService : IDialogService
diffVm.CloseAction = () => diffDlg.Close();
diffDlg.Closed += (_, _) => _diffViewerWindow = null;
_diffViewerWindow = diffDlg;
diffDlg.Show(_owner);
diffDlg.CenterOn(_owner);
diffDlg.Show(); // no owner: an owned window would be pinned above the main window
};
vm.ConfirmAction = message => ConfirmAsync(message);
if (Shell is { } shell)
+28
View File
@@ -0,0 +1,28 @@
using Avalonia;
using Avalonia.Controls;
namespace ClaudeDo.Ui.Views;
internal static class WindowPlacement
{
/// <summary>
/// Centres a not-yet-shown window on <paramref name="owner"/>, clamped to the owner's screen.
/// Replaces <c>CenterOwner</c> for windows shown without an owner (which the OS would pin above it).
/// </summary>
public static void CenterOn(this Window window, Window owner)
{
var scale = owner.DesktopScaling;
var ownerSize = owner.FrameSize ?? owner.ClientSize;
var x = owner.Position.X + (int)((ownerSize.Width - window.Width) * scale / 2);
var y = owner.Position.Y + (int)((ownerSize.Height - window.Height) * scale / 2);
if (owner.Screens.ScreenFromWindow(owner)?.WorkingArea is { } area)
{
x = Math.Max(area.X, Math.Min(x, area.Right - (int)(window.Width * scale)));
y = Math.Max(area.Y, Math.Min(y, area.Bottom - (int)(window.Height * scale)));
}
window.WindowStartupLocation = WindowStartupLocation.Manual;
window.Position = new PixelPoint(x, y);
}
}