summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-06-01 20:06:22 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2013-06-01 20:06:22 +0000
commit94fe19c59258e996568029a1c5c3731b6b58f66f (patch)
tree8c60cf9258fbc95c1d5eb9c1ab17e36fdf7eff6c
parentc8c89815de8f9b6b07bc29ec83f254e3d7b1a539 (diff)
downloadnavit-94fe19c59258e996568029a1c5c3731b6b58f66f.tar.gz
Add:gui_internal:Further code in preparation of making the box widget scrollable
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@5528 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r--navit/navit/gui/internal/gui_internal.h3
-rw-r--r--navit/navit/gui/internal/gui_internal_html.c2
-rw-r--r--navit/navit/gui/internal/gui_internal_widget.c43
-rw-r--r--navit/navit/gui/internal/gui_internal_widget.h1
4 files changed, 39 insertions, 10 deletions
diff --git a/navit/navit/gui/internal/gui_internal.h b/navit/navit/gui/internal/gui_internal.h
index f9f31f1a4..b13d34e34 100644
--- a/navit/navit/gui/internal/gui_internal.h
+++ b/navit/navit/gui/internal/gui_internal.h
@@ -10,6 +10,7 @@ struct gui_priv;
#define STATE_CLEAR 32
#define STATE_EDITABLE 64
#define STATE_SCROLLABLE 128
+#define STATE_OFFSCREEN 256
#define GESTURE_RINGSIZE 100
@@ -42,6 +43,8 @@ enum flags {
flags_expand=0x100,
flags_fill=0x200,
flags_swap=0x400,
+ flags_scrollx=0x800,
+ flags_scrolly=0x1000,
orientation_horizontal=0x10000,
orientation_vertical=0x20000,
orientation_horizontal_vertical=0x40000,
diff --git a/navit/navit/gui/internal/gui_internal_html.c b/navit/navit/gui/internal/gui_internal_html.c
index 0cb28761f..c9d33be56 100644
--- a/navit/navit/gui/internal/gui_internal_html.c
+++ b/navit/navit/gui/internal/gui_internal_html.c
@@ -428,7 +428,7 @@ gui_internal_html_text(void *dummy, const char *text, int len, void *data, void
case html_tag_a:
if (html->name && len) {
if (html->class && !strcasecmp(html->class,"clist"))
- this->html_container=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill);
+ this->html_container=gui_internal_box_new(this, gravity_left_top|orientation_vertical|flags_expand|flags_fill /* |flags_scrolly */);
else
this->html_container=gui_internal_box_new(this, gravity_center|orientation_horizontal_vertical|flags_expand|flags_fill);
gui_internal_widget_append(gui_internal_menu(this, _(text_stripped)), this->html_container);
diff --git a/navit/navit/gui/internal/gui_internal_widget.c b/navit/navit/gui/internal/gui_internal_widget.c
index e851fc980..d677d3ca8 100644
--- a/navit/navit/gui/internal/gui_internal_widget.c
+++ b/navit/navit/gui/internal/gui_internal_widget.c
@@ -11,6 +11,7 @@
#include "gui_internal_priv.h"
#include "gui_internal_menu.h"
+static void gui_internal_scroll_buttons_init(struct gui_priv *this, struct widget *widget, struct scroll_buttons *sb);
static void
gui_internal_background_render(struct gui_priv *this, struct widget *w)
@@ -331,9 +332,12 @@ static void gui_internal_box_render(struct gui_priv *this, struct widget *w)
l=w->children;
while (l) {
wc=l->data;
- gui_internal_widget_render(this, wc);
+ if (!(wc->state & STATE_OFFSCREEN))
+ gui_internal_widget_render(this, wc);
l=g_list_next(l);
}
+ if (w->scroll_buttons)
+ gui_internal_widget_render(this, w->scroll_buttons->button_box);
}
@@ -346,6 +350,7 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
{
struct widget *wc;
int x0,x=0,y=0,width=0,height=0,owidth=0,oheight=0,expand=0,expandd=1,count=0,rows=0,cols=w->cols ? w->cols : 0;
+ int hb=w->scroll_buttons?w->scroll_buttons->button_box->h:0;
GList *l;
int orientation=w->flags & 0xffff0000;
@@ -425,8 +430,8 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
}
oheight=height;
if (expand && w->h) {
- expandd=w->h-height+expand;
- oheight=w->h;
+ expandd=w->h-hb-height+expand;
+ oheight=w->h-hb;
} else
expandd=expand=1;
break;
@@ -474,7 +479,7 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
}
if (! w->w && ! w->h) {
w->w=w->bl+w->br+width;
- w->h=w->bt+w->bb+height;
+ w->h=w->bt+w->bb+height+hb;
w->packed=1;
}
#if 0
@@ -498,9 +503,9 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
if (w->flags & gravity_top)
y=w->p.y+w->bt;
if (w->flags & gravity_ycenter)
- y=w->p.y+w->h/2-oheight/2;
+ y=w->p.y+(w->h-hb)/2-oheight/2;
if (w->flags & gravity_bottom)
- y=w->p.y+w->h-w->bb-oheight;
+ y=w->p.y+(w->h-hb)-w->bb-oheight;
l=w->children;
switch (orientation) {
case orientation_horizontal:
@@ -509,7 +514,7 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
wc=l->data;
wc->p.x=x;
if (wc->flags & flags_fill)
- wc->h=w->h;
+ wc->h=w->h-hb;
if (wc->flags & flags_expand) {
if (! wc->w)
wc->w=1;
@@ -543,6 +548,14 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
wc->p.x=x-wc->w/2;
if (w->flags & gravity_right)
wc->p.x=x-wc->w;
+#if 0
+ if (w->flags & flags_scrolly)
+ dbg(0,"%d - %d vs %d - %d\n",y,y+wc->h,w->p.y,w->p.y+w->h-hb);
+ if (y+wc->h > w->p.y+w->h-hb || y+wc->h < w->p.y)
+ wc->state |= STATE_OFFSCREEN;
+ else
+ wc->state &= ~STATE_OFFSCREEN;
+#endif
y+=wc->h+w->spy;
l=g_list_next(l);
}
@@ -585,6 +598,17 @@ static void gui_internal_box_pack(struct gui_priv *this, struct widget *w)
default:
break;
}
+ if ((w->flags & flags_scrolly) && y > w->h+w->p.y && !w->scroll_buttons) {
+ w->scroll_buttons=g_new0(struct scroll_buttons, 1);
+ gui_internal_scroll_buttons_init(this, w, w->scroll_buttons);
+ w->scroll_buttons->button_box->w=w->w;
+ w->scroll_buttons->button_box->p.x=w->p.x;
+ w->scroll_buttons->button_box->p.y=w->p.y+w->h-w->scroll_buttons->button_box->h;
+ gui_internal_widget_pack(this, w->scroll_buttons->button_box);
+ dbg(0,"needs buttons %d vs %d\n",y,w->h);
+ gui_internal_box_pack(this, w);
+ return;
+ }
/**
* Call pack again on each child,
* the child has now had its size and coordinates
@@ -759,7 +783,6 @@ gui_internal_scroll_buttons_init(struct gui_priv *this, struct widget *widget, s
gravity_center|orientation_horizontal, gui_internal_table_button_prev, widget);
sb->button_box=gui_internal_box_new(this, gravity_center|orientation_horizontal);
- gui_internal_widget_append(widget, sb->button_box);
gui_internal_widget_append(sb->button_box, sb->prev_button);
gui_internal_widget_append(sb->button_box, sb->next_button);
@@ -794,8 +817,10 @@ struct widget * gui_internal_widget_table_new(struct gui_priv * this, enum flags
widget->background=this->background;
data = (struct table_data*)widget->data;
- if (buttons)
+ if (buttons) {
gui_internal_scroll_buttons_init(this, widget, &data->scroll_buttons);
+ gui_internal_widget_append(widget, data->scroll_buttons.button_box);
+ }
return widget;
diff --git a/navit/navit/gui/internal/gui_internal_widget.h b/navit/navit/gui/internal/gui_internal_widget.h
index 9cdd9ae10..4f337373a 100644
--- a/navit/navit/gui/internal/gui_internal_widget.h
+++ b/navit/navit/gui/internal/gui_internal_widget.h
@@ -74,6 +74,7 @@ struct widget {
struct form *form;
GList *children;
struct widget *parent;
+ struct scroll_buttons *scroll_buttons;
};
struct scroll_buttons {