mirror of
https://github.com/textmate/textmate.git
synced 2026-04-28 03:00:34 -04:00
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:
@@ -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;
|
||||
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user