summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjell Ericson <kjell@haxx.se>2003-01-21 14:26:56 +0000
committerKjell Ericson <kjell@haxx.se>2003-01-21 14:26:56 +0000
commitd853887a57405d380d6040196ff89cddcbf6eff3 (patch)
treeafd73396f8f38675402296643e0d0d28ec545e0d
parentd618fb0cb24761d3a5d4c42092398f60a895948c (diff)
downloadrockbox-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
-rw-r--r--apps/player/keyboard.c215
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
34static unsigned short* kbd_setupkeys(int page, int* len) 34static 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;