[Scummvm-cvs-logs] SF.net SVN: scummvm: [27193] scummvm/trunk/engines/agi/predictive.cpp

knakos at users.sourceforge.net knakos at users.sourceforge.net
Fri Jun 8 10:12:19 CEST 2007


Revision: 27193
          http://scummvm.svn.sourceforge.net/scummvm/?rev=27193&view=rev
Author:   knakos
Date:     2007-06-08 01:12:18 -0700 (Fri, 08 Jun 2007)

Log Message:
-----------
adding navigation with arrow keys and enter; did away with some ugly gotos

Modified Paths:
--------------
    scummvm/trunk/engines/agi/predictive.cpp

Modified: scummvm/trunk/engines/agi/predictive.cpp
===================================================================
--- scummvm/trunk/engines/agi/predictive.cpp	2007-06-08 07:51:44 UTC (rev 27192)
+++ scummvm/trunk/engines/agi/predictive.cpp	2007-06-08 08:12:18 UTC (rev 27193)
@@ -110,7 +110,7 @@
 }
 
 bool AgiEngine::predictiveDialog(void) {
-	int key = 0, active = -1, lastactive = -1;
+	int key = 0, active = -1, lastactive = 0;
 	bool rc = false;
 	uint8 x;
 	int y;
@@ -118,6 +118,8 @@
 	String prefix;
 	char temp[MAXWORDLEN + 1], repeatcount[MAXWORDLEN];
 	AgiBlock tmpwindow;
+	bool navigationwithkeys = false;
+	bool processkey;
 
 	_predictiveDialogRunning = true;
 	_system->setFeatureState(OSystem::kFeatureDisableKeyFiltering, true);
@@ -238,7 +240,9 @@
 			printText(temp, 0, 8, 7, MAXWORDLEN, 15, 0);
 			_gfx->flushBlock(62, 54, 249, 66);
 
-			if (active >= 0 && key != 9) {
+			if (active >= 0 && !navigationwithkeys) {
+				// provide visual feedback only when not navigating with the arrows
+				// so that the user can see the active button.
 				active = -1;
 				needRefresh = true;
 			} else
@@ -249,20 +253,132 @@
 
 		_gfx->pollTimer();	/* msdos driver -> does nothing */
 		key = doPollKeyboard();
+		processkey = false;
 		switch (key) {
 		case KEY_ENTER:
-			active = 13;
-			goto processkey;
+			if (navigationwithkeys) {
+				// when the user has utilized arrow key navigation,
+				// interpret enter as 'click' on the active button
+				active = lastactive;
+			} else {
+				// else it is a shortcut for 'Ok'
+				active = 13;
+			}
+			processkey = true;
+			break;
 		case KEY_ESCAPE:
 			rc = false;
 			goto getout;
 		case BUTTON_LEFT:
+			navigationwithkeys = false;
 			for (int i = 0; buttons[i]; i++) {
 				if (_gfx->testButton(bx[i], by[i], buttons[i])) {
 					active = i;
+					processkey = true;
+					break;
 				}
 			}
-processkey:
+			break;
+		case KEY_BACKSPACE:
+			active = 11;
+			processkey = true;
+			break;
+		case '#':
+			active = 9;
+			processkey = true;
+			break;
+		case '*':
+			active = 14;
+			processkey = true;
+			break;
+		case 0x09:	/* Tab */
+			navigationwithkeys = true;
+			debugC(3, kDebugLevelText, "Focus change");
+			lastactive = active = lastactive + 1;
+			active %= ARRAYSIZE(buttons) - 1;
+			needRefresh = true;
+			break;
+		case KEY_LEFT:
+			navigationwithkeys = true;
+			if (lastactive == 0 || lastactive == 3 || lastactive == 6)
+				active = lastactive + 2;
+			else if (lastactive == 9)
+				active = 15;
+			else if (lastactive == 11)
+				active = 11;
+			else if (lastactive == 12)
+				active = 13;
+			else if (lastactive == 14)
+				active = 10;
+			else
+				active = lastactive - 1;
+			lastactive = active;
+			needRefresh = true;
+			break;
+		case KEY_RIGHT:
+			navigationwithkeys = true;
+			if (lastactive == 2 || lastactive == 5 || lastactive == 8)
+				active = lastactive - 2;
+			else if (lastactive == 10)
+				active = 14;
+			else if (lastactive == 11)
+				active = 11;
+			else if (lastactive == 13)
+				active = 12;
+			else if (lastactive == 15)
+				active = 9;
+			else
+				active = lastactive + 1;
+			lastactive = active;
+			needRefresh = true;
+			break;
+		case KEY_UP:
+			navigationwithkeys = true;
+			if (lastactive <= 2)
+				active = 11;
+			else if (lastactive == 9 || lastactive == 10)
+				active = lastactive - 2;
+			else if (lastactive == 11)
+				active = 13;
+			else if (lastactive == 14)
+				active = 8;
+			else if (lastactive == 15)
+				active = 6;
+			else
+				active = lastactive - 3;
+			lastactive = active;
+			needRefresh = true;
+			break;
+		case KEY_DOWN:
+			navigationwithkeys = true;
+			if (lastactive == 6)
+				active = 15;
+			else if (lastactive == 7 || lastactive == 8)
+				active = lastactive + 2;
+			else if (lastactive == 11)
+				active = 0;
+			else if (lastactive == 12 || lastactive == 13)
+				active = 11;
+			else if (lastactive == 14 || lastactive == 15)
+				active = lastactive - 2;
+			else
+				active = lastactive + 3;
+			lastactive = active;
+			needRefresh = true;
+			break;
+		default:
+			// handle numeric buttons
+			if (key >= '1' && key <= '9') {
+				active = key - '1';
+				processkey = true;
+			} else if (key == '0') {
+				active = 15;
+				processkey = true;
+			}
+			break;
+		}
+
+		if (processkey) {
 			if (active >= 0) {
 				needRefresh = true;
 				lastactive = active;
@@ -291,7 +407,7 @@
 								prefix.deleteLastChar();
 						}
 					} else if (prefix.size() + _currentCode.size() < MAXWORDLEN - 1) { // don't overflow the dialog line
-					       	if (active == 15) { // zero
+						if (active == 15) { // zero
 							_currentCode += buttonStr[9];
 						} else {
 							_currentCode += buttonStr[active];
@@ -299,21 +415,21 @@
 					}
 
 					switch (mode) {
-					case kModeNum:
-						_currentWord = _currentCode;
-						break;
-					case kModePre:
-						if (!matchWord() && _currentCode.size()) {
-							_currentCode.deleteLastChar();
-							matchWord();
-						}
-						break;
-					case kModeAbc:
-						for (x = 0; x < _currentCode.size(); x++)
-							if (_currentCode[x] >= '1')
-								temp[x] = buttons[_currentCode[x] - '1'][3 + repeatcount[x]];
-						temp[_currentCode.size()] = 0;
-						_currentWord = temp;
+						case kModeNum:
+							_currentWord = _currentCode;
+							break;
+						case kModePre:
+							if (!matchWord() && _currentCode.size()) {
+								_currentCode.deleteLastChar();
+								matchWord();
+							}
+							break;
+						case kModeAbc:
+							for (x = 0; x < _currentCode.size(); x++)
+								if (_currentCode[x] >= '1')
+									temp[x] = buttons[_currentCode[x] - '1'][3 + repeatcount[x]];
+							temp[_currentCode.size()] = 0;
+							_currentWord = temp;
 					}
 				} else if (active == 9) { // next
 					if (mode != kModeAbc) {
@@ -360,31 +476,6 @@
 					goto press;
 				}
 			}
-			break;
-		case KEY_BACKSPACE:
-			active = 11;
-			goto processkey;
-		case '#':
-			active = 9;
-			goto processkey;
-		case '*':
-			active = 14;
-			goto processkey;
-		case 0x09:	/* Tab */
-			debugC(3, kDebugLevelText, "Focus change");
-			lastactive = active = lastactive + 1;
-			active %= ARRAYSIZE(buttons) - 1;
-			needRefresh = true;
-			break;
-		default:
-			// handle numeric buttons
-			if (key >= '1' && key <= '9') {
-				active = key - '1';
-				goto processkey;
-			} else if (key == '0') {
-				active = 15;
-				goto processkey;
-			}
 		}
 	}
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list