summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Leske <sebastian.leske@sleske.name>2016-05-27 08:56:45 +0200
committerSebastian Leske <sebastian.leske@sleske.name>2016-05-31 22:35:48 +0200
commitdce47eec67da325662603f47b03dfc53a8e1f957 (patch)
treed3a50aa61288d9673db5d175651b51a71e8a507f
parentbd2e244ea877f242efbd02412f22aaa6a50fd2ab (diff)
downloadnavit-dce47eec67da325662603f47b03dfc53a8e1f957.tar.gz
Fix:gui_internal:Repair "Set distance to"/"Get more" menu items. Fixes #1342.
During table rendering, do not disable off-screen table entries by toggling STATE_SENSITIVE. Doing so breaks the menu items "Set distance to"/ "Get more"; these must never be STATE_SENSITIVE, since their sub-widgets should receive clicks. Instead, use STATE_OFFSCREEN to mark off-screen entries and skip them during traversal with a rotary encoder.
-rw-r--r--navit/gui/internal/gui_internal.c7
-rw-r--r--navit/gui/internal/gui_internal.h1
-rw-r--r--navit/gui/internal/gui_internal_widget.c10
3 files changed, 12 insertions, 6 deletions
diff --git a/navit/gui/internal/gui_internal.c b/navit/gui/internal/gui_internal.c
index a3a7b2994..2437ddee5 100644
--- a/navit/gui/internal/gui_internal.c
+++ b/navit/gui/internal/gui_internal.c
@@ -2701,7 +2701,9 @@ gui_internal_keynav_point(struct widget *w, int dx, int dy, struct point *p)
static struct widget*
gui_internal_keynav_find_next_sensitive_child(struct widget *wi) {
GList *l=wi->children;
- if (wi && wi->state & STATE_SENSITIVE)
+ if (wi->state & STATE_OFFSCREEN)
+ return NULL;
+ if (wi->state & STATE_SENSITIVE)
return wi;
while (l) {
struct widget* tmp = gui_internal_keynav_find_next_sensitive_child(l->data);
@@ -2746,6 +2748,9 @@ gui_internal_keynav_find_prev(struct widget *wi, struct widget *current_highligh
// Reached current widget; last widget found is the result.
return RESULT_FOUND;
}
+ // If widget is off-screen, do not recurse into it.
+ if (wi->state & STATE_OFFSCREEN)
+ return NO_RESULT_YET;
if (wi->state & STATE_SENSITIVE)
*result= wi;
GList *l=wi->children;
diff --git a/navit/gui/internal/gui_internal.h b/navit/gui/internal/gui_internal.h
index 162fb296e..ea5ab79ae 100644
--- a/navit/gui/internal/gui_internal.h
+++ b/navit/gui/internal/gui_internal.h
@@ -8,6 +8,7 @@ struct gui_priv;
#define STATE_CLEAR 32
#define STATE_EDITABLE 64
#define STATE_SCROLLABLE 128
+#define STATE_OFFSCREEN 256
#define GESTURE_RINGSIZE 100
diff --git a/navit/gui/internal/gui_internal_widget.c b/navit/gui/internal/gui_internal_widget.c
index a4c859375..1dd28837f 100644
--- a/navit/gui/internal/gui_internal_widget.c
+++ b/navit/gui/internal/gui_internal_widget.c
@@ -1248,7 +1248,7 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w)
is_first_page=1;
}
- /* First, let's deactivate all columns that are in rows which are *before*
+ /* First, let's mark all columns as off-screen that are in rows which are *before*
* our current page.
* */
GList *row = w->children;
@@ -1264,7 +1264,7 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w)
cur_column=g_list_next(cur_column))
{
struct widget * cur_widget = (struct widget*) cur_column->data;
- cur_widget->state &= ~STATE_SENSITIVE;
+ cur_widget->state |= STATE_OFFSCREEN;
}
row = g_list_next(row);
}
@@ -1308,7 +1308,7 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w)
/* We pack the widget before rendering to ensure that the x and y
* coordinates get pushed down.
*/
- cur_widget->state |= STATE_SENSITIVE;
+ cur_widget->state &= ~STATE_OFFSCREEN;
gui_internal_widget_pack(this,cur_widget);
gui_internal_widget_render(this,cur_widget);
@@ -1317,8 +1317,8 @@ gui_internal_table_render(struct gui_priv * this, struct widget * w)
max_height = dim->height;
}
} else {
- /* Deactivate contents that we don't have space for. */
- cur_widget->state &= ~STATE_SENSITIVE;
+ /* Mark contents that we don't have space for. */
+ cur_widget->state |= STATE_OFFSCREEN;
}
}