// BSD License: https://github.com/hokein/DockProgressBar #import @interface DockDownloadProgressBar : NSProgressIndicator + (DockDownloadProgressBar*)sharedDockDownloadProgressBar; - (void)setProgress:(float)progress; - (void)updateProgressBar; - (void)hideProgressBar; - (void)clear; @end @implementation DockDownloadProgressBar + (DockDownloadProgressBar*)sharedDockDownloadProgressBar { static DockDownloadProgressBar* progress_bar; NSDockTile* dock_tile = [NSApp dockTile]; if (!progress_bar) { progress_bar = [[DockDownloadProgressBar alloc] initWithFrame: NSMakeRect(0.0f, 0.0f, dock_tile.size.width, 15.0f)]; [progress_bar setStyle:NSProgressIndicatorBarStyle]; [progress_bar setIndeterminate:NO]; [progress_bar setBezeled:YES]; [progress_bar setMinValue:0]; [progress_bar setMaxValue:1]; [progress_bar setHidden:NO]; } if ([dock_tile contentView] == NULL) { NSImageView* content_view = [[NSImageView alloc] init]; [content_view setImage:[NSApp applicationIconImage]]; [dock_tile setContentView:content_view]; [content_view addSubview:progress_bar]; } return progress_bar; } - (void)drawRect:(NSRect)dirtyRect { // Draw edges of rounded rect. NSRect rect = NSInsetRect([self bounds], 1.0, 1.0); CGFloat radius = rect.size.height / 2; NSBezierPath* bezier_path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius]; [bezier_path setLineWidth:2.0]; [[NSColor grayColor] set]; [bezier_path stroke]; // Fill the rounded rect. rect = NSInsetRect(rect, 2.0, 2.0); radius = rect.size.height / 2; bezier_path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:radius yRadius:radius]; [bezier_path setLineWidth:1.0]; [bezier_path addClip]; // Calculate the progress width. rect.size.width = floor(rect.size.width * ([self doubleValue] / [self maxValue])); // Fill the progress bar with color blue. [[NSColor colorWithSRGBRed:0.2 green:0.6 blue:1 alpha:1] set]; NSRectFill(rect); } - (void)updateProgressBar { [self setHidden:NO]; [[NSApp dockTile] display]; } - (void)hideProgressBar { [self setHidden:YES]; [[NSApp dockTile] display]; } - (void)setProgress:(float)progress { [self setDoubleValue:progress]; } - (void)clear { [[NSApp dockTile] setContentView:NULL]; } @end