From 96e25cf50293d2c8f33bbd4d2578a4e2b63441f9 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 7 Apr 2015 15:45:00 -0400 Subject: Added the Mac OS X uiContainer. Added it to uiWindow. Added the Mac OS X coordinate system mirroring to the new control logic. Renamed *_darwin.c to *_darwin.m. --- new/container_darwin.m | 22 +++++++++++ new/newcontrol_darwin.c | 99 ----------------------------------------------- new/newcontrol_darwin.m | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ new/uipriv_darwin.h | 5 +++ new/window_darwin.m | 11 ++++++ 5 files changed, 138 insertions(+), 99 deletions(-) create mode 100644 new/container_darwin.m delete mode 100644 new/newcontrol_darwin.c create mode 100644 new/newcontrol_darwin.m (limited to 'new') diff --git a/new/container_darwin.m b/new/container_darwin.m new file mode 100644 index 0000000..7f628a3 --- /dev/null +++ b/new/container_darwin.m @@ -0,0 +1,22 @@ +// 4 august 2014 +#import "uipriv_darwin.h" + +// calling -[className] on the content views of NSWindow, NSTabItem, and NSBox all return NSView, so I'm assuming I just need to override these +// fornunately: +// - NSWindow resizing calls -[setFrameSize:] (but not -[setFrame:]) +// - NSTab resizing calls both -[setFrame:] and -[setFrameSIze:] on the current tab +// - NSTab switching tabs calls both -[setFrame:] and -[setFrameSize:] on the new tab +// so we just override setFrameSize: +// thanks to mikeash and JtRip in irc.freenode.net/#macdev +@implementation uiContainer + +- (void)setFrameSize:(NSSize)s +{ + uiSizing d; + + [super setFrameSize:s]; + if (self.child != NULL) + (*(self.child->resize))(self.child, 0, 0, [self bounds].size.width, [self bounds].size.height, d); +} + +@end diff --git a/new/newcontrol_darwin.c b/new/newcontrol_darwin.c deleted file mode 100644 index 66a7ecc..0000000 --- a/new/newcontrol_darwin.c +++ /dev/null @@ -1,99 +0,0 @@ -// 7 april 2015 -#include "uipriv_darwin.h" - -typedef struct uiSingleWidgetControl uiSingleWidgetControl; - -struct uiSingleViewControl { - uiControl control; - NSView *control; - NSScrollView *scrollView; - NSView *immediate; // the control that is added to the parent container; either control or scrollView - void *data; -}; - -#define S(c) ((uiSingleViewControl *) (c)) - -static uintptr_t singleHandle(uiControl *c) -{ - return (uintptr_t) (S(c)->control); -} - -static void singleSetParent(uiControl *c, uintptr_t parent) -{ - NSView *parentView = (NSView *) parent; - - [parentView addSubview:S(c)->immediate]; -} - -static uiSize singlePreferredSize(uiControl *c, uiSizing *d) -{ - uiSize size; - - // TODO - size.width = size.height = 0; - return size; -} - -static void singleResize(uiControl *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiSizing *d) -{ - NSRect frame; - - frame.origin.x = x; - frame.origin.y = y; - frame.size.width = width; - frame.size.height = height; - frame = [S(c)->immediate frameForAlignmentRect:frame]; - [S(c)->immediate setFrame:frame]; -} - -static void singleContainerShow(uiControl *c) -{ - [S(c)->immediate setHidden:NO]; -} - -static void singleContainerHide(uiControl *c) -{ - [S(c)->immediate setHidden:YES]; -} - -// TODO connect free function - -uiControl *uiDarwinNewControl(Class class, BOOL inScrollView, BOOL scrollViewHasBorder, void *data) -{ - uiSingleViewControl *c; - - c = g_new0(uiSingleViewControl, 1); - // thanks to autoxr and arwyn in irc.freenode.net/#macdev - c->widget = (NSView *) [[class alloc] initWithFrame:NSZeroRect]; - c->immediate = c->control; - - // TODO turn into bit field? - if (inScrollView) { - c->scrollView = [[NSScrollView alloc] initWithFrame:NSZeroRect]; - [c->scrollView setDocumentView:c->control]; - [c->scrollView setHasHorizontalScroller:YES]; - [c->scrollView setHasVerticalScroller:YES]; - [c->scrollView setAutohidesScrollers:YES]; - if (scrollViewHasBorder) - [c->scrollView setBorderType:NSBezelBorder]; - else - [c->scrollView setBorderType:NSNoBorder]; - c->immediate = (NSView *) (c->scrolledWindow); - } - - c->control.handle = singleHandle; - c->control.setParent = singleSetParent; - c->control.preferredSize = singlePreferredSize; - c->control.resize = singleResize; - c->control.containerShow = singleContainerShow; - c->control.containerHide = singleContainerHide; - - c->data = data; - - return (uiControl *) c; -} - -void *uiDarwinControlData(uiControl *c) -{ - return S(c)->data; -} diff --git a/new/newcontrol_darwin.m b/new/newcontrol_darwin.m new file mode 100644 index 0000000..1b3b799 --- /dev/null +++ b/new/newcontrol_darwin.m @@ -0,0 +1,100 @@ +// 7 april 2015 +#include "uipriv_darwin.h" + +typedef struct uiSingleWidgetControl uiSingleWidgetControl; + +struct uiSingleViewControl { + uiControl control; + NSView *control; + NSScrollView *scrollView; + NSView *immediate; // the control that is added to the parent container; either control or scrollView + void *data; +}; + +#define S(c) ((uiSingleViewControl *) (c)) + +static uintptr_t singleHandle(uiControl *c) +{ + return (uintptr_t) (S(c)->control); +} + +static void singleSetParent(uiControl *c, uintptr_t parent) +{ + NSView *parentView = (NSView *) parent; + + [parentView addSubview:S(c)->immediate]; +} + +static uiSize singlePreferredSize(uiControl *c, uiSizing *d) +{ + uiSize size; + + // TODO + size.width = size.height = 0; + return size; +} + +static void singleResize(uiControl *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiSizing *d) +{ + NSRect frame; + + frame.origin.x = x; + // mac os x coordinate system has (0,0) in the lower-left + frame.origin.y = [[S(c)->immediate superview] bounds].size.height - y; + frame.size.width = width; + frame.size.height = height; + frame = [S(c)->immediate frameForAlignmentRect:frame]; + [S(c)->immediate setFrame:frame]; +} + +static void singleContainerShow(uiControl *c) +{ + [S(c)->immediate setHidden:NO]; +} + +static void singleContainerHide(uiControl *c) +{ + [S(c)->immediate setHidden:YES]; +} + +// TODO connect free function + +uiControl *uiDarwinNewControl(Class class, BOOL inScrollView, BOOL scrollViewHasBorder, void *data) +{ + uiSingleViewControl *c; + + c = g_new0(uiSingleViewControl, 1); + // thanks to autoxr and arwyn in irc.freenode.net/#macdev + c->widget = (NSView *) [[class alloc] initWithFrame:NSZeroRect]; + c->immediate = c->control; + + // TODO turn into bit field? + if (inScrollView) { + c->scrollView = [[NSScrollView alloc] initWithFrame:NSZeroRect]; + [c->scrollView setDocumentView:c->control]; + [c->scrollView setHasHorizontalScroller:YES]; + [c->scrollView setHasVerticalScroller:YES]; + [c->scrollView setAutohidesScrollers:YES]; + if (scrollViewHasBorder) + [c->scrollView setBorderType:NSBezelBorder]; + else + [c->scrollView setBorderType:NSNoBorder]; + c->immediate = (NSView *) (c->scrolledWindow); + } + + c->control.handle = singleHandle; + c->control.setParent = singleSetParent; + c->control.preferredSize = singlePreferredSize; + c->control.resize = singleResize; + c->control.containerShow = singleContainerShow; + c->control.containerHide = singleContainerHide; + + c->data = data; + + return (uiControl *) c; +} + +void *uiDarwinControlData(uiControl *c) +{ + return S(c)->data; +} diff --git a/new/uipriv_darwin.h b/new/uipriv_darwin.h index 191355f..f45b8e6 100644 --- a/new/uipriv_darwin.h +++ b/new/uipriv_darwin.h @@ -11,3 +11,8 @@ extern void *uiAlloc(size_t); extern void *uiRealloc(void *, size_t); extern void uiFree(void *); + +// container_darwin.m +@interface uiContainer : NSView +@property uiControl *child; +@end diff --git a/new/window_darwin.m b/new/window_darwin.m index 30c3a1a..b74714a 100644 --- a/new/window_darwin.m +++ b/new/window_darwin.m @@ -22,6 +22,8 @@ struct uiWindow { NSWindow *w; + uiContainer *container; + uiControl *child; uiWindowDelegate *d; }; @@ -43,6 +45,9 @@ uiWindow *uiNewWindow(char *title, int width, int height) [w->w setTitle:toNSString(title)]; // TODO substitutions + w->container = [[uiContainer alloc] initWithFrame:NSZeroRect]; + [w->w setContentView:((NSView *) w->container)]; + w->d = [uiWindowDelegate new]; w->d.w = w; w->d.onClosing = defaultOnClosing; @@ -79,3 +84,9 @@ void uiWindowOnClosing(uiWindow *w, int (*f)(uiWindow *, void *), void *data) w->d.onClosing = f; w->d.onClosingData = data; } + +void uiWindowSetChild(uiWindow *w, uiControl *c) +{ + w->child = c; + (*(w->child->setParent))(w->child, (uintptr_t) (w->container)); +} -- cgit v1.2.3