diff --git a/AppKit/AppKit.j b/AppKit/AppKit.j index bada5344d..43427701a 100644 --- a/AppKit/AppKit.j +++ b/AppKit/AppKit.j @@ -26,6 +26,7 @@ @import "CPAccordionView.j" @import "CPAlert.j" @import "CPAnimation.j" +@import "CPAppearance.j" @import "CPApplication.j" @import "CPArrayController.j" @import "CPBezierPath.j" @@ -106,7 +107,8 @@ @import "CPView.j" @import "CPViewAnimation.j" @import "CPViewController.j" +@import "CPVisualEffectView.j" @import "CPWebView.j" @import "CPWindow.j" @import "CPWindowController.j" -@import "CPWorkspace.j" +@import "CPWorkspace.j" \ No newline at end of file diff --git a/AppKit/CPAppearance.j b/AppKit/CPAppearance.j new file mode 100644 index 000000000..e80c20a4a --- /dev/null +++ b/AppKit/CPAppearance.j @@ -0,0 +1,162 @@ +/* + * CPAppearance.j + * AppKit + * + * Created by Antoine Mercadal. + * Copyright 2015, Cappuccino Project. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import "CPTheme.j" + +CPAppearanceNameAqua = @"CPAppearanceNameAqua"; +CPAppearanceNameLightContent = @"CPAppearanceNameLightContent"; +CPAppearanceNameVibrantDark = @"CPAppearanceNameVibrantDark"; +CPAppearanceNameVibrantLight = @"CPAppearanceNameVibrantLight"; + +var _CPAppearanceCurrent = nil, + _CPAppearancesRegistry = @{}; + + +@protocol CPAppearanceCustomization + +@required +- (CPAppearance)appearance; +- (void)setAppearance:(CPAppearance)appearance; +- (CPAppearance)effectiveAppearance; +- (void)setEffectiveAppearance:(CPAppearance)appearance; + +@end + +CPThemeStateAppearanceAqua = CPThemeState("appearance-aqua"); +CPThemeStateAppearanceLightContent = CPThemeState("appearance-light-content"); +CPThemeStateAppearanceVibrantLight = CPThemeState("appearance-vibrant-light"); +CPThemeStateAppearanceVibrantDark = CPThemeState("appearance-vibrant-dark"); + + +/*! + @ingroup appkit + + A CPAppareance represents the appearance of an to a subset of UI elements. + This is a very lightweight implementation of the NSAppearance system, but + We are using it for compliance, and especially for the CPVisualEffectView +*/ +@implementation CPAppearance : CPObject +{ + BOOL _allowsVibrancy @accessors(property=allowsVibrancy); + + CPString _name; +} + + +#pragma mark - +#pragma mark Class Methods + +/*! Returns the current default CPAppearance +*/ ++ (CPAppearance)currentAppearance +{ + if (!_CPAppearanceCurrent) + _CPAppearanceCurrent = [CPAppearance appearanceNamed:CPAppearanceNameAqua]; + + return _CPAppearanceCurrent; +} + +/*! Sets the current default CPAppearance + @param appearance the new current appearance +*/ ++ (void)setCurrentAppearance:(CPAppearance)anAppearance +{ + _CPAppearanceCurrent = anAppearance; +} + +/*! Returns the CPAppearance object with the given name + @param name the name of the appearance +*/ ++ (CPAppearance)appearanceNamed:(CPString)aName +{ + if (![_CPAppearancesRegistry containsKey:aName]) + { + [_CPAppearancesRegistry setObject:[[CPAppearance alloc] initWithAppearanceNamed:aName bundle:nil] + forKey:aName]; + } + + return [_CPAppearancesRegistry objectForKey:aName]; +} + + +#pragma mark - +#pragma mark Initialization + +/*! Creates a CPAppearance object initialized to the specified appearance file in the specified bundle + This method does actually nothing special. It just creates a default appearance object +*/ +- (id)initWithAppearanceNamed:(CPString)aName bundle:(CPBundle)bundle +{ + if (self = [super init]) + { + _name = aName; + _allowsVibrancy = YES; + + if ([_CPAppearancesRegistry containsKey:aName]) + [CPException raise:CPInternalInconsistencyException reason:"Appearance with name '" + aName + "' is already declared."]; + + [_CPAppearancesRegistry setObject:self forKey:aName]; + } + + return self; +} + + +#pragma mark - +#pragma mark Implementation + +- (BOOL)isEqual:(id)anObject +{ + if (![anObject isKindOfClass:CPAppearance]) + return NO; + + return self._name == anObject._name; +} + +- (CPString)description +{ + return @""; +} + + +#pragma mark - +#pragma mark CPCoding + +- (id)initWithCoder:(CPCoder)aCoder +{ + if (self = [super init]) + { + _name = [aCoder decodeObjectForKey:@"_name"]; + _allowsVibrancy = [aCoder decodeBoolForKey:@"_allowsVibrancy"]; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_name forKey:@"_name"]; + [aCoder encodeBool:_allowsVibrancy forKey:@"_allowsVibrancy"]; +} + +@end \ No newline at end of file diff --git a/AppKit/CPButtonBar.j b/AppKit/CPButtonBar.j index 47f869597..f27819689 100644 --- a/AppKit/CPButtonBar.j +++ b/AppKit/CPButtonBar.j @@ -112,6 +112,8 @@ - (void)awakeFromCib { + [super awakeFromCib]; + var view = [self superview], subview = self; diff --git a/AppKit/CPScrollView.j b/AppKit/CPScrollView.j index 1b34e8658..f6de3acd0 100644 --- a/AppKit/CPScrollView.j +++ b/AppKit/CPScrollView.j @@ -1582,6 +1582,8 @@ var CPScrollViewContentViewKey = @"CPScrollViewContentView", */ - (void)awakeFromCib { + [super awakeFromCib]; + [self _updateScrollerStyle]; [self _updateCornerAndHeaderView]; } diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index ec145d802..baefde563 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -529,6 +529,8 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", - (void)awakeFromCib { + [super awakeFromCib]; + // This cannot be run in initWithCoder because it might call selectTabViewItem:, which is // not safe to call before the views of the tab views items are fully decoded. [self _updateItems]; diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 8d6d23f58..9254ba296 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -6394,6 +6394,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", - (void)awakeFromCib { + [super awakeFromCib]; [self setThemeState:CPThemeStateTableDataView]; } diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 36ed408bb..cd589a28b 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -26,6 +26,7 @@ @import "CGAffineTransform.j" @import "CGGeometry.j" +@import "CPAppearance.j" @import "CPColor.j" @import "CPGraphicsContext.j" @import "CPResponder.j" @@ -131,7 +132,6 @@ var CPViewFlags = { }, var CPViewHighDPIDrawingEnabled = YES; - /*! @ingroup appkit @class CPView @@ -240,6 +240,10 @@ var CPViewHighDPIDrawingEnabled = YES; BOOL _toolTipInstalled; BOOL _isObserving; + + BOOL _allowsVibrancy @accessors(property=allowsVibrancy); + CPAppearance _appearance @accessors(getter=appearance); + CPAppearance _effectiveAppearance; } /* @@ -327,6 +331,13 @@ var CPViewHighDPIDrawingEnabled = YES; return nil; } +- (void)awakeFromCib +{ + [super awakeFromCib]; + + [self _recomputeAppearance]; +} + - (id)init { return [self initWithFrame:CGRectMakeZero()]; @@ -839,9 +850,9 @@ var CPViewHighDPIDrawingEnabled = YES; */ - (void)viewDidMoveToSuperview { -// if (_graphicsContext) - [self setNeedsDisplay:YES]; + [self _recomputeAppearance]; + [self setNeedsDisplay:YES]; } /*! @@ -3509,6 +3520,85 @@ setBoundsOrigin: return (_ephemeralSubviewsForNames[aViewName] || nil); } +@end + + +@implementation CPView (Appearance) + +/*! Returns the receiver's appearance if any, or ask the superview and returns it. +*/ +- (CPAppearance)effectiveAppearance +{ + if (_appearance) + return _appearance; + + return [_superview effectiveAppearance]; +} + +- (void)setAppearance:(CPAppearance)anAppearance +{ + if ([_appearance isEqual:anAppearance]) + return; + + [self willChangeValueForKey:@"appearance"]; + _appearance = anAppearance; + [self didChangeValueForKey:@"appearance"]; + + [self _recomputeAppearance]; +} + +/*! @ignore +*/ +- (void)_recomputeAppearance +{ + // if we don't have a themeState, it means + // the view is not decoding from a cib, so we just return. + // this method will be called again in awakeFromCib + if (!_themeState) + return; + + var effectiveAppearance = [self effectiveAppearance]; + + if ([effectiveAppearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameAqua]]) + { + [self setThemeState:CPThemeStateAppearanceAqua]; + [self unsetThemeState:CPThemeStateAppearanceLightContent]; + [self unsetThemeState:CPThemeStateAppearanceVibrantLight]; + [self unsetThemeState:CPThemeStateAppearanceVibrantDark]; + } + else if ([effectiveAppearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameLightContent]]) + { + [self unsetThemeState:CPThemeStateAppearanceAqua]; + [self setThemeState:CPThemeStateAppearanceLightContent]; + [self unsetThemeState:CPThemeStateAppearanceVibrantLight]; + [self unsetThemeState:CPThemeStateAppearanceVibrantDark]; + } + else if ([effectiveAppearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]) + { + [self unsetThemeState:CPThemeStateAppearanceAqua]; + [self unsetThemeState:CPThemeStateAppearanceLightContent]; + [self setThemeState:CPThemeStateAppearanceVibrantLight]; + [self unsetThemeState:CPThemeStateAppearanceVibrantDark]; + } + else if ([effectiveAppearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]) + { + [self unsetThemeState:CPThemeStateAppearanceAqua]; + [self unsetThemeState:CPThemeStateAppearanceLightContent]; + [self unsetThemeState:CPThemeStateAppearanceVibrantLight]; + [self setThemeState:CPThemeStateAppearanceVibrantDark]; + } + else + { + [self unsetThemeState:CPThemeStateAppearanceAqua]; + [self unsetThemeState:CPThemeStateAppearanceLightContent]; + [self unsetThemeState:CPThemeStateAppearanceVibrantLight]; + [self unsetThemeState:CPThemeStateAppearanceVibrantDark]; + } + + [_subviews makeObjectsPerformSelector:@selector(_recomputeAppearance)]; +} + + @end var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", @@ -3531,7 +3621,8 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", CPReuseIdentifierKey = @"CPReuseIdentifierKey", CPViewScaleKey = @"CPViewScaleKey", CPViewSizeScaleKey = @"CPViewSizeScaleKey", - CPViewIsScaledKey = @"CPViewIsScaledKey"; + CPViewIsScaledKey = @"CPViewIsScaledKey", + CPViewAppearanceKey = @"CPViewAppearanceKey"; @implementation CPView (CPCoding) @@ -3646,6 +3737,8 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", _themeAttributes[attributeName] = CPThemeAttributeDecode(aCoder, attributeName, attributes[count], _theme, themeClass); } + [self setAppearance:[aCoder decodeObjectForKey:CPViewAppearanceKey]]; + [self setNeedsDisplay:YES]; [self setNeedsLayout]; } @@ -3734,6 +3827,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", [aCoder encodeSize:[self scaleSize] forKey:CPViewScaleKey]; [aCoder encodeSize:[self _hierarchyScaleSize] forKey:CPViewSizeScaleKey]; [aCoder encodeBool:_isScaled forKey:CPViewIsScaledKey]; + [aCoder encodeObject:_appearance forKey:CPViewAppearanceKey]; } @end diff --git a/AppKit/CPVisualEffectView.j b/AppKit/CPVisualEffectView.j new file mode 100644 index 000000000..ece566562 --- /dev/null +++ b/AppKit/CPVisualEffectView.j @@ -0,0 +1,231 @@ +/* + * CPVisualEffectView.j + * AppKit + * + * Created by Antoine Mercadal. + * Copyright 2015, 280 Cappuccino Project. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import +@import "CPAppearance.j" +@import "CPView.j" + +@typedef CPVisualEffectMaterial +CPVisualEffectMaterialAppearanceBased = 0; +CPVisualEffectMaterialLight = 1; +CPVisualEffectMaterialDark = 2; +CPVisualEffectMaterialTitlebar = 3; + +@typedef CPVisualEffectBlendingMode +CPVisualEffectBlendingModeBehindWindow = 0; +CPVisualEffectBlendingModeWithinWindow = 1; + +@typedef CPVisualEffectState +CPVisualEffectStateFollowsWindowActiveState = 0; +CPVisualEffectStateActive = 1; +CPVisualEffectStateInactive = 2; + + +/*! @ingroup appkit + + Very naive implementation of CPVisualEffectView. This view allows + to use vibrancy effect. This is only working with Safari 9+ and the + support in Chrome/ium should come quite soon. + Using this class with a browser that doesn't support backdrop-filter + While still work, but you will not get the blurry effect. +*/ +@implementation CPVisualEffectView : CPView +{ + CPImage _maskImage @accessors(property=maskImage); + CPVisualEffectBlendingMode _blendingMode @accessors(property=blendingMode); + CPVisualEffectMaterial _material @accessors(property=material); + CPVisualEffectState _state @accessors(property=state); +} + + +#pragma mark - +#pragma mark Initialization + +- (id)initWithFrame:(CGRect)aFrame +{ + if (self = [super initWithFrame:aFrame]) + { + _material = CPVisualEffectMaterialAppearanceBased; + _blendingMode = CPVisualEffectBlendingModeWithinWindow; + _state = CPVisualEffectStateFollowsWindowActiveState; + _appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]; + } + + return self; +} + + +#pragma mark - +#pragma mark CPVisualEffectView API + +/*! Sets the appearance of the CPVisualEffectView. + + Only CPAppearance named CPAppearanceNameVibrantDark or CPAppearanceNameVibrantLight are valid + + @param anAppearance the CPAppearance. +*/ +- (void)setAppearance:(CPAppearance)anAppearance +{ + if (![self _validAppearance:anAppearance]) + [CPException raise:CPInvalidArgumentException reason:"Appearance can only be CPAppearanceNameVibrantDark or CPAppearanceNameVibrantLight in CPVisualEffectView, but is " + anAppearance]; + + [super setAppearance:anAppearance]; + [self _applyVibrancyState]; +} + +/*! Sets the received effect state. + Possible values: +
+    CPVisualEffectStateFollowsWindowActiveState (default)
+    CPVisualEffectStateActive
+    CPVisualEffectStateInactive
+    
+*/ +- (void)setState:(CPVisualEffectState)aState +{ + if (_state == aState) + return; + + [self willChangeValueForKey:"state"]; + _state = aState; + [self didChangeValueForKey:"state"]; + + [self _applyVibrancyState]; +} + + +#pragma mark - +#pragma mark Utilities + +- (void)_setEffectEnabled:(BOOL)shouldEnable +{ + var dark = [[self appearance] isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]], + prop = CPBrowserStyleProperty("backdrop-filter"), + color = (dark ? [CPColor colorWithHexString:@"1e1e1e"] : [CPColor whiteColor]), + finalColor = shouldEnable ? [color colorWithAlphaComponent:0.6] : color; + + [self setBackgroundColor:finalColor]; + +#if PLATFORM(DOM) + self._DOMElement.style[prop] = shouldEnable ? "blur(30px)" : nil; +#endif + +} + +- (void)_applyVibrancyState +{ + switch (_state) + { + case CPVisualEffectStateFollowsWindowActiveState: + [self _setEffectEnabled:[self hasThemeState:CPThemeStateKeyWindow]]; + break; + + case CPVisualEffectStateActive: + [self _setEffectEnabled:YES]; + break; + + case CPVisualEffectStateInactive: + [self _setEffectEnabled:NO]; + break; + } +} + +- (BOOL)_validAppearance:(CPAppearance)anAppearance +{ + return [anAppearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]] || [anAppearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; +} + + +#pragma mark - +#pragma mark Overrides + +- (BOOL)setThemeState:(ThemeState)aState +{ + if (aState.isa && [aState isKindOfClass:CPArray]) + aState = CPThemeState.apply(null, aState); + + var r = [super setThemeState:aState]; + + if (r) + [self _applyVibrancyState]; + + return r; +} + +- (BOOL)unsetThemeState:(ThemeState)aState +{ + if (aState.isa && [aState isKindOfClass:CPArray]) + aState = CPThemeState.apply(null, aState); + + var r = [super unsetThemeState:aState]; + + if (r) + [self _applyVibrancyState]; + + return r; +} + +- (void)viewDidMoveToSuperview +{ + [super viewDidMoveToSuperview]; + + if (_superview) + [self _applyVibrancyState]; +} + +- (void)viewDidMoveToWindow +{ + [super viewDidMoveToWindow]; + + if (_window) + [self _applyVibrancyState]; +} + + +#pragma mark - +#pragma mark CPCoding + +- (id)initWithCoder:(CPCoder)aCoder +{ + if (self = [super initWithCoder:aCoder]) + { + _blendingMode = [aCoder decodeIntForKey:@"_blendingMode"] || CPVisualEffectBlendingModeWithinWindow; + _maskImage = [aCoder decodeObjectForKey:@"_maskImage"]; + _material = [aCoder decodeIntForKey:@"_material"] || CPVisualEffectMaterialAppearanceBased; + _state = [aCoder decodeIntForKey:@"_state"] || CPVisualEffectStateFollowsWindowActiveState; + } + + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + + [aCoder encodeObject:_maskImage forKey:@"_maskImage"]; + [aCoder encodeInt:_blendingMode forKey:@"_blendingMode"]; + [aCoder encodeInt:_material forKey:@"_material"]; + [aCoder encodeInt:_state forKey:@"_state"]; +} + + +@end \ No newline at end of file diff --git a/AppKit/CPWindow/_CPPopoverWindowView.j b/AppKit/CPWindow/_CPPopoverWindowView.j index b337be625..aeba11f8a 100644 --- a/AppKit/CPWindow/_CPPopoverWindowView.j +++ b/AppKit/CPWindow/_CPPopoverWindowView.j @@ -26,7 +26,6 @@ @import "CGGradient.j" @import "_CPWindowView.j" -@global CPPopoverAppearanceMinimal var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); @@ -39,7 +38,6 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); { float _arrowOffsetX @accessors(property=arrowOffsetX); float _arrowOffsetY @accessors(property=arrowOffsetY); - int _appearance @accessors(property=appearance); unsigned _preferredEdge @accessors(property=preferredEdge); CGSize _cursorSize; @@ -123,7 +121,7 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); { _arrowOffsetX = 0.0; _arrowOffsetY = 0.0; - _appearance = CPPopoverAppearanceMinimal; + _appearance = [CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]; _cursorSize = CGSizeMakeCopy(_CPPopoverWindowViewDefaultCursorSize); } @@ -168,7 +166,7 @@ var _CPPopoverWindowViewDefaultCursorSize = CGSizeMake(16, 10); gradient, frame = [self bounds]; - if (_appearance == CPPopoverAppearanceMinimal) + if ([_appearance isEqual:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]) { gradient = [self valueForThemeAttribute:@"background-gradient"]; strokeColor = [self valueForThemeAttribute:@"stroke-color"]; diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index 4aa1f4c0e..443109c18 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -141,7 +141,12 @@ var _CPPopoverWindow_shouldClose_ = 1 << 4, if (_appearance === anAppearance) return; - [_windowView setAppearance:anAppearance]; + _appearance = anAppearance; + + var appearanceName = _appearance == CPPopoverAppearanceMinimal ? CPAppearanceNameVibrantLight : CPAppearanceNameVibrantDark, + viewAppearance = [CPAppearance appearanceNamed:appearanceName]; + + [_windowView setAppearance:viewAppearance]; } - (void)setStyleMask:(unsigned)aStyleMask diff --git a/Tests/AppKit/CPViewTest.j b/Tests/AppKit/CPViewTest.j index 5c2457569..b3f1b80e2 100644 --- a/Tests/AppKit/CPViewTest.j +++ b/Tests/AppKit/CPViewTest.j @@ -771,6 +771,112 @@ var methodCalled; [self assert:nil equals:view._toolTipFunctionOut]; } +- (void)testAppearanceDefaultvalue +{ + [self assert:nil equals:[view appearance]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantDark]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantLight]]; + [self assert:nil equals:[view effectiveAppearance]]; +} + +- (void)testAppearanceWithVibrantDark +{ + [view setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark] equals:[view appearance]]; + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark] equals:[view effectiveAppearance]]; + [self assertTrue:[view hasThemeState:CPThemeStateAppearanceVibrantDark]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantLight]]; +} + +- (void)testAppearanceWithVibrantLight +{ + [view setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight] equals:[view appearance]]; + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight] equals:[view effectiveAppearance]]; + [self assertTrue:[view hasThemeState:CPThemeStateAppearanceVibrantLight]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantDark]]; +} + +- (void)testAppearanceReset +{ + [view setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + [view setAppearance:nil]; + + [self assert:nil equals:[view appearance]]; + [self assert:nil equals:[view effectiveAppearance]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantLight]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantDark]]; +} + +- (void)testEffectiveAppearance +{ + var secondView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [view addSubview:secondView]; + + [self assert:nil equals:[secondView appearance]]; + + [view setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight] equals:[secondView effectiveAppearance]]; +} + +- (void)testEffectiveAppearanceWithMovingViews +{ + var viewA = [[CPView alloc] initWithFrame:CGRectMakeZero()], + viewB = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [viewA setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + [viewB setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + + [viewA addSubview:view]; + + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight] equals:[view effectiveAppearance]]; + [self assertTrue:[view hasThemeState:CPThemeStateAppearanceVibrantLight]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantDark]]; + + [viewB addSubview:view]; + + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark] equals:[view effectiveAppearance]]; + [self assertFalse:[view hasThemeState:CPThemeStateAppearanceVibrantLight]]; + [self assertTrue:[view hasThemeState:CPThemeStateAppearanceVibrantDark]]; +} + +- (void)testEffectiveAppearanceWithMovingViewHierarchy +{ + var viewC = [[CPView alloc] initWithFrame:CGRectMakeZero()], + viewA = [[CPView alloc] initWithFrame:CGRectMakeZero()], + viewB = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [view setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + [viewC setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + + [viewA addSubview:viewB]; + [view addSubview:viewA]; + + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight] equals:[viewB effectiveAppearance]]; + + [viewC addSubview:viewA]; + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark] equals:[viewB effectiveAppearance]]; +} + +- (void)testEffectiveAppearanceReset +{ + var viewA = [[CPView alloc] initWithFrame:CGRectMakeZero()], + viewB = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + + [viewA setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight]]; + [viewB setAppearance:[CPAppearance appearanceNamed:CPAppearanceNameVibrantDark]]; + + [viewA addSubview:view]; + [self assert:[CPAppearance appearanceNamed:CPAppearanceNameVibrantLight] equals:[view effectiveAppearance]]; + + [view removeFromSuperview]; + [self assert:nil equals:[view effectiveAppearance]]; +} + @end @implementation CPLayoutView : CPView diff --git a/Tests/Manual/CPVisualEffectViewTest/AppController.j b/Tests/Manual/CPVisualEffectViewTest/AppController.j new file mode 100644 index 000000000..ee506899a --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/AppController.j @@ -0,0 +1,73 @@ +/* + * AppController.j + * CPVisualEffectViewTest + * + * Created by You on August 13, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + +@implementation AppController : CPObject +{ + @outlet CPWindow window; + + @outlet CPVisualEffectView FXView1; + @outlet CPVisualEffectView FXView2; + @outlet CPVisualEffectView FXView3; + @outlet CPVisualEffectView FXView4; + @outlet CPVisualEffectView FXView5; + @outlet CPVisualEffectView FXView6; + + @outlet CPTextField field1; + @outlet CPTextField field2; + @outlet CPTextField field3; + @outlet CPTextField field4; + @outlet CPTextField field5; + @outlet CPTextField field6; + + @outlet CPButton button1; + @outlet CPButton button2; + @outlet CPButton button3; + @outlet CPButton button4; + @outlet CPButton button5; + @outlet CPButton button6; + +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ +} + +- (void)awakeFromCib +{ + var fields = [field1, field2, field3, field4, field5, field6]; + + for (var i = [fields count] - 1; i >= 0; i--) + [fields[i] setValue:[CPColor whiteColor] forThemeAttribute:@"text-color" inState:CPThemeStateAppearanceVibrantDark]; + + var buttons = [button1, button2, button3, button4, button5, button6]; + + for (var i = [buttons count] - 1; i >= 0; i--) + { + [buttons[i] setValue:[CPColor colorWithHexString:@"f3f3f3"] forThemeAttribute:@"bezel-color" inState:CPThemeStateAppearanceVibrantLight]; + [buttons[i] setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"text-color" inState:CPThemeStateAppearanceVibrantLight]; + [buttons[i] setValue:[CPColor clearColor] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateAppearanceVibrantLight]; + + [buttons[i] setValue:[CPColor colorWithHexString:@"333333"] forThemeAttribute:@"bezel-color" inState:CPThemeStateAppearanceVibrantDark]; + [buttons[i] setValue:[CPColor colorWithHexString:@"999"] forThemeAttribute:@"text-color" inState:CPThemeStateAppearanceVibrantDark]; + [buttons[i] setValue:[CPColor clearColor] forThemeAttribute:@"text-shadow-color" inState:CPThemeStateAppearanceVibrantDark]; + } +} + +- (IBAction)switch:(id)aSender +{ + var dark = [CPAppearance appearanceNamed:CPAppearanceNameVibrantDark], + light = [CPAppearance appearanceNamed:CPAppearanceNameVibrantLight], + appearance = ([[aSender effectiveAppearance] isEqual:dark]) ? light : dark; + + [[aSender superview] setAppearance:appearance]; +} + +@end diff --git a/Tests/Manual/CPVisualEffectViewTest/Info.plist b/Tests/Manual/CPVisualEffectViewTest/Info.plist new file mode 100644 index 000000000..074f91770 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPVisualEffectViewTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2015, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPVisualEffectViewTest/Jakefile b/Tests/Manual/CPVisualEffectViewTest/Jakefile new file mode 100644 index 000000000..690674428 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * CPVisualEffectViewTest + * + * Created by You on August 13, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPVisualEffectViewTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPVisualEffectViewTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPVisualEffectViewTest"); + task.setIdentifier("com.yourcompany.CPVisualEffectViewTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPVisualEffectViewTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPVisualEffectViewTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPVisualEffectViewTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/CPVisualEffectViewTest/Resources/MainMenu.cib b/Tests/Manual/CPVisualEffectViewTest/Resources/MainMenu.cib new file mode 100644 index 000000000..0e716eed0 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/Resources/MainMenu.cib @@ -0,0 +1,7 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;73E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;74E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;75E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;55E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;59E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;71E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;62E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;58E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;73E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;64E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;70E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;88E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;60E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;66E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;72E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;93E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;69E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;94E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;95E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;61E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;43E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;97E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;98E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;99E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;101E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;102E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;103E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;104E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;47E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;106E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;47E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;111E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;112E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;47E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;116E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;119E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;121E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;116E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;98E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;99E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;125E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;126E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;102E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;127E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;104E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;51E;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPImageViewK;8;$classesA;S;11;CPImageViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;130E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;131E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;133E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;23;CPImageViewHasShadowKeyD;K;6;CP$UIDd;1;0E;K;28;CPImageViewImageAlignmentKeyD;K;6;CP$UIDd;3;105E;E;D;K;10;$classnameS;18;CPVisualEffectViewK;8;$classesA;S;18;CPVisualEffectViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;134E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;135E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;136E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;3;138E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;3;139E;K;9;_materialD;K;6;CP$UIDd;3;105E;K;6;_stateD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;55E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;55E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;142E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;143E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;55E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;55E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;148E;K;7;$aimageD;K;6;CP$UIDd;3;150E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;152E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;110E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;153E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;120E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;117E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;154E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;135E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;155E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;3;138E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;3;139E;K;9;_materialD;K;6;CP$UIDd;3;105E;K;6;_stateD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;59E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;59E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;148E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;156E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;59E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;59E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;157E;K;7;$aimageD;K;6;CP$UIDd;3;158E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;152E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;110E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;153E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;120E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;117E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;159E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;135E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;3;161E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;3;139E;K;9;_materialD;K;6;CP$UIDd;3;105E;K;6;_stateD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;157E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;162E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;62E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;163E;K;7;$aimageD;K;6;CP$UIDd;3;164E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;152E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;110E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;153E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;120E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;117E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;165E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;135E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;3;138E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;3;139E;K;9;_materialD;K;6;CP$UIDd;3;105E;K;6;_stateD;K;6;CP$UIDd;3;117E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;65E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;65E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;163E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;65E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;65E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;168E;K;7;$aimageD;K;6;CP$UIDd;3;169E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;152E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;110E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;153E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;120E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;117E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;170E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;135E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;171E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;3;161E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;3;139E;K;9;_materialD;K;6;CP$UIDd;3;105E;K;6;_stateD;K;6;CP$UIDd;3;117E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;168E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;172E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;173E;K;7;$aimageD;K;6;CP$UIDd;3;174E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;152E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;110E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;153E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;120E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;117E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;135E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;3;161E;K;10;_maskImageD;K;6;CP$UIDd;1;0E;K;13;_blendingModeD;K;6;CP$UIDd;3;139E;K;9;_materialD;K;6;CP$UIDd;3;105E;K;6;_stateD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;71E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;140E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;141E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;71E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;114E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;115E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;117E;K;6;$afontD;K;6;CP$UIDd;3;173E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;120E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;177E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;110E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;110E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;124E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;117E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;110E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;110E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;2;57E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;71E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;71E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;113E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;146E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;147E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;178E;K;7;$aimageD;K;6;CP$UIDd;3;179E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;109E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;109E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;110E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;116E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;105E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;3;122E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;152E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;110E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;153E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;120E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;117E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;45E;E;E;S;8;delegateS;7;FXView1S;7;FXView2S;7;FXView3S;7;FXView4S;7;FXView5S;7;FXView6S;7;button1S;7;button2S;7;button3S;7;button4S;7;button5S;7;button6S;6;field1S;6;field2S;6;field3S;6;field4S;6;field5S;6;field6S;6;windowS;7;switch:S;13;AppControllerS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1618478080S;22;{{100, 88}, {181, 67}}S;21;{{0, 0}, {1440, 877}}d;2;15S;6;Windowd;1;0S;19;{{0, 0}, {181, 67}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;49E;E;E;S;6;normalS;6;{1, 1}F;S;21;{{20, 25}, {141, 17}}S;19;{{0, 0}, {141, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4d;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;T;S;23;Click me to loose focusd;2;-1D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;123E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;181E;E;d;10;1886912512S;24;{{303, 166}, {834, 545}}d;1;7S;20;{{0, 0}, {834, 545}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;71E;E;E;d;2;18d;1;3D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;182E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;183E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;185E;E;S;22;{{87, 15}, {215, 254}}S;20;{{0, 0}, {215, 254}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;58E;E;E;D;K;10;$classnameS;12;CPAppearanceK;8;$classesA;S;12;CPAppearanceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;5;_nameD;K;6;CP$UIDd;3;186E;K;15;_allowsVibrancyD;K;6;CP$UIDd;1;0E;E;d;1;1S;22;{{20, 110}, {175, 34}}S;19;{{0, 0}, {175, 34}}D;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;S;32;Vibrant Light +Follows Key WindowS;21;{{73, 213}, {69, 25}}S;18;{{0, 0}, {69, 25}}S;6;buttonS;27;bordered+controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;4;nameD;K;6;CP$UIDd;3;187E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;188E;K;5;valueD;K;6;CP$UIDd;3;189E;E;S;6;SwitchS;0;d;2;14S;23;{{310, 15}, {215, 254}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;E;E;S;20;Vibrant Light +ActiveD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;4;nameD;K;6;CP$UIDd;3;187E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;188E;K;5;valueD;K;6;CP$UIDd;3;189E;E;S;24;{{310, 277}, {215, 254}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;E;E;D;K;6;$classD;K;6;CP$UIDd;3;137E;K;5;_nameD;K;6;CP$UIDd;3;190E;K;15;_allowsVibrancyD;K;6;CP$UIDd;1;0E;E;S;19;Vibrant Dark +ActiveD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;4;nameD;K;6;CP$UIDd;3;187E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;188E;K;5;valueD;K;6;CP$UIDd;3;189E;E;S;23;{{533, 15}, {215, 254}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;E;E;S;22;Vibrant Light +InactiveD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;4;nameD;K;6;CP$UIDd;3;187E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;188E;K;5;valueD;K;6;CP$UIDd;3;189E;E;S;24;{{533, 277}, {215, 254}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;E;E;S;21;Vibrant Dark +InactiveD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;4;nameD;K;6;CP$UIDd;3;187E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;188E;K;5;valueD;K;6;CP$UIDd;3;189E;E;S;23;{{87, 277}, {215, 254}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;E;E;S;31;Vibrant Dark +Follows Key WindowD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;180E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;120E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;120E;E;D;K;6;$classD;K;6;CP$UIDd;3;149E;K;4;nameD;K;6;CP$UIDd;3;187E;K;12;defaultValueD;K;6;CP$UIDd;1;0E;K;5;stateD;K;6;CP$UIDd;3;188E;K;5;valueD;K;6;CP$UIDd;3;189E;E;S;28;_CPFontSystemFacePlaceholderD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;191E;D;K;6;CP$UIDd;3;139E;E;E;S;7;CPImageS;14;background.jpgD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;184E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;193E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;152E;K;9;frameworkD;K;6;CP$UIDd;3;152E;E;E;S;28;CPAppearanceNameVibrantLightS;5;imageS;11;highlightedD;K;6;$classD;K;6;CP$UIDd;3;118E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;194E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;195E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;110E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;110E;E;S;27;CPAppearanceNameVibrantDarkf;18;0.6862745098039216D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;192E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;196E;E;S;18;.AppleSystemUIFontd;2;13S;32;{"width":245.76,"height":160.32}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPVisualEffectViewTest/Resources/MainMenu.xib b/Tests/Manual/CPVisualEffectViewTest/Resources/MainMenu.xib new file mode 100644 index 000000000..650cd38a2 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/Resources/MainMenu.xib @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vibrant Light +Follows Key Window + + + + + + + + + + + + + + + + + + + Vibrant Light +Active + + + + + + + + + + + + + + + + + + + Vibrant Dark +Active + + + + + + + + + + + + + + + + + + + Vibrant Light +Inactive + + + + + + + + + + + + + + + + + + + Vibrant Dark +Inactive + + + + + + + + + + + + + + + + + + + Vibrant Dark +Follows Key Window + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/CPVisualEffectViewTest/Resources/background.jpg b/Tests/Manual/CPVisualEffectViewTest/Resources/background.jpg new file mode 100644 index 000000000..0fe64744a Binary files /dev/null and b/Tests/Manual/CPVisualEffectViewTest/Resources/background.jpg differ diff --git a/Tests/Manual/CPVisualEffectViewTest/index-debug.html b/Tests/Manual/CPVisualEffectViewTest/index-debug.html new file mode 100644 index 000000000..c4d1557d3 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + CPVisualEffectViewTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPVisualEffectViewTest/index.html b/Tests/Manual/CPVisualEffectViewTest/index.html new file mode 100644 index 000000000..af62486e2 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + CPVisualEffectViewTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPVisualEffectViewTest/main.j b/Tests/Manual/CPVisualEffectViewTest/main.j new file mode 100644 index 000000000..03e6d6d85 --- /dev/null +++ b/Tests/Manual/CPVisualEffectViewTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPVisualEffectViewTest + * + * Created by You on August 13, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index 8dbc498ee..a45eac2e5 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -88,6 +88,8 @@ @import "NSSortDescriptor.j" @import "NSPopover.j" @import "NSProgressIndicator.j" +@import "NSAppearance.j" +@import "NSVisualEffectView.j" function CP_NSMapClassName(aClassName) diff --git a/Tools/nib2cib/NSAppearance.j b/Tools/nib2cib/NSAppearance.j new file mode 100644 index 000000000..fc5f62b4d --- /dev/null +++ b/Tools/nib2cib/NSAppearance.j @@ -0,0 +1,52 @@ +/* + * NSAppearance.j + * nib2cib + * + * Created by Antoine Mercadal. + * Copyright 2015, Cappuccino Project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + + +@implementation CPAppearance (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + if (self = [super init]) + { + _name = [aCoder decodeObjectForKey:@"NSAppearanceName"].replace(/^NS/, "CP"); + } + + return self; +} + +@end + +@implementation NSAppearance : CPAppearance + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [CPAppearance class]; +} + +@end diff --git a/Tools/nib2cib/NSView.j b/Tools/nib2cib/NSView.j index ad996f35a..e25ce5eff 100644 --- a/Tools/nib2cib/NSView.j +++ b/Tools/nib2cib/NSView.j @@ -52,6 +52,7 @@ var NSViewAutoresizingMask = 0x3F, _window = [aCoder decodeObjectForKey:@"NSWindow"]; _superview = [aCoder decodeObjectForKey:@"NSSuperview"]; _subviews = [aCoder decodeObjectForKey:@"NSSubviews"]; + _appearance = [aCoder decodeObjectForKey:@"NSAppearance"]; _hierarchyScaleSize = CGSizeMake(1.0 , 1.0); _scaleSize = CGSizeMake(1.0, 1.0); diff --git a/Tools/nib2cib/NSVisualEffectView.j b/Tools/nib2cib/NSVisualEffectView.j new file mode 100644 index 000000000..809f5def2 --- /dev/null +++ b/Tools/nib2cib/NSVisualEffectView.j @@ -0,0 +1,57 @@ +/* + * NSVisualEffectView.j + * nib2cib + * + * Created by Antoine Mercadal. + * Copyright 2015, Cappuccino Project + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + + +@implementation CPVisualEffectView (NSCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + if (self = [super NS_initWithCoder:aCoder]) + { + _material = [aCoder decodeObjectForKey:@"NSVisualEffectViewMaterial"]; + _state = [aCoder decodeObjectForKey:@"NSVisualEffectViewState"]; + + // this is not supported + // _blendingMode = [aCoder decodeObjectForKey:@"NSVisualEffectViewBlendingMode"]; + _blendingMode = CPVisualEffectBlendingModeWithinWindow; + } + + return self; +} + +@end + +@implementation NSVisualEffectView : CPVisualEffectView + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [CPVisualEffectView class]; +} + +@end diff --git a/Tools/objj2objcskeleton/objj2objcskeleton b/Tools/objj2objcskeleton/objj2objcskeleton index c855c5c54..83a8ffe75 100644 --- a/Tools/objj2objcskeleton/objj2objcskeleton +++ b/Tools/objj2objcskeleton/objj2objcskeleton @@ -604,5 +604,7 @@ var NSClasses = { "NSWindow" : YES, "NSWindowController" : YES, "NSWorkspace" : YES, - "NSPopover": YES + "NSPopover": YES, + "NSAppearance" : YES, + "NSVisualEffectView" : YES, };