habe versucht die Eingabelogik bei SMS-Style zu verbessern (wenn neues Zeichen anders als altes Zeichen, springe eins weiter) und die Menge der moeglichen Zeichen auf die erlaubten Zeichen zu reduzieren (speziell: Bouquetname: Umlaute verbieten).
Leider habe ich keine lauffaehige Entwicklungsumgebung (liegt an div. Gruenden - wird sich vermutlich nicht so schnell realisieren lassen).
Deshalb folgender Code als diff ohne Garantie - nicht mal auf Compilierbarkeit.
Ich wuerde den Code auch per Mail jemanden zuschicken, aber ich wollte nicht die ganzen Files ins Forum posten.
Viele Gruesse!
.old ist jeweils die aktuelle Datei aus dem CVS.
Code: Alles auswählen
--- stringinput.h.old Thu Apr 25 21:03:30 2002
+++ stringinput.h Sun Aug 25 17:58:48 2002
@@ -83,7 +83,19 @@
{
bool capsMode;
int arraySizes[10];
- char* Chars[10];
+
+ const static char CharList[10][10] = {"0 -/()<>=", // 9 characters
+ "1.,:!?",
+ "abc2ä",
+ "def3",
+ "ghi4",
+ "jkl5",
+ "mno6ö",
+ "pqrs7ß",
+ "tuv8ü",
+ "wxyz9"};
+
+ char Chars[10][9]; // maximal 9 character in one CharList entry!
int keyCounter;
int lastKey;
Code: Alles auswählen
--- stringinput.cpp.old Sun Jul 7 19:36:47 2002
+++ stringinput.cpp Sun Aug 25 17:11:33 2002
@@ -85,13 +85,15 @@
void CStringInput::key0_9Pressed(int key)
{
- value[selected]=validchars[key];
- paintChar(selected);
-
- if (selected < (size- 1))
- selected++;
- paintChar(selected-1);
- paintChar(selected);
+ value[selected]=validchars[key];
+
+ if (selected < (size - 1))
+ {
+ selected++;
+ paintChar(selected - 1);
+ }
+
+ paintChar(selected);
}
void CStringInput::keyRedPressed()
@@ -146,7 +148,7 @@
void CStringInput::keyRightPressed()
{
- if(selected<(int)strlen(value)-1)
+ if (selected < (size - 1))
{
selected++;
paintChar(selected-1);
@@ -342,21 +344,19 @@
CStringInputSMS::CStringInputSMS(string Name, char* Value, int Size, string Hint_1, string Hint_2, char* Valid_Chars, CChangeObserver* Observ, string Icon)
: CStringInput(Name, Value, Size, Hint_1, Hint_2, Valid_Chars, Observ, Icon)
{
- Chars[1] = "1.,:!?";
- Chars[2] = "abc2ä";
- Chars[3] = "def3";
- Chars[4] = "ghi4";
- Chars[5] = "jkl5";
- Chars[6] = "mno6ö";
- Chars[7] = "pqrs7ß";
- Chars[8] = "tuv8ü";
- Chars[9] = "wxyz9";
- Chars[0] = "0 -/()<>=";
+ lastKey = -1; // no key pressed yet
+
+ for (int i = 0; i < 10; i++)
+ {
+ int j = 0;
+ for (int k = 0; k < strlen(CharList[i]); k++)
+ if (strchr(Valid_Chars, CharList[i][k]) != NULL)
+ Chars[i][j++] = CharList[i][k];
+ if (j == 0)
+ Chars[i][j++] = ' '; // prevent empty char lists
+ arraySizes[i] = j;
+ }
- for(int i=0; i<10; i++)
- {
- arraySizes[i] = strlen(Chars[i]);
- }
height+=260;
y = ((500-height)>>1);
}
@@ -364,28 +364,30 @@
void CStringInputSMS::key0_9Pressed(int key)
{
- if (lastKey != key)
- {
- keyCounter = 0;
- }
- keyCounter = keyCounter % strlen(Chars[key]);
- value[selected] = Chars[key][keyCounter];
- paintChar(selected);
- keyCounter++;
- lastKey = key;
-}
+ if (lastKey != key)
+ {
+ if ((lastKey != -1) && // there is a last key
+ (selected < (size- 1))) // we can shift the cursor one field to the right
+ {
+ selected++;
+ paintChar(selected - 1);
+ }
+ keyCounter = 0;
+ }
+ else
+ keyCounter = (keyCounter + 1) % arraySizes[key];
+ value[selected] = Chars[key][keyCounter];
+ paintChar(selected);
+ lastKey = key;
+}
+
+void CStringInputSMS::keyRedPressed() // switch between lower & uppercase
+{
+ if (((value[selected]>='a') && (value[selected]<='z')) ||
+ ((value[selected]>='A') && (value[selected]<='Z')))
+ value[selected] ^= 32;
-void CStringInputSMS::keyRedPressed()
-{
- if ((value[selected]>='a') && (value[selected]<='z'))
- {
- value[selected] -= 32;
- }
- else if ((value[selected]>='A') && (value[selected]<='Z'))
- {
- value[selected] += 32;
- }
- paintChar(selected);
+ paintChar(selected);
}
void CStringInputSMS::keyUpPressed()
@@ -396,13 +398,13 @@
void CStringInputSMS::keyLeftPressed()
{
- keyCounter=0;
+ lastKey = -1; // no key pressed yet
CStringInput::keyLeftPressed();
}
void CStringInputSMS::keyRightPressed()
{
- keyCounter=0;
+ lastKey = -1; // no key pressed yet
CStringInput::keyRightPressed();
}
@@ -462,7 +464,6 @@
int CPINInput::exec( CMenuTarget* parent, string )
{
int res = menu_return::RETURN_REPAINT;
- char oldval[size];
if (parent)
{
@@ -471,7 +472,6 @@
for(int count=strlen(value)-1;count<size-1;count++)
strcat(value, " ");
- strcpy(oldval, value);
paint();