positioner widget - the child is positioned in the middle, does not grow
This commit is contained in:
@@ -2,7 +2,7 @@ CC=gcc
|
|||||||
CFLAGS=-Wall -g -pthread
|
CFLAGS=-Wall -g -pthread
|
||||||
|
|
||||||
OBJS=init.o loop.o toplevel_window.o x.o container.o widget.o \
|
OBJS=init.o loop.o toplevel_window.o x.o container.o widget.o \
|
||||||
gui.o label.o event.o xy_plot.o textlist.o notify.o
|
gui.o label.o event.o xy_plot.o textlist.o notify.o positioner.o
|
||||||
|
|
||||||
gui.a: $(OBJS)
|
gui.a: $(OBJS)
|
||||||
ar cr gui.a $(OBJS)
|
ar cr gui.a $(OBJS)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ 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);
|
||||||
widget *new_container(gui *gui, int vertical);
|
widget *new_container(gui *gui, int vertical);
|
||||||
|
widget *new_positioner(gui *gui);
|
||||||
widget *new_label(gui *gui, const char *text);
|
widget *new_label(gui *gui, const char *text);
|
||||||
widget *new_xy_plot(gui *gui, int width, int height, char *label,
|
widget *new_xy_plot(gui *gui, int width, int height, char *label,
|
||||||
int vruler_width);
|
int vruler_width);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extern int volatile gui_logd;
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
enum widget_type {
|
enum widget_type {
|
||||||
TOPLEVEL_WINDOW, CONTAINER, TEXT_LIST, XY_PLOT, BUTTON, LABEL
|
TOPLEVEL_WINDOW, CONTAINER, POSITIONER, TEXT_LIST, XY_PLOT, BUTTON, LABEL
|
||||||
};
|
};
|
||||||
|
|
||||||
struct widget_list;
|
struct widget_list;
|
||||||
@@ -77,6 +77,10 @@ struct container_widget {
|
|||||||
int nchildren;
|
int nchildren;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct positioner_widget {
|
||||||
|
struct widget common;
|
||||||
|
};
|
||||||
|
|
||||||
struct textlist_widget {
|
struct textlist_widget {
|
||||||
struct widget common;
|
struct widget common;
|
||||||
char **text;
|
char **text;
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
#include "gui.h"
|
||||||
|
#include "gui_defs.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static void add_child(gui *g, widget *_this, widget *child, int position)
|
||||||
|
{
|
||||||
|
LOGD("ADD_CHILD positioner\n");
|
||||||
|
struct positioner_widget *this = _this;
|
||||||
|
widget_add_child_internal(g, this, child, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void del_child(gui *g, widget *_this, widget *child)
|
||||||
|
{
|
||||||
|
LOGD("DEL_CHILD positioner\n");
|
||||||
|
struct positioner_widget *this = _this;
|
||||||
|
widget_del_child_internal(g, this, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void allocate(
|
||||||
|
gui *_g, widget *_this, int x, int y, int width, int height)
|
||||||
|
{
|
||||||
|
LOGD("ALLOCATE positioner %p\n", _this);
|
||||||
|
struct gui *g = _g;
|
||||||
|
struct positioner_widget *this = _this;
|
||||||
|
struct widget_list *l = this->common.children;
|
||||||
|
int cwidth, cheight;
|
||||||
|
|
||||||
|
this->common.x = x;
|
||||||
|
this->common.y = y;
|
||||||
|
this->common.width = width;
|
||||||
|
this->common.height = height;
|
||||||
|
|
||||||
|
if (l != NULL) {
|
||||||
|
l->item->hints(g, l->item, &cwidth, &cheight);
|
||||||
|
l->item->allocate(g, l->item, x+(width-cwidth)/2, y+(height-cheight)/2,
|
||||||
|
cwidth, cheight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hints(gui *_gui, widget *_w, int *width, int *height)
|
||||||
|
{
|
||||||
|
LOGD("HINTS positioner %p\n", _w);
|
||||||
|
struct gui *g = _gui;
|
||||||
|
struct positioner_widget *this = _w;
|
||||||
|
struct widget_list *l = this->common.children;
|
||||||
|
if (l != NULL)
|
||||||
|
l->item->hints(g, l->item, width, height);
|
||||||
|
else { *width = *height = 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
static void button(gui *_g, widget *_this, int x, int y, int button, int up)
|
||||||
|
{
|
||||||
|
LOGD("BUTTON positioner %p xy %d %d button %d up %d\n", _this, x, y, button, up);
|
||||||
|
struct gui *g = _g;
|
||||||
|
struct positioner_widget *this = _this;
|
||||||
|
struct widget_list *l = this->common.children;
|
||||||
|
if (l != NULL)
|
||||||
|
l->item->button(g, l->item, x, y, button, up);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void paint(gui *_gui, widget *_this)
|
||||||
|
{
|
||||||
|
LOGD("PAINT positioner\n");
|
||||||
|
struct gui *g = _gui;
|
||||||
|
struct widget *this = _this;
|
||||||
|
struct widget_list *l = this->children;
|
||||||
|
if (l != NULL)
|
||||||
|
l->item->paint(g, l->item);
|
||||||
|
}
|
||||||
|
|
||||||
|
widget *new_positioner(gui *_gui)
|
||||||
|
{
|
||||||
|
struct gui *g = _gui;
|
||||||
|
struct positioner_widget *w;
|
||||||
|
|
||||||
|
glock(g);
|
||||||
|
|
||||||
|
w = new_widget(g, POSITIONER, sizeof(struct positioner_widget));
|
||||||
|
|
||||||
|
w->common.paint = paint;
|
||||||
|
w->common.add_child = add_child;
|
||||||
|
w->common.del_child = del_child;
|
||||||
|
w->common.allocate = allocate;
|
||||||
|
w->common.hints = hints;
|
||||||
|
w->common.button = button;
|
||||||
|
|
||||||
|
gunlock(g);
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
@@ -264,7 +264,8 @@ void widget_dirty(gui *_gui, widget *_this)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const char *names[] = {
|
static const char *names[] = {
|
||||||
"TOPLEVEL_WINDOW", "CONTAINER", "TEXT_LIST", "XY_PLOT", "BUTTON", "LABEL"
|
"TOPLEVEL_WINDOW", "CONTAINER", "POSITIONER", "TEXT_LIST",
|
||||||
|
"XY_PLOT", "BUTTON", "LABEL"
|
||||||
};
|
};
|
||||||
const char *widget_name(enum widget_type type)
|
const char *widget_name(enum widget_type type)
|
||||||
{
|
{
|
||||||
@@ -272,6 +273,7 @@ const char *widget_name(enum widget_type type)
|
|||||||
default: break;
|
default: break;
|
||||||
case TOPLEVEL_WINDOW:
|
case TOPLEVEL_WINDOW:
|
||||||
case CONTAINER:
|
case CONTAINER:
|
||||||
|
case POSITIONER:
|
||||||
case TEXT_LIST:
|
case TEXT_LIST:
|
||||||
case XY_PLOT:
|
case XY_PLOT:
|
||||||
case BUTTON:
|
case BUTTON:
|
||||||
|
|||||||
Reference in New Issue
Block a user