[Scummvm-cvs-logs] SF.net SVN: scummvm:[33317] scummvm/branches/gsoc2008-vkeybd/backends/ common

kenny-d at users.sourceforge.net kenny-d at users.sourceforge.net
Sat Jul 26 22:35:46 CEST 2008


Revision: 33317
          http://scummvm.svn.sourceforge.net/scummvm/?rev=33317&view=rev
Author:   kenny-d
Date:     2008-07-26 20:35:46 +0000 (Sat, 26 Jul 2008)

Log Message:
-----------
VirtualKeyboard:
- implemented functionality for modifier keys
- cleaned up parser
- started on text display

Modified Paths:
--------------
    scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.h
    scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.cpp
    scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.h

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.cpp	2008-07-26 20:27:15 UTC (rev 33316)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.cpp	2008-07-26 20:35:46 UTC (rev 33317)
@@ -240,20 +240,20 @@
 		uint16 ascii = atoi(evtNode->values["ascii"].c_str());
 
 		byte flags = 0;
-		if (evtNode->values.contains("flags")) {
-			Common::StringTokenizer tok(evtNode->values["flags"], ", ");
-			for (Common::String fl = tok.nextToken(); !fl.empty(); fl = tok.nextToken()) {
-				if (fl == "ctrl" || fl == "control")
-					flags &= Common::KBD_CTRL;
-				else if (fl == "alt")
-					flags &= Common::KBD_ALT;
-				else if (fl == "shift")
-					flags &= Common::KBD_SHIFT;
-			}
-		}
+		if (evtNode->values.contains("flags"))
+			flags = parseFlags(evtNode->values["flags"]);
 
 		evt.data = new Common::KeyState(code, ascii, flags);
 
