From 8f32a740b356ba80864f2c66c070cc2e274197f6 Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Tue, 30 Oct 2018 20:46:55 +0700 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20use=20textured=20windows=20for?= =?UTF-8?q?=20Open=20Quickly=20(=E2=8C=98T)=20and=20friends?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When building on 10.14 the textured window look does not provide a borderless title bar look as the window content is lighter than the title bar. The solution is to move the search controls to the title bar, which is possible starting with 10.10. --- Applications/TextMate/src/Favorites.mm | 14 +--- .../OakFilterList/src/BundleItemChooser.mm | 69 +++++++++---------- Frameworks/OakFilterList/src/FileChooser.mm | 15 +--- Frameworks/OakFilterList/src/OakChooser.h | 1 + Frameworks/OakFilterList/src/OakChooser.mm | 35 ++++++++-- Frameworks/OakFilterList/src/SymbolChooser.mm | 12 +--- 6 files changed, 71 insertions(+), 75 deletions(-) diff --git a/Applications/TextMate/src/Favorites.mm b/Applications/TextMate/src/Favorites.mm index efaace84..9836f237 100644 --- a/Applications/TextMate/src/Favorites.mm +++ b/Applications/TextMate/src/Favorites.mm @@ -69,15 +69,10 @@ static NSUInteger const kOakSourceIndexFavorites = 1; OakScopeBarView* scopeBar = [OakScopeBarView new]; scopeBar.labels = self.sourceListLabels; - OakBackgroundFillView* aboveScopeBarDark = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); - OakBackgroundFillView* aboveScopeBarLight = OakCreateHorizontalLine([NSColor colorWithCalibratedWhite:0.797 alpha:1], [NSColor colorWithCalibratedWhite:0.912 alpha:1]); - OakBackgroundFillView* topDivider = OakCreateHorizontalLine([NSColor darkGrayColor], [NSColor colorWithCalibratedWhite:0.551 alpha:1]); - OakBackgroundFillView* bottomDivider = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); + OakBackgroundFillView* topDivider = OakCreateHorizontalLine([NSColor darkGrayColor], [NSColor colorWithCalibratedWhite:0.551 alpha:1]); + OakBackgroundFillView* bottomDivider = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); NSDictionary* views = @{ - @"searchField": self.searchField, - @"aboveScopeBarDark": aboveScopeBarDark, - @"aboveScopeBarLight": aboveScopeBarLight, @"scopeBar": scopeBar, @"topDivider": topDivider, @"scrollView": self.scrollView, @@ -90,17 +85,14 @@ static NSUInteger const kOakSourceIndexFavorites = 1; OakAddAutoLayoutViewsToSuperview([views allValues], contentView); OakSetupKeyViewLoop(@[ self.tableView, self.searchField, scopeBar ]); - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[searchField(>=50)]-(8)-|" options:0 metrics:nil views:views]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aboveScopeBarDark(==aboveScopeBarLight)]|" options:0 metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[scopeBar]-(>=8)-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==topDivider,==bottomDivider)]|" options:0 metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[statusTextField]-[itemCountTextField]-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; - [contentView addConstraint:[NSLayoutConstraint constraintWithItem:aboveScopeBarLight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [contentView addConstraint:[NSLayoutConstraint constraintWithItem:topDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [contentView addConstraint:[NSLayoutConstraint constraintWithItem:bottomDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(2)-[searchField]-(8)-[aboveScopeBarDark][aboveScopeBarLight]-(3)-[scopeBar]-(4)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[statusTextField]-(5)-|" options:0 metrics:nil views:views]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(4)-[scopeBar]-(4)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[statusTextField]-(5)-|" options:0 metrics:nil views:views]]; self.sourceIndex = [[NSUserDefaults standardUserDefaults] integerForKey:kUserDefaultsOpenProjectSourceIndex]; [scopeBar bind:NSValueBinding toObject:self withKeyPath:@"sourceIndex" options:nil]; diff --git a/Frameworks/OakFilterList/src/BundleItemChooser.mm b/Frameworks/OakFilterList/src/BundleItemChooser.mm index db7df054..061b197e 100644 --- a/Frameworks/OakFilterList/src/BundleItemChooser.mm +++ b/Frameworks/OakFilterList/src/BundleItemChooser.mm @@ -404,8 +404,6 @@ static std::vector relevant_items_in_scope (scope::context_t } @property (nonatomic) OakKeyEquivalentView* keyEquivalentView; @property (nonatomic) NSPopUpButton* actionsPopUpButton; -@property (nonatomic) NSView* aboveScopeBarDark; -@property (nonatomic) NSView* aboveScopeBarLight; @property (nonatomic) OakScopeBarView* scopeBar; @property (nonatomic) NSView* topDivider; @property (nonatomic) NSView* bottomDivider; @@ -470,9 +468,6 @@ static std::vector relevant_items_in_scope (scope::context_t [actionMenu addItem:[NSMenuItem separatorItem]]; [actionMenu addItemWithTitle:@"Search All Scopes" action:@selector(toggleSearchAllScopes:) keyEquivalent:key < 9 ? [NSString stringWithFormat:@"%c", '0' + (++key % 10)] : @""]; - self.aboveScopeBarDark = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); - self.aboveScopeBarLight = OakCreateHorizontalLine([NSColor colorWithCalibratedWhite:0.797 alpha:1], [NSColor colorWithCalibratedWhite:0.912 alpha:1]); - self.scopeBar = [OakScopeBarView new]; self.scopeBar.labels = _sourceListLabels; @@ -491,7 +486,29 @@ static std::vector relevant_items_in_scope (scope::context_t self.editButton.target = self; self.editButton.action = @selector(editItem:); - OakAddAutoLayoutViewsToSuperview([self.allViews allValues], self.window.contentView); + NSDictionary* views = @{ + @"scopeBar": self.scopeBar, + @"topDivider": self.topDivider, + @"scrollView": self.scrollView, + @"bottomDivider": self.bottomDivider, + @"status": self.statusTextField, + @"edit": self.editButton, + @"select": self.selectButton, + }; + + NSView* contentView = self.window.contentView; + OakAddAutoLayoutViewsToSuperview(views.allValues, contentView); + + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[scopeBar]-(>=8)-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==topDivider,==bottomDivider)]|" options:0 metrics:nil views:views]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(24)-[status]-[edit]-[select]-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(4)-[scopeBar]-(4)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[select]-(5)-|" options:0 metrics:nil views:views]]; + + [contentView addConstraint:[NSLayoutConstraint constraintWithItem:_topDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + [contentView addConstraint:[NSLayoutConstraint constraintWithItem:_bottomDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + + OakAddAutoLayoutViewsToSuperview(@[ self.actionsPopUpButton ], self.titleBarView); + [self.titleBarView removeConstraints:self.titleBarView.constraints]; [self setupLayoutConstraints]; [self.scopeBar bind:NSValueBinding toObject:self withKeyPath:@"sourceIndex" options:nil]; @@ -550,41 +567,17 @@ static std::vector relevant_items_in_scope (scope::context_t } } -- (NSDictionary*)allViews -{ - return @{ - @"searchField": self.keyEquivalentInput ? self.keyEquivalentView : self.searchField, - @"actions": self.actionsPopUpButton, - @"aboveScopeBarDark": self.aboveScopeBarDark, - @"aboveScopeBarLight": self.aboveScopeBarLight, - @"scopeBar": self.scopeBar, - @"topDivider": self.topDivider, - @"scrollView": self.scrollView, - @"bottomDivider": self.bottomDivider, - @"status": self.statusTextField, - @"edit": self.editButton, - @"select": self.selectButton, - }; -} - - (void)setupLayoutConstraints { - NSDictionary* views = self.allViews; + NSDictionary* views = @{ + @"searchField": self.keyEquivalentInput ? self.keyEquivalentView : self.searchField, + @"actions": self.actionsPopUpButton, + }; NSMutableArray* constraints = [NSMutableArray array]; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[searchField(>=50)]-[actions]-(8)-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aboveScopeBarDark(==aboveScopeBarLight)]|" options:0 metrics:nil views:views]]; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[scopeBar]-(>=8)-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views]]; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==topDivider,==bottomDivider)]|" options:0 metrics:nil views:views]]; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(24)-[status]-[edit]-[select]-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(2)-[searchField]-(8)-[aboveScopeBarDark][aboveScopeBarLight]-(3)-[scopeBar]-(4)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[select]-(5)-|" options:0 metrics:nil views:views]]; - - NSView* contentView = self.window.contentView; - [constraints addObject:[NSLayoutConstraint constraintWithItem:_aboveScopeBarLight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; - [constraints addObject:[NSLayoutConstraint constraintWithItem:_topDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; - [constraints addObject:[NSLayoutConstraint constraintWithItem:_bottomDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; - - [contentView addConstraints:constraints]; + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[searchField(>=50)]-[actions]-(8)-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(4)-[searchField]-(8)-|" options:0 metrics:nil views:views]]; + [self.titleBarView addConstraints:constraints]; self.layoutConstraints = constraints; OakSetupKeyViewLoop(@[ (self.keyEquivalentInput ? self.keyEquivalentView : self.searchField), self.actionsPopUpButton, self.scopeBar, self.editButton, self.selectButton ]); @@ -646,7 +639,7 @@ static std::vector relevant_items_in_scope (scope::context_t _keyEquivalentInput = flag; - NSView* contentView = self.window.contentView; + NSView* contentView = self.titleBarView; [contentView removeConstraints:self.layoutConstraints]; self.layoutConstraints = nil; diff --git a/Frameworks/OakFilterList/src/FileChooser.mm b/Frameworks/OakFilterList/src/FileChooser.mm index 90b30cf3..fb3ad890 100644 --- a/Frameworks/OakFilterList/src/FileChooser.mm +++ b/Frameworks/OakFilterList/src/FileChooser.mm @@ -253,7 +253,6 @@ static NSDictionary* globs_for_path (std::string const& path) _sourceListLabels = @[ @"All", @"Open Documents", @"Uncommitted Documents" ]; _searchResults = [NSMutableArray array]; - [self.window setContentBorderThickness:57 forEdge:NSMaxYEdge]; self.tableView.allowsMultipleSelection = YES; self.tableView.rowHeight = 38; @@ -265,15 +264,10 @@ static NSDictionary* globs_for_path (std::string const& path) _progressIndicator.controlSize = NSControlSizeSmall; _progressIndicator.displayedWhenStopped = NO; - OakBackgroundFillView* aboveScopeBarDark = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); - OakBackgroundFillView* aboveScopeBarLight = OakCreateHorizontalLine([NSColor colorWithCalibratedWhite:0.797 alpha:1], [NSColor colorWithCalibratedWhite:0.912 alpha:1]); - OakBackgroundFillView* topDivider = OakCreateHorizontalLine([NSColor darkGrayColor], [NSColor colorWithCalibratedWhite:0.551 alpha:1]); - OakBackgroundFillView* bottomDivider = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); + OakBackgroundFillView* topDivider = OakCreateHorizontalLine([NSColor darkGrayColor], [NSColor colorWithCalibratedWhite:0.551 alpha:1]); + OakBackgroundFillView* bottomDivider = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); NSDictionary* views = @{ - @"searchField": self.searchField, - @"aboveScopeBarDark": aboveScopeBarDark, - @"aboveScopeBarLight": aboveScopeBarLight, @"scopeBar": scopeBar, @"topDivider": topDivider, @"scrollView": self.scrollView, @@ -287,17 +281,14 @@ static NSDictionary* globs_for_path (std::string const& path) OakAddAutoLayoutViewsToSuperview([views allValues], contentView); OakSetupKeyViewLoop(@[ self.searchField, scopeBar ]); - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[searchField(>=50)]-(8)-|" options:0 metrics:nil views:views]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aboveScopeBarDark(==aboveScopeBarLight)]|" options:0 metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[scopeBar]-(>=8)-|" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==topDivider,==bottomDivider)]|" options:0 metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(24)-[statusTextField]-[itemCountTextField]-(4)-[progressIndicator]-(4)-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; - [contentView addConstraint:[NSLayoutConstraint constraintWithItem:aboveScopeBarLight attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [contentView addConstraint:[NSLayoutConstraint constraintWithItem:topDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [contentView addConstraint:[NSLayoutConstraint constraintWithItem:bottomDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(2)-[searchField]-(8)-[aboveScopeBarDark][aboveScopeBarLight]-(3)-[scopeBar]-(4)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[statusTextField]-(5)-|" options:0 metrics:nil views:views]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(4)-[scopeBar]-(4)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[statusTextField]-(5)-|" options:0 metrics:nil views:views]]; self.sourceIndex = [[NSUserDefaults standardUserDefaults] integerForKey:kUserDefaultsFileChooserSourceIndexKey]; diff --git a/Frameworks/OakFilterList/src/OakChooser.h b/Frameworks/OakFilterList/src/OakChooser.h index a994cbe6..750f6ffb 100644 --- a/Frameworks/OakFilterList/src/OakChooser.h +++ b/Frameworks/OakFilterList/src/OakChooser.h @@ -21,6 +21,7 @@ PUBLIC @interface OakChooser : NSResponder // For subclasses @property (nonatomic) NSArray* items; +@property (nonatomic, readonly) NSView* titleBarView; @property (nonatomic) NSSearchField* searchField; @property (nonatomic) NSScrollView* scrollView; @property (nonatomic) NSTableView* tableView; diff --git a/Frameworks/OakFilterList/src/OakChooser.mm b/Frameworks/OakFilterList/src/OakChooser.mm index c0c36da0..3ab014ef 100644 --- a/Frameworks/OakFilterList/src/OakChooser.mm +++ b/Frameworks/OakFilterList/src/OakChooser.mm @@ -112,6 +112,10 @@ NSMutableAttributedString* CreateAttributedStringWithMarkedUpRanges (std::string } @interface OakChooser () +{ + NSTitlebarAccessoryViewController* _accessoryViewController; + NSView* _titleBarView; +} @end static void* kFirstResponderBinding = &kFirstResponderBinding; @@ -173,11 +177,7 @@ static void* kFirstResponderBinding = &kFirstResponderBinding; [[_itemCountTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; [_itemCountTextField setContentHuggingPriority:NSLayoutPriorityDefaultHigh forOrientation:NSLayoutConstraintOrientationHorizontal]; - _window = [[NSPanel alloc] initWithContentRect:NSMakeRect(600, 700, 400, 500) styleMask:(NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable|NSWindowStyleMaskTexturedBackground) backing:NSBackingStoreBuffered defer:NO]; - [_window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; - [_window setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge]; - [_window setContentBorderThickness:32 forEdge:NSMaxYEdge]; - [_window setContentBorderThickness:23 forEdge:NSMinYEdge]; + _window = [[NSPanel alloc] initWithContentRect:NSMakeRect(600, 700, 400, 500) styleMask:(NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable) backing:NSBackingStoreBuffered defer:NO]; [[_window standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; [[_window standardWindowButton:NSWindowZoomButton] setHidden:YES]; _window.delegate = self; @@ -187,6 +187,13 @@ static void* kFirstResponderBinding = &kFirstResponderBinding; [_searchField bind:NSValueBinding toObject:self withKeyPath:@"filterString" options:nil]; [_window addObserver:self forKeyPath:@"firstResponder" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:kFirstResponderBinding]; + + if(NSView* titleBarView = self.titleBarView) + { + _accessoryViewController = [[NSTitlebarAccessoryViewController alloc] init]; + _accessoryViewController.view = titleBarView; + [self.window addTitlebarAccessoryViewController:_accessoryViewController]; + } } return self; } @@ -203,6 +210,24 @@ static void* kFirstResponderBinding = &kFirstResponderBinding; _tableView.delegate = nil; } +- (NSView*)titleBarView +{ + if(!_titleBarView) + { + _titleBarView = [[NSView alloc] initWithFrame:NSZeroRect]; + + NSDictionary* titleBarViews = @{ + @"searchField": self.searchField + }; + + OakAddAutoLayoutViewsToSuperview(titleBarViews.allValues, _titleBarView); + [_titleBarView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[searchField]-(8)-|" options:0 metrics:nil views:titleBarViews]]; + [_titleBarView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(4)-[searchField]-(8)-|" options:0 metrics:nil views:titleBarViews]]; + [_titleBarView setFrameSize:_titleBarView.fittingSize]; + } + return _titleBarView; +} + - (void)showWindow:(id)sender { [_window makeFirstResponder:_window.initialFirstResponder]; diff --git a/Frameworks/OakFilterList/src/SymbolChooser.mm b/Frameworks/OakFilterList/src/SymbolChooser.mm index f1398ac8..8c148990 100644 --- a/Frameworks/OakFilterList/src/SymbolChooser.mm +++ b/Frameworks/OakFilterList/src/SymbolChooser.mm @@ -41,12 +41,9 @@ static SymbolChooserItem* CreateItem (OakDocument* document, text::pos_t const& { self.window.title = @"Jump to Symbol"; - OakBackgroundFillView* topDivider = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); OakBackgroundFillView* bottomDivider = OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]); NSDictionary* views = @{ - @"searchField": self.searchField, - @"topDivider": topDivider, @"scrollView": self.scrollView, @"bottomDivider": bottomDivider, @"statusTextField": self.statusTextField, @@ -55,15 +52,12 @@ static SymbolChooserItem* CreateItem (OakDocument* document, text::pos_t const& NSView* contentView = self.window.contentView; OakAddAutoLayoutViewsToSuperview([views allValues], contentView); + OakSetupKeyViewLoop(@[ self.searchField ]); - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(8)-[searchField(>=50)]-(8)-|" options:0 metrics:nil views:views]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==topDivider,==bottomDivider)]|" options:0 metrics:nil views:views]]; - - [contentView addConstraint:[NSLayoutConstraint constraintWithItem:topDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==bottomDivider)]|" options:0 metrics:nil views:views]]; [contentView addConstraint:[NSLayoutConstraint constraintWithItem:bottomDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[statusTextField]-[itemCountTextField]-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; - [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(2)-[searchField]-(8)-[topDivider][scrollView(>=50)][bottomDivider]-(4)-[statusTextField]-(5)-|" options:0 metrics:nil views:views]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView(>=50)][bottomDivider]-(4)-[statusTextField]-(5)-|" options:0 metrics:nil views:views]]; } return self; }