Yosemite: use NSDateComponentsFormatter instead of custom time string code

This commit is contained in:
Mitchell Livingston 2014-10-17 05:12:00 +00:00
parent 953780f38e
commit a7444a21b5
6 changed files with 96 additions and 15 deletions

View File

@ -23,6 +23,7 @@
*****************************************************************************/
#import "InfoActivityViewController.h"
#import "NSApplicationAdditions.h"
#import "NSStringAdditions.h"
#import "PiecesView.h"
#import "Torrent.h"
@ -185,8 +186,23 @@
//uses a relative date, so can't be set once
[fDateAddedField setObjectValue: [torrent dateAdded]];
[fDownloadTimeField setStringValue: [NSString timeString: [torrent secondsDownloading] showSeconds: YES]];
[fSeedTimeField setStringValue: [NSString timeString: [torrent secondsSeeding] showSeconds: YES]];
if ([NSApp isOnYosemiteOrBetter]) {
static NSDateComponentsFormatter *timeFormatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
timeFormatter = [NSDateComponentsFormatter new];
timeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort;
timeFormatter.allowedUnits = NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
timeFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading;
});
[fDownloadTimeField setStringValue: [timeFormatter stringFromTimeInterval:[torrent secondsDownloading]]];
[fSeedTimeField setStringValue: [timeFormatter stringFromTimeInterval:[torrent secondsSeeding]]];
}
else {
[fDownloadTimeField setStringValue: [NSString timeString: [torrent secondsDownloading] includesTimeRemainingPhrase:NO showSeconds: YES]];
[fSeedTimeField setStringValue: [NSString timeString: [torrent secondsSeeding] includesTimeRemainingPhrase:NO showSeconds: YES]];
}
[fPiecesView updateView];
}

View File

@ -40,8 +40,8 @@
+ (NSString *) percentString: (CGFloat) progress longDecimals: (BOOL) longDecimals;
+ (NSString *) timeString: (uint64_t) seconds showSeconds: (BOOL) showSeconds;
+ (NSString *) timeString: (uint64_t) seconds showSeconds: (BOOL) showSeconds maxFields: (NSUInteger) max;
+ (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds;
+ (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds maxFields: (NSUInteger) max;
- (NSComparisonResult) compareNumeric: (NSString *) string; //simple compare method for strings with numbers (works for IP addresses)

View File

@ -153,13 +153,17 @@
return [NSString localizedStringWithFormat: @"%.1f%%", tr_truncd(progress * 100.0, 1)];
}
+ (NSString *) timeString: (uint64_t) seconds showSeconds: (BOOL) showSeconds
+ (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds
{
return [NSString timeString: seconds showSeconds: showSeconds maxFields: NSUIntegerMax];
return [NSString timeString: seconds
includesTimeRemainingPhrase: includesTimeRemainingPhrase
showSeconds: showSeconds
maxFields: NSUIntegerMax];
}
+ (NSString *) timeString: (uint64_t) seconds showSeconds: (BOOL) showSeconds maxFields: (NSUInteger) max
+ (NSString *) timeString: (uint64_t) seconds includesTimeRemainingPhrase: (BOOL) includesTimeRemainingPhrase showSeconds: (BOOL) showSeconds maxFields: (NSUInteger) max
{
NSAssert(![NSApp isOnYosemiteOrBetter], @"you should be using NSDateComponentsFormatter on >= 10.10");
NSParameterAssert(max > 0);
NSMutableArray * timeArray = [NSMutableArray arrayWithCapacity: MIN(max, 5)];
@ -200,7 +204,13 @@
if (max > 0 && showSeconds)
[timeArray addObject: [NSString stringWithFormat: NSLocalizedString(@"%u sec", "time string"), remaining]];
return [timeArray componentsJoinedByString: @" "];
NSString * timeString = [timeArray componentsJoinedByString: @" "];
if (includesTimeRemainingPhrase) {
timeString = [NSString stringWithFormat: NSLocalizedString(@"%@ remaining", "time remaining string"), timeString];
}
return timeString;
}
- (NSComparisonResult) compareNumeric: (NSString *) string

View File

@ -196,8 +196,24 @@ tr_session * fLib = NULL;
: NSLocalizedString(@"Total N/A", "stats total");
[fRatioAllField setStringValue: totalRatioString];
[fTimeField setStringValue: [NSString timeString: statsSession.secondsActive showSeconds: NO]];
[fTimeAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString timeString: statsAll.secondsActive showSeconds: NO]]];
if ([NSApp isOnYosemiteOrBetter]) {
static NSDateComponentsFormatter *timeFormatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
timeFormatter = [NSDateComponentsFormatter new];
timeFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
timeFormatter.maximumUnitCount = 3;
timeFormatter.allowedUnits = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitWeekOfMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
timeFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading;
});
[fTimeField setStringValue: [timeFormatter stringFromTimeInterval:statsSession.secondsActive]];
[fTimeAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [timeFormatter stringFromTimeInterval:statsAll.secondsActive]]];
}
else {
[fTimeField setStringValue: [NSString timeString: statsSession.secondsActive includesTimeRemainingPhrase:NO showSeconds: NO]];
[fTimeAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString timeString: statsAll.secondsActive includesTimeRemainingPhrase:NO showSeconds: NO]]];
}
if (statsAll.sessionCount == 1)
[fNumOpenedField setStringValue: NSLocalizedString(@"1 time", "stats window -> times opened")];