+	} else if (type == "modifier") {
+		if (!evtNode->values.contains("flags"))
+			return parserError("Key modifier element must contain modifier attributes");
+		
+		evt.type = VirtualKeyboard::kEventModifier;
+		byte *flags = new byte;
+		*(flags) = parseFlags(evtNode->values["flags"]);
+		evt.data = flags;
+
 	} else if (type == "switch_mode") {
 		if (!evtNode->values.contains("mode"))
 			return parserError("Switch mode event element must contain mode attribute");
@@ -335,29 +335,62 @@
 	if (!areaNode->values.contains("shape") || !areaNode->values.contains("coords") || !areaNode->values.contains("target"))
 		return parserError("Area element must contain shape, coords and target attributes");
 
-	Common::String shape = areaNode->values["shape"];
-	if (shape == "rect") {
-		Common::Rect *rect = _mode->imageMap.createRectArea(areaNode->values["target"]);
-		int x1, y1, x2, y2;
-		if (!parseIntegerKey(areaNode->values["coords"].c_str(), 4, &x1, &y1, &x2, &y2))
-			return parserError("Invalid coords for rect area");
-		rect->left = x1; rect->top = y1; rect->right = x2; rect->bottom = y2;
+	Common::String& shape = areaNode->values["shape"];
+	Common::String& target = areaNode->values["target"];
+	Common::String& coords = areaNode->values["coords"];
+
+	if (target == "preview_area") {
+		if (shape != "rect")
+			return parserError("preview_area must be a rect area");
+		_mode->previewArea = new Common::Rect();
+		return parseRect(_mode->previewArea, coords);
+	} else if (shape == "rect") {
+		Common::Rect *rect = _mode->imageMap.createRectArea(target);
+		return parseRect(rect, coords);
 	} else if (shape == "poly") {
-		Common::StringTokenizer tok (areaNode->values["coords"], ", ");
-		Common::Polygon *poly = _mode->imageMap.createPolygonArea(areaNode->values["target"]);
-		for (Common::String st = tok.nextToken(); !st.empty(); st = tok.nextToken()) {
-			int x, y;
-			if (sscanf(st.c_str(), "%d", &x) != 1)
-				return parserError("Invalid coords for polygon area");
-			st = tok.nextToken();
-			if (sscanf(st.c_str(), "%d", &y) != 1)
-				return parserError("Invalid coords for polygon area");
-			poly->addPoint(x, y);
-		}
-		if (poly->getPointCount() < 3)
+		Common::Polygon *poly = _mode->imageMap.createPolygonArea(target);
+		return parsePolygon(poly, coords);
+	}
+	return parserError("Area shape '%s' not known", shape.c_str());
+}
+
+byte VirtualKeyboardParser::parseFlags(const String& flags) {
+	Common::StringTokenizer tok(flags, ", ");
+	byte val = 0;
+	for (Common::String fl = tok.nextToken(); !fl.empty(); fl = tok.nextToken()) {
+		if (fl == "ctrl" || fl == "control")
+			val &= Common::KBD_CTRL;
+		else if (fl == "alt")
+			val &= Common::KBD_ALT;
+		else if (fl == "shift")
+			val &= Common::KBD_SHIFT;
+	}
+	return val;
+}
+
+bool VirtualKeyboardParser::parseRect(Common::Rect *rect, const String& coords) {
+	int x1, y1, x2, y2;
+	if (!parseIntegerKey(coords.c_str(), 4, &x1, &y1, &x2, &y2))
+		return parserError("Invalid coords for rect area");
+	rect->left = x1; rect->top = y1; rect->right = x2; rect->bottom = y2;
+	if (!rect->isValidRect())
+		return parserError("Rect area is not a valid rectangle");
+	return true;
+}
+
+bool VirtualKeyboardParser::parsePolygon(Common::Polygon *poly, const String& coords) {
+	Common::StringTokenizer tok (coords, ", ");
+	for (Common::String st = tok.nextToken(); !st.empty(); st = tok.nextToken()) {
+		int x, y;
+		if (sscanf(st.c_str(), "%d", &x) != 1)
 			return parserError("Invalid coords for polygon area");
-	} else
-		return parserError("Area shape '%s' not known", shape.c_str());
+		st = tok.nextToken();
+		if (sscanf(st.c_str(), "%d", &y) != 1)
+			return parserError("Invalid coords for polygon area");
+		poly->addPoint(x, y);
+	}
+	if (poly->getPointCount() < 3)
+		return parserError("Invalid coords for polygon area");
 
 	return true;
 }

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.h	2008-07-26 20:27:15 UTC (rev 33316)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard-parser.h	2008-07-26 20:35:46 UTC (rev 33317)
@@ -203,6 +203,10 @@
 	bool parserCallback_KeyboardClosed();
 	bool parserCallback_ModeClosed();
 
+	byte parseFlags(const String& flags);
+	bool parseRect(Common::Rect *rect, const String& coords);
+	bool parsePolygon(Common::Polygon *poly, const String& coords);
+
 	Common::HashMap<Common::String, ParserCallback, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _callbacks;
 	Common::HashMap<Common::String, ParserCallback, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _closedCallbacks;
 };

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.cpp
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.cpp	2008-07-26 20:27:15 UTC (rev 33316)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.cpp	2008-07-26 20:35:46 UTC (rev 33317)
@@ -63,6 +63,7 @@
 	_vAlignment = kAlignBottom;
 	_keyQueue.clear();
 	_keyDown = 0;
+	_keyFlags = 0;
 	_displaying = _drag = false;
 	_firstRun = true;
 	_lastScreenChanged = _system->getScreenChangeID();
