text viewer: can select "move to prev/next page" or "move to top page/bottom page...
[kugel-rb.git] / apps / plugins / text_viewer / text_viewer.c
blobfae2f071aa155e8d708b18d6efaab3a5e338a4ee
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Gilles Roux
11 * 2003 Garrett Derner
12 * 2010 Yoshihisa Uchida
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
23 #include "plugin.h"
24 #include "tv_action.h"
25 #include "tv_button.h"
26 #include "tv_preferences.h"
28 PLUGIN_HEADER
30 enum plugin_status plugin_start(const void* file)
32 int button;
33 int lastbutton = BUTTON_NONE;
34 bool autoscroll = false;
35 long old_tick;
36 bool done = false;
37 bool display_update = true;
38 const struct tv_preferences *prefs = tv_get_preferences();
40 old_tick = *rb->current_tick;
42 if (!file)
43 return PLUGIN_ERROR;
45 if (!tv_init(file)) {
46 rb->splash(HZ, "Error opening file");
47 return PLUGIN_ERROR;
50 #if LCD_DEPTH > 1
51 rb->lcd_set_backdrop(NULL);
52 #endif
54 while (!done) {
56 if (display_update)
57 tv_draw();
59 display_update = true;
61 button = rb->button_get_w_tmo(HZ/10);
63 switch (button) {
64 case TV_MENU:
65 #ifdef TV_MENU2
66 case TV_MENU2:
67 #endif
69 enum tv_menu_result res = tv_menu();
71 if (res != TV_MENU_RESULT_EXIT_MENU)
73 tv_exit(NULL);
74 done = true;
75 if (res == TV_MENU_RESULT_ATTACHED_USB)
76 return PLUGIN_USB_CONNECTED;
79 break;
81 case TV_AUTOSCROLL:
82 #ifdef TV_AUTOSCROLL_PRE
83 if (lastbutton != TV_AUTOSCROLL_PRE)
84 break;
85 #endif
86 autoscroll = !autoscroll;
87 break;
89 case TV_SCROLL_UP:
90 case TV_SCROLL_UP | BUTTON_REPEAT:
91 #ifdef TV_SCROLL_UP2
92 case TV_SCROLL_UP2:
93 case TV_SCROLL_UP2 | BUTTON_REPEAT:
94 #endif
95 tv_scroll_up(TV_VERTICAL_SCROLL_PREFS);
96 old_tick = *rb->current_tick;
97 break;
99 case TV_SCROLL_DOWN:
100 case TV_SCROLL_DOWN | BUTTON_REPEAT:
101 #ifdef TV_PAGE_DOWN2
102 case TV_SCROLL_DOWN2:
103 case TV_SCROLL_DOWN2 | BUTTON_REPEAT:
104 #endif
105 tv_scroll_down(TV_VERTICAL_SCROLL_PREFS);
106 old_tick = *rb->current_tick;
107 break;
109 case TV_SCREEN_LEFT:
110 case TV_SCREEN_LEFT | BUTTON_REPEAT:
111 if (prefs->windows > 1)
113 /* Screen left */
114 tv_scroll_left(TV_HORIZONTAL_SCROLL_PREFS);
116 else { /* prefs->windows == 1 */
117 if (prefs->narrow_mode == NM_PAGE)
119 /* scroll to previous page */
120 tv_scroll_up(TV_VERTICAL_SCROLL_PAGE);
122 else
124 /* Top of file */
125 tv_top();
128 break;
130 case TV_SCREEN_RIGHT:
131 case TV_SCREEN_RIGHT | BUTTON_REPEAT:
132 if (prefs->windows > 1)
134 /* Screen right */
135 tv_scroll_right(TV_HORIZONTAL_SCROLL_PREFS);
137 else { /* prefs->windows == 1 */
138 if (prefs->narrow_mode == NM_PAGE)
140 /* scroll to next page */
141 tv_scroll_down(TV_VERTICAL_SCROLL_PAGE);
143 else
145 /* Bottom of file */
146 tv_bottom();
149 break;
151 #ifdef TV_LINE_UP
152 case TV_LINE_UP:
153 case TV_LINE_UP | BUTTON_REPEAT:
154 /* Scroll up one line */
155 tv_scroll_up(TV_VERTICAL_SCROLL_LINE);
156 old_tick = *rb->current_tick;
157 break;
159 case TV_LINE_DOWN:
160 case TV_LINE_DOWN | BUTTON_REPEAT:
161 /* Scroll down one line */
162 tv_scroll_down(TV_VERTICAL_SCROLL_LINE);
163 old_tick = *rb->current_tick;
164 break;
165 #endif
166 #ifdef TV_COLUMN_LEFT
167 case TV_COLUMN_LEFT:
168 case TV_COLUMN_LEFT | BUTTON_REPEAT:
169 /* Scroll left one column */
170 tv_scroll_left(TV_HORIZONTAL_SCROLL_COLUMN);
171 break;
173 case TV_COLUMN_RIGHT:
174 case TV_COLUMN_RIGHT | BUTTON_REPEAT:
175 /* Scroll right one column */
176 tv_scroll_right(TV_HORIZONTAL_SCROLL_COLUMN);
177 break;
178 #endif
180 #ifdef TV_RC_QUIT
181 case TV_RC_QUIT:
182 #endif
183 case TV_QUIT:
184 #ifdef TV_QUIT2
185 case TV_QUIT2:
186 #endif
187 tv_exit(NULL);
188 done = true;
189 break;
191 case TV_BOOKMARK:
192 tv_add_or_remove_bookmark();
193 break;
195 default:
196 if (rb->default_event_handler_ex(button, tv_exit, NULL)
197 == SYS_USB_CONNECTED)
198 return PLUGIN_USB_CONNECTED;
199 display_update = false;
200 break;
202 if (button != BUTTON_NONE)
204 lastbutton = button;
205 rb->yield();
207 if (autoscroll)
209 if(old_tick <= *rb->current_tick - (110 - prefs->autoscroll_speed * 10))
211 tv_scroll_down(TV_VERTICAL_SCROLL_PREFS);
212 old_tick = *rb->current_tick;
213 display_update = true;
217 return PLUGIN_OK;