summaryrefslogtreecommitdiff
path: root/apps/plugins/lib
diff options
context:
space:
mode:
authorTeruaki Kawashima <teru@rockbox.org>2010-06-29 13:33:19 +0000
committerTeruaki Kawashima <teru@rockbox.org>2010-06-29 13:33:19 +0000
commit5af120f1cb6269aac73bd3b3aa9665884508fc51 (patch)
tree0ffe193b823732f9910305d5a83bd92da7ca4c45 /apps/plugins/lib
parent470226dbbfc4ca0b61ca33620c06c695d7e55d57 (diff)
downloadrockbox-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
Diffstat (limited to 'apps/plugins/lib')
-rw-r--r--apps/plugins/lib/simple_viewer.c97
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 @@
28struct view_info { 28struct 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
40static const char* get_next_line(const char *text, struct view_info *info) 42static 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)
109static int init_view(struct view_info *info, 128static 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
175static void scroll_up(struct view_info *info) 218static 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
184static void scroll_down(struct view_info *info) 227static 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);