[PATCH] Border interactions (history navigation and page up/down).
Tim Besard
tim.besard at gmail.com
Sat Nov 28 16:37:35 CET 2009
---
wiki-app/history.c | 39 +++++++++++++++---
wiki-app/history.h | 7 ++-
wiki-app/lcd_buf_draw.c | 101 +++++++++++++++++++++++++++++++++++-----------
wiki-app/lcd_buf_draw.h | 3 +
wiki-app/wikilib.c | 23 ++++++++++-
5 files changed, 140 insertions(+), 33 deletions(-)
diff --git a/wiki-app/history.c b/wiki-app/history.c
index 7548b06..d6ebef7 100644
--- a/wiki-app/history.c
+++ b/wiki-app/history.c
@@ -44,6 +44,7 @@ int history_count = 0;
int rendered_history_count = -1;
int history_changed = HISTORY_SAVE_NONE;
extern int display_mode;
+int history_index = 0;
static inline unsigned int history_modulus(int modulus) {
return modulus % HISTORY_MAX_DISPLAY_ITEM;
@@ -55,10 +56,14 @@ void history_reload()
render_history_with_pcf();
}
-void history_add(const long idx_article, const char *title, int b_keep_pos)
+void history_add(const long idx_article, const char *title, int b_keep_pos, int b_shift)
{
int i = 0;
int bFound = 0;
+
+ if (b_shift)
+ history_shift(history_index);
+ history_index = 0;
history_changed = HISTORY_SAVE_NORMAL;
while (!bFound && i < history_count)
@@ -89,11 +94,23 @@ void history_add(const long idx_article, const char *title, int b_keep_pos)
history_count++;
}
-void history_log_y_pos(const long y_pos)
-{
- if (history_changed != HISTORY_SAVE_NORMAL)
- history_changed = HISTORY_SAVE_POWER_OFF;
- history_list[0].last_y_pos = y_pos;
+long history_get_article() {
+ return history_list[history_index].idx_article;
+}
+
+void history_shift(int amount) {
+ if (amount <= 0)
+ return;
+ if (amount >= history_count) {
+ history_clear();
+ return;
+ }
+ history_count -= amount;
+ memcpy((void*)&history_list[0],(void*)&history_list[amount],sizeof(HISTORY)*history_count);
+}
+
+void history_set_y_pos(const long y_pos) {
+ history_list[history_index].last_y_pos = y_pos;
}
long history_get_y_pos(const long idx_article)
@@ -164,6 +181,16 @@ int history_list_save(int level)
return rc;
}
+void history_navigate(int articles) {
+ int index = history_index - articles;
+ if (index < 0 || index >= history_count)
+ return;
+ history_index -= articles;
+ long idx_article = history_get_article();
+
+ display_revisited_article(idx_article);
+}
+
void draw_clear_history(int bClear)
{
int i;
diff --git a/wiki-app/history.h b/wiki-app/history.h
index 6117783..d10c756 100644
--- a/wiki-app/history.h
+++ b/wiki-app/history.h
@@ -34,15 +34,18 @@
void history_clear(void);
-void history_add(const long idx_article, const char *title, int b_keep_pos);
+void history_add(const long idx_article, const char *title, int b_keep_pos, int b_shift);
unsigned int history_get_count();
void history_list_init(void);
int history_list_save(int level);
void history_open_article(int new_selection);
void history_reload();
-void history_log_y_pos(const long y_pos);
+long history_get_article();
+void history_shift(int amount);
+void history_set_y_pos(const long y_pos);
long history_get_y_pos(const long idx_article);
+void history_navigate(int articles);
void draw_clear_history(int bFlag);
typedef struct _HISTORY {
diff --git a/wiki-app/lcd_buf_draw.c b/wiki-app/lcd_buf_draw.c
index 51bceb1..9d80619 100644
--- a/wiki-app/lcd_buf_draw.c
+++ b/wiki-app/lcd_buf_draw.c
@@ -106,6 +106,8 @@ int stop_render_article = 0;
int b_show_scroll_bar = 0;
long saved_idx_article;
+bool hist_revisit = false;
+
#define MIN_BAR_LEN 20
void show_scroll_bar(int bShow)
{
@@ -1199,7 +1201,7 @@ void display_article_with_pcf(int start_y)
if (lcd_draw_cur_y_pos < 0)
lcd_draw_cur_y_pos = 0;
if (display_mode == DISPLAY_MODE_ARTICLE)
- history_log_y_pos(lcd_draw_cur_y_pos);
+ history_set_y_pos(lcd_draw_cur_y_pos);
pos = (lcd_draw_cur_y_pos*LCD_VRAM_WIDTH_PIXELS)/8;
@@ -1223,7 +1225,7 @@ float scroll_speed()
void scroll_article(void)
{
unsigned long time_now, delay_time;
- long pos;
+ int article_scroll_actual;
if(finger_move_speed == 0)
return;
@@ -1244,26 +1246,13 @@ void scroll_article(void)
time_scroll_article_last = time_now;
article_scroll_increment = (float)finger_move_speed * ((float)delay_time / (float)seconds_to_ticks(1));
-
- lcd_draw_cur_y_pos += article_scroll_increment;
finger_move_speed = scroll_speed();
- if(lcd_draw_cur_y_pos < 0)
- {
- lcd_draw_cur_y_pos = 0;
- finger_move_speed = 0;
- }
- else if (lcd_draw_cur_y_pos > lcd_draw_buf.current_y - LCD_HEIGHT_LINES)
- {
- lcd_draw_cur_y_pos = lcd_draw_buf.current_y - LCD_HEIGHT_LINES;
+
+ article_scroll_actual = scroll_article_raw(article_scroll_increment);
+ if (article_scroll_actual != article_scroll_increment)
finger_move_speed = 0;
- }
- if (display_mode == DISPLAY_MODE_ARTICLE)
- history_log_y_pos(lcd_draw_cur_y_pos);
-
- pos = (lcd_draw_cur_y_pos*LCD_VRAM_WIDTH_PIXELS)/8;
-
- repaint_framebuffer(lcd_draw_buf.screen_buf,pos, 1);
-
+
+
if (finger_move_speed == 0 && b_show_scroll_bar)
{
b_show_scroll_bar = 0;
@@ -1272,6 +1261,48 @@ void scroll_article(void)
}
}
+int scroll_article_raw(int amount)
+{
+ long pos;
+ int lcd_draw_new_y_pos;
+
+ if (!display_first_page || request_display_next_page ||
+ ((display_mode == DISPLAY_MODE_INDEX || display_mode == DISPLAY_MODE_HISTORY) &&
+ article_link_count <= NUMBER_OF_FIRST_PAGE_RESULTS))
+ {
+ return 0;
+ }
+
+ lcd_draw_new_y_pos = lcd_draw_cur_y_pos + amount;
+ if(lcd_draw_new_y_pos < 0)
+ {
+ amount = -lcd_draw_cur_y_pos;
+ }
+ else if (lcd_draw_new_y_pos > lcd_draw_buf.current_y - LCD_HEIGHT_LINES)
+ {
+ amount = lcd_draw_buf.current_y - LCD_HEIGHT_LINES - lcd_draw_cur_y_pos;
+ }
+ lcd_draw_cur_y_pos += amount;
+
+ if (display_mode == DISPLAY_MODE_ARTICLE)
+ history_set_y_pos(lcd_draw_cur_y_pos);
+
+ pos = (lcd_draw_cur_y_pos*LCD_VRAM_WIDTH_PIXELS)/8;
+
+ repaint_framebuffer(lcd_draw_buf.screen_buf,pos, 1);
+
+ return amount;
+}
+
+void scroll_article_page(int pages) {
+ int pixels = pages * LCD_HEIGHT_LINES;
+ if (pages > 0)
+ pixels -= lcd_draw_buf.line_height;
+ else
+ pixels += lcd_draw_buf.line_height;
+ scroll_article_raw(pixels);
+}
+
void display_retrieved_article(long idx_article)
{
int i;
@@ -1280,13 +1311,13 @@ void display_retrieved_article(long idx_article)
char title[MAX_TITLE_SEARCH];
int link_count_addon = 0;
int bKeepPos = 0;
-
+
if (last_display_mode == DISPLAY_MODE_HISTORY)
{
init_render_article(history_get_y_pos(idx_article));
bKeepPos = 1;
}
- else
+ else if (!hist_revisit)
{
init_render_article(0);
}
@@ -1324,7 +1355,11 @@ void display_retrieved_article(long idx_article)
display_first_page = 0; // use this to disable scrolling until the first page of the linked article is loaded
get_article_title_from_idx(idx_article, title);
- history_add(idx_article, title, bKeepPos);
+ if (!hist_revisit) {
+ // Clicking through removes history entries ahead
+ bool bShift = (last_display_mode == DISPLAY_MODE_ARTICLE);
+ history_add(idx_article, title, bKeepPos, bShift);
+ }
}
int isArticleLinkSelectedSequentialSearch(int x,int y, int start_i, int end_i)
@@ -1487,9 +1522,25 @@ int load_init_article(long idx_init_article)
#endif
#ifndef WIKIPCF
-void display_link_article(long idx_article)
+void display_revisited_article(long idx_article)
{
+ request_y_pos = 0;
+ saved_idx_article = idx_article;
+ file_buffer[0] = '\0';
+ if (retrieve_article(idx_article))
+ return;
+
+ if (restricted_article && check_restriction(idx_article))
+ return;
+
+ hist_revisit = true;
+ init_render_article(history_get_y_pos(idx_article));
+ display_link_article(idx_article);
+ hist_revisit = false;
+}
+void display_link_article(long idx_article)
+{
request_y_pos = 0;
if (idx_article == RESTRICTED_MARK_LINK)
{
@@ -1968,3 +2019,5 @@ void msg_on_lcd_clear(int x, int y)
// guilib_fb_unlock();
#endif
}
+
+
diff --git a/wiki-app/lcd_buf_draw.h b/wiki-app/lcd_buf_draw.h
index a533f3a..5cb3d55 100644
--- a/wiki-app/lcd_buf_draw.h
+++ b/wiki-app/lcd_buf_draw.h
@@ -266,12 +266,15 @@ void init_file_buffer();
int div_wiki(int a,int b);
int GetFontLinespace(int font);
#ifndef WIKIPCF
+void display_revisited_article(long idx_article);
void display_link_article(long idx_article);
void display_retrieved_article(long idx_article);
void display_str(char *str);
void open_article_link(int x,int y);
void open_article_link_with_link_number(int article_link_number);
void scroll_article(void);
+int scroll_article_raw(int amount);
+void scroll_article_page(int pages);
int draw_bmf_char(ucs4_t u,int font,int x,int y, int inverted);
int buf_draw_bmf_char(char *buf, ucs4_t u,int font,int x,int y, int inverted);
int isArticleLinkSelected(int x,int y);
diff --git a/wiki-app/wikilib.c b/wiki-app/wikilib.c
index d0f4547..4c0516d 100644
--- a/wiki-app/wikilib.c
+++ b/wiki-app/wikilib.c
@@ -95,6 +95,7 @@ bool article_moved = false;
#define SMOOTH_SCROLL_ACTIVATION_SPPED_THRESHOLD 50
#define LIST_SMOOTH_SCROLL_SPEED_FACTOR 5
#define ARTICLE_SMOOTH_SCROLL_SPEED_FACTOR 3
+#define TAPBORDER 15
int article_scroll_pixel = INITIAL_ARTICLE_SCROLL_PIXEL;
int article_moved_pixels = 0;
extern int link_to_be_inverted;
@@ -727,7 +728,7 @@ static void handle_touch(struct wl_input_event *ev)
article_moved_pixels = 0;
touch_y_last_unreleased = 0;
start_move_time = 0;
-
+
article_link_number = get_activated_article_link_number();
if(article_link_number>=0)
{
@@ -751,6 +752,26 @@ static void handle_touch(struct wl_input_event *ev)
init_invert_link();
}
return;
+ } else if (finger_move_speed == 0) {
+ // Top tap
+ if (ev->touch_event.y <= TAPBORDER) {
+ scroll_article_page(-1);
+ }
+
+ // Bottom tap
+ else if (LCD_HEIGHT_LINES - ev->touch_event.y <= TAPBORDER) {
+ scroll_article_page(1);
+ }
+
+ // Left tap
+ else if (ev->touch_event.x <= TAPBORDER) {
+ history_navigate(-1);
+ }
+
+ // Right tap
+ else if (LCD_WIDTH_PIXELS - ev->touch_event.x <= TAPBORDER) {
+ history_navigate(1);
+ }
}
reset_article_link_number();
--
1.6.5.2
--=-G96Th15gLYeEfPSauiOg--
More information about the community
mailing list