// // ColumnCell.m // Perforce // // Created by Adam Czubernat on 24.05.2013. // Copyright (c) 2013 PolSource. All rights reserved. // #import "ColumnCell.h" #define SPACING 4.0f @interface ColumnCell () - (void)drawOverlay:(CGRect)frame; - (void)drawUnreadBadge:(CGRect)frame; - (void)drawTagBadge:(CGRect)frame; - (void)drawGradientInFrame:(CGRect)frame color:(NSColor *)color; @end @implementation ColumnCell @synthesize overlayColor, unread, tag; static NSColor *selectionColor; static NSColor *textColor; static NSColor *textColorSelected; static NSImage *indicatorImage; static NSImage *selectedIndicatorImage; static NSImage *unreadBadgeImage; static NSImage *tagBadgeImage; - (id)init { if (self = [super init]) { [self setLineBreakMode:NSLineBreakByTruncatingTail]; [self setEditable:YES]; // Load images and colors static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ selectionColor = [NSUserDefaults colorForKey:kColorBackgroundColumnSelected]; textColor = [NSUserDefaults colorForKey:kColorTextColumn]; textColorSelected = [NSUserDefaults colorForKey:kColorTextColumnSelected]; indicatorImage = [NSImage imageNamed:@"ColumnArrow.png"]; selectedIndicatorImage = [NSImage imageNamed:@"ColumnArrowSelected.png"]; unreadBadgeImage = [NSImage imageNamed:@"UnreadIndicator.png"]; tagBadgeImage = [NSImage imageNamed:@"TagIndicator.png"]; }); } return self; } #pragma mark - Overrides - (NSRect)imageRectForBounds:(NSRect)frame { frame.origin.x = SPACING; frame.size.width = frame.size.height; return frame; } - (NSRect)titleRectForBounds:(NSRect)frame { CGFloat spacing = SPACING; CGSize size = self.titleSize; frame.origin.x = frame.size.height + 2.0f * spacing; frame.origin.y += trunc((frame.size.height - size.height) * 0.5f); frame.size.width = frame.size.width - frame.origin.x - spacing; frame.size.height -= trunc(frame.size.height - size.height); if (!self.isLeaf) frame.size.width -= indicatorImage.size.width; if (unread) frame.size.width -= frame.size.height + 2.0f; if (tag) frame.size.width -= frame.size.height + 2.0f; return frame; } - (void)drawWithFrame:(NSRect)frame inView:(NSView *)controlView { NSImage *image; NSColor *color; BOOL selected = self.isHighlighted; frame.size.width = controlView.frame.size.width; // Maximize cell's size frame.size.width -= 2.0f; // Offset to allow wspace for column divider // Draw selection if (selected) { // if (self.backgroundStyle) ... [selectionColor setFill]; NSRectFill(frame); } [self drawOverlay:frame]; // Draw image image = selected ? self.alternateImage : self.image; [image drawInRect:[self imageRectForBounds:frame] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0f respectFlipped:YES hints:nil]; if ([self showsFirstResponder]) { // Draw focus ring NSRect focusFrame = NSInsetRect([self titleRectForBounds:frame], -1, -1); [NSGraphicsContext saveGraphicsState]; NSSetFocusRingStyle(NSFocusRingOnly); [[NSBezierPath bezierPathWithRect:focusFrame] fill]; [NSGraphicsContext restoreGraphicsState]; } else { // Draw title NSMutableDictionary *titleAttributes = [[self attributedStringValue] attributesAtIndex:0 effectiveRange:0].mutableCopy; color = selected ? textColorSelected : textColor; [titleAttributes setObject:color forKey:NSForegroundColorAttributeName]; [self.title drawInRect:[self titleRectForBounds:frame] withAttributes:titleAttributes]; } [self drawUnreadBadge:frame]; [self drawTagBadge:frame]; if (self.isLeaf) // Don't draw indicator when it's not a directory return; // Draw an arrow indicator image = selected ? selectedIndicatorImage : indicatorImage; [image drawInRect:(CGRect) { frame.size.width - image.size.width, frame.origin.y + trunc((frame.size.height - image.size.height) * 0.5f), image.size, } fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0f respectFlipped:YES hints:nil]; } - (void)editWithFrame:(NSRect)frame inView:(NSView *)controlView editor:(NSTextView *)editor delegate:(id)anObject event:(NSEvent *)theEvent { frame = [self titleRectForBounds:frame]; [editor setFrame:(CGRect) { --frame.origin.x, frame.origin.y, frame.size }]; [editor setTextContainerInset:(NSSize) { 0.0f, 1.0f }]; [[editor textContainer] setLineFragmentPadding:1.0f]; [editor setAutoresizingMask:NSViewWidthSizable]; [editor setDrawsBackground:YES]; [editor setBackgroundColor:[NSColor whiteColor]]; editor.font = self.font; editor.string = self.title; editor.textColor = textColor; editor.delegate = (id)controlView; NSString *ext = [editor.string stringByDeletingPathExtension]; [editor setSelectedRange:(NSRange) { 0, ext.length ?: self.title.length }]; [controlView addSubview:editor]; [[controlView window] makeFirstResponder:editor]; } #pragma mark - Private - (void)drawOverlay:(CGRect)frame { if (!overlayColor) return; [self drawGradientInFrame:self.isHighlighted ? (CGRect) { frame.size.width - frame.size.height - 1.0f, frame.origin.y + 1.0f, frame.size.height, frame.size.height - 1.0f, } : (CGRect) { frame.origin.x, frame.origin.y + 1.0f, frame.size.width - frame.origin.x - 1.0f, frame.size.height - 1.0f, } color:overlayColor]; } - (void)drawUnreadBadge:(CGRect)frame { if (!unread) return; CGSize size = unreadBadgeImage.size; [unreadBadgeImage drawInRect:(CGRect) { self.isLeaf ? frame.size.width - (frame.size.height + size.width) * 0.5f - 1.0f : (frame.size.height - size.height) * 0.5f + SPACING, frame.origin.y + (self.isLeaf ? 0.0f : 1.0f) + (frame.size.height - size.height) * 0.5f, size } fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0f respectFlipped:YES hints:nil]; } - (void)drawTagBadge:(CGRect)frame { if (!tag) return; CGSize size = tagBadgeImage.size; CGRect rect = { self.isLeaf ? frame.size.width - (frame.size.height + size.width) * 0.5f - 1.0f : (frame.size.height - size.height) * 0.5f + SPACING, frame.origin.y + (self.isLeaf ? 0.0f : 1.0f) + (frame.size.height - size.height) * 0.5f, size }; if (unread) rect.origin.x -= size.height; [tagBadgeImage drawInRect:rect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0f respectFlipped:YES hints:nil]; } - (void)drawGradientInFrame:(CGRect)frame color:(NSColor *)color { CGFloat cornerSize = trunc(frame.size.height * 0.5f); NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:[color colorWithAlphaComponent:0.5f] endingColor:color]; NSBezierPath *bezier = [NSBezierPath bezierPathWithRoundedRect:frame xRadius:cornerSize yRadius:cornerSize]; [gradient drawInBezierPath:bezier angle:90.0f]; } #pragma mark - Public - (CGSize)titleSize { return [[self attributedStringValue] size]; } @end
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 15071 | alan_petersen |
Populate -o //guest/perforce_software/piper/... //guest/alan_petersen/piper/.... |
||
//guest/perforce_software/piper/mac/main/Perforce/Classes/ViewControllers/ColumnView/ColumnCell.m | |||||
#2 | 12961 | alan_petersen |
Piper 2.0 Mega Update New Features/Functionality - Added help menu redirecting to URL. - Added readonly property for creating new workspaces. - Added html hyperlinks for Copy link functionality. - Added functionality for managing Finder Favorite items in sidebar. - Redesigned the way mapping is stored in Piper. - First version of syncing finder sidebar items with workspace mapping. - Small sorting improvements. - Creating Projects directory inside users home folder. - Adding Projects folder to finder sidebar item. - Creating and removing symbolic links accordingly to mapped folders. - Preventing duplicate names in symbolic links. - Refreshing symbolic links on mapping change inside application. - Storing workspace and server details in p4 configuration for other applications to use. - Added contextual menu items for Finder integration. - Added services menu for Adobe Illustrator integration. - Keyboard shortcuts for Illustrator integration. - Code refactoring and fixes for mapping issues. - Added Finder functionality to edit all files in folder. - Added user friendly message when editing a file using Finder outside the workspace. - Implemented hidden automatic login when opening application using Finder integration. - Logging to file in ~/Library/Logs - Unified workspace and all files views to show both local and depot files and folders. - Removed my workspace view references and logic. - Editing unmapped files on server. - First version of adding file to unmapped folders. - Showing opened by and edit actions in column details for all depot files. - Improved mappings functionality. - Enabled same feature options for mapped and unmapped folders and files. - Redesigned from scratch mapping and unmapping procedures for adding and removing files. - Implemented cleaning workspace using new mapping functionality. Removed debug overlay coloring. - Automated workspace creation - Improvements in editing files already mapped to workspace. - Implemented deleting remote files. - Implemented first version of move operation for remote files. - Removing last workspace information when disconnecting from workspace using app menu. - Implemented editing and submitting using symbolic links in project folder. New finder menu service for symbolic links Show in Piper which acts like share link functionality. - New icons for files and folders not tracked in the filesystem. - Improvements in showing file using share link. - Switched to new way of retrieving files in order to show user changes. - Redesigned and implemented new functionality for chaining operations with mapping. - Improvements and redesign of Edit/add actions to use new chaining logic . Fixed issue with file edit. - Improvements in window showing when using services. - Simplified file loading so the local files appears only when remote are also loaded. - Improved deleting of untracked files to avoid mapping and marking for delete. - Enabling simple copy paste and moving of remote and local files. - Added abort for exception handling in order to force crashing application on critical failures - Added custom exception handling for catching runtime errors to log and crash instead of continuing in unstable state. - Changed file copying to use mark for add . - Simplified and fixed responding file representations to mapping changes. Bug Fixes - Fixed crash when synchronizing. - Fixed sync issue when downloading directory without file size information. - Fixed issue with unread list crashing when file is not existing on disk. - Fixed incorrect sync progress calculation. - Removed relative path issues. - Fixed many of case-sensitivity problems. - Fixed deprecated methods and related issues in OS X 10.10. - Fixed folder rename not updating in column view. Revised and fixed many potential problems from implicit casting. - Fixed missing sync button on fast sync completion. - Refreshing mapping on synchronization. Fixed symbolic links not appearing until app is restarted. - Fixed latest crashing of autosync. - Fixed loading indicator issues. - Fixed and redesigned submit dialog to work correctly with Submit All Files option in Finder. - Fixed multiple error messages on network outage. Redesigned showing errors in main window. - Fixed opening random locations when using Finder integration. - Fixed issue when panel was detached from parent window. - Fixed bug when creating new workspace wouldn't store default settings. - Fixed memory issues with network operations. - Fixes in relogging mappings and file listing. - Improvements in editing unmapped files. - Fixed crash when adding file outside workspace. - Fixed breadcrumbs control issue. - Fixed issue with double parent folders when opening unmapped files. - Fixed crashes on sync after mapping new files. - Fixed issue with editing file using Finder -- Merging code and additional fixes in add button functionality. - Fixed unsync not working - Fixed submit panel issue not selecting files with different name case. - Fixed missing revert and sync to workspace actions in some cases. - Fixed issue with Submit and Edit finder actions. Improvements in stability of finder integration. - Fixed issue with unsubmitted folders breaking status of files inside. - Fixed issue with added files not showing correct icon and status. - Fixed bug with file edit resulting in a new directory named exactly like a file. - Fixed issue with reloading of subpath resulting in untracked folders. - Fixed mapping issue when result was always view mapping not relative. - Fixed submit panel showing more than once. - Fixed illustrator services not working. - Fixed userdefaults preferences problem with workspace name being null. - Fixed userdefaults keypath problem of dot-containing workspace names. - Forcing recreating of browser to possibly prevent pre-10.10 errors with automatic workspace selection. - Fixed adding file to depot not presenting correct icon. - Fixed issues with reverting a file that was marked for add. - Presenting error when trying to submit untracked files. - Fixed issue when submit files service crashed when using unmapped files. - Fixed file representation disappearing when removing file. - Fixed issue with symlinks resolving working on 10.10 only. Issue related to workspace selection not showing. - Fixed error panel method calls unavailable in Mac OS versions before 10.10. Issue related to hanging error panels. - Fixed removing a local file resulting in action progress freezing. - Fixed open file not working after edit. - Fixing crash when mapping changed. Issue related to moving local file to unmapped folder and other similar cases. |
||
#1 | 11252 | alan_petersen | Rename/move file(s) | ||
//guest/perforce_software/piper/mac/Perforce/Classes/ViewControllers/ColumnView/ColumnCell.m | |||||
#1 | 10744 | alan_petersen | Rename/move file(s) | ||
//guest/perforce_software/piper/Perforce/Classes/ViewControllers/ColumnView/ColumnCell.m | |||||
#1 | 8919 | Matt Attaway | Initial add of Piper, a lightweight Perforce client for artists and designers. |