From 6d58f434b74bb0119f493ba8e4508c93b14685d9 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 29 Oct 2014 12:12:00 -0400 Subject: [PATCH] Added the initial implementaiton of Spinbox on Mac OS X. It doesn't quite work yet. --- container_darwin.go | 1 + objc_darwin.h | 4 ++++ spinbox_darwin.go | 47 +++++++++++++++++++++++++++++++++++++++++++++ spinbox_darwin.m | 40 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 spinbox_darwin.m diff --git a/container_darwin.go b/container_darwin.go index 5cc2b1c..02ccca4 100644 --- a/container_darwin.go +++ b/container_darwin.go @@ -53,6 +53,7 @@ func containerResized(data unsafe.Pointer) { } // These are based on measurements from Interface Builder. +// TODO reverify these against /layout rects/, not /frame rects/ const ( macXMargin = 20 macYMargin = 20 diff --git a/objc_darwin.h b/objc_darwin.h index fec0b67..c24dd58 100644 --- a/objc_darwin.h +++ b/objc_darwin.h @@ -151,4 +151,8 @@ extern void openFile(id, void *); extern id newWarningPopover(char *); extern void warningPopoverShow(id, id); +/* spinbox_darwin.m */ +extern id newSpinboxStepper(void); +extern id spinboxSetup(id, id, void *); + #endif diff --git a/spinbox_darwin.go b/spinbox_darwin.go index c3f1da8..2768e40 100644 --- a/spinbox_darwin.go +++ b/spinbox_darwin.go @@ -2,6 +2,10 @@ package ui +import ( + "unsafe" +) + // #include "objc_darwin.h" import "C" @@ -15,3 +19,46 @@ import "C" // - http://andrehoffmann.wordpress.com/tag/nsstepper/ ? // TODO // - proper spacing between edit and spinner: Interface Builder isn't clear; NSDatePicker doesn't spill the beans + +type spinbox struct { + textfield C.id + stepper C.id + objcspinbox C.id +} + +func newSpinbox() Spinbox { + s := new(spinbox) + s.textfield = C.newTextField() + s.stepper = C.newSpinboxStepper() + s.objcspinbox = C.spinboxSetup(s.textfield, s.stepper, unsafe.Pointer(s)) + return s +} + +func (s *spinbox) setParent(p *controlParent) { + C.parent(s.textfield, p.id) + C.parent(s.stepper, p.id) +} + +func (s *spinbox) preferredSize(d *sizing) (width, height int) { + // TODO + return 20, 20 +} + +func (s *spinbox) resize(x int, y int, width int, height int, d *sizing) { + // TODO + C.moveControl(s.textfield, C.intptr_t(x), C.intptr_t(y), C.intptr_t(width - 20), C.intptr_t(height)) + C.moveControl(s.stepper, C.intptr_t(x + width - 15), C.intptr_t(y), C.intptr_t(15), C.intptr_t(height)) +} + +func (s *spinbox) nTabStops() int { + // TODO does the stepper count? + return 1 +} + +func (s *spinbox) containerShow() { + // only provided for the Windows backend +} + +func (s *spinbox) containerHide() { + // only provided for the Windows backend +} diff --git a/spinbox_darwin.m b/spinbox_darwin.m new file mode 100644 index 0000000..f9d6fe4 --- /dev/null +++ b/spinbox_darwin.m @@ -0,0 +1,40 @@ +// 29 october 2014 + +#include "objc_darwin.h" +#include "_cgo_export.h" +#import + +@interface goSpinbox : NSObject { +@public + void *gospinbox; +} +@property NSInteger integerValue; +@end + +@implementation goSpinbox +@synthesize integerValue; +@end + +id newSpinboxStepper(void) +{ + NSStepper *s; + + s = [[NSStepper alloc] initWithFrame:NSZeroRect]; + [s setMinValue:0]; + [s setMaxValue:100]; + [s setIncrement:1]; + [s setAutorepeat:YES]; // hold mouse button to step repeatedly + return (id) s; +} + +id spinboxSetup(id textfield, id stepper, void *gospinbox) +{ + goSpinbox *g; + + g = [goSpinbox new]; + g->gospinbox = gospinbox; + // TODO set any options? + [textfield bind:@"integerValue" toObject:g withKeyPath:@"integerValue" options:nil]; + [stepper bind:@"integerValue" toObject:g withKeyPath:@"integerValue" options:nil]; + return (id) g; +}