summaryrefslogtreecommitdiff
path: root/new/darwin/tab.m
diff options
context:
space:
mode:
Diffstat (limited to 'new/darwin/tab.m')
-rw-r--r--new/darwin/tab.m67
1 files changed, 67 insertions, 0 deletions
diff --git a/new/darwin/tab.m b/new/darwin/tab.m
new file mode 100644
index 0000000..c36181e
--- /dev/null
+++ b/new/darwin/tab.m
@@ -0,0 +1,67 @@
+// 12 april 2015
+#import "uipriv_darwin.h"
+
+// TODO
+// - verify margins against extra space around the tab
+// - free child containers properly
+
+@interface uiNSTabView : NSTabView
+@property uiControl *uiC;
+@end
+
+@implementation uiNSTabView
+
+- (void)viewDidMoveToSuperview
+{
+ // TODO free all tabs explicitly
+ if (uiDarwinControlFreeWhenAppropriate(self.uiC, [self superview]))
+ self.uiC = NULL;
+ [super viewDidMoveToSuperview];
+}
+
+@end
+
+// the default new control implementation uses -sizeToFit, which we don't have with NSTabView
+// fortunately, we do have -minimumSize
+static void preferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height)
+{
+ uiNSTabView *tv;
+ NSSize s;
+
+ tv = (uiNSTabView *) uiControlHandle(c);
+ s = [tv minimumSize];
+ *width = (intmax_t) (s.width);
+ *height = (intmax_t) (s.height);
+}
+
+uiControl *uiNewTab(void)
+{
+ uiControl *c;
+ uiNSTabView *t;
+
+ c = uiDarwinNewControl([uiNSTabView class], NO, NO);
+ c->preferredSize = preferredSize;
+ t = (uiNSTabView *) uiControlHandle(c);
+ t.uiC = c;
+
+ // also good for NSTabView (same selector and everything)
+ setStandardControlFont((NSControl *) t);
+
+ return c;
+}
+
+void uiTabAddPage(uiControl *c, const char *name, uiControl *child)
+{
+ uiNSTabView *tv;
+ uiParent *content;
+ NSTabViewItem *i;
+
+ content = uiNewParent(0);
+ uiParentSetChild(content, child);
+
+ i = [[NSTabViewItem alloc] initWithIdentifier:nil];
+ [i setLabel:toNSString(name)];
+ [i setView:((NSView *) uiParentHandle(content))];
+ tv = (uiNSTabView *) uiControlHandle(c);
+ [tv addTabViewItem:i];
+}