delete children widget
This commit is contained in:
@@ -18,6 +18,7 @@ static void add_child(gui *g, widget *_this, widget *child, int position)
|
|||||||
{
|
{
|
||||||
LOGD("ADD_CHILD container\n");
|
LOGD("ADD_CHILD container\n");
|
||||||
struct container_widget *this = _this;
|
struct container_widget *this = _this;
|
||||||
|
|
||||||
this->hints_are_valid = 0;
|
this->hints_are_valid = 0;
|
||||||
widget_add_child_internal(g, this, child, position);
|
widget_add_child_internal(g, this, child, position);
|
||||||
|
|
||||||
@@ -35,6 +36,24 @@ static void add_child(gui *g, widget *_this, widget *child, int position)
|
|||||||
this->nchildren++;
|
this->nchildren++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void del_child(gui *g, widget *_this, widget *child)
|
||||||
|
{
|
||||||
|
LOGD("DEL_CHILD container\n");
|
||||||
|
struct container_widget *this = _this;
|
||||||
|
int position = widget_get_child_position(g, _this, child);
|
||||||
|
|
||||||
|
this->hints_are_valid = 0;
|
||||||
|
widget_del_child_internal(g, this, child);
|
||||||
|
|
||||||
|
memmove(this->growable + position, this->growable + position+1,
|
||||||
|
(this->nchildren - position - 1) * sizeof(int));
|
||||||
|
|
||||||
|
this->growable = realloc(this->growable, (this->nchildren-1)*sizeof(int));
|
||||||
|
if (this->growable == NULL) abort();
|
||||||
|
|
||||||
|
this->nchildren--;
|
||||||
|
}
|
||||||
|
|
||||||
static void compute_vertical_hints(struct gui *g,
|
static void compute_vertical_hints(struct gui *g,
|
||||||
struct container_widget *this)
|
struct container_widget *this)
|
||||||
{
|
{
|
||||||
@@ -271,6 +290,7 @@ widget *new_container(gui *_gui, int vertical)
|
|||||||
|
|
||||||
w->common.paint = paint;
|
w->common.paint = paint;
|
||||||
w->common.add_child = add_child;
|
w->common.add_child = add_child;
|
||||||
|
w->common.del_child = del_child;
|
||||||
w->common.repack = repack;
|
w->common.repack = repack;
|
||||||
|
|
||||||
if (vertical) {
|
if (vertical) {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ gui *gui_init(void);
|
|||||||
|
|
||||||
/* position = -1 to put at the end */
|
/* position = -1 to put at the end */
|
||||||
void widget_add_child(gui *gui, widget *parent, widget *child, int position);
|
void widget_add_child(gui *gui, widget *parent, widget *child, int position);
|
||||||
|
void widget_del_child(gui *gui, widget *parent, widget *child);
|
||||||
void widget_dirty(gui *gui, widget *this);
|
void widget_dirty(gui *gui, widget *this);
|
||||||
|
|
||||||
widget *new_toplevel_window(gui *gui, int width, int height, char *title);
|
widget *new_toplevel_window(gui *gui, int width, int height, char *title);
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ struct widget {
|
|||||||
struct widget *parent;
|
struct widget *parent;
|
||||||
void (*repack)(gui *g, widget *this);
|
void (*repack)(gui *g, widget *this);
|
||||||
void (*add_child)(gui *g, widget *this, widget *child, int position);
|
void (*add_child)(gui *g, widget *this, widget *child, int position);
|
||||||
|
void (*del_child)(gui *g, widget *this, widget *child);
|
||||||
void (*allocate)(gui *g, widget *this, int x, int y, int width, int height);
|
void (*allocate)(gui *g, widget *this, int x, int y, int width, int height);
|
||||||
void (*hints)(gui *g, widget *this, int *width, int *height);
|
void (*hints)(gui *g, widget *this, int *width, int *height);
|
||||||
void (*paint)(gui *g, widget *this);
|
void (*paint)(gui *g, widget *this);
|
||||||
@@ -197,6 +198,8 @@ struct gui {
|
|||||||
widget *new_widget(struct gui *g, enum widget_type type, int size);
|
widget *new_widget(struct gui *g, enum widget_type type, int size);
|
||||||
void widget_add_child_internal(
|
void widget_add_child_internal(
|
||||||
gui *_gui, widget *parent, widget *child, int position);
|
gui *_gui, widget *parent, widget *child, int position);
|
||||||
|
void widget_del_child_internal(gui *_gui, widget *parent, widget *child);
|
||||||
|
int widget_get_child_position(gui *_gui, widget *parent, widget *child);
|
||||||
|
|
||||||
const char *widget_name(enum widget_type type);
|
const char *widget_name(enum widget_type type);
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ static void default_allocate(
|
|||||||
gui *gui, widget *_this, int x, int y, int width, int height);
|
gui *gui, widget *_this, int x, int y, int width, int height);
|
||||||
static void default_add_child(
|
static void default_add_child(
|
||||||
gui *_gui, widget *_this, widget *child, int position);
|
gui *_gui, widget *_this, widget *child, int position);
|
||||||
|
static void default_del_child(gui *_gui, widget *_this, widget *child);
|
||||||
static void default_hints(gui *g, widget *this, int *width, int *height);
|
static void default_hints(gui *g, widget *this, int *width, int *height);
|
||||||
static void default_button(gui *gui, widget *_this, int x, int y, int button,
|
static void default_button(gui *gui, widget *_this, int x, int y, int button,
|
||||||
int up);
|
int up);
|
||||||
@@ -47,6 +48,7 @@ widget *new_widget(struct gui *g, enum widget_type type, int size)
|
|||||||
ret->clear = default_clear;
|
ret->clear = default_clear;
|
||||||
ret->repack = default_repack;
|
ret->repack = default_repack;
|
||||||
ret->add_child = default_add_child;
|
ret->add_child = default_add_child;
|
||||||
|
ret->del_child = default_del_child;
|
||||||
ret->allocate = default_allocate;
|
ret->allocate = default_allocate;
|
||||||
ret->hints = default_hints;
|
ret->hints = default_hints;
|
||||||
ret->button = default_button;
|
ret->button = default_button;
|
||||||
@@ -121,6 +123,65 @@ repack:
|
|||||||
send_event(_gui, REPACK, p->id);
|
send_event(_gui, REPACK, p->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void widget_del_child_internal(gui *_gui, widget *parent, widget *child)
|
||||||
|
{
|
||||||
|
struct widget *p = parent;
|
||||||
|
struct widget *c = child;
|
||||||
|
struct widget_list *prev, *cur;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
c->parent = NULL;
|
||||||
|
|
||||||
|
prev = NULL;
|
||||||
|
cur = p->children;
|
||||||
|
|
||||||
|
while (cur != NULL && cur->item != c) {
|
||||||
|
prev = cur;
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur == NULL) ERR("child not found\n");
|
||||||
|
|
||||||
|
if (prev == NULL) {
|
||||||
|
/* child is at head */
|
||||||
|
p->children = cur->next;
|
||||||
|
if (p->children != NULL) p->children->last = cur->last;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur->next == NULL) {
|
||||||
|
/* child is last (and prev is != NULL) */
|
||||||
|
prev->next = NULL;
|
||||||
|
p->children->last = prev;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* child is between two existing items */
|
||||||
|
prev->next = cur->next;
|
||||||
|
|
||||||
|
done:
|
||||||
|
free(cur);
|
||||||
|
send_event(_gui, REPACK, p->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int widget_get_child_position(gui *_gui, widget *parent, widget *child)
|
||||||
|
{
|
||||||
|
struct widget *p = parent;
|
||||||
|
struct widget *c = child;
|
||||||
|
struct widget_list *cur;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
cur = p->children;
|
||||||
|
|
||||||
|
while (cur != NULL && cur->item != c) {
|
||||||
|
cur = cur->next;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur == NULL) return -1;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
/* default functions */
|
/* default functions */
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
@@ -140,12 +201,18 @@ static void default_repack(gui *gui, widget *_this)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void default_add_child(
|
static void default_add_child(
|
||||||
gui *_gui, widget *_this, widget *child, int position)
|
gui *_gui, widget *_this, widget *child, int position)
|
||||||
{
|
{
|
||||||
struct widget *this = _this;
|
struct widget *this = _this;
|
||||||
WARN("cannot add child to widget %s\n", widget_name(this->type));
|
WARN("cannot add child to widget %s\n", widget_name(this->type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void default_del_child( gui *_gui, widget *_this, widget *child)
|
||||||
|
{
|
||||||
|
struct widget *this = _this;
|
||||||
|
WARN("cannot del child from widget %s\n", widget_name(this->type));
|
||||||
|
}
|
||||||
|
|
||||||
static void default_allocate(
|
static void default_allocate(
|
||||||
gui *gui, widget *_this, int x, int y, int width, int height)
|
gui *gui, widget *_this, int x, int y, int width, int height)
|
||||||
{
|
{
|
||||||
@@ -180,6 +247,14 @@ void widget_add_child(gui *_gui, widget *parent, widget *child, int position)
|
|||||||
gunlock(_gui);
|
gunlock(_gui);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void widget_del_child(gui *_gui, widget *parent, widget *child)
|
||||||
|
{
|
||||||
|
struct widget *this = parent;
|
||||||
|
glock(_gui);
|
||||||
|
this->del_child(_gui, parent, child);
|
||||||
|
gunlock(_gui);
|
||||||
|
}
|
||||||
|
|
||||||
void widget_dirty(gui *_gui, widget *_this)
|
void widget_dirty(gui *_gui, widget *_this)
|
||||||
{
|
{
|
||||||
struct gui *g = _gui;
|
struct gui *g = _gui;
|
||||||
|
|||||||
Reference in New Issue
Block a user