121 lines
2.9 KiB
C
121 lines
2.9 KiB
C
|
// 28 august 2015
|
||
|
#include "uipriv_unix.h"
|
||
|
|
||
|
// This file contains helpers for managing child controls.
|
||
|
|
||
|
struct uiprivChild {
|
||
|
uiControl *c;
|
||
|
GtkWidget *widget;
|
||
|
|
||
|
gboolean oldhexpand;
|
||
|
GtkAlign oldhalign;
|
||
|
gboolean oldvexpand;
|
||
|
GtkAlign oldvalign;
|
||
|
|
||
|
// Some children can be boxed; that is, they can have an optionally-margined box around them.
|
||
|
// uiGroup, uiTab, and uiWindow all do this.
|
||
|
GtkWidget *box;
|
||
|
|
||
|
// If the child is not boxed, this is its parent.
|
||
|
// If the child is boxed, this is the box.
|
||
|
GtkContainer *parent;
|
||
|
|
||
|
// This flag is for users of these functions.
|
||
|
// For uiBox, this is "spaced".
|
||
|
// For uiTab, this is "margined". (uiGroup and uiWindow have to maintain their margined state themselves, since the margined state is independent of whether there is a child for those two.)
|
||
|
int flag;
|
||
|
};
|
||
|
|
||
|
uiprivChild *uiprivNewChild(uiControl *child, uiControl *parent, GtkContainer *parentContainer)
|
||
|
{
|
||
|
uiprivChild *c;
|
||
|
|
||
|
if (child == NULL)
|
||
|
return NULL;
|
||
|
|
||
|
c = uiprivNew(uiprivChild);
|
||
|
c->c = child;
|
||
|
c->widget = GTK_WIDGET(uiControlHandle(c->c));
|
||
|
|
||
|
c->oldhexpand = gtk_widget_get_hexpand(c->widget);
|
||
|
c->oldhalign = gtk_widget_get_halign(c->widget);
|
||
|
c->oldvexpand = gtk_widget_get_vexpand(c->widget);
|
||
|
c->oldvalign = gtk_widget_get_valign(c->widget);
|
||
|
|
||
|
uiControlSetParent(c->c, parent);
|
||
|
uiUnixControlSetContainer(uiUnixControl(c->c), parentContainer, FALSE);
|
||
|
c->parent = parentContainer;
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
uiprivChild *uiprivNewChildWithBox(uiControl *child, uiControl *parent, GtkContainer *parentContainer, int margined)
|
||
|
{
|
||
|
uiprivChild *c;
|
||
|
GtkWidget *box;
|
||
|
|
||
|
if (child == NULL)
|
||
|
return NULL;
|
||
|
box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||
|
gtk_widget_show(box);
|
||
|
c = uiprivNewChild(child, parent, GTK_CONTAINER(box));
|
||
|
gtk_widget_set_hexpand(c->widget, TRUE);
|
||
|
gtk_widget_set_halign(c->widget, GTK_ALIGN_FILL);
|
||
|
gtk_widget_set_vexpand(c->widget, TRUE);
|
||
|
gtk_widget_set_valign(c->widget, GTK_ALIGN_FILL);
|
||
|
c->box = box;
|
||
|
gtk_container_add(parentContainer, c->box);
|
||
|
uiprivChildSetMargined(c, margined);
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
void uiprivChildRemove(uiprivChild *c)
|
||
|
{
|
||
|
uiControlSetParent(c->c, NULL);
|
||
|
uiUnixControlSetContainer(uiUnixControl(c->c), c->parent, TRUE);
|
||
|
|
||
|
gtk_widget_set_hexpand(c->widget, c->oldhexpand);
|
||
|
gtk_widget_set_halign(c->widget, c->oldhalign);
|
||
|
gtk_widget_set_vexpand(c->widget, c->oldvexpand);
|
||
|
gtk_widget_set_valign(c->widget, c->oldvalign);
|
||
|
|
||
|
if (c->box != NULL)
|
||
|
gtk_widget_destroy(c->box);
|
||
|
|
||
|
uiprivFree(c);
|
||
|
}
|
||
|
|
||
|
void uiprivChildDestroy(uiprivChild *c)
|
||
|
{
|
||
|
uiControl *child;
|
||
|
|
||
|
child = c->c;
|
||
|
uiprivChildRemove(c);
|
||
|
uiControlDestroy(child);
|
||
|
}
|
||
|
|
||
|
GtkWidget *uiprivChildWidget(uiprivChild *c)
|
||
|
{
|
||
|
return c->widget;
|
||
|
}
|
||
|
|
||
|
int uiprivChildFlag(uiprivChild *c)
|
||
|
{
|
||
|
return c->flag;
|
||
|
}
|
||
|
|
||
|
void uiprivChildSetFlag(uiprivChild *c, int flag)
|
||
|
{
|
||
|
c->flag = flag;
|
||
|
}
|
||
|
|
||
|
GtkWidget *uiprivChildBox(uiprivChild *c)
|
||
|
{
|
||
|
return c->box;
|
||
|
}
|
||
|
|
||
|
void uiprivChildSetMargined(uiprivChild *c, int margined)
|
||
|
{
|
||
|
uiprivSetMargined(GTK_CONTAINER(c->box), margined);
|
||
|
}
|