update macOS group indicators (#3183)

* update macOS group indicators

proposal for updated Group indicators, inspired by Xcode, and ios Calendar.

Discussion over here: https://github.com/transmission/transmission/issues/3058

* Update TorrentCell.mm

resolve some pr isssues

* Update TorrentCell.mm

add a group indicator width definition
This commit is contained in:
SweetPPro 2022-06-08 22:13:29 +02:00 committed by GitHub
parent aabb8c809e
commit 7056765468
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 23 deletions

View File

@ -12,6 +12,7 @@
@property(nonatomic) BOOL hoverAction;
- (NSRect)iconRectForBounds:(NSRect)bounds;
- (NSRect)actionRectForBounds:(NSRect)bounds;
- (void)addTrackingAreasForView:(NSView*)controlView
inRect:(NSRect)cellFrame

View File

@ -16,6 +16,10 @@
#define IMAGE_SIZE_MIN 16.0
#define ERROR_IMAGE_SIZE 20.0
#define GROUP_IMAGE_WIDTH 4.0
#define GROUP_INSET_REG 4.0
#define GROUP_PADDING_REG 22.0
#define NORMAL_BUTTON_WIDTH 14.0
#define ACTION_BUTTON_WIDTH 16.0
@ -126,6 +130,16 @@
return NSMakeRect(NSMinX(bounds) + PADDING_HORIZONTAL, ceil(NSMidY(bounds) - imageSize * 0.5), imageSize, imageSize);
}
- (NSRect)actionRectForBounds:(NSRect)bounds
{
BOOL const minimal = [self.fDefaults boolForKey:@"SmallView"];
NSRect iconRect = [self iconRectForBounds:bounds];
iconRect.origin.x += minimal ? 0.0 : GROUP_INSET_REG * 2 + GROUP_IMAGE_WIDTH;
return iconRect;
}
- (NSCellHitResult)hitTestForEvent:(NSEvent*)event inRect:(NSRect)cellFrame ofView:(NSView*)controlView
{
NSPoint point = [controlView convertPoint:event.locationInWindow fromView:nil];
@ -271,7 +285,7 @@
[controlView addTrackingArea:area];
//action button
NSRect actionButtonRect = [self iconRectForBounds:cellFrame]; //use the whole icon
NSRect actionButtonRect = [self actionRectForBounds:cellFrame];
NSTrackingAreaOptions actionOptions = options;
if (NSMouseInRect(mouseLocation, actionButtonRect, controlView.flipped))
{
@ -296,34 +310,35 @@
[self drawBar:minimal ? [self barRectMinForBounds:cellFrame] : [self barRectRegForBounds:cellFrame]];
//group coloring
NSRect const iconRect = [self iconRectForBounds:cellFrame];
NSRect const parentRect = [self iconRectForBounds:cellFrame];
NSRect iconRect = NSMakeRect(parentRect.origin.x, parentRect.origin.y, parentRect.size.width, parentRect.size.height);
iconRect.origin.x += minimal ? 0 : GROUP_INSET_REG * 3;
NSInteger const groupValue = torrent.groupValue;
if (groupValue != -1)
{
NSRect groupRect = NSInsetRect(iconRect, -1.0, -2.0);
NSRect groupRect = NSInsetRect(parentRect, -1.0, -2.0);
if (!minimal)
{
groupRect.size.height -= 1.0;
groupRect.origin.y -= 1.0;
groupRect.size.height = cellFrame.size.height - (GROUP_INSET_REG * 4);
groupRect.size.width = GROUP_INSET_REG;
groupRect.origin.y -= GROUP_INSET_REG * 2;
groupRect.origin.x += GROUP_INSET_REG;
}
CGFloat const radius = minimal ? 3.0 : 6.0;
CGFloat const radius = GROUP_INSET_REG / 2;
CGFloat fractionOfBlendedColor = 0.05;
NSColor *groupColor = [GroupsController.groups colorForIndex:groupValue],
*darkGroupColor = [groupColor blendedColorWithFraction:0.2 ofColor:NSColor.whiteColor];
*darkGroupColor = [groupColor blendedColorWithFraction:fractionOfBlendedColor ofColor:NSColor.controlTextColor];
//border
NSBezierPath* bp = [NSBezierPath bezierPathWithRoundedRect:groupRect xRadius:radius yRadius:radius];
[darkGroupColor set];
bp.lineWidth = 2.0;
[bp stroke];
NSBezierPath* groupPath = [NSBezierPath bezierPathWithRoundedRect:groupRect xRadius:radius yRadius:radius];
//inside
bp = [NSBezierPath bezierPathWithRoundedRect:groupRect xRadius:radius yRadius:radius];
NSGradient* gradient = [[NSGradient alloc] initWithStartingColor:[groupColor blendedColorWithFraction:0.7
ofColor:NSColor.whiteColor]
endingColor:darkGroupColor];
[gradient drawInBezierPath:bp angle:90.0];
[groupPath setLineWidth:1.0];
[darkGroupColor setStroke];
[groupPath stroke];
[groupColor setFill];
[groupPath fill];
}
BOOL const error = torrent.anyErrorOrWarning;
@ -458,8 +473,10 @@
#warning image should use new gear
if (!self.fTracking && self.hoverAction)
{
NSRect actionRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height);
actionRect.origin.x += minimal ? 0.0 : GROUP_INSET_REG * 3;
NSImage* actionImage = [NSImage imageNamed:@"ActionHover"];
[actionImage drawInRect:[self actionButtonRectForBounds:cellFrame] fromRect:NSZeroRect
[actionImage drawInRect:[self actionButtonRectForBounds:actionRect] fromRect:NSZeroRect
operation:NSCompositingOperationSourceOver
fraction:1.0
respectFlipped:YES
@ -745,6 +762,7 @@
}
else
{
result.origin.x += GROUP_PADDING_REG;
result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE;
result.size.width = rightBound - NSMinX(result) - PADDING_HORIZONTAL;
}
@ -762,7 +780,7 @@
{
NSRect result;
result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE + PADDING_BETWEEN_TITLE_AND_PROGRESS;
result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + GROUP_PADDING_REG + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.size.height = HEIGHT_STATUS;
result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONTAL;
@ -775,7 +793,7 @@
NSRect result;
result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE + PADDING_BETWEEN_TITLE_AND_PROGRESS + HEIGHT_STATUS +
PADDING_BETWEEN_PROGRESS_AND_BAR + BAR_HEIGHT + PADDING_BETWEEN_BAR_AND_STATUS;
result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + GROUP_PADDING_REG + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_TITLE;
result.size.height = HEIGHT_STATUS;
result.size.width = NSMaxX(bounds) - NSMinX(result) - PADDING_HORIZONTAL;
@ -787,7 +805,7 @@
{
NSRect result;
result.size.height = BAR_HEIGHT;
result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_BAR;
result.origin.x = NSMinX(bounds) + PADDING_HORIZONTAL + GROUP_PADDING_REG + IMAGE_SIZE_REG + PADDING_BETWEEN_IMAGE_AND_BAR;
result.origin.y = NSMinY(bounds) + PADDING_ABOVE_TITLE + HEIGHT_TITLE + PADDING_BETWEEN_TITLE_AND_PROGRESS + HEIGHT_STATUS +
PADDING_BETWEEN_PROGRESS_AND_BAR;

View File

@ -758,7 +758,7 @@
return;
}
NSRect const rect = [self.fTorrentCell iconRectForBounds:[self rectOfRow:row]];
NSRect const rect = [self.fTorrentCell actionRectForBounds:[self rectOfRow:row]];
if (self.fActionPopoverShown)
{