diff --git a/redo/objc_darwin.h b/redo/objc_darwin.h index 59c98fc..20a2c4f 100644 --- a/redo/objc_darwin.h +++ b/redo/objc_darwin.h @@ -65,4 +65,23 @@ extern void tableMakeDataSource(id, void *); /* control_darwin.m */ extern id newScrollView(id); +/* xsizing_darwin.m */ +struct xsize { + intptr_t width; + intptr_t height; +}; +struct xrect { + intptr_t x; + intptr_t y; + intptr_t width; + intptr_t height; +}; +struct xalignment { + struct xrect rect; + intptr_t baseline; +}; +extern struct xsize controlPrefSize(id); +extern struct xsize areaPrefSize(id); +extern struct xalignment alignmentInfo(id, struct xrect); + #endif diff --git a/redo/xsizing_darwin.m b/redo/xsizing_darwin.m new file mode 100644 index 0000000..12faf4b --- /dev/null +++ b/redo/xsizing_darwin.m @@ -0,0 +1,63 @@ +// 15 may 2014 + +#include "objc_darwin.h" +#import + +#define toNSControl(x) ((NSControl *) (x)) +#define toNSScrollView(x) ((NSScrollView *) (x)) +#define toNSView(x) ((NSView *) (x)) + +// TODO merge into control_darwin.m or sizing_darwin.m? really need to figure out what to do about the Go-side container struct... + +// also good for NSTableView (TODO might not do what we want) and NSProgressIndicator +struct xsize controlPrefSize(id control) +{ + NSControl *c; + NSRect r; + struct xsize s; + + c = toNSControl(control); + [c sizeToFit]; + r = [c frame]; + s.width = (intptr_t) r.size.width; + s.height = (intptr_t) r.size.height; + return s; +} + +// TODO use this, possibly update to not need scrollview +/* +struct xsize areaPrefSize(id scrollview) +{ + NSView *c; + NSRect r; + struct xsize s; + + c = areaInScrollView(toNSScrollView(scrollview)); + // don't size to fit; the frame size is already the size we want + r = [c frame]; + s.width = (intptr_t) r.size.width; + s.height = (intptr_t) r.size.height; + return s; +} +*/ + +struct xalignment alignmentInfo(id c, struct xrect newrect) +{ + NSView *v; + struct xalignment a; + NSRect r; + + v = toNSView(c); + r = NSMakeRect((CGFloat) newrect.x, + (CGFloat) newrect.y, + (CGFloat) newrect.width, + (CGFloat) newrect.height); + r = [v alignmentRectForFrame:r]; + a.rect.x = (intptr_t) r.origin.x; + a.rect.y = (intptr_t) r.origin.y; + a.rect.width = (intptr_t) r.size.width; + a.rect.height = (intptr_t) r.size.height; + // TODO set frame first? + a.baseline = (intptr_t) [v baselineOffsetFromBottom]; + return a; +}