summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-10-29 12:12:00 -0400
committerPietro Gagliardi <[email protected]>2014-10-29 12:12:00 -0400
commit6d58f434b74bb0119f493ba8e4508c93b14685d9 (patch)
treecefdc0fb71e5a00b86193eee9cf7e3612f2b3e09
parent765ccf00a36d379dcdb853173c0049f2bccc4cf3 (diff)
Added the initial implementaiton of Spinbox on Mac OS X. It doesn't quite work yet.
-rw-r--r--container_darwin.go1
-rw-r--r--objc_darwin.h4
-rw-r--r--spinbox_darwin.go47
-rw-r--r--spinbox_darwin.m40
4 files changed, 92 insertions, 0 deletions
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 <Cocoa/Cocoa.h>
+
+@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;
+}