@@ -196,13 +197,23 @@
 	Event evt = _currentMode->events[area];
 
 	switch (evt.type) {
-	case kEventKey:
+	case kEventKey: {
 		// add virtual keypress to queue
-		_keyQueue.push(*(Common::KeyState*)evt.data);
+		Common::KeyState key = *(Common::KeyState*)evt.data;
+		key.flags ^= _keyFlags;
+		if ((key.keycode >= Common::KEYCODE_a) && (key.keycode <= Common::KEYCODE_z))
+			key.ascii = (key.flags & Common::KBD_SHIFT) ? key.keycode - 32 : key.keycode;
+		_keyQueue.insertKey(key);
+		_keyFlags = 0;
 		break;
+	}
+	case kEventModifier:
+		_keyFlags ^= *(byte*)(evt.data);
+		break;
 	case kEventSwitchMode:
 		// switch to new mode
 		switchMode(*(Common::String *)evt.data);
+		_keyFlags = 0;
 		break;
 	case kEventClose:
 		// close virtual keyboard
@@ -247,7 +258,6 @@
 		_system->showOverlay();
 		_system->clearOverlay();
 	}
-
 	_overlayBackup.create(_system->getOverlayWidth(), _system->getOverlayHeight(), sizeof(OverlayColor));
 	_system->grabOverlay((OverlayColor*)_overlayBackup.pixels, _overlayBackup.w);
 	setupCursor();
@@ -382,4 +392,94 @@
 	CursorMan.popCursorPalette();
 }
 
+VirtualKeyboard::Queue::Queue() {
+	_keyPos = _keys.begin();
+	_strPos = 0;
+}
+
+void VirtualKeyboard::Queue::insertKey(KeyState key) {
+	switch (key.keycode) {
+	case KEYCODE_LEFT:
+		moveLeft();
+		return;
+	case KEYCODE_RIGHT:
+		moveRight();
+		return;
+	case KEYCODE_BACKSPACE:
+		deleteKey();
+		return;
+	}
+
+	String keyStr;
+	if (key.keycode >= 32 && key.keycode <= 126) {
+		if (key.flags & KBD_CTRL)
+			keyStr += "Ctrl+";
+		if (key.flags & KBD_ALT)
+			keyStr += "Alt+";
+		if (key.flags & KBD_SHIFT && (key.ascii < 65 || key.ascii > 90))
+			keyStr += "Shift+";
+		keyStr += (char)key.ascii;
+	}
+
+	const char *k = keyStr.c_str();
+	while (char ch = *k++)
+		_str.insertChar(ch, _strPos++);
+
+	VirtualKeyPress kp;
+	kp.key = key;
+	kp.strLen = keyStr.size();
+	_keys.insert(_keyPos, kp);
+	_keyPos++;
+}
+
+void VirtualKeyboard::Queue::deleteKey() {
+	if (_keyPos == _keys.begin())
+		return;
+	List<VirtualKeyPress>::iterator it = _keyPos;
+	it--;
+	_strPos -= it->strLen;
+	while((it->strLen)-- > 0)
+		_str.deleteChar(_strPos);
+	_keys.erase(it);
+}
+
+void VirtualKeyboard::Queue::moveLeft() {
+	if (_keyPos == _keys.begin())
+		return;
+	_keyPos--;
+	_strPos -= _keyPos->strLen;
+}
+
+void VirtualKeyboard::Queue::moveRight() {
+	List<VirtualKeyPress>::iterator it = _keyPos;
+	it++;
+	if (it == _keys.end())
+		return;
+	_strPos += _keyPos->strLen;
+	_keyPos	= it;
+}
+
+KeyState VirtualKeyboard::Queue::pop() {
+	KeyState ret = _keys.begin()->key;
+	_keys.pop_front();
+	return ret;
+}
+
+void VirtualKeyboard::Queue::clear() {
+	_keys.clear();
+	_keyPos = _keys.begin();
+	_str.clear();
+	_strPos = 0;
+}
+
+bool VirtualKeyboard::Queue::empty()
+{ 
+	return _keys.empty();
+}
+
+String VirtualKeyboard::Queue::getString()
+{
+	return _str;
+}
+
 } // end of namespace Common

