Don’t use textured windows for Open Quickly (⌘T) and friends

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.
This commit is contained in:
Allan Odgaard
2018-10-30 20:46:55 +07:00
parent c50d92ba56
commit 8f32a740b3
6 changed files with 71 additions and 75 deletions

View File

@@ -404,8 +404,6 @@ static std::vector<bundles::item_ptr> 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<bundles::item_ptr> 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<bundles::item_ptr> 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<bundles::item_ptr> 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<bundles::item_ptr> 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;

View File

@@ -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];

View File

@@ -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;

View File

@@ -112,6 +112,10 @@ NSMutableAttributedString* CreateAttributedStringWithMarkedUpRanges (std::string
}
@interface OakChooser () <NSWindowDelegate, NSTextFieldDelegate, NSTableViewDataSource, NSTableViewDelegate, NSSearchFieldDelegate>
{
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];

View File

@@ -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;
}