diff options
author | Kjell Ericson <kjell@haxx.se> | 2003-01-21 14:26:56 +0000 |
---|---|---|
committer | Kjell Ericson <kjell@haxx.se> | 2003-01-21 14:26:56 +0000 |
commit | d853887a57405d380d6040196ff89cddcbf6eff3 (patch) | |
tree | afd73396f8f38675402296643e0d0d28ec545e0d /apps | |
parent | d618fb0cb24761d3a5d4c42092398f60a895948c (diff) | |
download | rockbox-d853887a57405d380d6040196ff89cddcbf6eff3.tar.gz rockbox-d853887a57405d380d6040196ff89cddcbf6eff3.zip |
First version of a "better" keyboard handling for the Player.
More to come from Mats and me.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3141 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/player/keyboard.c | 215 |
1 files changed, 150 insertions, 65 deletions
diff --git a/apps/player/keyboard.c b/apps/player/keyboard.c index 342172d44a..e164b04861 100644 --- a/apps/player/keyboard.c +++ b/apps/player/keyboard.c | |||
@@ -33,34 +33,31 @@ unsigned short *lcd_ascii; | |||
33 | 33 | ||
34 | static unsigned short* kbd_setupkeys(int page, int* len) | 34 | static unsigned short* kbd_setupkeys(int page, int* len) |
35 | { | 35 | { |
36 | static unsigned short lines[256]; | 36 | static unsigned short lines[128]; |
37 | 37 | ||
38 | unsigned short ch; | 38 | unsigned short ch; |
39 | int i = 0; | 39 | int i = 0; |
40 | 40 | ||
41 | switch (page) { | 41 | switch (page) { |
42 | case 0: /* Capitals */ | 42 | case 0: /* Capitals */ |
43 | for (ch = 'A'; ch <= 'Z'; ch++) lines[i++] = ch; | 43 | for (ch = 'A'; ch <= 'Z'; ch++) |
44 | lines[i++] = ch; | ||
44 | for (ch = 0xc0; ch <= 0xdd; ch++) | 45 | for (ch = 0xc0; ch <= 0xdd; ch++) |
45 | if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD) | 46 | if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD) |
46 | lines[i++] = ch; | 47 | lines[i++] = ch; |
47 | break; | 48 | break; |
48 | 49 | ||
49 | case 1: /* Small */ | 50 | case 1: /* Small */ |
50 | for (ch = 'a'; ch <= 'z'; ch++) lines[i++] = ch; | 51 | for (ch = 'a'; ch <= 'z'; ch++) |
52 | lines[i++] = ch; | ||
51 | for (ch = 0xdf; ch <= 0xff; ch++) | 53 | for (ch = 0xdf; ch <= 0xff; ch++) |
52 | if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD) | 54 | if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD) |
53 | lines[i++] = ch; | 55 | lines[i++] = ch; |
54 | break; | 56 | break; |
55 | 57 | ||
56 | case 2: /* Others */ | 58 | case 2: /* Others */ |
57 | for (ch = ' '; ch <= '@'; ch++) lines[i++] = ch; | 59 | for (ch = ' '; ch <= '@'; ch++) |
58 | for (ch = 0x5b; ch <= 0x60; ch++) | 60 | lines[i++] = ch; |
59 | if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD) | ||
60 | lines[i++] = ch; | ||
61 | for (ch = 0x07b; ch <= 0x0bf; ch++) | ||
62 | if (lcd_ascii[ch] != NOCHAR_NEW && lcd_ascii[ch] != NOCHAR_OLD) | ||
63 | lines[i++] = ch; | ||
64 | break; | 61 | break; |
65 | } | 62 | } |
66 | 63 | ||
@@ -76,41 +73,102 @@ int kbd_input(char* text, int buflen) | |||
76 | int page=0, x=0; | 73 | int page=0, x=0; |
77 | int linelen; | 74 | int linelen; |
78 | unsigned short* line = kbd_setupkeys(page, &linelen); | 75 | unsigned short* line = kbd_setupkeys(page, &linelen); |
79 | 76 | int menu_line=0; | |
80 | while(!done) | 77 | int cursor_pos=0; |
81 | { | 78 | int button_pressed; |
82 | int i; | 79 | unsigned char temptext[12]; |
80 | #define MENU_LINE_FILENAME 0 | ||
81 | #define MENU_LINE_NEWCHARS 1 | ||
82 | #define MENU_LINE_DELETE 2 | ||
83 | #define MENU_LINE_ACCEPT 3 | ||
84 | #define MENU_LINE_QUIT 4 | ||
85 | #define MENU_LINE_LAST 4 | ||
86 | |||
87 | lcd_clear_display(); | ||
88 | |||
89 | while(!done) { | ||
90 | int i, p; | ||
83 | int len = strlen(text); | 91 | int len = strlen(text); |
84 | 92 | ||
85 | lcd_clear_display(); | 93 | /* draw filename */ |
86 | 94 | p=0; | |
87 | /* draw chars */ | 95 | i=0; |
88 | for (i=0; i < 11; i++) { | 96 | if (cursor_pos>7) { |
89 | if (line[i+x]) | 97 | i=cursor_pos-7; |
90 | lcd_putc(i, 1, line[i+x]); | ||
91 | else | ||
92 | break; | ||
93 | } | 98 | } |
94 | 99 | ||
95 | /* write out the text */ | 100 | while (p<10 && line[i]) { |
96 | if (len <= 11) { | 101 | if (i == cursor_pos) |
97 | /* if we have enough room */ | 102 | temptext[p++]=0x7f; |
98 | lcd_puts(0, 0, text); | 103 | temptext[p++]=text[i]; |
104 | i++; | ||
105 | } | ||
106 | temptext[p]=0; | ||
107 | lcd_puts(1, 0, temptext); | ||
108 | |||
109 | switch (menu_line) { | ||
110 | case MENU_LINE_FILENAME: | ||
111 | case MENU_LINE_NEWCHARS: | ||
112 | /* Draw insert chars */ | ||
113 | temptext[0]=0x81; | ||
114 | temptext[1]=line[x%linelen]; | ||
115 | temptext[2]=0x82; | ||
116 | for (i=1; i < 8; i++) { | ||
117 | temptext[i+2]=line[(i+x)%linelen]; | ||
118 | } | ||
119 | temptext[p]=0; | ||
120 | lcd_puts(1, 1, temptext); | ||
121 | break; | ||
122 | case MENU_LINE_DELETE: | ||
123 | lcd_puts_scroll(1, 1, "Delete next char"); | ||
124 | break; | ||
125 | case MENU_LINE_ACCEPT: | ||
126 | lcd_puts_scroll(1, 1, "Accept"); | ||
127 | break; | ||
128 | case MENU_LINE_QUIT: | ||
129 | lcd_puts_scroll(1, 1, "Cancel"); | ||
130 | break; | ||
99 | } | 131 | } |
100 | else { | 132 | if (menu_line==MENU_LINE_FILENAME) { |
101 | /* if we don't have enough room, write out the last bit only */ | 133 | lcd_putc(0, 0, 0x92); |
102 | lcd_putc(0, 0, '<'); | 134 | lcd_putc(0, 1, ' '); |
103 | lcd_puts(1, 0, text + len - 10); | 135 | } else { |
136 | lcd_putc(0, 0, ' '); | ||
137 | lcd_putc(0, 1, 0x92); | ||
104 | } | 138 | } |
139 | |||
105 | lcd_update(); | 140 | lcd_update(); |
106 | 141 | ||
107 | switch ( button_get(true) ) { | 142 | button_pressed=button_get(true); |
108 | 143 | if (menu_line==MENU_LINE_FILENAME) { | |
109 | case BUTTON_MENU | BUTTON_STOP: | 144 | switch ( button_pressed ) { |
110 | /* abort */ | 145 | case BUTTON_UP: |
111 | return -1; | 146 | case BUTTON_UP | BUTTON_REPEAT: |
147 | if (cursor_pos<len) | ||
148 | cursor_pos++; | ||
149 | button_pressed=0; | ||
112 | break; | 150 | break; |
113 | 151 | case BUTTON_DOWN: | |
152 | case BUTTON_DOWN | BUTTON_REPEAT: | ||
153 | if (cursor_pos>0) | ||
154 | cursor_pos--; | ||
155 | button_pressed=0; | ||
156 | break; | ||
157 | } | ||
158 | } else if (menu_line==MENU_LINE_NEWCHARS) { | ||
159 | switch ( button_pressed ) { | ||
160 | |||
161 | case BUTTON_UP: | ||
162 | case BUTTON_UP | BUTTON_REPEAT: | ||
163 | x=(x+1+linelen)%linelen; | ||
164 | button_pressed=0; | ||
165 | break; | ||
166 | case BUTTON_DOWN: | ||
167 | case BUTTON_DOWN | BUTTON_REPEAT: | ||
168 | x=(x-1+linelen)%linelen; | ||
169 | button_pressed=0; | ||
170 | break; | ||
171 | |||
114 | case BUTTON_MENU: | 172 | case BUTTON_MENU: |
115 | /* shift */ | 173 | /* shift */ |
116 | if (++page == KEYBOARD_PAGES) | 174 | if (++page == KEYBOARD_PAGES) |
@@ -118,41 +176,68 @@ int kbd_input(char* text, int buflen) | |||
118 | line = kbd_setupkeys(page, &linelen); | 176 | line = kbd_setupkeys(page, &linelen); |
119 | break; | 177 | break; |
120 | 178 | ||
121 | case BUTTON_RIGHT: | 179 | case BUTTON_ON: |
122 | case BUTTON_RIGHT | BUTTON_REPEAT: | 180 | if (len < buflen) { |
123 | if (x < linelen - 1) | 181 | /* ON insert the char */ |
124 | x++; | 182 | for (i=len; i>cursor_pos; i--) { |
125 | else | 183 | text[i]=text[i-1]; |
126 | x = 0; | 184 | } |
127 | break; | 185 | text[cursor_pos]=line[x]; |
128 | 186 | button_pressed=0; | |
129 | case BUTTON_LEFT: | 187 | cursor_pos++; |
130 | case BUTTON_LEFT | BUTTON_REPEAT: | 188 | } |
131 | if (x) | ||
132 | x--; | ||
133 | else | ||
134 | x = linelen - 1; | ||
135 | break; | 189 | break; |
136 | 190 | } | |
137 | case BUTTON_STOP: | 191 | } else if (menu_line==MENU_LINE_DELETE) { |
138 | /* backspace */ | 192 | switch ( button_pressed ) { |
139 | if (len) | 193 | case BUTTON_ON: |
140 | text[len-1] = 0; | 194 | case BUTTON_PLAY: |
195 | case BUTTON_PLAY | BUTTON_REPEAT: | ||
196 | button_pressed=0; | ||
197 | for (i=cursor_pos; i<=len; i++) { | ||
198 | text[i]=text[i+1]; | ||
199 | } | ||
141 | break; | 200 | break; |
142 | 201 | } | |
202 | } else if (menu_line==MENU_LINE_ACCEPT) { | ||
203 | switch ( button_pressed ) { | ||
143 | case BUTTON_ON: | 204 | case BUTTON_ON: |
144 | /* ON accepts what was entered and continues */ | 205 | case BUTTON_PLAY: |
145 | done = true; | 206 | case BUTTON_PLAY | BUTTON_REPEAT: |
207 | button_pressed=0; | ||
208 | done=true; | ||
146 | break; | 209 | break; |
147 | 210 | } | |
211 | } else if (menu_line==MENU_LINE_QUIT) { | ||
212 | switch ( button_pressed ) { | ||
213 | case BUTTON_ON: | ||
148 | case BUTTON_PLAY: | 214 | case BUTTON_PLAY: |
149 | /* PLAY inserts the selected char */ | 215 | case BUTTON_PLAY | BUTTON_REPEAT: |
150 | if (len<buflen) | 216 | return 1; |
151 | { | ||
152 | text[len] = line[x]; | ||
153 | text[len+1] = 0; | ||
154 | } | ||
155 | break; | 217 | break; |
218 | } | ||
219 | } | ||
220 | |||
221 | /* Handle unhandled events */ | ||
222 | switch ( button_pressed ) { | ||
223 | case 0: | ||
224 | /* button is already handled */ | ||
225 | break; | ||
226 | |||
227 | case BUTTON_MENU | BUTTON_STOP: | ||
228 | break; | ||
229 | |||
230 | case BUTTON_RIGHT: | ||
231 | case BUTTON_RIGHT | BUTTON_REPEAT: | ||
232 | if (menu_line<MENU_LINE_LAST) | ||
233 | menu_line++; | ||
234 | break; | ||
235 | |||
236 | case BUTTON_LEFT: | ||
237 | case BUTTON_LEFT | BUTTON_REPEAT: | ||
238 | if (menu_line>0) | ||
239 | menu_line--; | ||
240 | break; | ||
156 | } | 241 | } |
157 | } | 242 | } |
158 | return 0; | 243 | return 0; |