aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/unix/group.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/unix/group.c')
-rw-r--r--src/libui_sdl/libui/unix/group.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/unix/group.c b/src/libui_sdl/libui/unix/group.c
new file mode 100644
index 0000000..6238a1b
--- /dev/null
+++ b/src/libui_sdl/libui/unix/group.c
@@ -0,0 +1,89 @@
+// 11 june 2015
+#include "uipriv_unix.h"
+
+struct uiGroup {
+ uiUnixControl c;
+ GtkWidget *widget;
+ GtkContainer *container;
+ GtkBin *bin;
+ GtkFrame *frame;
+
+ // unfortunately, even though a GtkFrame is a GtkBin, calling gtk_container_set_border_width() on it /includes/ the GtkFrame's label; we don't want tht
+ struct child *child;
+
+ int margined;
+};
+
+uiUnixControlAllDefaultsExceptDestroy(uiGroup)
+
+static void uiGroupDestroy(uiControl *c)
+{
+ uiGroup *g = uiGroup(c);
+
+ if (g->child != NULL)
+ childDestroy(g->child);
+ g_object_unref(g->widget);
+ uiFreeControl(uiControl(g));
+}
+
+char *uiGroupTitle(uiGroup *g)
+{
+ return uiUnixStrdupText(gtk_frame_get_label(g->frame));
+}
+
+void uiGroupSetTitle(uiGroup *g, const char *text)
+{
+ gtk_frame_set_label(g->frame, text);
+}
+
+void uiGroupSetChild(uiGroup *g, uiControl *child)
+{
+ if (g->child != NULL)
+ childRemove(g->child);
+ g->child = newChildWithBox(child, uiControl(g), g->container, g->margined);
+}
+
+int uiGroupMargined(uiGroup *g)
+{
+ return g->margined;
+}
+
+void uiGroupSetMargined(uiGroup *g, int margined)
+{
+ g->margined = margined;
+ if (g->child != NULL)
+ childSetMargined(g->child, g->margined);
+}
+
+uiGroup *uiNewGroup(const char *text)
+{
+ uiGroup *g;
+ gfloat yalign;
+ GtkLabel *label;
+ PangoAttribute *bold;
+ PangoAttrList *boldlist;
+
+ uiUnixNewControl(uiGroup, g);
+
+ g->widget = gtk_frame_new(text);
+ g->container = GTK_CONTAINER(g->widget);
+ g->bin = GTK_BIN(g->widget);
+ g->frame = GTK_FRAME(g->widget);
+
+ // with GTK+, groupboxes by default have frames and slightly x-offset regular text
+ // they should have no frame and fully left-justified, bold text
+ // preserve default y-alignment
+ gtk_frame_get_label_align(g->frame, NULL, &yalign);
+ gtk_frame_set_label_align(g->frame, 0, yalign);
+ gtk_frame_set_shadow_type(g->frame, GTK_SHADOW_NONE);
+ label = GTK_LABEL(gtk_frame_get_label_widget(g->frame));
+ // this is the boldness level used by GtkPrintUnixDialog
+ // (it technically uses "bold" but see pango's pango-enum-types.c for the name conversion; GType is weird)
+ bold = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
+ boldlist = pango_attr_list_new();
+ pango_attr_list_insert(boldlist, bold);
+ gtk_label_set_attributes(label, boldlist);
+ pango_attr_list_unref(boldlist); // thanks baedert in irc.gimp.net/#gtk+
+
+ return g;
+}