diff options
author | Teruaki Kawashima <teru@rockbox.org> | 2010-06-29 13:33:19 +0000 |
---|---|---|
committer | Teruaki Kawashima <teru@rockbox.org> | 2010-06-29 13:33:19 +0000 |
commit | 5af120f1cb6269aac73bd3b3aa9665884508fc51 (patch) | |
tree | 0ffe193b823732f9910305d5a83bd92da7ca4c45 | |
parent | 470226dbbfc4ca0b61ca33620c06c695d7e55d57 (diff) | |
download | rockbox-5af120f1cb6269aac73bd3b3aa9665884508fc51.tar.gz rockbox-5af120f1cb6269aac73bd3b3aa9665884508fc51.zip |
some improvements for simple viewer.
* displays a scrollbar if there is more text than currently displayed.
* enables to scroll text by scrollwheel.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27175 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/plugins/lib/simple_viewer.c | 97 |
1 files changed, 77 insertions, 20 deletions
diff --git a/apps/plugins/lib/simple_viewer.c b/apps/plugins/lib/simple_viewer.c index bbb0b0310d..13fdc32c2f 100644 --- a/apps/plugins/lib/simple_viewer.c +++ b/apps/plugins/lib/simple_viewer.c | |||
@@ -28,7 +28,9 @@ | |||
28 | struct view_info { | 28 | struct view_info { |
29 | #ifdef HAVE_LCD_BITMAP | 29 | #ifdef HAVE_LCD_BITMAP |
30 | struct font* pf; | 30 | struct font* pf; |
31 | struct viewport scrollbar_vp; /* viewport for scrollbar */ | ||
31 | #endif | 32 | #endif |
33 | struct viewport vp; | ||
32 | const char *title; | 34 | const char *title; |
33 | const char *text; /* displayed text */ | 35 | const char *text; /* displayed text */ |
34 | int display_lines; /* number of lines can be displayed */ | 36 | int display_lines; /* number of lines can be displayed */ |
@@ -39,7 +41,6 @@ struct view_info { | |||
39 | 41 | ||
40 | static const char* get_next_line(const char *text, struct view_info *info) | 42 | static const char* get_next_line(const char *text, struct view_info *info) |
41 | { | 43 | { |
42 | (void) info; | ||
43 | const char *ptr = text; | 44 | const char *ptr = text; |
44 | const char *space = NULL; | 45 | const char *space = NULL; |
45 | int total, n, w; | 46 | int total, n, w; |
@@ -61,7 +62,7 @@ static const char* get_next_line(const char *text, struct view_info *info) | |||
61 | ptr += n; | 62 | ptr += n; |
62 | break; | 63 | break; |
63 | } | 64 | } |
64 | if (total + w > LCD_WIDTH) | 65 | if (total + w > info->vp.width) |
65 | break; | 66 | break; |
66 | ptr += n; | 67 | ptr += n; |
67 | total += w; | 68 | total += w; |
@@ -73,11 +74,29 @@ static void calc_line_count(struct view_info *info) | |||
73 | { | 74 | { |
74 | const char *ptr = info->text; | 75 | const char *ptr = info->text; |
75 | int i = 0; | 76 | int i = 0; |
77 | #ifdef HAVE_LCD_BITMAP | ||
78 | bool scrollbar = false; | ||
79 | #endif | ||
76 | 80 | ||
77 | while (*ptr) | 81 | while (*ptr) |
78 | { | 82 | { |
79 | ptr = get_next_line(ptr, info); | 83 | ptr = get_next_line(ptr, info); |
80 | i++; | 84 | i++; |
85 | #ifdef HAVE_LCD_BITMAP | ||
86 | if (!scrollbar && i > info->display_lines) | ||
87 | { | ||
88 | ptr = info->text; | ||
89 | i = 0; | ||
90 | info->scrollbar_vp = info->vp; | ||
91 | info->scrollbar_vp.width = rb->global_settings->scrollbar_width; | ||
92 | info->vp.width -= info->scrollbar_vp.width; | ||
93 | if (rb->global_settings->scrollbar != SCROLLBAR_RIGHT) | ||
94 | info->vp.x = info->scrollbar_vp.width; | ||
95 | else | ||
96 | info->scrollbar_vp.x = info->vp.width; | ||
97 | scrollbar = true; | ||
98 | } | ||
99 | #endif | ||
81 | } | 100 | } |
82 | info->line_count = i; | 101 | info->line_count = i; |
83 | } | 102 | } |
@@ -109,12 +128,12 @@ static void calc_first_line(struct view_info *info, int line) | |||
109 | static int init_view(struct view_info *info, | 128 | static int init_view(struct view_info *info, |
110 | const char *title, const char *text) | 129 | const char *title, const char *text) |
111 | { | 130 | { |
131 | rb->viewport_set_defaults(&info->vp, SCREEN_MAIN); | ||
112 | #ifdef HAVE_LCD_BITMAP | 132 | #ifdef HAVE_LCD_BITMAP |
113 | info->pf = rb->font_get(FONT_UI); | 133 | info->pf = rb->font_get(FONT_UI); |
114 | info->display_lines = LCD_HEIGHT / info->pf->height; | 134 | info->display_lines = info->vp.height / info->pf->height; |
115 | #else | 135 | #else |
116 | 136 | info->display_lines = info->vp.height; | |
117 | info->display_lines = LCD_HEIGHT; | ||
118 | #endif | 137 | #endif |
119 | 138 | ||
120 | info->title = title; | 139 | info->title = title; |
@@ -123,6 +142,7 @@ static int init_view(struct view_info *info, | |||
123 | info->line = 0; | 142 | info->line = 0; |
124 | info->start = 0; | 143 | info->start = 0; |
125 | 144 | ||
145 | #ifdef HAVE_LCD_BITMAP | ||
126 | /* no title for small screens. */ | 146 | /* no title for small screens. */ |
127 | if (info->display_lines < 4) | 147 | if (info->display_lines < 4) |
128 | { | 148 | { |
@@ -131,7 +151,10 @@ static int init_view(struct view_info *info, | |||
131 | else | 151 | else |
132 | { | 152 | { |
133 | info->display_lines--; | 153 | info->display_lines--; |
154 | info->vp.y += info->pf->height; | ||
155 | info->vp.height -= info->pf->height; | ||
134 | } | 156 | } |
157 | #endif | ||
135 | 158 | ||
136 | calc_line_count(info); | 159 | calc_line_count(info); |
137 | return 0; | 160 | return 0; |
@@ -146,47 +169,67 @@ static void draw_text(struct view_info *info) | |||
146 | #endif | 169 | #endif |
147 | static char output[OUTPUT_SIZE]; | 170 | static char output[OUTPUT_SIZE]; |
148 | const char *text, *ptr; | 171 | const char *text, *ptr; |
149 | int i, max_show, lines = 0; | 172 | int max_show, line; |
173 | struct screen* display = rb->screens[SCREEN_MAIN]; | ||
150 | 174 | ||
151 | /* clear screen */ | 175 | /* clear screen */ |
152 | rb->lcd_clear_display(); | 176 | display->clear_display(); |
153 | 177 | ||
178 | #ifdef HAVE_LCD_BITMAP | ||
154 | /* display title. */ | 179 | /* display title. */ |
155 | if(info->title) | 180 | if(info->title) |
156 | { | 181 | { |
157 | rb->lcd_puts(0, lines, info->title); | 182 | display->set_viewport(NULL); |
158 | lines++; | 183 | display->puts(0, 0, info->title); |
159 | } | 184 | } |
185 | #endif | ||
160 | 186 | ||
161 | max_show = MIN(info->line_count - info->line, info->display_lines); | 187 | max_show = MIN(info->line_count - info->line, info->display_lines); |
162 | text = info->text + info->start; | 188 | text = info->text + info->start; |
163 | 189 | ||
164 | for (i = 0; i < max_show; i++, lines++) | 190 | display->set_viewport(&info->vp); |
191 | for (line = 0; line < max_show; line++) | ||
165 | { | 192 | { |
193 | int len; | ||
166 | ptr = get_next_line(text, info); | 194 | ptr = get_next_line(text, info); |
167 | rb->strlcpy(output, text, ptr-text+1); | 195 | len = ptr-text; |
168 | rb->lcd_puts(0, lines, output); | 196 | while(len > 0 && isspace(text[len-1])) |
197 | len--; | ||
198 | rb->memcpy(output, text, len); | ||
199 | output[len] = 0; | ||
200 | display->puts(0, line, output); | ||
169 | text = ptr; | 201 | text = ptr; |
170 | } | 202 | } |
203 | #ifdef HAVE_LCD_BITMAP | ||
204 | if (info->line_count > info->display_lines) | ||
205 | { | ||
206 | display->set_viewport(&info->scrollbar_vp); | ||
207 | rb->gui_scrollbar_draw(display, (info->scrollbar_vp.width? 0: 1), 0, | ||
208 | info->scrollbar_vp.width - 1, info->scrollbar_vp.height, | ||
209 | info->line_count, info->line, info->line + max_show, | ||
210 | VERTICAL); | ||
211 | } | ||
212 | #endif | ||
171 | 213 | ||
172 | rb->lcd_update(); | 214 | display->set_viewport(NULL); |
215 | display->update(); | ||
173 | } | 216 | } |
174 | 217 | ||
175 | static void scroll_up(struct view_info *info) | 218 | static void scroll_up(struct view_info *info, int n) |
176 | { | 219 | { |
177 | if (info->line <= 0) | 220 | if (info->line <= 0) |
178 | return; | 221 | return; |
179 | calc_first_line(info, info->line-1); | 222 | |
223 | calc_first_line(info, info->line-n); | ||
180 | draw_text(info); | 224 | draw_text(info); |
181 | return; | ||
182 | } | 225 | } |
183 | 226 | ||
184 | static void scroll_down(struct view_info *info) | 227 | static void scroll_down(struct view_info *info, int n) |
185 | { | 228 | { |
186 | if (info->line + info->display_lines >= info->line_count) | 229 | if (info->line + info->display_lines >= info->line_count) |
187 | return; | 230 | return; |
188 | 231 | ||
189 | calc_first_line(info, info->line+1); | 232 | calc_first_line(info, info->line+n); |
190 | draw_text(info); | 233 | draw_text(info); |
191 | } | 234 | } |
192 | 235 | ||
@@ -228,11 +271,25 @@ int view_text(const char *title, const char *text) | |||
228 | { | 271 | { |
229 | case PLA_UP: | 272 | case PLA_UP: |
230 | case PLA_UP_REPEAT: | 273 | case PLA_UP_REPEAT: |
231 | scroll_up(&info); | 274 | #ifdef HAVE_SCROLLWHEEL |
275 | case PLA_SCROLL_BACK: | ||
276 | case PLA_SCROLL_BACK_REPEAT: | ||
277 | #endif | ||
278 | scroll_up(&info, 1); | ||
232 | break; | 279 | break; |
233 | case PLA_DOWN: | 280 | case PLA_DOWN: |
234 | case PLA_DOWN_REPEAT: | 281 | case PLA_DOWN_REPEAT: |
235 | scroll_down(&info); | 282 | #ifdef HAVE_SCROLLWHEEL |
283 | case PLA_SCROLL_FWD: | ||
284 | case PLA_SCROLL_FWD_REPEAT: | ||
285 | #endif | ||
286 | scroll_down(&info, 1); | ||
287 | break; | ||
288 | case PLA_LEFT: | ||
289 | scroll_up(&info, info.display_lines); | ||
290 | break; | ||
291 | case PLA_RIGHT: | ||
292 | scroll_down(&info, info.display_lines); | ||
236 | break; | 293 | break; |
237 | case PLA_LEFT_REPEAT: | 294 | case PLA_LEFT_REPEAT: |
238 | scroll_to_top(&info); | 295 | scroll_to_top(&info); |