Finished reimplementing the GTK+ uiArea. Now to build. Then to rewrite the tests...
This commit is contained in:
parent
8ea3b07aa8
commit
e167b08fdb
1
ui.h
1
ui.h
|
@ -292,6 +292,7 @@ struct uiAreaHandler {
|
||||||
_UI_EXTERN uintmax_t uiMenuItemType(void);
|
_UI_EXTERN uintmax_t uiMenuItemType(void);
|
||||||
#define uiArea(this) ((uiArea *) uiIsA((this), uiAreaType(), 1))
|
#define uiArea(this) ((uiArea *) uiIsA((this), uiAreaType(), 1))
|
||||||
// TODO give a better name
|
// TODO give a better name
|
||||||
|
// TODO document the types of width and height
|
||||||
_UI_EXTERN void uiAreaSetSize(uiArea *a, intmax_t width, intmax_t height);
|
_UI_EXTERN void uiAreaSetSize(uiArea *a, intmax_t width, intmax_t height);
|
||||||
// TODO uiAreaQueueRedraw()
|
// TODO uiAreaQueueRedraw()
|
||||||
_UI_EXTERN void uiAreaQueueRedrawAll(uiArea *a);
|
_UI_EXTERN void uiAreaQueueRedrawAll(uiArea *a);
|
||||||
|
|
77
unix/area.c
77
unix/area.c
|
@ -37,6 +37,8 @@ struct uiArea {
|
||||||
uiAreaHandler *ah;
|
uiAreaHandler *ah;
|
||||||
|
|
||||||
gboolean scrolling;
|
gboolean scrolling;
|
||||||
|
intmax_t scrollWidth;
|
||||||
|
intmax_t scrollHeight;
|
||||||
|
|
||||||
clickCounter cc;
|
clickCounter cc;
|
||||||
};
|
};
|
||||||
|
@ -135,7 +137,35 @@ static gboolean areaWidget_draw(GtkWidget *w, cairo_t *cr)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO preferred height/width
|
// to do this properly for scrolling areas, we need to
|
||||||
|
// - return the same value for min and nat
|
||||||
|
// - call gtk_widget_queue_resize() when the size changes
|
||||||
|
// thanks to Company in irc.gimp.net/#gtk+
|
||||||
|
static void areaWidget_get_preferred_height(GtkWidget *w, gint *min, gint *nat)
|
||||||
|
{
|
||||||
|
areaWidget *aw = areaWidget(w);
|
||||||
|
uiArea *a = aw->a;
|
||||||
|
|
||||||
|
// always chain up just in case
|
||||||
|
GTK_WIDGET_CLASS(areaWidget_parent_class)->get_preferred_height(w, min, nat);
|
||||||
|
if (a->scrolling) {
|
||||||
|
*min = a->scrollHeight;
|
||||||
|
*nat = a->scrollHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void areaWidget_get_preferred_width(GtkWidget *w, gint *min, gint *nat)
|
||||||
|
{
|
||||||
|
areaWidget *aw = areaWidget(w);
|
||||||
|
uiArea *a = aw->a;
|
||||||
|
|
||||||
|
// always chain up just in case
|
||||||
|
GTK_WIDGET_CLASS(areaWidget_parent_class)->get_preferred_width(w, min, nat);
|
||||||
|
if (a->scrolling) {
|
||||||
|
*min = a->scrollWidth;
|
||||||
|
*nat = a->scrollWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO merge with toModifiers?
|
// TODO merge with toModifiers?
|
||||||
static guint translateModifiers(guint state, GdkWindow *window)
|
static guint translateModifiers(guint state, GdkWindow *window)
|
||||||
|
@ -435,8 +465,8 @@ static void areaWidget_class_init(areaWidgetClass *class)
|
||||||
|
|
||||||
GTK_WIDGET_CLASS(class)->size_allocate = areaWidget_size_allocate;
|
GTK_WIDGET_CLASS(class)->size_allocate = areaWidget_size_allocate;
|
||||||
GTK_WIDGET_CLASS(class)->draw = areaWidget_draw;
|
GTK_WIDGET_CLASS(class)->draw = areaWidget_draw;
|
||||||
// GTK_WIDGET_CLASS(class)->get_preferred_height = areaWidget_get_preferred_height;
|
GTK_WIDGET_CLASS(class)->get_preferred_height = areaWidget_get_preferred_height;
|
||||||
// GTK_WIDGET_CLASS(class)->get_preferred_width = areaWidget_get_preferred_width;
|
GTK_WIDGET_CLASS(class)->get_preferred_width = areaWidget_get_preferred_width;
|
||||||
GTK_WIDGET_CLASS(class)->button_press_event = areaWidget_button_press_event;
|
GTK_WIDGET_CLASS(class)->button_press_event = areaWidget_button_press_event;
|
||||||
GTK_WIDGET_CLASS(class)->button_release_event = areaWidget_button_release_event;
|
GTK_WIDGET_CLASS(class)->button_release_event = areaWidget_button_release_event;
|
||||||
GTK_WIDGET_CLASS(class)->motion_notify_event = areaWidget_motion_notify_event;
|
GTK_WIDGET_CLASS(class)->motion_notify_event = areaWidget_motion_notify_event;
|
||||||
|
@ -459,9 +489,13 @@ uiUnixDefineControl(
|
||||||
uiAreaType // type function
|
uiAreaType // type function
|
||||||
)
|
)
|
||||||
|
|
||||||
void uiAreaUpdateScroll(uiArea *a)
|
void uiAreaSetSize(uiArea *a, intmax_t width, intmax_t height)
|
||||||
{
|
{
|
||||||
updateScroll(a->area);
|
if (!a->scrolling)
|
||||||
|
complain("attempt to call uiAreaSetSize() on a non-scrolling uiArea");
|
||||||
|
a->scrollWidth = width;
|
||||||
|
a->scrollHeight = height;
|
||||||
|
gtk_widget_queue_resize(a->areaWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiAreaQueueRedrawAll(uiArea *a)
|
void uiAreaQueueRedrawAll(uiArea *a)
|
||||||
|
@ -475,9 +509,7 @@ uiArea *uiNewArea(uiAreaHandler *ah)
|
||||||
|
|
||||||
a = (uiArea *) uiNewControl(uiAreaType());
|
a = (uiArea *) uiNewControl(uiAreaType());
|
||||||
|
|
||||||
a->widget = gtk_scrolled_window_new(NULL, NULL);
|
a->scrolling = FALSE;
|
||||||
a->scontainer = GTK_CONTAINER(a->widget);
|
|
||||||
a->sw = GTK_SCROLLED_WINDOW(a->widget);
|
|
||||||
|
|
||||||
a->areaWidget = GTK_WIDGET(g_object_new(areaWidgetType,
|
a->areaWidget = GTK_WIDGET(g_object_new(areaWidgetType,
|
||||||
"libui-area", a,
|
"libui-area", a,
|
||||||
|
@ -485,6 +517,35 @@ uiArea *uiNewArea(uiAreaHandler *ah)
|
||||||
a->drawingArea = GTK_DRAWING_AREA(a->areaWidget);
|
a->drawingArea = GTK_DRAWING_AREA(a->areaWidget);
|
||||||
a->area = areaWidget(a->areaWidget);
|
a->area = areaWidget(a->areaWidget);
|
||||||
|
|
||||||
|
a->widget = a->areaWidget;
|
||||||
|
|
||||||
|
uiUnixFinishNewControl(a, uiArea);
|
||||||
|
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
uiArea *uiNewScrollingArea(uiAreaHandler *ah, intmax_t width, intmax_t height)
|
||||||
|
{
|
||||||
|
uiArea *a;
|
||||||
|
|
||||||
|
a = (uiArea *) uiNewControl(uiAreaType());
|
||||||
|
|
||||||
|
a->scrolling = TRUE;
|
||||||
|
a->scrollWidth = width;
|
||||||
|
a->scrollHeight = height;
|
||||||
|
|
||||||
|
a->swidget = gtk_scrolled_window_new(NULL, NULL);
|
||||||
|
a->scontainer = GTK_CONTAINER(a->swidget);
|
||||||
|
a->sw = GTK_SCROLLED_WINDOW(a->swidget);
|
||||||
|
|
||||||
|
a->areaWidget = GTK_WIDGET(g_object_new(areaWidgetType,
|
||||||
|
"libui-area", a,
|
||||||
|
NULL));
|
||||||
|
a->drawingArea = GTK_DRAWING_AREA(a->areaWidget);
|
||||||
|
a->area = areaWidget(a->areaWidget);
|
||||||
|
|
||||||
|
a->widget = a->swidget;
|
||||||
|
|
||||||
gtk_container_add(a->scontainer, a->areaWidget);
|
gtk_container_add(a->scontainer, a->areaWidget);
|
||||||
// and make the area visible; only the scrolled window's visibility is controlled by libui
|
// and make the area visible; only the scrolled window's visibility is controlled by libui
|
||||||
gtk_widget_show(a->areaWidget);
|
gtk_widget_show(a->areaWidget);
|
||||||
|
|
Loading…
Reference in New Issue