// // TimeField.m // Cog // // Created by Vincent Spader on 2/22/09. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import "TimeField.h" static NSString *kTimerModeKey = @"timerShowTimeRemaining"; NSString *formatTimer(long minutes, long seconds, unichar prefix, int padding) { NSString *paddingChar = [NSString stringWithFormat:@"%C", (unichar)0x2007]; // Digit-width space NSString *paddingString = [@"" stringByPaddingToLength:padding withString:paddingChar startingAtIndex:0]; return [NSString localizedStringWithFormat:@"%@%C%lu:%02lu", paddingString, prefix, minutes, seconds]; } @implementation TimeField { BOOL showTimeRemaining; NSDictionary *fontAttributes; } - (void)awakeFromNib { showTimeRemaining = [[NSUserDefaults standardUserDefaults] boolForKey:kTimerModeKey]; NSFontDescriptor *fontDesc = [[NSFont systemFontOfSize:13] fontDescriptor]; NSDictionary *fontFeatureSettings = @{ NSFontFeatureTypeIdentifierKey: @(kNumberSpacingType), NSFontFeatureSelectorIdentifierKey: @(kMonospacedNumbersSelector) }; NSDictionary *fontFeatureAttributes = @{ NSFontFeatureSettingsAttribute: @[fontFeatureSettings] }; fontDesc = [fontDesc fontDescriptorByAddingAttributes:fontFeatureAttributes]; NSFont *font = [NSFont fontWithDescriptor:fontDesc size:13]; fontAttributes = @{ NSFontAttributeName: font }; } static int _log10(long minutes) { int ret = 1; while(minutes >= 10) { minutes /= 10; ret++; } return ret; } - (void)update { NSString *text; if(showTimeRemaining == NO) { long sec = self.currentTime; long sectotal = self.duration; int minutedigits = _log10(sec / 60); int otherminutedigits = _log10(sectotal / 60) + 1; // Plus hyphen int padding = MAX(0, otherminutedigits - minutedigits); text = formatTimer(sec / 60, sec % 60, 0x200B, padding); // Zero-width space } else { long sec = MAX(0, self.duration - self.currentTime); long sectotal = self.duration; int minutedigits = _log10(sec / 60) + 1; // Plus hyphen int otherminutedigits = _log10(sectotal / 60) + 1; // Also plus hyphen int padding = MAX(0, otherminutedigits - minutedigits); text = formatTimer(sec / 60, sec % 60, 0x2212, padding); // Minus } NSAttributedString *string = [[NSAttributedString alloc] initWithString:text attributes:fontAttributes]; [self setAttributedStringValue:string]; } - (void)mouseDown:(NSEvent *)theEvent { showTimeRemaining = !showTimeRemaining; [[NSUserDefaults standardUserDefaults] setBool:showTimeRemaining forKey:kTimerModeKey]; [self update]; } - (void)setCurrentTime:(NSInteger)currentTime { _currentTime = currentTime; [self update]; } @end