From 461f341abc112bccff0b869953fa171216bd3f7a Mon Sep 17 00:00:00 2001 From: daboe01 Date: Mon, 12 Jan 2026 20:27:04 +0100 Subject: [PATCH] fixed: button HUD styles --- AppKit/CPAlert.j | 16 ++++-- AppKit/CPButton.j | 3 +- AppKit/Themes/Aristo3/ThemeDescriptors.j | 73 ++++++++++++++++++++---- Tests/Manual/CPAlertTest/AppController.j | 2 +- 4 files changed, 77 insertions(+), 17 deletions(-) diff --git a/AppKit/CPAlert.j b/AppKit/CPAlert.j index c9175d27e..ad15ba851 100644 --- a/AppKit/CPAlert.j +++ b/AppKit/CPAlert.j @@ -418,9 +418,7 @@ var bottomHeight = 71; */ - (void)addButtonWithTitle:(CPString)aTitle { - var bounds = [[_window contentView] bounds], - count = [_buttons count], - + var count = [_buttons count], button = [[CPButton alloc] initWithFrame:CGRectMakeZero()]; [button setTitle:aTitle]; @@ -429,7 +427,10 @@ var bottomHeight = 71; [button setAction:@selector(_takeReturnCodeFrom:)]; [button setBezelStyle:CPSmallSquareBezelStyle]; - [[_window contentView] addSubview:button]; + // Only add subview if the window has been created. + // Otherwise, _createWindowWithStyle will handle adding the buttons from the _buttons array later. + if (_window) + [[_window contentView] addSubview:button]; if (count == 0) { @@ -769,6 +770,12 @@ var bottomHeight = 71; var frame = CGRectMakeZero(); frame.size = [_themeView currentValueForThemeAttribute:@"size"]; + // Propagate CPHUDBackgroundWindowMask from _defaultWindowStyle to forceStyle. + // This ensures that even if we force CPDocModalWindowMask (for sheets), + // the window still knows it should be a HUD. + if (_defaultWindowStyle & CPHUDBackgroundWindowMask) + forceStyle |= CPHUDBackgroundWindowMask; + _window = [[CPPanel alloc] initWithContentRect:frame styleMask:forceStyle || _defaultWindowStyle]; [_window setLevel:CPStatusWindowLevel]; [_window setPlatformWindow:[[CPApp keyWindow] platformWindow]]; @@ -776,6 +783,7 @@ var bottomHeight = 71; if (_title) [_window setTitle:_title]; +debugger var contentView = [_window contentView], count = [_buttons count]; diff --git a/AppKit/CPButton.j b/AppKit/CPButton.j index 926f3938b..a21baed43 100644 --- a/AppKit/CPButton.j +++ b/AppKit/CPButton.j @@ -98,7 +98,8 @@ var CPButtonBezelStyleStateMap = @{ CPRegularSquareBezelStyle: CPButtonStateBezelStyleRegularSquare, CPTexturedSquareBezelStyle: CPButtonStateBezelStyleTextured, CPDisclosureBezelStyle: CPButtonStateBezelStyleDisclosure, - CPRoundedDisclosureBezelStyle: CPButtonStateBezelStyleRoundedDisclosure + CPRoundedDisclosureBezelStyle: CPButtonStateBezelStyleRoundedDisclosure, + CPHUDBezelStyle: CPThemeStateHUD }; /// @cond IGNORE diff --git a/AppKit/Themes/Aristo3/ThemeDescriptors.j b/AppKit/Themes/Aristo3/ThemeDescriptors.j index c87f4722e..3368f820e 100644 --- a/AppKit/Themes/Aristo3/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo3/ThemeDescriptors.j @@ -1080,25 +1080,59 @@ var themedButtonValues = nil, [@"image-offset", CPButtonImageOffset], - // --- HUD MAPPINGS --- +// --- HUD MAPPINGS --- // 1. Force Text Color White [@"text-color", [CPColor whiteColor], CPThemeStateHUD], [@"text-color", [CPColor colorWithWhite:1 alpha:0.4], [CPThemeStateHUD, CPThemeStateDisabled]], + + // Ensure white text persists even when button thinks it is Default or Highlighted in HUD + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateDefault]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateHighlighted]], + + // Force white text for Bordered + Highlighted states in HUD to override standard theme specificity + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateHighlighted]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateSelected]], + + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD, CPThemeStateHighlighted]], // 2. Rounded Bezel Style (Standard Push Button) - [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD]], - [@"bezel-color", hudHighlightedButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateHighlighted]], - [@"bezel-color", hudDisabledButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateDisabled]], + [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered]], + [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDefault]], + [@"bezel-color", hudHighlightedButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateHighlighted]], + [@"bezel-color", hudDisabledButtonCssColor, [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDisabled]], - // 3. Textured Rounded (Often used in HUDs) - [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleTexturedRounded, CPThemeStateHUD]], - [@"bezel-color", hudHighlightedButtonCssColor, [CPButtonStateBezelStyleTexturedRounded, CPThemeStateHUD, CPThemeStateHighlighted]], - [@"bezel-color", hudDisabledButtonCssColor, [CPButtonStateBezelStyleTexturedRounded, CPThemeStateHUD, CPThemeStateDisabled]], + // 3. Small Square Bezel Style (Secondary Alert Buttons) + [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD, CPThemeStateBordered]], + [@"bezel-color", hudHighlightedButtonCssColor, [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateHighlighted]], + [@"bezel-color", hudDisabledButtonCssColor, [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDisabled]], - // 4. Adjust Layout for HUD + // 4. Textured Rounded + [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleTexturedRounded, CPThemeStateHUD, CPThemeStateBordered]], + [@"bezel-color", hudHighlightedButtonCssColor, [CPButtonStateBezelStyleTexturedRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateHighlighted]], + [@"bezel-color", hudDisabledButtonCssColor, [CPButtonStateBezelStyleTexturedRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDisabled]], + + // 5. Round Rect (This is the default style in CPButton.j) + [@"bezel-color", hudButtonCssColor, [CPButtonStateBezelStyleRoundRect, CPThemeStateHUD, CPThemeStateBordered]], + [@"bezel-color", hudHighlightedButtonCssColor, [CPButtonStateBezelStyleRoundRect, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateHighlighted]], + [@"bezel-color", hudDisabledButtonCssColor, [CPButtonStateBezelStyleRoundRect, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDisabled]], + + // Adjust Layout for HUD + // Rounded [@"min-size", CGSizeMake(0.0, 18.0), [CPButtonStateBezelStyleRounded, CPThemeStateHUD]], - [@"content-inset", CGInsetMake(0.0, 10.0, 1.0, 10.0), [CPButtonStateBezelStyleRounded, CPThemeStateHUD]] + [@"content-inset", CGInsetMake(0.0, 10.0, 1.0, 10.0), [CPButtonStateBezelStyleRounded, CPThemeStateHUD]], + + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDefault, CPThemeStateHighlighted]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRounded, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateKeyWindow, CPThemeStateHighlighted]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRoundRect, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateDefault, CPThemeStateHighlighted]], + [@"text-color", [CPColor whiteColor], [CPButtonStateBezelStyleRoundRect, CPThemeStateHUD, CPThemeStateBordered, CPThemeStateKeyWindow, CPThemeStateHighlighted]], + + // Small Square + [@"min-size", CGSizeMake(0.0, 18.0), [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD]], + [@"content-inset", CGInsetMake(0.0, 10.0, 1.0, 10.0), [CPButtonStateBezelStyleSmallSquare, CPThemeStateHUD]] ]; [self registerThemeValues:themedButtonValues forView:button]; @@ -7393,9 +7427,26 @@ var themedButtonValues = nil, return standardWindowView; } + + (_CPDocModalWindowView)themedDocModalWindowView { - return [[_CPDocModalWindowView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) styleMask:nil]; + var docModalWindowView = [[_CPDocModalWindowView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) styleMask:nil]; + + // Apply the same styling as the standard Modal Window to cover the background + var bezelColor = [CPColor colorWithCSSDictionary:@{ + @"background-color": A3ColorBackground, + @"border": @"1px solid " + A3ColorWindowBorder, + @"border-radius": @"6px", + @"box-shadow": @"0 5px 15px rgba(0,0,0,0.5)" + }]; + + var themeValues = [ + [@"bezel-color", bezelColor] + ]; + + [self registerThemeValues:themeValues forView:docModalWindowView]; + + return docModalWindowView; } + (_CPBorderlessBridgeWindowView)themedBorderlessBridgeWindowView diff --git a/Tests/Manual/CPAlertTest/AppController.j b/Tests/Manual/CPAlertTest/AppController.j index bb91b42b3..f48b08d52 100644 --- a/Tests/Manual/CPAlertTest/AppController.j +++ b/Tests/Manual/CPAlertTest/AppController.j @@ -51,7 +51,7 @@ { [self _init]; - theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(100, 100, 500, 500) styleMask:CPTitledWindowMask]; + theWindow = [[CPWindow alloc] initWithContentRect:CGRectMake(100, 100, 500, 500) styleMask:CPTitledWindowMask | CPHUDBackgroundWindowMask]; [theWindow setTitle:@"CPAlert Test"]; var contentView = [theWindow contentView];