mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-11-15 03:03:50 +00:00
Fixed: new first responder and key window theme states not always applied.
This commit is contained in:
1 parent
c28da78294
commit
ba27a4cc4a
2 files changed
+53
-3
No files matched your search
+26
-3
@@ -343,6 +343,9 @@ var CPViewFlags = { },
|
||||
_scaleSize = CGSizeMake(1.0, 1.0);
|
||||
_isScaled = NO;
|
||||
|
||||
_theme = [CPTheme defaultTheme];
|
||||
_themeState = CPThemeStateNormal;
|
||||
|
||||
#if PLATFORM(DOM)
|
||||
_DOMElement = DOMElementPrototype.cloneNode(false);
|
||||
AppKitTagDOMElement(self, _DOMElement);
|
||||
@@ -354,9 +357,6 @@ var CPViewFlags = { },
|
||||
_DOMImageSizes = [];
|
||||
#endif
|
||||
|
||||
_theme = [CPTheme defaultTheme];
|
||||
_themeState = CPThemeStateNormal;
|
||||
|
||||
[self _setupToolTipHandlers];
|
||||
[self _setupViewFlags];
|
||||
|
||||
@@ -577,6 +577,21 @@ var CPViewFlags = { },
|
||||
if (![aSubview isHidden] && [self isHiddenOrHasHiddenAncestor])
|
||||
[aSubview _notifyViewDidHide];
|
||||
|
||||
// This method might be called before we are fully unarchived, in which case the theme state isn't set up yet
|
||||
// and none of the below matters anyhow.
|
||||
if (_themeState)
|
||||
{
|
||||
if ([self hasThemeState:CPThemeStateFirstResponder])
|
||||
[aSubview _notifyViewDidBecomeFirstResponder];
|
||||
else
|
||||
[aSubview _notifyViewDidResignFirstResponder];
|
||||
|
||||
if ([self hasThemeState:CPThemeStateKeyWindow])
|
||||
[aSubview _notifyWindowDidBecomeKey];
|
||||
else
|
||||
[aSubview _notifyWindowDidResignKey];
|
||||
}
|
||||
|
||||
[aSubview viewDidMoveToSuperview];
|
||||
|
||||
[self didAddSubview:aSubview];
|
||||
@@ -615,6 +630,9 @@ var CPViewFlags = { },
|
||||
if (!_isHidden && [_superview isHiddenOrHasHiddenAncestor])
|
||||
[self _notifyViewDidUnhide];
|
||||
|
||||
[self _notifyWindowDidResignKey];
|
||||
[self _notifyViewDidResignFirstResponder];
|
||||
|
||||
_superview = nil;
|
||||
|
||||
[self _setWindow:nil];
|
||||
@@ -736,6 +754,11 @@ var CPViewFlags = { },
|
||||
while (count--)
|
||||
[_subviews[count] _setWindow:aWindow];
|
||||
|
||||
if ([_window isKeyWindow])
|
||||
[self setThemeState:CPThemeStateKeyWindow];
|
||||
else
|
||||
[self unsetThemeState:CPThemeStateKeyWindow];
|
||||
|
||||
[self viewDidMoveToWindow];
|
||||
|
||||
[[self window] _dirtyKeyViewLoop];
|
||||
|
||||
@@ -419,6 +419,33 @@
|
||||
[self assertTrue:[siblingView2 hasThemeState:CPThemeStateKeyWindow]];
|
||||
}
|
||||
|
||||
- (void)testWhenFirstResponderBeforeBeingAddedSubviewShouldHaveThemeStateFirstResponder
|
||||
{
|
||||
var aView, siblingView, aWindow;
|
||||
[CPViewTest createResponderView:@ref(aView) siblingView:@ref(siblingView) inWindow:@ref(aWindow)];
|
||||
|
||||
[self assertFalse:[aView hasThemeState:CPThemeStateFirstResponder]];
|
||||
[self assertFalse:[siblingView hasThemeState:CPThemeStateFirstResponder]];
|
||||
|
||||
[aWindow makeFirstResponder:aView];
|
||||
|
||||
var subview = [CPView new];
|
||||
[aView addSubview:subview];
|
||||
[self assertTrue:[subview hasThemeState:CPThemeStateFirstResponder]];
|
||||
}
|
||||
|
||||
- (void)testWhenRemovedSubviewShouldLoseThemeStateFirstResponder
|
||||
{
|
||||
var aView, siblingView, aWindow;
|
||||
[CPViewTest createResponderView:@ref(aView) siblingView:@ref(siblingView) inWindow:@ref(aWindow)];
|
||||
|
||||
[aWindow makeFirstResponder:aView];
|
||||
var subview = [CPView new];
|
||||
[aView addSubview:subview];
|
||||
[subview removeFromSuperview];
|
||||
[self assertFalse:[subview hasThemeState:CPThemeStateFirstResponder]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation CPResponderView : CPView
|
||||
|
||||
Reference in new issue
Block a user