diff options
author | Stephen Kennedy | 2008-07-30 13:47:54 +0000 |
---|---|---|
committer | Stephen Kennedy | 2008-07-30 13:47:54 +0000 |
commit | e2a2a672f591f36fb596bb6cb849978c70611c3e (patch) | |
tree | 73cc81ea173bdb4a35cfe437bb115e38f405f1d7 /backends/common/virtual-keyboard.cpp | |
parent | a051061e38bfcbd7cfac81deb3acf69f154dc681 (diff) | |
download | scummvm-rg350-e2a2a672f591f36fb596bb6cb849978c70611c3e.tar.gz scummvm-rg350-e2a2a672f591f36fb596bb6cb849978c70611c3e.tar.bz2 scummvm-rg350-e2a2a672f591f36fb596bb6cb849978c70611c3e.zip |
- major re-factoring of VK - all GUI-related code has been abstracted to VirtualKeyboardGUI class
- fixed bug with parsing modifiers in VirtualKeyboardParser
- fixed numerous GCC warnings
svn-id: r33448
Diffstat (limited to 'backends/common/virtual-keyboard.cpp')
-rw-r--r-- | backends/common/virtual-keyboard.cpp | 314 |
1 files changed, 76 insertions, 238 deletions
diff --git a/backends/common/virtual-keyboard.cpp b/backends/common/virtual-keyboard.cpp index e6ef87b946..45a0a47568 100644 --- a/backends/common/virtual-keyboard.cpp +++ b/backends/common/virtual-keyboard.cpp @@ -24,14 +24,9 @@ */ #include "backends/common/virtual-keyboard.h" +#include "backends/common/virtual-keyboard-gui.h" #include "backends/common/virtual-keyboard-parser.h" -#include "common/config-manager.h" -#include "common/events.h" -#include "common/unzip.h" -#include "graphics/cursorman.h" #include "graphics/imageman.h" -#include "graphics/surface-keycolored.h" -#include "gui/newgui.h" namespace Common { @@ -40,43 +35,37 @@ VirtualKeyboard::VirtualKeyboard() : _currentMode(0), _keyDown(0) { _system = g_system; _parser = new VirtualKeyboardParser(this); - _loaded = _displaying = _drag = false; - _lastScreenChanged = _system->getScreenChangeID(); - - memset(_cursor, 0xFF, sizeof(_cursor)); + _kbdGUI = new VirtualKeyboardGUI(this); + _loaded = false; } VirtualKeyboard::~VirtualKeyboard() { - // TODO: clean up event data pointers - deleteEventData(); + deleteEvents(); + delete _kbdGUI; delete _parser; } +void VirtualKeyboard::deleteEvents() { + ModeMap::iterator it_m; + EventMap::iterator it_e; + for (it_m = _modes.begin(); it_m != _modes.end(); it_m++) { + EventMap *evt = &(it_m->_value.events); + for (it_e = evt->begin(); it_e != evt->end(); it_e++) + delete it_e->_value; + } +} + void VirtualKeyboard::reset() { - // TODO: clean up event data pointers - deleteEventData(); + deleteEvents(); _modes.clear(); _initialMode = _currentMode = 0; - _kbdBound.left = _kbdBound.top - = _kbdBound.right = _kbdBound.bottom = 0; _hAlignment = kAlignCentre; _vAlignment = kAlignBottom; _keyQueue.clear(); _keyDown = 0; _keyFlags = 0; - _displaying = _drag = false; - _firstRun = true; - _lastScreenChanged = _system->getScreenChangeID(); -} - -void VirtualKeyboard::deleteEventData() { - ModeMap::iterator it_m; - EventMap::iterator it_e; - for (it_m = _modes.begin(); it_m != _modes.end(); it_m++) { - EventMap *evt = &(it_m->_value.events); - for (it_e = evt->begin(); it_e != evt->end(); it_e++) - delete it_e->_value.data; - } + _loaded = false; + _kbdGUI->reset(); } bool VirtualKeyboard::loadKeyboardPack(Common::String packName) { @@ -127,79 +116,25 @@ bool VirtualKeyboard::loadKeyboardPack(Common::String packName) { return _loaded; } -void VirtualKeyboard::setDefaultPosition() -{ - int16 scrW = _system->getOverlayWidth(), scrH = _system->getOverlayHeight(); - int16 kbdW = _kbdBound.width(), kbdH = _kbdBound.height(); - int16 posX = 0, posY = 0; - if (scrW != kbdW) { - switch (_hAlignment) { - case kAlignLeft: - posX = 0; - break; - case kAlignCentre: - posX = (scrW - kbdW) / 2; - break; - case kAlignRight: - posX = scrW - kbdW; - break; - } - } - if (scrH != kbdH) { - switch (_vAlignment) { - case kAlignTop: - posY = 0; - break; - case kAlignMiddle: - posY = (scrH - kbdH) / 2; - break; - case kAlignBottom: - posY = scrH - kbdH; - break; - } - } - _kbdBound.moveTo(posX, posY); -} - bool VirtualKeyboard::checkModeResolutions() { _parser->setParseMode(kParseCheckResolutions); _loaded = _parser->parse(); return _loaded; } - -void VirtualKeyboard::move(int16 x, int16 y) { - // snap to edge of screen - if (ABS(x) < SNAP_WIDTH) - x = 0; - int16 x2 = _system->getOverlayWidth() - _kbdBound.width(); - if (ABS(x - x2) < SNAP_WIDTH) - x = x2; - if (ABS(y) < SNAP_WIDTH) - y = 0; - int16 y2 = _system->getOverlayHeight() - _kbdBound.height(); - if (ABS(y - y2) < SNAP_WIDTH) - y = y2; - - _kbdBound.moveTo(x, y); -} Common::String VirtualKeyboard::findArea(int16 x, int16 y) { - x -= _kbdBound.left; - y -= _kbdBound.top; - if (x < 0 || x > _kbdBound.width()) return ""; - if (y < 0 || y > _kbdBound.height()) return ""; return _currentMode->imageMap.findMapArea(x, y); } -void VirtualKeyboard::processClick(const Common::String& area) { +void VirtualKeyboard::processAreaClick(const Common::String& area) { if (!_currentMode->events.contains(area)) return; - Event evt = _currentMode->events[area]; + Event *evt = _currentMode->events[area]; - switch (evt.type) { + switch (evt->type) { case kEventKey: { // add virtual keypress to queue - Common::KeyState key = *(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; @@ -208,25 +143,23 @@ void VirtualKeyboard::processClick(const Common::String& area) { break; } case kEventModifier: - _keyFlags ^= *(byte*)(evt.data); + _keyFlags ^= *(byte*)(evt->data); break; case kEventSwitchMode: // switch to new mode - switchMode(*(Common::String *)evt.data); + switchMode(*(Common::String *)evt->data); _keyFlags = 0; break; case kEventClose: // close virtual keyboard - _displaying = false; + _kbdGUI->hide(); break; } } void VirtualKeyboard::switchMode(Mode *newMode) { - _kbdBound.setWidth(newMode->image->w); - _kbdBound.setHeight(newMode->image->h); + _kbdGUI->setKeyboardSurface(newMode->image, newMode->transparentColor); _currentMode = newMode; - _needRedraw = true; } void VirtualKeyboard::switchMode(const Common::String& newMode) { @@ -237,6 +170,20 @@ void VirtualKeyboard::switchMode(const Common::String& newMode) { switchMode(&_modes[newMode]); } +void VirtualKeyboard::handleMouseDown(int16 x, int16 y) { + _areaDown = findArea(x, y); + if (_areaDown.empty()) + _kbdGUI->startDrag(x, y); +} + +void VirtualKeyboard::handleMouseUp(int16 x, int16 y) { + if (!_areaDown.empty() && _areaDown == findArea(x, y)) { + processAreaClick(_areaDown); + _areaDown.clear(); + } + _kbdGUI->endDrag(); +} + void VirtualKeyboard::show() { if (!_loaded) { // if not loaded then load default "vkeybd" pack @@ -245,90 +192,12 @@ void VirtualKeyboard::show() { return; } } - if (_lastScreenChanged != _system->getScreenChangeID()) - screenChanged(); switchMode(_initialMode); - _displaying = true; - if (_firstRun) { - _firstRun = false; - setDefaultPosition(); - } - - if (!g_gui.isActive()) { - _system->showOverlay(); - _system->clearOverlay(); - } - _overlayBackup.create(_system->getOverlayWidth(), _system->getOverlayHeight(), sizeof(OverlayColor)); - _system->grabOverlay((OverlayColor*)_overlayBackup.pixels, _overlayBackup.w); - setupCursor(); - - runLoop(); - - removeCursor(); - _system->copyRectToOverlay((OverlayColor*)_overlayBackup.pixels, _overlayBackup.w, 0, 0, _overlayBackup.w, _overlayBackup.h); - if (!g_gui.isActive()) _system->hideOverlay(); - _overlayBackup.free(); -} -void VirtualKeyboard::hide() { - _displaying = false; -} - -void VirtualKeyboard::screenChanged() { - _lastScreenChanged = _system->getScreenChangeID(); - if (!checkModeResolutions()) - _displaying = false; -} + _kbdGUI->run(); -void VirtualKeyboard::runLoop() { - Common::EventManager *eventMan = _system->getEventManager(); - - while (_displaying) { - if (_needRedraw) redraw(); - - animateCursor(); - _system->updateScreen(); - Common::Event event; - while (eventMan->pollEvent(event)) { - switch (event.type) { - case Common::EVENT_LBUTTONDOWN: - if (_kbdBound.contains(event.mouse)) { - _areaDown = findArea(event.mouse.x, event.mouse.y); - if (_areaDown.empty()) { - _drag = true; - _dragPoint.x = event.mouse.x - _kbdBound.left; - _dragPoint.y = event.mouse.y - _kbdBound.top; - } - } else - _areaDown.clear(); - break; - case Common::EVENT_LBUTTONUP: - if (_drag) _drag = false; - if (!_areaDown.empty() && _areaDown == findArea(event.mouse.x, event.mouse.y)) { - processClick(_areaDown); - _areaDown.clear(); - } - break; - case Common::EVENT_MOUSEMOVE: - if (_drag) { - move(event.mouse.x - _dragPoint.x, - event.mouse.y - _dragPoint.y); - _needRedraw = true; - } - break; - case Common::EVENT_SCREEN_CHANGED: - screenChanged(); - break; - case Common::EVENT_QUIT: - _system->quit(); - return; - default: - break; - } - } - // Delay for a moment - _system->delayMillis(10); - } + EventManager *eventMan = _system->getEventManager(); + assert(eventMan); // push keydown & keyup events into the event manager Common::Event evt; @@ -342,62 +211,20 @@ void VirtualKeyboard::runLoop() { } } -void VirtualKeyboard::redraw() { - Graphics::SurfaceKeyColored surf; - - surf.create(_system->getOverlayWidth(), _system->getOverlayHeight(), sizeof(OverlayColor)); - - memcpy(surf.pixels, _overlayBackup.pixels, surf.w * surf.h * sizeof(OverlayColor)); - surf.blit(_currentMode->image, _kbdBound.left, _kbdBound.top, _currentMode->transparentColor); - - _system->copyRectToOverlay((OverlayColor*)surf.pixels, surf.w, 0, 0, surf.w, surf.h); - - surf.free(); - - _needRedraw = false; -} - -void VirtualKeyboard::setupCursor() { - const byte palette[] = { - 255, 255, 255, 0, - 255, 255, 255, 0, - 171, 171, 171, 0, - 87, 87, 87, 0 - }; - - CursorMan.pushCursorPalette(palette, 0, 4); - CursorMan.pushCursor(NULL, 0, 0, 0, 0); - CursorMan.showMouse(true); -} - -void VirtualKeyboard::animateCursor() { - int time = _system->getMillis(); - if (time > _cursorAnimateTimer + kCursorAnimateDelay) { - for (int i = 0; i < 15; i++) { - if ((i < 6) || (i > 8)) { - _cursor[16 * 7 + i] = _cursorAnimateCounter; - _cursor[16 * i + 7] = _cursorAnimateCounter; - } - } - - CursorMan.replaceCursor(_cursor, 16, 16, 7, 7); - - _cursorAnimateTimer = time; - _cursorAnimateCounter = (_cursorAnimateCounter + 1) % 4; - } +void VirtualKeyboard::hide() { + _kbdGUI->hide(); } -void VirtualKeyboard::removeCursor() { - CursorMan.popCursor(); - CursorMan.popCursorPalette(); +bool VirtualKeyboard::isDisplaying() { + return _kbdGUI->isDisplaying(); } -VirtualKeyboard::Queue::Queue() { - _keyPos = _keys.begin(); +VirtualKeyboard::KeyPressQueue::KeyPressQueue() { + _keyPos = _keys.end(); _strPos = 0; } -void VirtualKeyboard::Queue::insertKey(KeyState key) { +void VirtualKeyboard::KeyPressQueue::insertKey(KeyState key) { switch (key.keycode) { case KEYCODE_LEFT: moveLeft(); @@ -408,6 +235,8 @@ void VirtualKeyboard::Queue::insertKey(KeyState key) { case KEYCODE_BACKSPACE: deleteKey(); return; + default: + ; } String keyStr; @@ -429,10 +258,11 @@ void VirtualKeyboard::Queue::insertKey(KeyState key) { kp.key = key; kp.strLen = keyStr.size(); _keys.insert(_keyPos, kp); - _keyPos++; + + printf("%s %d\n", _str.c_str(), kp.strLen); } -void VirtualKeyboard::Queue::deleteKey() { +void VirtualKeyboard::KeyPressQueue::deleteKey() { if (_keyPos == _keys.begin()) return; List<VirtualKeyPress>::iterator it = _keyPos; @@ -443,41 +273,49 @@ void VirtualKeyboard::Queue::deleteKey() { _keys.erase(it); } -void VirtualKeyboard::Queue::moveLeft() { +void VirtualKeyboard::KeyPressQueue::moveLeft() { if (_keyPos == _keys.begin()) return; _keyPos--; _strPos -= _keyPos->strLen; } -void VirtualKeyboard::Queue::moveRight() { - List<VirtualKeyPress>::iterator it = _keyPos; - it++; - if (it == _keys.end()) +void VirtualKeyboard::KeyPressQueue::moveRight() { + if (_keyPos == _keys.end()) return; _strPos += _keyPos->strLen; - _keyPos = it; + _keyPos++; } -KeyState VirtualKeyboard::Queue::pop() { - KeyState ret = _keys.begin()->key; +KeyState VirtualKeyboard::KeyPressQueue::pop() { + bool front = (_keyPos == _keys.begin()); + VirtualKeyPress kp = *(_keys.begin()); _keys.pop_front(); - return ret; + + if (front) + _keyPos = _keys.begin(); + else + _strPos -= kp.strLen; + + while (kp.strLen-- > 0) + _str.deleteChar(0); + + return kp.key; } -void VirtualKeyboard::Queue::clear() { +void VirtualKeyboard::KeyPressQueue::clear() { _keys.clear(); - _keyPos = _keys.begin(); + _keyPos = _keys.end(); _str.clear(); _strPos = 0; } -bool VirtualKeyboard::Queue::empty() +bool VirtualKeyboard::KeyPressQueue::empty() { return _keys.empty(); } -String VirtualKeyboard::Queue::getString() +const String& VirtualKeyboard::KeyPressQueue::getString() { return _str; } |