Revision: 15020 http://sourceforge.net/p/skim-app/code/15020 Author: hofman Date: 2025-03-25 18:12:07 +0000 (Tue, 25 Mar 2025) Log Message: ----------- Fix layout of color swatch background with large size. Make radius of color swatches dependent on size.
Modified Paths: -------------- trunk/SKColorSwatch.m Modified: trunk/SKColorSwatch.m =================================================================== --- trunk/SKColorSwatch.m 2025-03-24 17:09:26 UTC (rev 15019) +++ trunk/SKColorSwatch.m 2025-03-25 18:12:07 UTC (rev 15020) @@ -58,15 +58,22 @@ #define COLOR_KEY @"color" -#define BEZEL_INSET_LEFTRIGHT 1.0 -#define BEZEL_INSET_TOP 1.0 -#define BEZEL_INSET_BOTTOM 2.0 -#define COLOR_INSET 2.0 +#define BEZEL_INSET_LEFT 1.0 +#define BEZEL_INSET_RIGHT 1.0 +#define BEZEL_INSET_TOP 1.0 +#define BEZEL_INSET_BOTTOM 2.0 +#define COLOR_INSET 2.0 -#define LARGE_SIZE_HEIGHT_OFFSET 10.0 -#define LARGE_SIZE_WIDTH_OUTSET 6.0 -#define REGULAR_BEZEL_WIDTH_OFFSET 4.0 +#define LARGE_SIZE_HEIGHT_OUTSET 4.5 +#define LARGE_SIZE_WIDTH_OUTSET 5.0 +#define BEZEL_WIDTH_OFFSET_REGULAR 4.0 +#define BEZEL_WIDTH_OFFSET_SMALL 0.0 +#define BEZEL_WIDTH_OFFSET_MINI 0.0 +#define BEZEL_WIDTH_OFFSET_LARGE 2.0 + +#define SKControlSizeLarge 3 + @interface SKColorSwatchBackgroundView : NSControl @property (nonatomic) CGFloat bezelWidth; @end @@ -257,7 +264,7 @@ } - (NSEdgeInsets)alignmentRectInsets { - return NSEdgeInsetsMake(BEZEL_INSET_TOP, BEZEL_INSET_LEFTRIGHT, BEZEL_INSET_BOTTOM, BEZEL_INSET_LEFTRIGHT); + return NSEdgeInsetsMake(BEZEL_INSET_TOP, BEZEL_INSET_LEFT, BEZEL_INSET_BOTTOM, BEZEL_INSET_RIGHT); } - (void)updateSubviewLayout { @@ -269,10 +276,8 @@ - (void)updateBezelHeight { CGFloat height = [[backgroundView cell] cellSize].height - BEZEL_INSET_TOP - BEZEL_INSET_BOTTOM; - if (@available(macOS 11.0, *)) { - if ([backgroundView controlSize] == NSControlSizeLarge) - height -= LARGE_SIZE_HEIGHT_OFFSET; - } + if ([backgroundView controlSize] == SKControlSizeLarge) + height -= 2.0 * LARGE_SIZE_HEIGHT_OUTSET; if (fabs(height - bezelHeight) > 0.0) { bezelHeight = height; [self updateSubviewLayout]; @@ -286,7 +291,12 @@ if (controlSize != [self controlSize]) { [super setControlSize:controlSize]; [backgroundView setControlSize:controlSize]; - [backgroundView setFrame:controlSize == 3 ? NSInsetRect([self bounds], -LARGE_SIZE_WIDTH_OUTSET, 0.0) : [self bounds]]; + NSRect bgFrame = [self bounds]; + if (controlSize == SKControlSizeLarge) { + bgFrame = NSInsetRect(bgFrame, -LARGE_SIZE_WIDTH_OUTSET, -LARGE_SIZE_HEIGHT_OUTSET); + bgFrame.origin.y = ceil(bgFrame.origin.y); + } + [backgroundView setFrame:bgFrame]; [self updateBezelHeight]; } } @@ -302,9 +312,12 @@ - (void)drawFocusRingMask { NSRect rect = [self focusRingMaskBounds]; if (NSIsEmptyRect(rect) == NO) { - CGFloat r = 2.0; + CGFloat r = 3.0; if (@available(macOS 11.0, *)) - r = 3.0; + r = ceil(0.25 * bezelHeight) - 3.0; + else + r = floor(0.25 * bezelHeight) - 3.0; + r = fmax(0.5, r); [[NSBezierPath bezierPathWithRoundedRect:rect xRadius:r yRadius:r] fill]; } } @@ -601,7 +614,7 @@ for (SKColorSwatchItemView *itemView in itemViews) [[itemView animator] setFrame:[self frameForItemViewAtIndex:i++ collapsedIndex:collapsedIndex]]; if (NSEqualSizes(size, NSZeroSize) == NO) { - [[backgroundView animator] setBezelWidth:size.width - 2.0 * BEZEL_INSET_LEFTRIGHT]; + [[backgroundView animator] setBezelWidth:size.width - BEZEL_INSET_LEFT - BEZEL_INSET_RIGHT]; if (autoResizes) [[self animator] setFrameSize:size]; } @@ -875,7 +888,7 @@ NSSegmentedCell *cell = [[NSSegmentedCell alloc] init]; [cell setSegmentCount:1]; [cell setSegmentStyle:NSSegmentStyleTexturedSquare]; - [cell setWidth:fmax(0.0, NSWidth(frameRect) - REGULAR_BEZEL_WIDTH_OFFSET - 2.0 * BEZEL_INSET_LEFTRIGHT) forSegment:0]; + [cell setWidth:fmax(0.0, NSWidth(frameRect) - BEZEL_WIDTH_OFFSET_REGULAR - BEZEL_INSET_LEFT - BEZEL_INSET_RIGHT) forSegment:0]; [self setCell:cell]; } return self; @@ -883,14 +896,22 @@ - (BOOL)canBecomeKeyView { return NO; } -#define BEZEL_WIDTH_OFFSET ([self controlSize] == NSControlSizeRegular ? REGULAR_BEZEL_WIDTH_OFFSET : 0.0) +- (CGFloat)bezelWidthOffset { + switch ([self controlSize]) { + case NSControlSizeRegular: return BEZEL_WIDTH_OFFSET_REGULAR; + case NSControlSizeSmall: return BEZEL_WIDTH_OFFSET_SMALL; + case NSControlSizeMini: return BEZEL_WIDTH_OFFSET_MINI; + case SKControlSizeLarge: return BEZEL_WIDTH_OFFSET_LARGE; + default: return BEZEL_WIDTH_OFFSET_REGULAR; + } +} - (CGFloat)bezelWidth { - return [[self cell] widthForSegment:0] + BEZEL_WIDTH_OFFSET; + return [[self cell] widthForSegment:0] + [self bezelWidthOffset]; } - (void)setBezelWidth:(CGFloat)width { - [[self cell] setWidth:width - BEZEL_WIDTH_OFFSET forSegment:0]; + [[self cell] setWidth:width - [self bezelWidthOffset] forSegment:0]; [self setNeedsDisplay:YES]; } @@ -964,9 +985,12 @@ if (NSWidth(rect) < 5.0) return; rect = NSInsetRect(rect, 2.0, 2.0); - CGFloat r = 2.0; + CGFloat r = 3.0; if (@available(macOS 11.0, *)) - r = 3.0; + r = ceil(0.25 * NSHeight(rect)) - 2.0; + else + r = floor(0.25 * NSHeight(rect) - 2.0); + r = fmax(0.5, r); BOOL disabled = NO; if (@available(macOS 10.14, *)) disabled = [[self window] isMainWindow] == NO && [[self window] isKeyWindow] == NO && ([self isDescendantOf:[[self window] contentView]] == NO || [[self window] isKindOfClass:NSClassFromString(@"NSToolbarSnapshotWindow")]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Skim-app-commit mailing list Skim-app-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/skim-app-commit