diff options
author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2013-06-01 20:06:22 +0000 |
---|---|---|
committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2013-06-01 20:06:22 +0000 |
commit | f0ca24a93de277044917107975242ad8e4afa4cf (patch) | |
tree | fa8382e63c509a93e2370d1275ddbe864979b7d0 /navit | |
parent | fa900714e23a8821bb04f472b5a32839dd5b9d24 (diff) | |
download | navit-f0ca24a93de277044917107975242ad8e4afa4cf.tar.gz |
Add:gui_internal:Further code in preparation of making the box widget scrollable
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5528 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit')
-rw-r--r-- | navit/gui/internal/gui_internal.h | 3 | ||||
-rw-r--r-- | navit/gui/internal/gui_internal_html.c | 2 | ||||
-rw-r--r-- | navit/gui/internal/gui_internal_widget.c | 43 | ||||
-rw-r--r-- | navit/gui/internal/gui_internal_widget.h | 1 |
4 files changed, 39 insertions, 10 deletions
diff --git a/navit/gui/internal/gui_internal.h b/navit/gui/internal/gui_internal.h index f9f31f1a4..b13d34e34 100644 --- a/navit/gui/internal/gui_internal.h +++ b/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/gui/internal/gui_internal_html.c b/navit/gui/internal/gui_internal_html.c index 0cb28761f..c9d33be56 100644 --- a/navit/gui/internal/gui_internal_html.c +++ b/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/gui/internal/gui_internal_widget.c b/navit/gui/internal/gui_internal_widget.c index e851fc980..d677d3ca8 100644 --- a/navit/gui/internal/gui_internal_widget.c +++ b/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/gui/internal/gui_internal_widget.h b/navit/gui/internal/gui_internal_widget.h index 9cdd9ae10..4f337373a 100644 --- a/navit/gui/internal/gui_internal_widget.h +++ b/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 { |