From f3cd0b0797b375d9ebbeda1f3c1665a9ea628d7d Mon Sep 17 00:00:00 2001 From: Ronald Wampler Date: Tue, 11 Apr 2017 22:01:29 -0400 Subject: [PATCH] Resolve ambiguous autolayout issues Most of these layout changes are related to the common pattern we used to set constraints for "dividers", where one of the dividers is specified to be connected to both edges of its superview then setting the other dividers' constraints to have equal widths (e.g., @"H:|[divider(==divider2,==divider3)]"). On 10.12, this now appears to result in ambiguous layout. We can resolve it by connecting at least one of the edges for each divider to its superview. --- Applications/TextMate/src/Favorites.mm | 18 ++++++++++--- Frameworks/CommitWindow/src/CommitWindow.mm | 7 +++++ .../HTMLOutput/src/browser/HOBrowserView.mm | 2 +- .../HTMLOutput/src/browser/HOStatusBar.mm | 2 +- Frameworks/OakAppKit/src/OakTabItemView.mm | 1 + .../OakFileBrowser/src/ui/OFBActionsView.mm | 6 +++-- .../OakFileBrowser/src/ui/OFBHeaderView.mm | 2 +- .../OakFilterList/src/BundleItemChooser.mm | 7 ++++- Frameworks/OakFilterList/src/FileChooser.mm | 20 ++++++++++---- Frameworks/OakFilterList/src/SymbolChooser.mm | 13 +++++++--- Frameworks/OakTextView/src/OTVStatusBar.mm | 26 ++++++++++++++----- Frameworks/OakTextView/src/OakDocumentView.mm | 5 ++++ 12 files changed, 85 insertions(+), 24 deletions(-) diff --git a/Applications/TextMate/src/Favorites.mm b/Applications/TextMate/src/Favorites.mm index c1a20f00..7fa6760b 100644 --- a/Applications/TextMate/src/Favorites.mm +++ b/Applications/TextMate/src/Favorites.mm @@ -70,14 +70,19 @@ 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]); + NSDictionary* views = @{ @"searchField" : self.searchField, - @"aboveScopeBarDark" : OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]), - @"aboveScopeBarLight" : OakCreateHorizontalLine([NSColor colorWithCalibratedWhite:0.797 alpha:1], [NSColor colorWithCalibratedWhite:0.912 alpha:1]), + @"aboveScopeBarDark" : aboveScopeBarDark, + @"aboveScopeBarLight" : aboveScopeBarLight, @"scopeBar" : scopeBar, - @"topDivider" : OakCreateHorizontalLine([NSColor darkGrayColor], [NSColor colorWithCalibratedWhite:0.551 alpha:1]), + @"topDivider" : topDivider, @"scrollView" : self.scrollView, - @"bottomDivider" : OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]), + @"bottomDivider" : bottomDivider, @"statusTextField" : self.statusTextField, @"itemCountTextField" : self.itemCountTextField, }; @@ -91,6 +96,11 @@ static NSUInteger const kOakSourceIndexFavorites = 1; [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]]; self.sourceIndex = [[NSUserDefaults standardUserDefaults] integerForKey:kUserDefaultsOpenProjectSourceIndex]; diff --git a/Frameworks/CommitWindow/src/CommitWindow.mm b/Frameworks/CommitWindow/src/CommitWindow.mm index 444a86d6..0985cd1c 100644 --- a/Frameworks/CommitWindow/src/CommitWindow.mm +++ b/Frameworks/CommitWindow/src/CommitWindow.mm @@ -185,6 +185,10 @@ static void* kOakCommitWindowIncludeItemBinding = &kOakCommitWindowIncludeItemBi [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[previousMessages(>=200)]-(20)-|" options:0 metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[documentView(>=400,==topDocumentViewDivider,==bottomDocumentViewDivider)]|" options:0 metrics:nil views:views]]; [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(20)-[showTableButton]" options:0 metrics:nil views:views]]; + + [contentView addConstraint:[NSLayoutConstraint constraintWithItem:_topDocumentViewDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + [contentView addConstraint:[NSLayoutConstraint constraintWithItem:_bottomDocumentViewDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + [contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(12)-[previousMessages]-(12)-[topDocumentViewDivider][documentView][bottomDocumentViewDivider]-(12)-[showTableButton]" options:0 metrics:nil views:views]]; if(self.showsTableView) @@ -366,6 +370,9 @@ static void* kOakCommitWindowIncludeItemBinding = &kOakCommitWindowIncludeItemBi [scrollViewConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[showTableButton]-(12)-[topScrollViewDivider][scrollView][bottomScrollViewDivider]" options:0 metrics:nil views:views]]; [scrollViewConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView(==topScrollViewDivider,==bottomScrollViewDivider)]|" options:0 metrics:nil views:views]]; + [scrollViewConstraints addObject:[NSLayoutConstraint constraintWithItem:_topScrollViewDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + [scrollViewConstraints addObject:[NSLayoutConstraint constraintWithItem:_bottomScrollViewDivider attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + _scrollViewConstraints = scrollViewConstraints; _scrollViewHeightConstraint = [NSLayoutConstraint constraintWithItem:_scrollView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0]; [contentView addConstraints:_scrollViewConstraints]; diff --git a/Frameworks/HTMLOutput/src/browser/HOBrowserView.mm b/Frameworks/HTMLOutput/src/browser/HOBrowserView.mm index e46a4134..ae22a3fc 100644 --- a/Frameworks/HTMLOutput/src/browser/HOBrowserView.mm +++ b/Frameworks/HTMLOutput/src/browser/HOBrowserView.mm @@ -51,7 +51,7 @@ static void ShowLoadErrorForURL (WebFrame* frame, NSURL* url, NSError* error) OakAddAutoLayoutViewsToSuperview([views allValues], self); - [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView(==statusBar,==divider)]|" options:NSLayoutFormatAlignAllTop metrics:nil views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView(==statusBar,==divider)]|" options:NSLayoutFormatAlignAllTop metrics:nil views:views]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[webView(>=10)][divider][statusBar]|" options:NSLayoutFormatAlignAllLeading metrics:nil views:views]]; } return self; diff --git a/Frameworks/HTMLOutput/src/browser/HOStatusBar.mm b/Frameworks/HTMLOutput/src/browser/HOStatusBar.mm index bea906fe..ec0811a1 100644 --- a/Frameworks/HTMLOutput/src/browser/HOStatusBar.mm +++ b/Frameworks/HTMLOutput/src/browser/HOStatusBar.mm @@ -106,7 +106,7 @@ static NSTextField* OakCreateTextField () NSArray* layout = @[ @"H:|-(3)-[back(==22)]-(2)-[forward(==back)]-(2)-[divider]", - @"V:|[back(==forward,==divider)]|", + @"V:|[back(==forward,==divider)]|", @"V:|[forward]|", @"V:|[divider]|", @"V:[status]-5-|", ]; diff --git a/Frameworks/OakAppKit/src/OakTabItemView.mm b/Frameworks/OakAppKit/src/OakTabItemView.mm index 4cb2f41f..fd69832a 100644 --- a/Frameworks/OakAppKit/src/OakTabItemView.mm +++ b/Frameworks/OakAppKit/src/OakTabItemView.mm @@ -346,6 +346,7 @@ static NSString* kUserDefaultsTabItemLineBreakStyleKey = @"tabItemLineBreakStyle NSDictionary* views = @{ @"left" : _leftCapView, @"right" : _rightCapView, @"title" : _textField, @"close" : _closeButton, @"overflow" : (_overflowButton ?: [NSNull null]) }; [_myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[left]-(3)-[close]-(>=3)-[title]-(>=3)-[right]-(0@450)-|" options:0 metrics:nil views:views]]; [_myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[left(==right)]|" options:0 metrics:nil views:views]]; + [_myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[right]|" options:0 metrics:nil views:views]]; [_myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[close]-(5)-|" options:0 metrics:nil views:views]]; [_myConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[title]-(5)-|" options:0 metrics:nil views:views]]; diff --git a/Frameworks/OakFileBrowser/src/ui/OFBActionsView.mm b/Frameworks/OakFileBrowser/src/ui/OFBActionsView.mm index 2dab0be0..eace15a0 100644 --- a/Frameworks/OakFileBrowser/src/ui/OFBActionsView.mm +++ b/Frameworks/OakFileBrowser/src/ui/OFBActionsView.mm @@ -47,9 +47,11 @@ static NSButton* OakCreateImageButton (NSImage* image) [wrappedActionsPopUpButton addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[popup]|" options:0 metrics:nil views:@{ @"popup" : self.actionsPopUpButton }]]; [wrappedActionsPopUpButton addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[popup]|" options:0 metrics:nil views:@{ @"popup" : self.actionsPopUpButton }]]; + NSView* divider = OakCreateDividerImageView(); + NSDictionary* views = @{ @"create" : self.createButton, - @"divider" : OakCreateDividerImageView(), + @"divider" : divider, @"actions" : wrappedActionsPopUpButton, @"reload" : self.reloadButton, @"search" : self.searchButton, @@ -60,7 +62,7 @@ static NSButton* OakCreateImageButton (NSImage* image) OakAddAutoLayoutViewsToSuperview([views allValues], self); OakSetupKeyViewLoop(@[ self, _createButton, _actionsPopUpButton, _reloadButton, _searchButton, _favoritesButton, _scmButton ], NO); - [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-3-[create(==24)]-1-[divider]-5-[actions(==30)]-(>=8)-[reload(==22,==search,==favorites,==scm)][search]-1-[favorites]-2-[scm]-(12)-|" options:0 metrics:nil views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-3-[create(==24)]-1-[divider]-5-[actions(==30)]-(>=8)-[reload(==22,==search,==favorites,==scm)][search]-1-[favorites]-2-[scm]-(12)-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[create(==divider,==actions,==reload,==search,==favorites,==scm)]|" options:0 metrics:nil views:views]]; } return self; diff --git a/Frameworks/OakFileBrowser/src/ui/OFBHeaderView.mm b/Frameworks/OakFileBrowser/src/ui/OFBHeaderView.mm index 6c3653c8..09dbdae2 100644 --- a/Frameworks/OakFileBrowser/src/ui/OFBHeaderView.mm +++ b/Frameworks/OakFileBrowser/src/ui/OFBHeaderView.mm @@ -132,7 +132,7 @@ static NSPopUpButton* OakCreateFolderPopUpButton () OakAddAutoLayoutViewsToSuperview([views allValues], self); OakSetupKeyViewLoop(@[ self, _folderPopUpButton, _goBackButton, _goForwardButton ], NO); - [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(-3)-[folder(>=75)]-(3)-[divider]-(2)-[back(==22)]-(2)-[forward(==back)]-(3)-|" options:0 metrics:nil views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(-3)-[folder(>=75)]-(3)-[divider]-(2)-[back(==22)]-(2)-[forward(==back)]-(3)-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bottomDivider]|" options:0 metrics:nil views:views]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[folder(==divider,==back,==forward)][bottomDivider]|" options:0 metrics:nil views:views]]; diff --git a/Frameworks/OakFilterList/src/BundleItemChooser.mm b/Frameworks/OakFilterList/src/BundleItemChooser.mm index df7aafaa..a6d69da8 100644 --- a/Frameworks/OakFilterList/src/BundleItemChooser.mm +++ b/Frameworks/OakFilterList/src/BundleItemChooser.mm @@ -579,7 +579,12 @@ static std::vector relevant_items_in_scope (scope::context_t [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]]; - [self.window.contentView addConstraints:constraints]; + 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]; self.layoutConstraints = constraints; OakSetupKeyViewLoop(@[ (self.keyEquivalentInput ? self.keyEquivalentView : self.searchField), self.actionsPopUpButton, self.scopeBar, self.editButton, self.selectButton ]); diff --git a/Frameworks/OakFilterList/src/FileChooser.mm b/Frameworks/OakFilterList/src/FileChooser.mm index 4cd330a3..67617796 100644 --- a/Frameworks/OakFilterList/src/FileChooser.mm +++ b/Frameworks/OakFilterList/src/FileChooser.mm @@ -265,15 +265,20 @@ static NSDictionary* globs_for_path (std::string const& path) _progressIndicator.controlSize = NSSmallControlSize; _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]); + NSDictionary* views = @{ @"searchField" : self.searchField, - @"aboveScopeBarDark" : OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]), - @"aboveScopeBarLight" : OakCreateHorizontalLine([NSColor colorWithCalibratedWhite:0.797 alpha:1], [NSColor colorWithCalibratedWhite:0.912 alpha:1]), + @"aboveScopeBarDark" : aboveScopeBarDark, + @"aboveScopeBarLight" : aboveScopeBarLight, @"scopeBar" : scopeBar, - @"topDivider" : OakCreateHorizontalLine([NSColor darkGrayColor], [NSColor colorWithCalibratedWhite:0.551 alpha:1]), + @"topDivider" : topDivider, @"scrollView" : self.scrollView, - @"bottomDivider" : OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]), - @"statusTextField" : self.statusTextField, + @"bottomDivider" : bottomDivider, + @"statusTextField" : self.statusTextField, @"itemCountTextField" : self.itemCountTextField, @"progressIndicator" : _progressIndicator, }; @@ -287,6 +292,11 @@ static NSDictionary* globs_for_path (std::string const& path) [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]]; self.sourceIndex = [[NSUserDefaults standardUserDefaults] integerForKey:kUserDefaultsFileChooserSourceIndexKey]; diff --git a/Frameworks/OakFilterList/src/SymbolChooser.mm b/Frameworks/OakFilterList/src/SymbolChooser.mm index 0894884d..479a9f81 100644 --- a/Frameworks/OakFilterList/src/SymbolChooser.mm +++ b/Frameworks/OakFilterList/src/SymbolChooser.mm @@ -41,11 +41,14 @@ 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" : OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]), + @"topDivider" : topDivider, @"scrollView" : self.scrollView, - @"bottomDivider" : OakCreateHorizontalLine([NSColor grayColor], [NSColor lightGrayColor]), + @"bottomDivider" : bottomDivider, @"statusTextField" : self.statusTextField, @"itemCountTextField" : self.itemCountTextField, }; @@ -55,7 +58,11 @@ static SymbolChooserItem* CreateItem (OakDocument* document, text::pos_t const& [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 addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[statusTextField]-[itemCountTextField]-|" options:NSLayoutFormatAlignAllCenterY 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]]; + + [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]]; } return self; diff --git a/Frameworks/OakTextView/src/OTVStatusBar.mm b/Frameworks/OakTextView/src/OTVStatusBar.mm index 61df35e1..6d241c29 100644 --- a/Frameworks/OakTextView/src/OTVStatusBar.mm +++ b/Frameworks/OakTextView/src/OTVStatusBar.mm @@ -90,18 +90,26 @@ static NSMenuItem* OakCreateIndentMenuItem (NSString* title, SEL action, id targ [wrappedBundleItemsPopUpButton addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[popup]|" options:0 metrics:nil views:@{ @"popup" : self.bundleItemsPopUp }]]; [wrappedBundleItemsPopUpButton addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[popup]|" options:0 metrics:nil views:@{ @"popup" : self.bundleItemsPopUp }]]; + NSTextField* line = OakCreateTextField(@"Line:"); + + NSView* dividerOne = OakCreateDividerImageView(); + NSView* dividerTwo = OakCreateDividerImageView(); + NSView* dividerThree = OakCreateDividerImageView(); + NSView* dividerFour = OakCreateDividerImageView(); + NSView* dividerFive = OakCreateDividerImageView(); + NSDictionary* views = @{ - @"line" : OakCreateTextField(@"Line:"), + @"line" : line, @"selection" : self.selectionField, - @"dividerOne" : OakCreateDividerImageView(), + @"dividerOne" : dividerOne, @"grammar" : self.grammarPopUp, - @"dividerTwo" : OakCreateDividerImageView(), + @"dividerTwo" : dividerTwo, @"items" : wrappedBundleItemsPopUpButton, - @"dividerThree" : OakCreateDividerImageView(), + @"dividerThree" : dividerThree, @"tabSize" : self.tabSizePopUp, - @"dividerFour" : OakCreateDividerImageView(), + @"dividerFour" : dividerFour, @"symbol" : self.symbolPopUp, - @"dividerFive" : OakCreateDividerImageView(), + @"dividerFive" : dividerFive, @"recording" : self.macroRecordingButton, }; @@ -119,6 +127,12 @@ static NSMenuItem* OakCreateIndentMenuItem (NSString* title, SEL action, id targ [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[line]-[selection(>=50,<=225)]-8-[dividerOne]-(-2)-[grammar(>=125@400,>=50,<=225)]-5-[dividerTwo]-(-2)-[tabSize(<=102)]-4-[dividerThree]-5-[items(==30)]-4-[dividerFour]-(-2)-[symbol(>=125@450,>=50)]-5-[dividerFive]-6-[recording]-7-|" options:0 metrics:nil views:views]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[dividerOne(==dividerTwo,==dividerThree,==dividerFour,==dividerFive)]|" options:0 metrics:nil views:views]]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:dividerTwo attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:dividerThree attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:dividerFour attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:dividerFive attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; + // Baseline align text-controls [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[line]-[selection]-(>=1)-[grammar]-(>=1)-[tabSize]-(>=1)-[symbol]" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views]]; // Center non-text control diff --git a/Frameworks/OakTextView/src/OakDocumentView.mm b/Frameworks/OakTextView/src/OakDocumentView.mm index 239b9ded..33d6c681 100644 --- a/Frameworks/OakTextView/src/OakDocumentView.mm +++ b/Frameworks/OakTextView/src/OakDocumentView.mm @@ -92,6 +92,10 @@ static NSString* const kFoldingsColumnIdentifier = @"foldings"; gutterScrollView.borderType = NSNoBorder; gutterScrollView.documentView = gutterView; + [gutterScrollView.contentView addConstraint:[NSLayoutConstraint constraintWithItem:gutterView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:gutterScrollView.contentView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; + [gutterScrollView.contentView addConstraint:[NSLayoutConstraint constraintWithItem:gutterView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:gutterScrollView.contentView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; + [gutterScrollView.contentView addConstraint:[NSLayoutConstraint constraintWithItem:gutterView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:gutterScrollView.contentView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]]; + gutterDividerView = OakCreateVerticalLine(nil); statusDividerView = OakCreateHorizontalLine([NSColor colorWithCalibratedWhite:0.500 alpha:1], [NSColor colorWithCalibratedWhite:0.750 alpha:1]); @@ -125,6 +129,7 @@ static NSString* const kFoldingsColumnIdentifier = @"foldings"; { [stackedViews addObjectsFromArray:@[ statusDividerView, _statusBar ]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_statusBar(==statusDividerView)]|" options:NSLayoutFormatAlignAllLeft|NSLayoutFormatAlignAllRight metrics:nil views:NSDictionaryOfVariableBindings(statusDividerView, _statusBar)]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:statusDividerView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; } [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[gutterScrollView(==gutterView)][gutterDividerView][textScrollView(>=100)]|" options:NSLayoutFormatAlignAllTop|NSLayoutFormatAlignAllBottom metrics:nil views:NSDictionaryOfVariableBindings(gutterScrollView, gutterView, gutterDividerView, textScrollView)]];