Finished the implementation of GTK+ uiGroup.
This commit is contained in:
parent
7abf88d9ef
commit
92aaa1ae07
|
@ -6,12 +6,28 @@ struct group {
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
GtkContainer *container;
|
GtkContainer *container;
|
||||||
GtkFrame *frame;
|
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
|
||||||
|
uiControl *bin;
|
||||||
uiControl *child;
|
uiControl *child;
|
||||||
int margined;
|
|
||||||
|
void (*baseCommitDestroy)(uiControl *);
|
||||||
};
|
};
|
||||||
|
|
||||||
uiDefineControlType(uiGroup, uiTypeGroup, struct group)
|
uiDefineControlType(uiGroup, uiTypeGroup, struct group)
|
||||||
|
|
||||||
|
static void groupCommitDestroy(uiControl *c)
|
||||||
|
{
|
||||||
|
struct group *g = (struct group *) c;
|
||||||
|
|
||||||
|
if (g->child != NULL) {
|
||||||
|
binSetChild(g->bin, NULL);
|
||||||
|
uiControlDestroy(g->child);
|
||||||
|
}
|
||||||
|
uiControlDestroy(g->bin);
|
||||||
|
(*(g->baseCommitDestroy))(uiControl(g));
|
||||||
|
}
|
||||||
|
|
||||||
static uintptr_t groupHandle(uiControl *c)
|
static uintptr_t groupHandle(uiControl *c)
|
||||||
{
|
{
|
||||||
struct group *g = (struct group *) c;
|
struct group *g = (struct group *) c;
|
||||||
|
@ -31,14 +47,14 @@ static char *groupTitle(uiGroup *gg)
|
||||||
{
|
{
|
||||||
struct group *g = (struct group *) gg;
|
struct group *g = (struct group *) gg;
|
||||||
|
|
||||||
return PUT_CODE_HERE;
|
return uiUnixStrdupText(gtk_frame_get_label(g->frame));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void groupSetTitle(uiGroup *gg, const char *text)
|
static void groupSetTitle(uiGroup *gg, const char *text)
|
||||||
{
|
{
|
||||||
struct group *g = (struct group *) gg;
|
struct group *g = (struct group *) gg;
|
||||||
|
|
||||||
PUT_CODE_HERE;
|
gtk_frame_set_label(g->frame, text);
|
||||||
// changing the text might necessitate a change in the groupbox's size
|
// changing the text might necessitate a change in the groupbox's size
|
||||||
uiControlQueueResize(uiControl(g));
|
uiControlQueueResize(uiControl(g));
|
||||||
}
|
}
|
||||||
|
@ -48,10 +64,10 @@ static void groupSetChild(uiGroup *gg, uiControl *child)
|
||||||
struct group *g = (struct group *) gg;
|
struct group *g = (struct group *) gg;
|
||||||
|
|
||||||
if (g->child != NULL)
|
if (g->child != NULL)
|
||||||
uiControlSetParent(g->child, NULL);
|
binSetChild(g->bin, NULL);
|
||||||
g->child = child;
|
g->child = child;
|
||||||
if (g->child != NULL) {
|
if (g->child != NULL) {
|
||||||
uiControlSetParent(g->child, uiControl(g));
|
binSetChild(g->bin, g->child);
|
||||||
uiControlQueueResize(g->child);
|
uiControlQueueResize(g->child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,14 +76,15 @@ static int groupMargined(uiGroup *gg)
|
||||||
{
|
{
|
||||||
struct group *g = (struct group *) gg;
|
struct group *g = (struct group *) gg;
|
||||||
|
|
||||||
return g->margined;
|
return binMargined(g->bin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO this includes the label
|
||||||
static void groupSetMargined(uiGroup *gg, int margined)
|
static void groupSetMargined(uiGroup *gg, int margined)
|
||||||
{
|
{
|
||||||
struct group *g = (struct group *) gg;
|
struct group *g = (struct group *) gg;
|
||||||
|
|
||||||
g->margined = margined;
|
binSetMargined(g->bin, margined);
|
||||||
uiControlQueueResize(uiControl(g));
|
uiControlQueueResize(uiControl(g));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +118,15 @@ uiGroup *uiNewGroup(const char *text)
|
||||||
gtk_label_set_attributes(label, boldlist);
|
gtk_label_set_attributes(label, boldlist);
|
||||||
pango_attr_list_unref(boldlist); // thanks baedert in irc.gimp.net/#gtk+
|
pango_attr_list_unref(boldlist); // thanks baedert in irc.gimp.net/#gtk+
|
||||||
|
|
||||||
|
g->bin = newBin();
|
||||||
|
// can't use uiControlSetParent() because we didn't set the vtable yet
|
||||||
|
gtk_container_add(g->container, GTK_WIDGET(uiControlHandle(g->bin)));
|
||||||
|
// TODO this is a mess
|
||||||
|
gtk_widget_show(GTK_WIDGET(uiControlHandle(g->bin)));
|
||||||
|
|
||||||
uiControl(g)->Handle = groupHandle;
|
uiControl(g)->Handle = groupHandle;
|
||||||
|
g->baseCommitDestroy = uiControl(g)->CommitDestroy;
|
||||||
|
uiControl(g)->CommitDestroy = groupCommitDestroy;
|
||||||
uiControl(g)->ContainerUpdateState = groupContainerUpdateState;
|
uiControl(g)->ContainerUpdateState = groupContainerUpdateState;
|
||||||
|
|
||||||
uiGroup(g)->Title = groupTitle;
|
uiGroup(g)->Title = groupTitle;
|
||||||
|
|
Loading…
Reference in New Issue