feat: uint formatter with units
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
@import Cocoa;
|
@import Cocoa;
|
||||||
|
|
||||||
@interface StrictUIntFormatter : NSFormatter
|
@interface StrictUIntFormatter : NSFormatter
|
||||||
|
/// Note: must contain `%ld` and is used as formatter string.
|
||||||
|
@property (nullable, copy) NSString *unit;
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -3,11 +3,28 @@
|
|||||||
@implementation StrictUIntFormatter
|
@implementation StrictUIntFormatter
|
||||||
/// Display object as integer formatted string.
|
/// Display object as integer formatted string.
|
||||||
- (NSString *)stringForObjectValue:(id)obj {
|
- (NSString *)stringForObjectValue:(id)obj {
|
||||||
return [NSString stringWithFormat:@"%d", [[NSString stringWithFormat:@"%@", obj] intValue]];
|
NSString *str = [NSString stringWithFormat:@"%@", obj];
|
||||||
|
if (str.length == 0)
|
||||||
|
return @"";
|
||||||
|
if (self.unit)
|
||||||
|
return [NSString stringWithFormat:self.unit, [str integerValue]];
|
||||||
|
return [NSString stringWithFormat:@"%ld", [str integerValue]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *)editingStringForObjectValue:(id)obj {
|
||||||
|
NSString *str = [NSString stringWithFormat:@"%@", obj];
|
||||||
|
if (str.length == 0)
|
||||||
|
return @"";
|
||||||
|
return [NSString stringWithFormat:@"%ld", [str integerValue]];
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse any pasted input as integer.
|
/// Parse any pasted input as integer.
|
||||||
- (BOOL)getObjectValue:(out id _Nullable __autoreleasing *)obj forString:(NSString *)string errorDescription:(out NSString *__autoreleasing _Nullable *)error {
|
- (BOOL)getObjectValue:(out id _Nullable __autoreleasing *)obj forString:(NSString *)string errorDescription:(out NSString *__autoreleasing _Nullable *)error {
|
||||||
*obj = [[NSNumber numberWithInt:[string intValue]] stringValue];
|
if (string.length == 0) {
|
||||||
|
*obj = @"";
|
||||||
|
} else {
|
||||||
|
*obj = [[NSNumber numberWithInt:[string intValue]] stringValue];
|
||||||
|
}
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
/// Only digits, no other character allowed
|
/// Only digits, no other character allowed
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ static inline CGFloat NSMaxWidth(NSView *a, NSView *b) { return Max(NSWidth(a.fr
|
|||||||
// UI: TextFields
|
// UI: TextFields
|
||||||
+ (NSTextField*)label:(NSString*)text;
|
+ (NSTextField*)label:(NSString*)text;
|
||||||
+ (NSTextField*)inputField:(NSString*)placeholder width:(CGFloat)w;
|
+ (NSTextField*)inputField:(NSString*)placeholder width:(CGFloat)w;
|
||||||
+ (NSTextField*)integerField:(NSUInteger)placeholder width:(CGFloat)w;
|
+ (NSTextField*)integerField:(NSString*)placeholder unit:(nullable NSString*)unit width:(CGFloat)w;
|
||||||
+ (NSView*)labelColumn:(NSArray<NSString*>*)labels rowHeight:(CGFloat)h padding:(CGFloat)pad;
|
+ (NSView*)labelColumn:(NSArray<NSString*>*)labels rowHeight:(CGFloat)h padding:(CGFloat)pad;
|
||||||
// UI: Buttons
|
// UI: Buttons
|
||||||
+ (NSButton*)button:(NSString*)text;
|
+ (NSButton*)button:(NSString*)text;
|
||||||
|
|||||||
@@ -29,9 +29,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create input text field which only accepts integer values. (calls `inputField`) `21px` height.
|
/// Create input text field which only accepts integer values. (calls `inputField`) `21px` height.
|
||||||
+ (NSTextField*)integerField:(NSUInteger)placeholder width:(CGFloat)w {
|
/// `field.formatter` is of type `StrictUIntFormatter`.
|
||||||
NSTextField *input = [self inputField:[NSString stringWithFormat:@"%ld", placeholder] width:w];
|
+ (NSTextField*)integerField:(NSString*)placeholder unit:(nullable NSString*)unit width:(CGFloat)w {
|
||||||
|
NSTextField *input = [self inputField:placeholder width:w];
|
||||||
input.formatter = [StrictUIntFormatter new];
|
input.formatter = [StrictUIntFormatter new];
|
||||||
|
((StrictUIntFormatter*)input.formatter).unit = unit;
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
self.name = [[[NSView inputField:NSLocalizedString(@"Example Title", nil) width:0] placeIn:self x:x yTop:rowHeight] sizeToRight:PAD_S + 18];
|
self.name = [[[NSView inputField:NSLocalizedString(@"Example Title", nil) width:0] placeIn:self x:x yTop:rowHeight] sizeToRight:PAD_S + 18];
|
||||||
self.spinnerName = [[NSView activitySpinner] placeIn:self xRight:1 yTop:rowHeight + 2.5];
|
self.spinnerName = [[NSView activitySpinner] placeIn:self xRight:1 yTop:rowHeight + 2.5];
|
||||||
// 3. row
|
// 3. row
|
||||||
self.refreshNum = [[NSView integerField:30 width:85] placeIn:self x:x yTop:2*rowHeight];
|
self.refreshNum = [[NSView integerField:@"∞" unit:nil width:85] placeIn:self x:x yTop:2*rowHeight];
|
||||||
self.refreshUnit = [[NSView popupButton:120] placeIn:self x:NSMaxX(self.refreshNum.frame) + PAD_M yTop:2*rowHeight];
|
self.refreshUnit = [[NSView popupButton:120] placeIn:self x:NSMaxX(self.refreshNum.frame) + PAD_M yTop:2*rowHeight];
|
||||||
self.regexConverterButton = [[[[NSView buttonIcon:RSSImageRegexIcon size:19]
|
self.regexConverterButton = [[[[NSView buttonIcon:RSSImageRegexIcon size:19]
|
||||||
action:@selector(openRegexConverter) target:controller]
|
action:@selector(openRegexConverter) target:controller]
|
||||||
|
|||||||
Reference in New Issue
Block a user