Fixed: new first responder and key window theme states not always applied.

This commit is contained in:
Alexander Ljungberg committed 2014-05-12 15:17:49 +01:00
1 parent c28da78294
commit ba27a4cc4a
2 files changed
+53 -3

No files matched your search

+26 -3
View File
@@ -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];
+27
View File
@@ -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