View File

@ -25,6 +25,7 @@
#import "Torrent.h"
#import "GroupsController.h"
#import "FileListNode.h"
#import "NSApplicationAdditions.h"
#import "NSStringAdditions.h"
#import "TrackerNode.h"
@ -1980,10 +1981,28 @@ int trashDataFile(const char * filename)
else
return NSLocalizedString(@"remaining time unknown", "Torrent -> eta string");
NSString * idleString = [NSString stringWithFormat: NSLocalizedString(@"%@ remaining", "Torrent -> eta string"),
[NSString timeString: eta showSeconds: YES maxFields: 2]];
if (fromIdle)
NSString * idleString;
if ([NSApp isOnYosemiteOrBetter]) {
static NSDateComponentsFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatter = [NSDateComponentsFormatter new];
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleShort;
formatter.maximumUnitCount = 2;
formatter.collapsesLargestUnit = YES;
formatter.includesTimeRemainingPhrase = YES;
});
idleString = [formatter stringFromTimeInterval: eta];
}
else {
idleString = [NSString timeString: eta includesTimeRemainingPhrase: YES showSeconds: YES maxFields: 2];
}
if (fromIdle) {
idleString = [idleString stringByAppendingFormat: @" (%@)", NSLocalizedString(@"inactive", "Torrent -> eta string")];
}
return idleString;
}

View File

@ -23,6 +23,7 @@
*****************************************************************************/
#import "TrackerNode.h"
#import "NSApplicationAdditions.h"
#import "NSStringAdditions.h"
@implementation TrackerNode
@ -156,9 +157,28 @@
return [NSLocalizedString(@"Announce in progress", "Tracker next announce") stringByAppendingEllipsis];
case TR_TRACKER_WAITING:
{
const NSTimeInterval nextAnnounceTimeLeft = fStat.nextAnnounceTime - [[NSDate date] timeIntervalSince1970];
NSString *timeString;
if ([NSApp isOnYosemiteOrBetter]) {
static NSDateComponentsFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatter = [NSDateComponentsFormatter new];
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated;
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading;
formatter.collapsesLargestUnit = YES;
});
timeString = [formatter stringFromTimeInterval: nextAnnounceTimeLeft];
}
else {
timeString = [NSString timeString: nextAnnounceTimeLeft includesTimeRemainingPhrase: NO showSeconds: YES];
}
return [NSString stringWithFormat: NSLocalizedString(@"Next announce in %@", "Tracker next announce"),
[NSString timeString: fStat.nextAnnounceTime - [[NSDate date] timeIntervalSince1970] showSeconds: YES]];
timeString];
}
case TR_TRACKER_QUEUED:
return [NSLocalizedString(@"Announce is queued", "Tracker next announce") stringByAppendingEllipsis];