Stringinput (apps/mczap/neutrinoNG/gui/widget/)

Das Original Benutzerinterface Neutrino-SD incl. zapit, sectionsd, yWeb etc...
thegoodguy
Erleuchteter
Erleuchteter
Beiträge: 465
Registriert: Mittwoch 14. August 2002, 20:45

Stringinput (apps/mczap/neutrinoNG/gui/widget/)

Beitrag von thegoodguy »

Hi,

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();
 
alexW
Developer
Beiträge: 631
Registriert: Donnerstag 24. Januar 2002, 12:21

Beitrag von alexW »

Hoi,

hast du die Moeglichkeit mal im IRC vorbeizuschauen?
alexW