Modified: scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.h
===================================================================
--- scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.h	2008-07-26 20:27:15 UTC (rev 33316)
+++ scummvm/branches/gsoc2008-vkeybd/backends/common/virtual-keyboard.h	2008-07-26 20:35:46 UTC (rev 33317)
@@ -33,7 +33,7 @@
 #include "common/hash-str.h"
 #include "common/image-map.h"
 #include "common/keyboard.h"
-#include "common/queue.h"
+#include "common/list.h"
 #include "common/str.h"
 #include "graphics/surface.h"
 
@@ -42,9 +42,10 @@
 class VirtualKeyboardParser;
 
 class VirtualKeyboard {
-
+protected:
 	enum EventType {
 		kEventKey,
+		kEventModifier,
 		kEventSwitchMode,
 		kEventClose
 	};
@@ -59,14 +60,16 @@
 	typedef Common::HashMap<Common::String, Event, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> EventMap; 
 
 	struct Mode {
-		Common::String     name;
-		Common::String     resolution;
-		Common::String     bitmapName;
-		Graphics::Surface *image;
-		OverlayColor	   transparentColor;
-		Common::ImageMap   imageMap;
-		EventMap           events;
-		Mode() : image(0) {}
+		Common::String		name;
+		Common::String		resolution;
+		Common::String		bitmapName;
+		Graphics::Surface	*image;
+		OverlayColor		transparentColor;
+		Common::ImageMap	imageMap;
+		EventMap			events;
+		Common::Rect		*previewArea;
+
+		Mode() : image(0), previewArea(0) {}
 	};
 	
 	typedef Common::HashMap<Common::String, Mode, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ModeMap;
@@ -83,6 +86,31 @@
 		kAlignBottom
 	};
 
+	struct VirtualKeyPress {
+		Common::KeyState key;
+		uint strLen;
+	};
+
+	class Queue {
+	public:
+		Queue();
+		void insertKey(KeyState key);
+		void deleteKey();
+		void moveLeft();
+		void moveRight();
+		KeyState pop();
+		void clear();
+		bool empty();
+		String getString();
+
+	private:
+		List<VirtualKeyPress> _keys;
+		List<VirtualKeyPress>::iterator _keyPos;
+
+		String _str;
+		uint _strPos;
+	};
+
 public:
 	VirtualKeyboard();
 	virtual ~VirtualKeyboard();
@@ -122,15 +150,19 @@
 		return _loaded;
 	}
 
-protected:
+protected:	// TODO : clean up all this stuff
 	OSystem	*_system;
 
+	byte _keyFlags;
+	Queue _keyQueue;
+	KeyState *_keyDown;
+
+
 	static const int SNAP_WIDTH = 10;
 	
 	friend class VirtualKeyboardParser;
 	VirtualKeyboardParser *_parser;
 
-	// TODO : sort order of all this stuff
 	void reset();
 	void deleteEventData();
 	void screenChanged();
@@ -139,7 +171,7 @@
 	void move(int16 x, int16 y);
 	void switchMode(Mode *newMode);
 	void switchMode(const Common::String& newMode);
-	Common::String findArea(int16 x, int16 y);
+	String findArea(int16 x, int16 y);
 	void processClick(const Common::String &area);
 	void runLoop();
 	void redraw();
@@ -156,18 +188,15 @@
 	Mode *_currentMode;
 
 	int _lastScreenChanged;
-	Common::Rect _kbdBound;
+	Rect _kbdBound;
 
 	HorizontalAlignment  _hAlignment;
 	VerticalAlignment    _vAlignment;
 
-	Common::String _areaDown;
-	Common::Point _dragPoint;
+	String _areaDown;
+	Point _dragPoint;
 	bool _drag;
 
-	Common::Queue<Common::KeyState> _keyQueue;
-	Common::KeyState *_keyDown;
-
 	static const int kCursorAnimateDelay = 250;
 	int		_cursorAnimateCounter;
 	int		_cursorAnimateTimer;


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