2
0

Add "Password for"-label and fix a weird UI bug with bindings, hidden and NSViews with certain inner constraints.

This commit is contained in:
Maarten Billemont 2015-11-04 23:53:46 -05:00
parent 8316e5331d
commit 7f68d4b98f
4 changed files with 156 additions and 120 deletions

2
External/Pearl vendored

@ -1 +1 @@
Subproject commit 83e3366c357e65fb4283ea10ee2ec12bf2afbb66 Subproject commit adcbc1f10abd55199130b02280fccdfaa8ce4211

View File

@ -37,6 +37,7 @@
@property(nonatomic, weak) IBOutlet NSTextField *inputLabel; @property(nonatomic, weak) IBOutlet NSTextField *inputLabel;
@property(nonatomic, weak) IBOutlet NSTextField *securePasswordField; @property(nonatomic, weak) IBOutlet NSTextField *securePasswordField;
@property(nonatomic, weak) IBOutlet NSTextField *revealPasswordField; @property(nonatomic, weak) IBOutlet NSTextField *revealPasswordField;
@property(nonatomic, weak) IBOutlet NSTextField *sitePasswordTipField;
@property(nonatomic, weak) IBOutlet NSSearchField *siteField; @property(nonatomic, weak) IBOutlet NSSearchField *siteField;
@property(nonatomic, weak) IBOutlet MPSitesTableView *siteTable; @property(nonatomic, weak) IBOutlet MPSitesTableView *siteTable;
@property(nonatomic, weak) IBOutlet NSProgressIndicator *progressView; @property(nonatomic, weak) IBOutlet NSProgressIndicator *progressView;

View File

