summaryrefslogtreecommitdiff
path: root/prev/spinbox_darwin.m
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2015-12-11 20:37:59 -0500
committerPietro Gagliardi <[email protected]>2015-12-11 20:37:59 -0500
commitf8e3f12ab02b528f2a05a4f713d7af7ea8e44b42 (patch)
tree82dedf4d37f0f6d31e88ebb2ca1ce6499dead261 /prev/spinbox_darwin.m
parente34c561ed5bedeb180437ec165882b98d70d38c1 (diff)
LET'S GET THIS FINAL REWRITE EVER STARTED
Diffstat (limited to 'prev/spinbox_darwin.m')
-rw-r--r--prev/spinbox_darwin.m125
1 files changed, 125 insertions, 0 deletions
diff --git a/prev/spinbox_darwin.m b/prev/spinbox_darwin.m
new file mode 100644
index 0000000..fddfbfd
--- /dev/null
+++ b/prev/spinbox_darwin.m
@@ -0,0 +1,125 @@
+// 29 october 2014
+
+#include "objc_darwin.h"
+#include "_cgo_export.h"
+#import <Cocoa/Cocoa.h>
+
+#define togoSpinbox(x) ((goSpinbox *) (x))
+
+@interface goSpinbox : NSObject {
+@public
+ void *gospinbox;
+ NSTextField *textfield;
+ NSNumberFormatter *formatter;
+ NSStepper *stepper;
+
+ NSInteger value;
+ NSInteger minimum;
+ NSInteger maximum;
+}
+@end
+
+@implementation goSpinbox
+
+- (id)initWithMinimum:(NSInteger)minimum maximum:(NSInteger)maximum
+{
+ self = [super init];
+ if (self == nil)
+ return nil;
+
+ self->textfield = (NSTextField *) newTextField();
+
+ self->formatter = [NSNumberFormatter new];
+ [self->formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
+ [self->formatter setLocalizesFormat:NO];
+ [self->formatter setUsesGroupingSeparator:NO];
+ [self->formatter setHasThousandSeparators:NO];
+ [self->formatter setAllowsFloats:NO];
+ // TODO partial string validation?
+ [self->textfield setFormatter:self->formatter];
+
+ self->stepper = [[NSStepper alloc] initWithFrame:NSZeroRect];
+ [self->stepper setIncrement:1];
+ [self->stepper setValueWraps:NO];
+ [self->stepper setAutorepeat:YES]; // hold mouse button to step repeatedly
+
+ // TODO how SHOULD the formatter treat invald input?
+
+ [self setMinimum:minimum];
+ [self setMaximum:maximum];
+ [self setValue:self->minimum];
+
+ [self->textfield setDelegate:self];
+ [self->stepper setTarget:self];
+ [self->stepper setAction:@selector(stepperClicked:)];
+
+ return self;
+}
+
+- (void)setValue:(NSInteger)value
+{
+ self->value = value;
+ if (self->value < self->minimum)
+ self->value = self->minimum;
+ if (self->value > self->maximum)
+ self->value = self->maximum;
+ [self->textfield setIntegerValue:self->value];
+ [self->stepper setIntegerValue:self->value];
+}
+
+- (void)setMinimum:(NSInteger)min
+{
+ self->minimum = min;
+ [self->formatter setMinimum:[NSNumber numberWithInteger:self->minimum]];
+ [self->stepper setMinValue:((double) (self->minimum))];
+}
+
+- (void)setMaximum:(NSInteger)max
+{
+ self->maximum = max;
+ [self->formatter setMaximum:[NSNumber numberWithInteger:self->maximum]];
+ [self->stepper setMaxValue:((double) (self->maximum))];
+}
+
+- (IBAction)stepperClicked:(id)sender
+{
+ [self setValue:[self->stepper integerValue]];
+ spinboxChanged(self->gospinbox);
+}
+
+- (void)controlTextDidChange:(NSNotification *)note
+{
+ [self setValue:[self->textfield integerValue]];
+ spinboxChanged(self->gospinbox);
+}
+
+@end
+
+id newSpinbox(void *gospinbox, intmax_t minimum, intmax_t maximum)
+{
+ goSpinbox *s;
+
+ s = [[goSpinbox new] initWithMinimum:((NSInteger) minimum) maximum:((NSInteger) maximum)];
+ s->gospinbox = gospinbox;
+ return s;
+}
+
+id spinboxTextField(id spinbox)
+{
+ return (id) (togoSpinbox(spinbox)->textfield);
+}
+
+id spinboxStepper(id spinbox)
+{
+ return (id) (togoSpinbox(spinbox)->stepper);
+}
+
+intmax_t spinboxValue(id spinbox)
+{
+ return (intmax_t) (togoSpinbox(spinbox)->value);
+}
+
+void spinboxSetValue(id spinbox, intmax_t value)
+{
+ [togoSpinbox(spinbox) setValue:((NSInteger) value)];
+}