From bf62a3d57e345c4550af9ca75ffda0dc50d54c42 Mon Sep 17 00:00:00 2001 From: Christine Yan Date: Tue, 5 May 2026 11:48:29 -0400 Subject: [PATCH] fix: standardize titlebar treatment across all windows - Add ExtendsContentIntoTitleBar + custom titlebar to OnboardingWindow, SetupWizardWindow, and WelcomeDialog to match HubWindow/CanvasWindow - Standardize titlebar height (48px), padding, emoji (FontSize 20), and title text (FontSize 13, CaptionTextBlockStyle) across all windows - CanvasWindow: update height 40->48px, emoji size 14->20, add FontSize 13 - CanvasWindow: move reload button inline next to title in separate grid column for proper click handling within titlebar drag region - Fix OnboardingWindow chat overlay sizing to use contentGrid.SizeChanged instead of rootGrid to avoid double-subtracting titlebar height Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Dialogs/WelcomeDialog.cs | 33 +++++++++++++- .../Onboarding/OnboardingWindow.cs | 44 ++++++++++++++++--- .../Windows/CanvasWindow.xaml | 25 +++++------ .../Windows/SetupWizardWindow.cs | 33 +++++++++++++- 4 files changed, 113 insertions(+), 22 deletions(-) diff --git a/src/OpenClaw.Tray.WinUI/Dialogs/WelcomeDialog.cs b/src/OpenClaw.Tray.WinUI/Dialogs/WelcomeDialog.cs index 0a3a69c..65637e9 100644 --- a/src/OpenClaw.Tray.WinUI/Dialogs/WelcomeDialog.cs +++ b/src/OpenClaw.Tray.WinUI/Dialogs/WelcomeDialog.cs @@ -20,6 +20,7 @@ public sealed class WelcomeDialog : WindowEx public WelcomeDialog() { Title = LocalizationHelper.GetString("WindowTitle_Welcome"); + ExtendsContentIntoTitleBar = true; this.SetWindowSize(480, 440); this.CenterOnScreen(); this.SetIcon("Assets\\openclaw.ico"); @@ -123,7 +124,37 @@ public sealed class WelcomeDialog : WindowEx Grid.SetRow(buttonPanel, 2); root.Children.Add(buttonPanel); - Content = root; + // Wrap content with custom titlebar + var outerGrid = new Grid(); + outerGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(48) }); + outerGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); + + var titleBar = new Grid { Padding = new Thickness(16, 0, 140, 0) }; + var titleIcon = new TextBlock + { + Text = "🦞", + FontSize = 20, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0) + }; + var titleTextBlock = new TextBlock + { + Text = LocalizationHelper.GetString("WindowTitle_Welcome"), + FontSize = 13, + Style = (Style)Application.Current.Resources["CaptionTextBlockStyle"], + VerticalAlignment = VerticalAlignment.Center + }; + var titleStack = new StackPanel { Orientation = Orientation.Horizontal }; + titleStack.Children.Add(titleIcon); + titleStack.Children.Add(titleTextBlock); + titleBar.Children.Add(titleStack); + Grid.SetRow(titleBar, 0); + outerGrid.Children.Add(titleBar); + + Grid.SetRow(root, 1); + outerGrid.Children.Add(root); + Content = outerGrid; + SetTitleBar(titleBar); Closed += (s, e) => _tcs.TrySetResult(_result); diff --git a/src/OpenClaw.Tray.WinUI/Onboarding/OnboardingWindow.cs b/src/OpenClaw.Tray.WinUI/Onboarding/OnboardingWindow.cs index dfa0224..9252942 100644 --- a/src/OpenClaw.Tray.WinUI/Onboarding/OnboardingWindow.cs +++ b/src/OpenClaw.Tray.WinUI/Onboarding/OnboardingWindow.cs @@ -55,6 +55,7 @@ public sealed class OnboardingWindow : WindowEx : null; Title = LocalizationHelper.GetString("Onboarding_Title"); + ExtendsContentIntoTitleBar = true; this.SetWindowSize(720, 900); this.CenterOnScreen(); this.SetIcon("Assets\\openclaw.ico"); @@ -99,19 +100,50 @@ public sealed class OnboardingWindow : WindowEx _chatOverlay.Visibility = Visibility.Collapsed; _chatOverlay.VerticalAlignment = VerticalAlignment.Top; - // Root grid: functional UI host fills everything, overlay sits on top (except nav bar) + // Root grid: titlebar row + content area _rootGrid = new Grid { Background = GetThemeBrush("SolidBackgroundFillColorBaseBrush") }; - _rootGrid.Children.Add(_host); - _rootGrid.Children.Add(_chatOverlay); + _rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(48) }); + _rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); + + // Custom title bar — matches HubWindow treatment + var titleBar = new Grid { Padding = new Thickness(16, 0, 140, 0) }; + var titleIcon = new TextBlock + { + Text = "🦞", + FontSize = 20, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0) + }; + var titleText = new TextBlock + { + Text = LocalizationHelper.GetString("Onboarding_Title"), + FontSize = 13, + Style = (Style)Application.Current.Resources["CaptionTextBlockStyle"], + VerticalAlignment = VerticalAlignment.Center + }; + var titleStack = new StackPanel { Orientation = Orientation.Horizontal }; + titleStack.Children.Add(titleIcon); + titleStack.Children.Add(titleText); + titleBar.Children.Add(titleStack); + Grid.SetRow(titleBar, 0); + _rootGrid.Children.Add(titleBar); + SetTitleBar(titleBar); + + // Content area + var contentGrid = new Grid(); + contentGrid.Children.Add(_host); + contentGrid.Children.Add(_chatOverlay); + Grid.SetRow(contentGrid, 1); + _rootGrid.Children.Add(contentGrid); Content = _rootGrid; Closed += OnClosed; - // Size the overlay after layout — leave space for the nav bar - // Nav bar is ~60px + VStack bottom padding 20px = 80px minimum - _rootGrid.SizeChanged += (_, args) => + // Size the overlay after layout — leave space for the nav bar (~84px) + // contentGrid is already in row 1 (below titlebar), so no need to subtract titlebar height + contentGrid.SizeChanged += (_, args) => { _chatOverlay.Height = Math.Max(0, args.NewSize.Height - 84); }; diff --git a/src/OpenClaw.Tray.WinUI/Windows/CanvasWindow.xaml b/src/OpenClaw.Tray.WinUI/Windows/CanvasWindow.xaml index cbcc5ec..e7050ba 100644 --- a/src/OpenClaw.Tray.WinUI/Windows/CanvasWindow.xaml +++ b/src/OpenClaw.Tray.WinUI/Windows/CanvasWindow.xaml @@ -20,29 +20,26 @@ - + - - + + FontSize="13" VerticalAlignment="Center" FontWeight="SemiBold"/> - - - + diff --git a/src/OpenClaw.Tray.WinUI/Windows/SetupWizardWindow.cs b/src/OpenClaw.Tray.WinUI/Windows/SetupWizardWindow.cs index 08fc4db..28223e5 100644 --- a/src/OpenClaw.Tray.WinUI/Windows/SetupWizardWindow.cs +++ b/src/OpenClaw.Tray.WinUI/Windows/SetupWizardWindow.cs @@ -79,6 +79,7 @@ public sealed class SetupWizardWindow : WindowEx _draftEnableNodeMode = settings.EnableNodeMode; Title = LocalizationHelper.GetString("Setup_Title"); + ExtendsContentIntoTitleBar = true; this.SetWindowSize(720, 900); this.CenterOnScreen(); this.SetIcon("Assets\\openclaw.ico"); @@ -370,7 +371,37 @@ public sealed class SetupWizardWindow : WindowEx Grid.SetRow(navPanel, 3); root.Children.Add(navPanel); - Content = root; + // Wrap content in a container with custom titlebar + var outerGrid = new Grid(); + outerGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(48) }); + outerGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); + + var titleBar = new Grid { Padding = new Thickness(16, 0, 140, 0) }; + var titleIcon = new TextBlock + { + Text = "🦞", + FontSize = 20, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0) + }; + var titleText = new TextBlock + { + Text = LocalizationHelper.GetString("Setup_Title"), + FontSize = 13, + Style = (Style)Application.Current.Resources["CaptionTextBlockStyle"], + VerticalAlignment = VerticalAlignment.Center + }; + var titleStack = new StackPanel { Orientation = Orientation.Horizontal }; + titleStack.Children.Add(titleIcon); + titleStack.Children.Add(titleText); + titleBar.Children.Add(titleStack); + Grid.SetRow(titleBar, 0); + outerGrid.Children.Add(titleBar); + + Grid.SetRow(root, 1); + outerGrid.Children.Add(root); + Content = outerGrid; + SetTitleBar(titleBar); Logger.Info("[Setup] Wizard opened"); // Load device identity for step 3