@ -43,7 +43,7 @@
- (void)windowDidLoad { - (void)windowDidLoad {
prof_new(@"windowDidLoad"); prof_new( @"windowDidLoad" );
[super windowDidLoad]; [super windowDidLoad];
prof_rewind( @"super" ); prof_rewind( @"super" );
@ -60,8 +60,11 @@
// }]; // }];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
prof_new( @"didBecomeKey" );
[self fadeIn]; [self fadeIn];
prof_rewind( @"fadeIn" );
[self updateUser]; [self updateUser];
prof_finish( @"updateUser" );
}]; }];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification object:self.window [[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification object:self.window
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
@ -85,7 +88,9 @@
}]; }];
[self observeKeyPath:@"sitesController.selection" [self observeKeyPath:@"sitesController.selection"
withBlock:^(id from, id to, NSKeyValueChange cause, id _self) { withBlock:^(id from, id to, NSKeyValueChange cause, id _self) {
prof_new( @"sitesController.selection" );
[_self updateSelection]; [_self updateSelection];
prof_finish( @"updateSelection" );
}]; }];
prof_rewind( @"observers" ); prof_rewind( @"observers" );
@ -597,6 +602,7 @@
]; ];
self.showVersionContainer = self.alternatePressed || self.selectedSite.outdated; self.showVersionContainer = self.alternatePressed || self.selectedSite.outdated;
[self.sitePasswordTipField setAttributedStringValue:straf( @"Your password for %@:", self.selectedSite.displayedName )];
} }
- (void)createNewSite:(NSString *)siteName { - (void)createNewSite:(NSString *)siteName {
@ -628,7 +634,7 @@
- (void)fadeIn { - (void)fadeIn {
prof_new(@"fadeIn"); prof_new( @"fadeIn" );
if ([self.window isOnActiveSpace] && self.window.alphaValue > FLT_EPSILON) { if ([self.window isOnActiveSpace] && self.window.alphaValue > FLT_EPSILON) {
prof_finish( @"showing" ); prof_finish( @"showing" );
return; return;

View File

@ -4,6 +4,7 @@
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9059"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9059"/>
<capability name="box content view" minToolsVersion="7.0"/> <capability name="box content view" minToolsVersion="7.0"/>
<capability name="stacking Non-gravity area distributions on NSStackView" minToolsVersion="7.0" minSystemVersion="10.11"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPPasswordWindowController"> <customObject id="-2" userLabel="File's Owner" customClass="MPPasswordWindowController">
@ -16,6 +17,7 @@
<outlet property="revealPasswordField" destination="v80-wd-hUR" id="N1U-6B-r1R"/> <outlet property="revealPasswordField" destination="v80-wd-hUR" id="N1U-6B-r1R"/>
<outlet property="securePasswordField" destination="iGR-wo-ual" id="DGh-5i-3u4"/> <outlet property="securePasswordField" destination="iGR-wo-ual" id="DGh-5i-3u4"/>
<outlet property="siteField" destination="CnS-iI-dhr" id="Ogo-lS-dcT"/> <outlet property="siteField" destination="CnS-iI-dhr" id="Ogo-lS-dcT"/>
<outlet property="sitePasswordTipField" destination="Ond-dT-x5d" id="jNr-gD-aJo"/>
<outlet property="siteTable" destination="xvJ-5c-vDp" id="ClP-j8-DyI"/> <outlet property="siteTable" destination="xvJ-5c-vDp" id="ClP-j8-DyI"/>
<outlet property="sitesController" destination="mcS-ik-b0n" id="cdF-BL-lfg"/> <outlet property="sitesController" destination="mcS-ik-b0n" id="cdF-BL-lfg"/>
<outlet property="window" destination="QvC-M9-y7g" id="dPy-F3-9rn"/> <outlet property="window" destination="QvC-M9-y7g" id="dPy-F3-9rn"/>
@ -24,9 +26,9 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hasShadow="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MPPasswordWindow"> <window title="Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hasShadow="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MPPasswordWindow">
<windowCollectionBehavior key="collectionBehavior" transient="YES" ignoresCycle="YES" fullScreenAuxiliary="YES"/> <windowCollectionBehavior key="collectionBehavior" moveToActiveSpace="YES" transient="YES" ignoresCycle="YES" fullScreenAuxiliary="YES"/>
<rect key="contentRect" x="0.0" y="0.0" width="640" height="560"/> <rect key="contentRect" x="0.0" y="0.0" width="640" height="560"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/> <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/>
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ" userLabel="Root"> <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ" userLabel="Root">
<rect key="frame" x="0.0" y="0.0" width="640" height="560"/> <rect key="frame" x="0.0" y="0.0" width="640" height="560"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
@ -209,7 +211,7 @@
<rect key="frame" x="20" y="338" width="600" height="178"/> <rect key="frame" x="20" y="338" width="600" height="178"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XUV-zU-Y9c" userLabel="Site Password"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XUV-zU-Y9c" userLabel="Site Password">
<rect key="frame" x="298" y="41" width="4" height="97"/> <rect key="frame" x="29" y="41" width="542" height="97"/>
<shadow key="shadow" blurRadius="0.5"> <shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
@ -224,7 +226,7 @@
</ciFilter> </ciFilter>
</contentFilters> </contentFilters>
<animations/> <animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" placeholderString="" id="WVV-EE-tkB"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="KeljXoleKowi9@" placeholderString="" id="WVV-EE-tkB">
<font key="font" size="64" name="SourceCodePro-Regular"/> <font key="font" size="64" name="SourceCodePro-Regular"/>
<color key="textColor" name="keyboardFocusIndicatorColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="keyboardFocusIndicatorColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
@ -238,6 +240,35 @@
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.displayedContent" id="Sdg-fb-kQK"/> <binding destination="mcS-ik-b0n" name="value" keyPath="selection.displayedContent" id="Sdg-fb-kQK"/>
</connections> </connections>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ond-dT-x5d" userLabel="Site Password Tip">
<rect key="frame" x="220" y="146" width="160" height="14"/>
<shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</shadow>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Your password for apple.com:" id="CgJ-XZ-6Hy">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="mcS-ik-b0n" name="hidden2" keyPath="selection.content.length" previousBinding="Jvv-jZ-PG1" id="OXN-Zm-1ra">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="mcS-ik-b0n" name="hidden" keyPath="canRemove" id="Jvv-jZ-PG1">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ia6-7b-dFr"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ia6-7b-dFr">
<rect key="frame" x="115" y="82" width="370" height="14"/> <rect key="frame" x="115" y="82" width="370" height="14"/>
<shadow key="shadow" blurRadius="0.5"> <shadow key="shadow" blurRadius="0.5">
@ -275,7 +306,7 @@
</binding> </binding>
</connections> </connections>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OaQ-of-zmb" userLabel="Initial Help"> <textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OaQ-of-zmb" userLabel="Initial Help">
<rect key="frame" x="39" y="142" width="522" height="23"/> <rect key="frame" x="39" y="142" width="522" height="23"/>
<shadow key="shadow" blurRadius="0.5"> <shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
@ -304,7 +335,7 @@
</binding> </binding>
</connections> </connections>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sYt-eL-uwt" userLabel="Initial Tip"> <textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sYt-eL-uwt" userLabel="Initial Tip">
<rect key="frame" x="46" y="44" width="508" height="90"/> <rect key="frame" x="46" y="44" width="508" height="90"/>
<shadow key="shadow" blurRadius="0.5"> <shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
@ -345,6 +376,8 @@
<constraint firstItem="Ia6-7b-dFr" firstAttribute="centerY" secondItem="XUV-zU-Y9c" secondAttribute="centerY" id="KqM-uR-Obm"/> <constraint firstItem="Ia6-7b-dFr" firstAttribute="centerY" secondItem="XUV-zU-Y9c" secondAttribute="centerY" id="KqM-uR-Obm"/>
<constraint firstItem="Ia6-7b-dFr" firstAttribute="centerX" secondItem="XUV-zU-Y9c" secondAttribute="centerX" id="NFQ-aw-8tm"/> <constraint firstItem="Ia6-7b-dFr" firstAttribute="centerX" secondItem="XUV-zU-Y9c" secondAttribute="centerX" id="NFQ-aw-8tm"/>
<constraint firstAttribute="centerX" secondItem="sYt-eL-uwt" secondAttribute="centerX" id="OFw-vb-I71"/> <constraint firstAttribute="centerX" secondItem="sYt-eL-uwt" secondAttribute="centerX" id="OFw-vb-I71"/>
<constraint firstItem="XUV-zU-Y9c" firstAttribute="top" secondItem="Ond-dT-x5d" secondAttribute="bottom" constant="8" symbolic="YES" id="UgV-J6-B5T"/>
<constraint firstItem="Ond-dT-x5d" firstAttribute="centerX" secondItem="XUV-zU-Y9c" secondAttribute="centerX" id="UhT-LQ-aZ8"/>
<constraint firstItem="sYt-eL-uwt" firstAttribute="top" secondItem="OaQ-of-zmb" secondAttribute="bottom" constant="8" symbolic="YES" id="hjJ-f1-mFv"/> <constraint firstItem="sYt-eL-uwt" firstAttribute="top" secondItem="OaQ-of-zmb" secondAttribute="bottom" constant="8" symbolic="YES" id="hjJ-f1-mFv"/>
<constraint firstItem="sYt-eL-uwt" firstAttribute="centerX" secondItem="OaQ-of-zmb" secondAttribute="centerX" id="mu2-se-Mtn"/> <constraint firstItem="sYt-eL-uwt" firstAttribute="centerX" secondItem="OaQ-of-zmb" secondAttribute="centerX" id="mu2-se-Mtn"/>
<constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/> <constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/>
@ -789,111 +822,8 @@
</binding> </binding>
</connections> </connections>
</textField> </textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="d3u-Ze-9uf" userLabel="Counter Container">
<rect key="frame" x="306" y="46" width="28" height="22"/>
<subviews>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XgA-Vl-CKh" userLabel="Counter Stepper">
<rect key="frame" x="-3" y="-3" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" alignment="left" minValue="1" maxValue="1000" doubleValue="1" id="ikF-n4-xiI"/>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.counter" id="qmm-6z-boy"/>
</connections>
</stepper>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NvO-kt-eZ2" userLabel="Counter Field">
<rect key="frame" x="19" y="2" width="11" height="19"/>
<shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</shadow>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="1" id="dhQ-bJ-rn3">
<font key="font" size="12" name="HelveticaNeue-Medium"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
</textFieldCell>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.counter" id="aA9-yw-cYE"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="NvO-kt-eZ2" secondAttribute="trailing" id="4Jx-wu-xIx"/>
<constraint firstAttribute="centerY" secondItem="NvO-kt-eZ2" secondAttribute="centerY" id="7XR-0G-Ptd"/>
<constraint firstAttribute="height" priority="250" id="S2c-OE-l9l"/>
<constraint firstItem="NvO-kt-eZ2" firstAttribute="leading" secondItem="XgA-Vl-CKh" secondAttribute="trailing" constant="8" symbolic="YES" id="V9l-un-zYj"/>
<constraint firstAttribute="centerY" secondItem="XgA-Vl-CKh" secondAttribute="centerY" id="Ye6-AA-god"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="XgA-Vl-CKh" secondAttribute="bottom" id="f3p-gK-Pzg"/>
<constraint firstItem="XgA-Vl-CKh" firstAttribute="top" relation="greaterThanOrEqual" secondItem="d3u-Ze-9uf" secondAttribute="top" id="sLs-IG-OES"/>
<constraint firstItem="XgA-Vl-CKh" firstAttribute="leading" secondItem="d3u-Ze-9uf" secondAttribute="leading" id="vKj-dp-A0D"/>
</constraints>
<animations/>
<connections>
<binding destination="mcS-ik-b0n" name="hidden" keyPath="canRemove" id="1HU-QK-FXC">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="mcS-ik-b0n" name="hidden2" keyPath="selection.generated" previousBinding="1HU-QK-FXC" id="MuW-Zk-XUD">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Ul5-Al-s4J" userLabel="Version Container">
<rect key="frame" x="302" y="76" width="36" height="22"/>
<subviews>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="s85-Ce-y9W">
<rect key="frame" x="-3" y="-3" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" alignment="left" minValue="1" maxValue="1000" doubleValue="1" id="oeb-hS-JIa"/>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.algorithmVersion" id="pIE-Rt-gEn"/>
</connections>
</stepper>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="z39-o6-8ma">
<rect key="frame" x="19" y="2" width="19" height="19"/>
<shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</shadow>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="V1" id="Noo-rx-Uaq">
<font key="font" size="12" name="HelveticaNeue-Medium"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
</textFieldCell>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.algorithm.description" id="mMx-c1-Ykb"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="z39-o6-8ma" firstAttribute="leading" secondItem="s85-Ce-y9W" secondAttribute="trailing" constant="8" symbolic="YES" id="0Zj-Pu-ofN"/>
<constraint firstItem="s85-Ce-y9W" firstAttribute="leading" secondItem="Ul5-Al-s4J" secondAttribute="leading" id="1gR-pq-zVe"/>
<constraint firstAttribute="centerY" secondItem="s85-Ce-y9W" secondAttribute="centerY" id="Ik1-gj-RVH"/>
<constraint firstAttribute="centerY" secondItem="z39-o6-8ma" secondAttribute="centerY" id="M8y-Sk-FEu"/>
<constraint firstAttribute="height" priority="250" constant="10" id="UBO-Bn-DKp"/>
<constraint firstAttribute="trailing" secondItem="z39-o6-8ma" secondAttribute="trailing" id="l1L-fS-G7r"/>
<constraint firstItem="s85-Ce-y9W" firstAttribute="top" relation="greaterThanOrEqual" secondItem="Ul5-Al-s4J" secondAttribute="top" id="tdC-zE-Mtb"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="s85-Ce-y9W" secondAttribute="bottom" id="utH-zK-jrm"/>
</constraints>
<animations/>
<connections>
<binding destination="-2" name="hidden" keyPath="showVersionContainer" id="5Vl-bo-rdV">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dbM-ja-dKO" userLabel="Version Tip"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dbM-ja-dKO" userLabel="Version Tip">
<rect key="frame" x="154" y="106" width="332" height="14"/> <rect key="frame" x="155" y="106" width="332" height="14"/>
<shadow key="shadow" blurRadius="0.5"> <shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/> <size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
@ -921,24 +851,123 @@
</binding> </binding>
</connections> </connections>
</textField> </textField>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Bgn-Ne-fQ7" userLabel="Version Container">
<rect key="frame" x="303" y="76" width="36" height="22"/>
<subviews>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mcq-qD-yte">
<rect key="frame" x="-3" y="-3" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" alignment="left" minValue="1" maxValue="1000" doubleValue="1" id="73y-03-zHt"/>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.algorithmVersion" id="GyA-hK-6cD"/>
</connections>
</stepper>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gyg-Fh-yn7">
<rect key="frame" x="19" y="3" width="19" height="19"/>
<shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</shadow>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="V1" id="Pjy-Fm-zwB">
<font key="font" size="12" name="HelveticaNeue-Medium"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
</textFieldCell>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.algorithm.description" id="w6W-Pf-5eN"/>
</connections>
</textField>
</subviews>
<animations/>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
<connections>
<binding destination="-2" name="hidden" keyPath="showVersionContainer" id="NfE-Qx-UMh">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</stackView>
<stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6II-KA-cNi" userLabel="Counter Container">
<rect key="frame" x="307" y="46" width="28" height="22"/>
<subviews>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XgA-Vl-CKh" userLabel="Counter Stepper">
<rect key="frame" x="-3" y="-3" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" alignment="left" minValue="1" maxValue="1000" doubleValue="1" id="ikF-n4-xiI"/>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.counter" id="qmm-6z-boy"/>
</connections>
</stepper>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NvO-kt-eZ2" userLabel="Counter Field">
<rect key="frame" x="19" y="3" width="11" height="19"/>
<shadow key="shadow" blurRadius="0.5">
<size key="offset" width="0.0" height="1"/>
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</shadow>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="1" id="dhQ-bJ-rn3">
<font key="font" size="12" name="HelveticaNeue-Medium"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
</textFieldCell>
<connections>
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.counter" id="aA9-yw-cYE"/>
</connections>
</textField>
</subviews>
<animations/>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
<connections>
<binding destination="mcS-ik-b0n" name="hidden2" keyPath="selection.generated" previousBinding="9vk-TH-Bm2" id="B6u-H8-b9o">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="mcS-ik-b0n" name="hidden" keyPath="canRemove" id="9vk-TH-Bm2">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</stackView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="v80-wd-hUR" firstAttribute="top" secondItem="iGR-wo-ual" secondAttribute="top" id="1iV-OU-5Ay"/> <constraint firstItem="v80-wd-hUR" firstAttribute="top" secondItem="iGR-wo-ual" secondAttribute="top" id="1iV-OU-5Ay"/>
<constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="vES-W5-m4x" secondAttribute="centerX" id="1tN-p4-2m4"/> <constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="vES-W5-m4x" secondAttribute="centerX" id="1tN-p4-2m4"/>
<constraint firstItem="Ido-NQ-3MY" firstAttribute="top" secondItem="1Qo-iG-CQt" secondAttribute="bottom" constant="4" id="3MM-M7-OKF"/> <constraint firstItem="Ido-NQ-3MY" firstAttribute="top" secondItem="1Qo-iG-CQt" secondAttribute="bottom" constant="4" id="3MM-M7-OKF"/>
<constraint firstAttribute="bottom" secondItem="Bwc-sd-6gm" secondAttribute="bottom" constant="-80" id="3fF-7g-c6C"/> <constraint firstAttribute="bottom" secondItem="Bwc-sd-6gm" secondAttribute="bottom" constant="-80" id="3fF-7g-c6C"/>
<constraint firstItem="dbM-ja-dKO" firstAttribute="centerX" secondItem="Ul5-Al-s4J" secondAttribute="centerX" id="4dP-Qu-TlT"/>
<constraint firstItem="XuF-Sp-6JD" firstAttribute="centerX" secondItem="qal-PP-YtO" secondAttribute="centerX" id="7mj-3B-j0X"/> <constraint firstItem="XuF-Sp-6JD" firstAttribute="centerX" secondItem="qal-PP-YtO" secondAttribute="centerX" id="7mj-3B-j0X"/>
<constraint firstItem="NGk-Io-Buc" firstAttribute="top" secondItem="oSh-Ec-8Nf" secondAttribute="bottom" constant="8" symbolic="YES" id="8AC-MT-cz4"/> <constraint firstItem="NGk-Io-Buc" firstAttribute="top" secondItem="oSh-Ec-8Nf" secondAttribute="bottom" constant="8" symbolic="YES" id="8AC-MT-cz4"/>
<constraint firstItem="vES-W5-m4x" firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="92S-HP-Vk7"/> <constraint firstItem="vES-W5-m4x" firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="92S-HP-Vk7"/>
<constraint firstItem="d3u-Ze-9uf" firstAttribute="top" secondItem="Ul5-Al-s4J" secondAttribute="bottom" constant="8" symbolic="YES" id="98H-X6-7xw"/>
<constraint firstItem="Ido-NQ-3MY" firstAttribute="centerX" secondItem="1Qo-iG-CQt" secondAttribute="centerX" id="99M-8j-9Dt"/> <constraint firstItem="Ido-NQ-3MY" firstAttribute="centerX" secondItem="1Qo-iG-CQt" secondAttribute="centerX" id="99M-8j-9Dt"/>
<constraint firstAttribute="trailing" secondItem="Aue-Zx-6Mf" secondAttribute="trailing" constant="20" symbolic="YES" id="9Pu-34-g2q"/> <constraint firstAttribute="trailing" secondItem="Aue-Zx-6Mf" secondAttribute="trailing" constant="20" symbolic="YES" id="9Pu-34-g2q"/>
<constraint firstItem="6II-KA-cNi" firstAttribute="top" secondItem="Bgn-Ne-fQ7" secondAttribute="bottom" constant="8" symbolic="YES" id="BfS-QZ-MfW"/>
<constraint firstItem="CnS-iI-dhr" firstAttribute="top" secondItem="OnR-s6-d4P" secondAttribute="bottom" constant="8" symbolic="YES" id="CGj-SL-Qhp"/> <constraint firstItem="CnS-iI-dhr" firstAttribute="top" secondItem="OnR-s6-d4P" secondAttribute="bottom" constant="8" symbolic="YES" id="CGj-SL-Qhp"/>
<constraint firstAttribute="trailing" secondItem="NGk-Io-Buc" secondAttribute="trailing" constant="20" symbolic="YES" id="DK5-VZ-db2"/> <constraint firstAttribute="trailing" secondItem="NGk-Io-Buc" secondAttribute="trailing" constant="20" symbolic="YES" id="DK5-VZ-db2"/>
<constraint firstItem="vES-W5-m4x" firstAttribute="centerY" secondItem="XuF-Sp-6JD" secondAttribute="centerY" id="DPa-1n-QWJ"/> <constraint firstItem="vES-W5-m4x" firstAttribute="centerY" secondItem="XuF-Sp-6JD" secondAttribute="centerY" id="DPa-1n-QWJ"/>
<constraint firstItem="Ul5-Al-s4J" firstAttribute="top" secondItem="dbM-ja-dKO" secondAttribute="bottom" constant="8" symbolic="YES" id="GJu-YJ-hEV"/> <constraint firstItem="6II-KA-cNi" firstAttribute="centerX" secondItem="vES-W5-m4x" secondAttribute="centerX" id="E1B-x0-Xhk"/>
<constraint firstAttribute="centerY" secondItem="iGR-wo-ual" secondAttribute="centerY" id="GZE-mX-kjj"/> <constraint firstAttribute="centerY" secondItem="iGR-wo-ual" secondAttribute="centerY" id="GZE-mX-kjj"/>
<constraint firstItem="Bgn-Ne-fQ7" firstAttribute="centerX" secondItem="dbM-ja-dKO" secondAttribute="centerX" id="HZ3-9P-tHh"/>
<constraint firstAttribute="centerY" secondItem="CnS-iI-dhr" secondAttribute="centerY" id="HjG-vb-3Qg"/> <constraint firstAttribute="centerY" secondItem="CnS-iI-dhr" secondAttribute="centerY" id="HjG-vb-3Qg"/>
<constraint firstItem="iGR-wo-ual" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="KNz-B2-qfi"/> <constraint firstItem="iGR-wo-ual" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="KNz-B2-qfi"/>
<constraint firstItem="Bwc-sd-6gm" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="-80" id="Kqb-ig-5cP"/> <constraint firstItem="Bwc-sd-6gm" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="-80" id="Kqb-ig-5cP"/>
@ -950,14 +979,14 @@
<constraint firstItem="gAU-xs-aae" firstAttribute="top" secondItem="Aue-Zx-6Mf" secondAttribute="bottom" constant="4" id="QkM-BN-dOT"/> <constraint firstItem="gAU-xs-aae" firstAttribute="top" secondItem="Aue-Zx-6Mf" secondAttribute="bottom" constant="4" id="QkM-BN-dOT"/>
<constraint firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="Qqi-bu-q65"/> <constraint firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="Qqi-bu-q65"/>
<constraint firstItem="brI-fg-Kav" firstAttribute="top" secondItem="UpZ-rb-NXd" secondAttribute="bottom" constant="4" id="Xc0-lG-4St"/> <constraint firstItem="brI-fg-Kav" firstAttribute="top" secondItem="UpZ-rb-NXd" secondAttribute="bottom" constant="4" id="Xc0-lG-4St"/>
<constraint firstItem="vES-W5-m4x" firstAttribute="centerX" secondItem="d3u-Ze-9uf" secondAttribute="centerX" id="YnC-cX-p8p"/> <constraint firstItem="6II-KA-cNi" firstAttribute="centerX" secondItem="Bgn-Ne-fQ7" secondAttribute="centerX" id="YH0-Su-oO4"/>
<constraint firstItem="qal-PP-YtO" firstAttribute="top" secondItem="XuF-Sp-6JD" secondAttribute="bottom" constant="4" id="YuB-MK-njZ"/> <constraint firstItem="qal-PP-YtO" firstAttribute="top" secondItem="XuF-Sp-6JD" secondAttribute="bottom" constant="4" id="YuB-MK-njZ"/>
<constraint firstItem="NGk-Io-Buc" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="ZVb-SX-b24"/> <constraint firstItem="NGk-Io-Buc" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="ZVb-SX-b24"/>
<constraint firstItem="1Qo-iG-CQt" firstAttribute="centerY" secondItem="vES-W5-m4x" secondAttribute="centerY" id="ZeK-3S-ZWW"/> <constraint firstItem="1Qo-iG-CQt" firstAttribute="centerY" secondItem="vES-W5-m4x" secondAttribute="centerY" id="ZeK-3S-ZWW"/>
<constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="UpZ-rb-NXd" secondAttribute="centerX" id="b9H-8D-b8a"/> <constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="UpZ-rb-NXd" secondAttribute="centerX" id="b9H-8D-b8a"/>
<constraint firstItem="vES-W5-m4x" firstAttribute="top" secondItem="6II-KA-cNi" secondAttribute="bottom" constant="8" symbolic="YES" id="bUR-ak-bXL"/>
<constraint firstAttribute="centerX" secondItem="oSh-Ec-8Nf" secondAttribute="centerX" id="c28-5a-C45"/> <constraint firstAttribute="centerX" secondItem="oSh-Ec-8Nf" secondAttribute="centerX" id="c28-5a-C45"/>
<constraint firstItem="oSh-Ec-8Nf" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" symbolic="YES" id="cUB-xF-1Wr"/> <constraint firstItem="oSh-Ec-8Nf" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" symbolic="YES" id="cUB-xF-1Wr"/>
<constraint firstItem="vES-W5-m4x" firstAttribute="top" secondItem="d3u-Ze-9uf" secondAttribute="bottom" constant="8" symbolic="YES" id="d3h-VT-ilM"/>
<constraint firstItem="XuF-Sp-6JD" firstAttribute="leading" secondItem="vES-W5-m4x" secondAttribute="trailing" constant="8" symbolic="YES" id="d43-2g-dap"/> <constraint firstItem="XuF-Sp-6JD" firstAttribute="leading" secondItem="vES-W5-m4x" secondAttribute="trailing" constant="8" symbolic="YES" id="d43-2g-dap"/>
<constraint firstAttribute="bottom" secondItem="R46-fx-n14" secondAttribute="bottom" constant="20" symbolic="YES" id="djJ-T6-7Rr"/> <constraint firstAttribute="bottom" secondItem="R46-fx-n14" secondAttribute="bottom" constant="20" symbolic="YES" id="djJ-T6-7Rr"/>
<constraint firstItem="OnR-s6-d4P" firstAttribute="top" secondItem="NGk-Io-Buc" secondAttribute="bottom" constant="8" symbolic="YES" id="dr2-eR-Yup"/> <constraint firstItem="OnR-s6-d4P" firstAttribute="top" secondItem="NGk-Io-Buc" secondAttribute="bottom" constant="8" symbolic="YES" id="dr2-eR-Yup"/>
@ -969,7 +998,6 @@
<constraint firstItem="9b3-wy-KBb" firstAttribute="top" secondItem="vES-W5-m4x" secondAttribute="bottom" constant="4" id="hKa-2u-uL3"/> <constraint firstItem="9b3-wy-KBb" firstAttribute="top" secondItem="vES-W5-m4x" secondAttribute="bottom" constant="4" id="hKa-2u-uL3"/>
<constraint firstAttribute="centerX" secondItem="R46-fx-n14" secondAttribute="centerX" id="hvb-7h-xDS"/> <constraint firstAttribute="centerX" secondItem="R46-fx-n14" secondAttribute="centerX" id="hvb-7h-xDS"/>
<constraint firstItem="Bme-XK-MMc" firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="i7B-jz-xgm"/> <constraint firstItem="Bme-XK-MMc" firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="i7B-jz-xgm"/>
<constraint firstItem="d3u-Ze-9uf" firstAttribute="centerX" secondItem="Ul5-Al-s4J" secondAttribute="centerX" id="iAv-c7-e2h"/>
<constraint firstItem="lW3-2z-cEa" firstAttribute="top" secondItem="iGR-wo-ual" secondAttribute="bottom" constant="8" symbolic="YES" id="jg5-h1-0Gn"/> <constraint firstItem="lW3-2z-cEa" firstAttribute="top" secondItem="iGR-wo-ual" secondAttribute="bottom" constant="8" symbolic="YES" id="jg5-h1-0Gn"/>
<constraint firstItem="vES-W5-m4x" firstAttribute="leading" secondItem="1Qo-iG-CQt" secondAttribute="trailing" constant="8" symbolic="YES" id="kTZ-lP-vnR"/> <constraint firstItem="vES-W5-m4x" firstAttribute="leading" secondItem="1Qo-iG-CQt" secondAttribute="trailing" constant="8" symbolic="YES" id="kTZ-lP-vnR"/>
<constraint firstAttribute="centerX" secondItem="iGR-wo-ual" secondAttribute="centerX" id="kXB-yZ-sur"/> <constraint firstAttribute="centerX" secondItem="iGR-wo-ual" secondAttribute="centerX" id="kXB-yZ-sur"/>
@ -979,6 +1007,7 @@
<constraint firstItem="Bwc-sd-6gm" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="-80" id="tea-fv-b1S"/> <constraint firstItem="Bwc-sd-6gm" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="-80" id="tea-fv-b1S"/>
<constraint firstItem="uol-dE-I8H" firstAttribute="centerY" secondItem="brI-fg-Kav" secondAttribute="centerY" id="u7f-S8-wNq"/> <constraint firstItem="uol-dE-I8H" firstAttribute="centerY" secondItem="brI-fg-Kav" secondAttribute="centerY" id="u7f-S8-wNq"/>
<constraint firstItem="lW3-2z-cEa" firstAttribute="centerX" secondItem="iGR-wo-ual" secondAttribute="centerX" id="vML-2u-shw"/> <constraint firstItem="lW3-2z-cEa" firstAttribute="centerX" secondItem="iGR-wo-ual" secondAttribute="centerX" id="vML-2u-shw"/>
<constraint firstItem="Bgn-Ne-fQ7" firstAttribute="top" secondItem="dbM-ja-dKO" secondAttribute="bottom" constant="8" symbolic="YES" id="wb6-bk-HwO"/>
<constraint firstItem="uol-dE-I8H" firstAttribute="leading" secondItem="brI-fg-Kav" secondAttribute="trailing" constant="8" symbolic="YES" id="wjM-05-gD1"/> <constraint firstItem="uol-dE-I8H" firstAttribute="leading" secondItem="brI-fg-Kav" secondAttribute="trailing" constant="8" symbolic="YES" id="wjM-05-gD1"/>
<constraint firstItem="v80-wd-hUR" firstAttribute="bottom" secondItem="iGR-wo-ual" secondAttribute="bottom" id="xiX-8e-pNR"/> <constraint firstItem="v80-wd-hUR" firstAttribute="bottom" secondItem="iGR-wo-ual" secondAttribute="bottom" id="xiX-8e-pNR"/>
<constraint firstItem="v80-wd-hUR" firstAttribute="leading" secondItem="iGR-wo-ual" secondAttribute="leading" id="yVZ-Ar-5ov"/> <constraint firstItem="v80-wd-hUR" firstAttribute="leading" secondItem="iGR-wo-ual" secondAttribute="leading" id="yVZ-Ar-5ov"/>