Revision: 29173 http://sourceforge.net/p/bibdesk/svn/29173 Author: hofman Date: 2025-04-23 16:11:18 +0000 (Wed, 23 Apr 2025) Log Message: ----------- Always draww background in background view. Add it directly above the fileview when there is no enclosing scroll view. Encode and decode various views and cells.
Modified Paths: -------------- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h =================================================================== --- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h 2025-04-23 14:32:18 UTC (rev 29172) +++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h 2025-04-23 16:11:18 UTC (rev 29173) @@ -216,7 +216,6 @@ NSMapTable *_infoTable; NSUInteger _numberOfColumns; NSUInteger _numberOfRows; - NSColor *_backgroundColor; CFRunLoopTimerRef _zombieTimer; NSIndexSet *_selectionIndexes; CGLayerRef _selectionOverlay; Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m =================================================================== --- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m 2025-04-23 14:32:18 UTC (rev 29172) +++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m 2025-04-23 16:11:18 UTC (rev 29173) @@ -149,8 +149,6 @@ @property (nonatomic, strong) NSColor *backgroundColor; @end -static void FVFillBackgroundColorOrGradient(NSColor *backgroundColor, NSRect rect, NSRect bounds, NSWindow *window); - #pragma mark - @interface FVHighlightView : NSView { @@ -160,6 +158,7 @@ } @property (nonatomic, copy) NSArray *highlightRects; @property (nonatomic) FVHighlightStyle highlightStyle; +- (void)setHighlightStyleFromBackgroundColor:(NSColor *)color; @end #pragma mark - @@ -285,10 +284,7 @@ - (void)_stopPreviewing; - (void)_updatePreviewer; - (void)handlePreviewerWillClose:(NSNotification *)aNote; -- (void)_registerForKeyOrMainStateNotifications; -- (void)_unregisterForKeyOrMainStateNotifications; - (void)_updateHighlightRects; -- (void)_updateHighlightStyle; @end @@ -306,7 +302,7 @@ @synthesize numberOfColumns=_numberOfColumns; @dynamic editable; @dynamic allowsDownloading; -@synthesize backgroundColor=_backgroundColor; +@dynamic backgroundColor; @dynamic textColor; @dynamic subtitleColor; @dynamic font; @@ -361,15 +357,28 @@ + (BOOL)accessInstanceVariablesDirectly { return NO; } - (void)_commonInit { - _highlightView = [[FVHighlightView alloc] initWithFrame:[self bounds]]; - [_highlightView setHighlightStyle:floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9 ? FVHighlightStyleUnbordered : FVHighlightStyleBordered]; - [_highlightView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; - [self addSubview:_highlightView]; + NSRect frame = [self bounds]; - _contentView = [[FVDisplayView alloc] initWithFrame:[self bounds] delegate:self]; - [_contentView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; - [self addSubview:_contentView]; + if (_backgroundView == nil) { + _backgroundView = [[FVBackgroundView alloc] initWithFrame:frame]; + [_backgroundView setBackgroundColor:[[self class] defaultBackgroundColor]]; + [_backgroundView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + [self addSubview:_backgroundView]; + } + if (_highlightView == nil) { + _highlightView = [[FVHighlightView alloc] initWithFrame:frame]; + [_highlightView setHighlightStyleFromBackgroundColor:[_backgroundView backgroundColor]]; + [_highlightView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + [self addSubview:_highlightView]; + } + + if (_contentView == nil) { + _contentView = [[FVDisplayView alloc] initWithFrame:frame delegate:self]; + [_contentView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + [self addSubview:_contentView]; + } + // Icons keyed by URL; may contain icons that are no longer displayed. Keeping this as primary storage means that // rearranging/reloading is relatively cheap, since we don't recreate all FVIcon instances every time -reload is called. _iconCache = [[NSMutableDictionary alloc] init]; @@ -389,8 +398,6 @@ _rubberBandView = nil; _fvFlags.isMouseDown = NO; _fvFlags.isEditable = NO; - [self setBackgroundColor:[[self class] defaultBackgroundColor]]; - _selectionOverlay = NULL; _numberOfColumns = 1; _numberOfRows = 1; @@ -430,19 +437,23 @@ // @@ Dark mode - _titleCell = [[NSTextFieldCell alloc] initTextCell:@""]; - [_titleCell setFont:[NSFont systemFontOfSize:12.0]]; - [_titleCell setTextColor:[NSColor respondsToSelector:@selector(labelColor)] ? [NSColor labelColor] : [NSColor darkGrayColor]]; - [_titleCell setLineBreakMode:NSLineBreakByTruncatingTail]; - [_titleCell setAlignment:NSTextAlignmentCenter]; + if (_titleCell == nil) { + _titleCell = [[NSTextFieldCell alloc] initTextCell:@""]; + [_titleCell setFont:[NSFont systemFontOfSize:12.0]]; + [_titleCell setTextColor:[NSColor respondsToSelector:@selector(labelColor)] ? [NSColor labelColor] : [NSColor darkGrayColor]]; + [_titleCell setLineBreakMode:NSLineBreakByTruncatingTail]; + [_titleCell setAlignment:NSTextAlignmentCenter]; + } // @@ Dark mode - _subtitleCell = [[NSTextFieldCell alloc] initTextCell:@""]; - [_subtitleCell setFont:[NSFont systemFontOfSize:10.0]]; - [_subtitleCell setTextColor:[NSColor respondsToSelector:@selector(secondaryLabelColor)] ? [NSColor secondaryLabelColor] : [NSColor grayColor]]; - [_subtitleCell setLineBreakMode:NSLineBreakByTruncatingTail]; - [_subtitleCell setAlignment:NSTextAlignmentCenter]; + if (_subtitleCell == nil) { + _subtitleCell = [[NSTextFieldCell alloc] initTextCell:@""]; + [_subtitleCell setFont:[NSFont systemFontOfSize:10.0]]; + [_subtitleCell setTextColor:[NSColor respondsToSelector:@selector(secondaryLabelColor)] ? [NSColor secondaryLabelColor] : [NSColor grayColor]]; + [_subtitleCell setLineBreakMode:NSLineBreakByTruncatingTail]; + [_subtitleCell setAlignment:NSTextAlignmentCenter]; + } _leftArrow = nil; _rightArrow = nil; @@ -490,16 +501,34 @@ return self; } -- (id)initWithCoder:(NSCoder *)coder { +- (id)initWithCoder:(NSCoder *)coder +{ self = [super initWithCoder:coder]; if (self) { - for (NSView *view in [[self subviews] copy]) - [view removeFromSuperview]; + _backgroundView = [coder decodeObjectForKey:@"backgroundView"]; + _highlightView = [coder decodeObjectForKey:@"highlightView"]; + _contentView = [coder decodeObjectForKey:@"contentView"]; + _titleCell = [coder decodeObjectForKey:@"titleCell"]; + _subtitleCell = [coder decodeObjectForKey:@"subtitleCell"]; + for (NSView *view in [[self subviews] copy]) { + if ([view class] == [NSButton class]) + [view removeFromSuperview]; + } [self _commonInit]; } return self; } +- (void)encodeWithCoder:(NSCoder *)coder +{ + [super encodeWithCoder:coder]; + [coder encodeConditionalObject:_backgroundView forKey:@"backgroundView"]; + [coder encodeConditionalObject:_highlightView forKey:@"highlightView"]; + [coder encodeConditionalObject:_contentView forKey:@"contentView"]; + [coder encodeConditionalObject:_titleCell forKey:@"titleCell"]; + [coder encodeConditionalObject:_subtitleCell forKey:@"subtitleCell"]; +} + - (void)dealloc { CFRunLoopTimerInvalidate(_zombieTimer); @@ -512,8 +541,6 @@ // takes care of the timer as well [self _cancelDownloads]; [_operationQueue terminate]; - CGLayerRelease(_selectionOverlay); - _selectionOverlay = NULL; } - (BOOL)isFlipped { return YES; } @@ -520,21 +547,17 @@ #pragma mark API -- (void)setBackgroundColor:(NSColor *)aColor; +- (void)setBackgroundColor:(NSColor *)backgroundColor; { - if (_backgroundColor != aColor) { - if ([self window]) { - if (_backgroundColor == nil) - [self _unregisterForKeyOrMainStateNotifications]; - else if (aColor == nil) - [self _registerForKeyOrMainStateNotifications]; - } - _backgroundColor = [aColor copy]; - [_backgroundView setBackgroundColor:_backgroundColor]; - [self _updateHighlightStyle]; - } + [_backgroundView setBackgroundColor:backgroundColor]; + [_highlightView setHighlightStyleFromBackgroundColor:backgroundColor]; } +- (NSColor *)backgroundColor; +{ + return [_backgroundView backgroundColor]; +} + - (void)setTextColor:(NSColor *)aColor; { [_titleCell setTextColor:aColor]; @@ -675,9 +698,6 @@ // arrows out of place now, they will be added again when required when resetting the tracking rects [self _hideArrows]; - CGLayerRelease(_selectionOverlay); - _selectionOverlay = NULL; - NSPoint scrollPoint = [self scrollPercentage]; // the full view will likely need repainting, this also recalculates the grid @@ -1078,7 +1098,7 @@ NSScrollView *scrollView = [self enclosingScrollView]; if ((scrollView && [[notification object] isEqual:[self superview]]) || (scrollView == nil && [[notification object] isEqual:self])) { [self _recalculateGridSize]; - if (scrollView && _backgroundView) + if (scrollView) [_backgroundView setFrame:[scrollView bounds]]; } } @@ -1109,10 +1129,9 @@ object:nil]; } - if (_backgroundView) { - [_backgroundView removeFromSuperview]; - _backgroundView = nil; - [self _updateHighlightStyle]; + if ([_backgroundView superview] != self) { + [_backgroundView setFrame:[self bounds]]; + [self addSubview:_backgroundView positioned:NSWindowBelow relativeTo:nil]; } [[NSNotificationCenter defaultCenter] removeObserver:self name:NSViewFrameDidChangeNotification object:nil]; @@ -1132,77 +1151,22 @@ if ([self window] && [[self window] isKeyWindow] == NO) [self resetCursorRects]; - if (scrollView && floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) { - if (_backgroundView == nil) { - _backgroundView = [[FVBackgroundView alloc] initWithFrame:[scrollView bounds]]; - [_backgroundView setBackgroundColor:_backgroundColor]; - [scrollView addSubview:_backgroundView positioned:NSWindowBelow relativeTo:nil]; - [scrollView setDrawsBackground:NO]; - } - [self _updateHighlightStyle]; + if (scrollView) { + [_backgroundView setFrame:[scrollView bounds]]; + [scrollView addSubview:_backgroundView positioned:NSWindowBelow relativeTo:nil]; + [scrollView setDrawsBackground:NO]; } } } -- (void)_handleKeyOrMainStateNotification:(NSNotification *)note { - if (_backgroundColor == nil) { - if (_backgroundView == nil) - [self setNeedsDisplay:YES]; - else if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10) - [_backgroundView setNeedsDisplay:YES]; - } -} - -- (void)_registerForKeyOrMainStateNotifications { - NSWindow *window = [self window]; - if (window) { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidBecomeMainNotification object:window]; - [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidResignMainNotification object:window]; - [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidBecomeKeyNotification object:window]; - [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidResignKeyNotification object:window]; - } -} - -- (void)_unregisterForKeyOrMainStateNotifications { - NSWindow *window = [self window]; - if (window) { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc removeObserver:self name:NSWindowDidBecomeMainNotification object:window]; - [nc removeObserver:self name:NSWindowDidResignMainNotification object:window]; - [nc removeObserver:self name:NSWindowDidBecomeKeyNotification object:window]; - [nc removeObserver:self name:NSWindowDidResignKeyNotification object:window]; - } -} - - (void)viewWillMoveToWindow:(NSWindow *)newWindow { NSWindow *window = [self window]; if (newWindow == nil && [[_sliderWindow parentWindow] isEqual:window]) { [_sliderWindow orderOut:nil]; } - if (window && _backgroundColor == nil) { - [self _unregisterForKeyOrMainStateNotifications]; - } [super viewWillMoveToWindow:newWindow]; } -- (void)viewDidMoveToWindow { - // for redrawing background color - if ([self window] && _backgroundColor == nil) { - [self _registerForKeyOrMainStateNotifications]; - } - [super viewDidMoveToWindow]; -} - -- (void)viewDidChangeEffectiveAppearance { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpartial-availability" - [super viewDidChangeEffectiveAppearance]; -#pragma clang diagnostic pop - CGLayerRelease(_selectionOverlay); - _selectionOverlay = NULL; -} - #pragma mark Layout - (CGFloat)_columnWidth { return _iconSize.width + _padding.width; } @@ -1378,9 +1342,6 @@ [self willChangeValueForKey:@"iconScale"]; _iconSize = iconSize; [self didChangeValueForKey:@"iconScale"]; - - CGLayerRelease(_selectionOverlay); - _selectionOverlay = NULL; } _padding = padding; @@ -1424,9 +1385,6 @@ [self willChangeValueForKey:@"iconScale"]; _iconSize = iconSize; [self didChangeValueForKey:@"iconScale"]; - - CGLayerRelease(_selectionOverlay); - _selectionOverlay = NULL; } padding = _padding; @@ -2041,30 +1999,6 @@ [_highlightView setHighlightRects:highlightRects]; } -- (void)_updateHighlightStyle { - // for generic colors we want a border so always either the fill or the stroke contrasts - FVHighlightStyle highlightStyle = FVHighlightStyleBordered; - - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9) { - if (_backgroundColor == nil) { - // with a sidebar visual effect background we want a selection visual effect highlight - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_15 && _backgroundView) - highlightStyle = FVHighlightStyleTranslucent; - else - highlightStyle = FVHighlightStyleUnbordered; - } else if ([[_backgroundColor colorSpaceName] isEqualToString:NSNamedColorSpace] && [[_backgroundColor catalogNameComponent] isEqualToString:@"System"]) { - // for system background colors we can use a highlight without border - // except on 10.5- underPageBackgroundColor is very dark (or light in dark mode) - NSString *colorName = [_backgroundColor colorNameComponent]; - if (([colorName hasSuffix:@"BackgroundColor"] || [colorName hasSuffix:@"RowColor"]) && - (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_15 || [colorName isEqualToString:@"underPageBackgroundColor"] == NO)) - highlightStyle = FVHighlightStyleUnbordered; - } - } - - [_highlightView setHighlightStyle:highlightStyle]; -} - #pragma mark Cache thread - (void)_enqueueReleaseOperationForIcons:(NSArray *)icons; @@ -2647,13 +2581,6 @@ - (void)drawRect:(NSRect)rect; { - if (_backgroundView == nil && [[NSGraphicsContext currentContext] isDrawingToScreen]) { - // otherwise we see a blocky transition, which fades on the redraw when scrolling stops - if (_backgroundColor == nil && [[[self enclosingScrollView] contentView] copiesOnScroll]) - [[[self enclosingScrollView] contentView] setCopiesOnScroll:NO]; - FVFillBackgroundColorOrGradient(_backgroundColor, rect, [self visibleRect], [self window]); - } - #if DEBUG_GRID [[NSColor grayColor] set]; NSRect r = NSInsetRect([self bounds], [self _leftMargin], [self _topMargin]); @@ -5045,13 +4972,73 @@ return self; } +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + if (self) { + _backgroundColor = [coder decodeObjectForKey:@"backgroundColor"]; + [self _updateVisualEffectViewIfNeeded]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + [super encodeWithCoder:coder]; + [coder encodeObject:_backgroundColor forKey:@"backgroundColor"]; +} + - (BOOL)isFlipped { return YES; } - (NSView *)hitTest:(NSPoint)point { return nil; } -- (void)setBackgroundColor:(NSColor *)backgroundColor -{ +- (void)_handleKeyOrMainStateNotification:(NSNotification *)note { + [self setNeedsDisplay:YES]; +} + +- (void)_registerForKeyOrMainStateNotifications { + NSWindow *window = [self window]; + if (window) { + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidBecomeMainNotification object:window]; + [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidResignMainNotification object:window]; + [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidBecomeKeyNotification object:window]; + [nc addObserver:self selector:@selector(_handleKeyOrMainStateNotification:) name:NSWindowDidResignKeyNotification object:window]; + } +} + +- (void)_unregisterForKeyOrMainStateNotifications { + NSWindow *window = [self window]; + if (window) { + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + [nc removeObserver:self name:NSWindowDidBecomeMainNotification object:window]; + [nc removeObserver:self name:NSWindowDidResignMainNotification object:window]; + [nc removeObserver:self name:NSWindowDidBecomeKeyNotification object:window]; + [nc removeObserver:self name:NSWindowDidResignKeyNotification object:window]; + } +} + +- (void)viewWillMoveToWindow:(NSWindow *)newWindow { + if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10 && [self window] && _backgroundColor == nil) + [self _unregisterForKeyOrMainStateNotifications]; + [super viewWillMoveToWindow:newWindow]; +} + +- (void)viewDidMoveToWindow { + if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10 && [self window] && _backgroundColor == nil) + [self _registerForKeyOrMainStateNotifications]; + [super viewDidMoveToWindow]; +} + +- (void)setBackgroundColor:(NSColor *)backgroundColor { if (backgroundColor != _backgroundColor) { + if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10 && [self window]) { + if (_backgroundColor == nil) + [self _unregisterForKeyOrMainStateNotifications]; + else if (backgroundColor == nil) + [self _registerForKeyOrMainStateNotifications]; + } + _backgroundColor = backgroundColor; [self _updateVisualEffectViewIfNeeded]; @@ -5061,24 +5048,10 @@ - (void)drawRect:(NSRect)rect { - if ([[self subviews] count] == 0) - FVFillBackgroundColorOrGradient(_backgroundColor, rect, [self bounds], [self window]); -} - -@end - -static void FVFillBackgroundColorOrGradient(NSColor *backgroundColor, NSRect rect, NSRect bounds, NSWindow *window) { - // any solid color background should override the gradient code - if (backgroundColor) { - [backgroundColor setFill]; - NSRectFillUsingOperation(rect, NSCompositingOperationSourceOver); + if ([[self subviews] count]) { } - else if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9) { - if ([window isKeyWindow] || [window isMainWindow]) { - [[NSColor colorWithCalibratedWhite:218.0 / 255.0 alpha:1.0] setFill]; - } else { - [[NSColor colorWithCalibratedWhite:226.0 / 255.0 alpha:1.0] setFill]; - } + else if (_backgroundColor) { + [_backgroundColor setFill]; NSRectFillUsingOperation(rect, NSCompositingOperationSourceOver); } else { @@ -5091,6 +5064,7 @@ color anyway. */ FVAPIAssert(floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6, @"gradient background is only available on 10.7 and later"); + FVAPIAssert(floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_10, @"gradient background should not be drawn on 10.10 and later"); // should be RGBA space, since we're drawing to the screen CGColorSpaceRef cspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); @@ -5098,7 +5072,7 @@ CGGradientRef gradient; // color values from DigitalColor Meter on 10.7, using Generic RGB space - if ([window isKeyWindow] || [window isMainWindow]) { + if ([[self window] isKeyWindow] || [[self window] isMainWindow]) { // ordered as lower/upper const CGFloat components[8] = { 198.0 / 255.0, 207.0 / 255.0, 216.0 / 255.0, 1.0, 227.0 / 255.0, 232.0 / 255.0, 238.0 / 255.0, 1.0 }; gradient = CGGradientCreateWithColorComponents(cspace, components, locations, 2); @@ -5114,7 +5088,7 @@ // only draw the dirty part, but we need to use the full visible bounds as the gradient extent CGContextSaveGState(ctxt); CGContextClipToRect(ctxt, NSRectToCGRect(rect)); - CGContextDrawLinearGradient(ctxt, gradient, CGPointMake(0, NSMaxY(bounds)), CGPointMake(0, NSMinY(bounds)), 0); + CGContextDrawLinearGradient(ctxt, gradient, CGPointMake(0, NSMaxY([self bounds])), CGPointMake(0, NSMinY([self bounds])), 0); CGContextRestoreGState(ctxt); CGGradientRelease(gradient); @@ -5122,6 +5096,8 @@ } } +@end + #pragma mark - @implementation FVHighlightView @@ -5129,19 +5105,6 @@ @synthesize highlightRects=_highlightRects; @synthesize highlightStyle=_highlightStyle; -- (BOOL)isFlipped { return YES; } - -- (NSView *)hitTest:(NSPoint)point { return nil; } - -- (void)viewDidChangeEffectiveAppearance { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpartial-availability" - [super viewDidChangeEffectiveAppearance]; -#pragma clang diagnostic pop - CGLayerRelease(_layer); - _layer = NULL; -} - - (void)_updateMaskImage { if ([[self subviews] count]) { NSImage *image = nil; @@ -5163,6 +5126,35 @@ } } +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + if (self) { + _highlightStyle = [coder decodeIntegerForKey:@"highlightStyle"]; + [self _updateMaskImage]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + [super encodeWithCoder:coder]; + [coder encodeInteger:_highlightStyle forKey:@"highlightStyle"]; +} + +- (BOOL)isFlipped { return YES; } + +- (NSView *)hitTest:(NSPoint)point { return nil; } + +- (void)viewDidChangeEffectiveAppearance { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpartial-availability" + [super viewDidChangeEffectiveAppearance]; +#pragma clang diagnostic pop + CGLayerRelease(_layer); + _layer = NULL; +} + - (void)setHighlightRects:(NSArray *)array { if (array != _highlightRects) { @@ -5196,8 +5188,33 @@ } } -- (void)_drawHighlightInRect:(NSRect)aRect inContext:(CGContextRef)drawingContext; +- (void)setHighlightStyleFromBackgroundColor:(NSColor *)color { + // for generic colors we want a border so always either the fill or the stroke contrasts + FVHighlightStyle highlightStyle = FVHighlightStyleBordered; + + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_9) { + if (color == nil) { + // with a sidebar visual effect background we want a selection visual effect highlight + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_15) + highlightStyle = FVHighlightStyleTranslucent; + else + highlightStyle = FVHighlightStyleUnbordered; + } else if ([[color colorSpaceName] isEqualToString:NSNamedColorSpace] && [[color catalogNameComponent] isEqualToString:@"System"]) { + // for system background colors we can use a highlight without border + // except on 10.5- underPageBackgroundColor is very dark (or light in dark mode) + NSString *colorName = [color colorNameComponent]; + if (([colorName hasSuffix:@"BackgroundColor"] || [colorName hasSuffix:@"RowColor"]) && + (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_15 || [colorName isEqualToString:@"underPageBackgroundColor"] == NO)) + highlightStyle = FVHighlightStyleUnbordered; + } + } + + [self setHighlightStyle:highlightStyle]; +} + +- (void)_drawHighlightInRect:(NSRect)aRect inContext:(CGContextRef)drawingContext +{ if (NULL == _layer) { _layer = CGLayerCreateWithContext(drawingContext, CGSizeMake(NSWidth(aRect), NSHeight(aRect)), NULL); @@ -5295,6 +5312,24 @@ return self; } +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + if (self) { + _delegate = [coder decodeObjectForKey:@"delegate"]; + for (NSView *view in [[self subviews] copy]) { + [view removeFromSuperview]; + } + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + [super encodeWithCoder:coder]; + [coder encodeConditionalObject:_delegate forKey:@"delegate"]; +} + - (BOOL)isFlipped { return YES; } - (NSView *)hitTest:(NSPoint)point { return nil; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Bibdesk-commit mailing list Bibdesk-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-commit