aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/darwin/group.m
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
committerStapleButter <thetotalworm@gmail.com>2017-09-09 02:30:51 +0200
commit70e4841d311d68689724768157cc9cbfbde7a9fc (patch)
treeba9499f77d1258530a7e60aa6e1732c41d98161c /src/libui_sdl/libui/darwin/group.m
parent81747d6c34eb159481a6ca3f283d065fa3568617 (diff)
another UI attempt, I guess.
sorry.
Diffstat (limited to 'src/libui_sdl/libui/darwin/group.m')
-rw-r--r--src/libui_sdl/libui/darwin/group.m194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/darwin/group.m b/src/libui_sdl/libui/darwin/group.m
new file mode 100644
index 0000000..0050bbd
--- /dev/null
+++ b/src/libui_sdl/libui/darwin/group.m
@@ -0,0 +1,194 @@
+// 14 august 2015
+#import "uipriv_darwin.h"
+
+struct uiGroup {
+ uiDarwinControl c;
+ NSBox *box;
+ uiControl *child;
+ NSLayoutPriority oldHorzHuggingPri;
+ NSLayoutPriority oldVertHuggingPri;
+ int margined;
+ struct singleChildConstraints constraints;
+ NSLayoutPriority horzHuggingPri;
+ NSLayoutPriority vertHuggingPri;
+};
+
+static void removeConstraints(uiGroup *g)
+{
+ // set to contentView instead of to the box itself, otherwise we get clipping underneath the label
+ singleChildConstraintsRemove(&(g->constraints), [g->box contentView]);
+}
+
+static void uiGroupDestroy(uiControl *c)
+{
+ uiGroup *g = uiGroup(c);
+
+ removeConstraints(g);
+ if (g->child != NULL) {
+ uiControlSetParent(g->child, NULL);
+ uiDarwinControlSetSuperview(uiDarwinControl(g->child), nil);
+ uiControlDestroy(g->child);
+ }
+ [g->box release];
+ uiFreeControl(uiControl(g));
+}
+
+uiDarwinControlDefaultHandle(uiGroup, box)
+uiDarwinControlDefaultParent(uiGroup, box)
+uiDarwinControlDefaultSetParent(uiGroup, box)
+uiDarwinControlDefaultToplevel(uiGroup, box)
+uiDarwinControlDefaultVisible(uiGroup, box)
+uiDarwinControlDefaultShow(uiGroup, box)
+uiDarwinControlDefaultHide(uiGroup, box)
+uiDarwinControlDefaultEnabled(uiGroup, box)
+uiDarwinControlDefaultEnable(uiGroup, box)
+uiDarwinControlDefaultDisable(uiGroup, box)
+
+static void uiGroupSyncEnableState(uiDarwinControl *c, int enabled)
+{
+ uiGroup *g = uiGroup(c);
+
+ if (uiDarwinShouldStopSyncEnableState(uiDarwinControl(g), enabled))
+ return;
+ if (g->child != NULL)
+ uiDarwinControlSyncEnableState(uiDarwinControl(g->child), enabled);
+}
+
+uiDarwinControlDefaultSetSuperview(uiGroup, box)
+
+static void groupRelayout(uiGroup *g)
+{
+ NSView *childView;
+
+ removeConstraints(g);
+ if (g->child == NULL)
+ return;
+ childView = (NSView *) uiControlHandle(g->child);
+ singleChildConstraintsEstablish(&(g->constraints),
+ [g->box contentView], childView,
+ uiDarwinControlHugsTrailingEdge(uiDarwinControl(g->child)),
+ uiDarwinControlHugsBottom(uiDarwinControl(g->child)),
+ g->margined,
+ @"uiGroup");
+ // needed for some very rare drawing errors...
+ jiggleViewLayout(g->box);
+}
+
+// TODO rename these since I'm starting to get confused by what they mean by hugging
+BOOL uiGroupHugsTrailingEdge(uiDarwinControl *c)
+{
+ uiGroup *g = uiGroup(c);
+
+ // TODO make a function?
+ return g->horzHuggingPri < NSLayoutPriorityWindowSizeStayPut;
+}
+
+BOOL uiGroupHugsBottom(uiDarwinControl *c)
+{
+ uiGroup *g = uiGroup(c);
+
+ return g->vertHuggingPri < NSLayoutPriorityWindowSizeStayPut;
+}
+
+static void uiGroupChildEdgeHuggingChanged(uiDarwinControl *c)
+{
+ uiGroup *g = uiGroup(c);
+
+ groupRelayout(g);
+}
+
+static NSLayoutPriority uiGroupHuggingPriority(uiDarwinControl *c, NSLayoutConstraintOrientation orientation)
+{
+ uiGroup *g = uiGroup(c);
+
+ if (orientation == NSLayoutConstraintOrientationHorizontal)
+ return g->horzHuggingPri;
+ return g->vertHuggingPri;
+}
+
+static void uiGroupSetHuggingPriority(uiDarwinControl *c, NSLayoutPriority priority, NSLayoutConstraintOrientation orientation)
+{
+ uiGroup *g = uiGroup(c);
+
+ if (orientation == NSLayoutConstraintOrientationHorizontal)
+ g->horzHuggingPri = priority;
+ else
+ g->vertHuggingPri = priority;
+ uiDarwinNotifyEdgeHuggingChanged(uiDarwinControl(g));
+}
+
+static void uiGroupChildVisibilityChanged(uiDarwinControl *c)
+{
+ uiGroup *g = uiGroup(c);
+
+ groupRelayout(g);
+}
+
+char *uiGroupTitle(uiGroup *g)
+{
+ return uiDarwinNSStringToText([g->box title]);
+}
+
+void uiGroupSetTitle(uiGroup *g, const char *title)
+{
+ [g->box setTitle:toNSString(title)];
+}
+
+void uiGroupSetChild(uiGroup *g, uiControl *child)
+{
+ NSView *childView;
+
+ if (g->child != NULL) {
+ removeConstraints(g);
+ uiDarwinControlSetHuggingPriority(uiDarwinControl(g->child), g->oldHorzHuggingPri, NSLayoutConstraintOrientationHorizontal);
+ uiDarwinControlSetHuggingPriority(uiDarwinControl(g->child), g->oldVertHuggingPri, NSLayoutConstraintOrientationVertical);
+ uiControlSetParent(g->child, NULL);
+ uiDarwinControlSetSuperview(uiDarwinControl(g->child), nil);
+ }
+ g->child = child;
+ if (g->child != NULL) {
+ childView = (NSView *) uiControlHandle(g->child);
+ uiControlSetParent(g->child, uiControl(g));
+ uiDarwinControlSetSuperview(uiDarwinControl(g->child), [g->box contentView]);
+ uiDarwinControlSyncEnableState(uiDarwinControl(g->child), uiControlEnabledToUser(uiControl(g)));
+ // don't hug, just in case we're a stretchy group
+ g->oldHorzHuggingPri = uiDarwinControlHuggingPriority(uiDarwinControl(g->child), NSLayoutConstraintOrientationHorizontal);
+ g->oldVertHuggingPri = uiDarwinControlHuggingPriority(uiDarwinControl(g->child), NSLayoutConstraintOrientationVertical);
+ uiDarwinControlSetHuggingPriority(uiDarwinControl(g->child), NSLayoutPriorityDefaultLow, NSLayoutConstraintOrientationHorizontal);
+ uiDarwinControlSetHuggingPriority(uiDarwinControl(g->child), NSLayoutPriorityDefaultLow, NSLayoutConstraintOrientationVertical);
+ }
+ groupRelayout(g);
+}
+
+int uiGroupMargined(uiGroup *g)
+{
+ return g->margined;
+}
+
+void uiGroupSetMargined(uiGroup *g, int margined)
+{
+ g->margined = margined;
+ singleChildConstraintsSetMargined(&(g->constraints), g->margined);
+}
+
+uiGroup *uiNewGroup(const char *title)
+{
+ uiGroup *g;
+
+ uiDarwinNewControl(uiGroup, g);
+
+ g->box = [[NSBox alloc] initWithFrame:NSZeroRect];
+ [g->box setTitle:toNSString(title)];
+ [g->box setBoxType:NSBoxPrimary];
+ [g->box setBorderType:NSLineBorder];
+ [g->box setTransparent:NO];
+ [g->box setTitlePosition:NSAtTop];
+ // we can't use uiDarwinSetControlFont() because the selector is different
+ [g->box setTitleFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
+
+ // default to low hugging to not hug edges
+ g->horzHuggingPri = NSLayoutPriorityDefaultLow;
+ g->vertHuggingPri = NSLayoutPriorityDefaultLow;
+
+ return g;
+}