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

Reply via email to