[Scummvm-cvs-logs] CVS: scummvm/sword2 controls.cpp,1.54,1.55
Torbj?rn Andersson
eriktorbjorn at users.sourceforge.net
Fri Dec 19 08:51:08 CET 2003
Update of /cvsroot/scummvm/scummvm/sword2
In directory sc8-pr-cvs1:/tmp/cvs-serv20540
Modified Files:
controls.cpp
Log Message:
Implemented scroll wheel handling for save/load dialogs. (This turned up a
few other hitherto harmless bugs, which I've hopefully managed to fix.)
Index: controls.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword2/controls.cpp,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- controls.cpp 3 Dec 2003 01:04:54 -0000 1.54
+++ controls.cpp 19 Dec 2003 16:50:02 -0000 1.55
@@ -106,6 +106,8 @@
virtual void onMouseMove(int x, int y) {}
virtual void onMouseDown(int x, int y) {}
virtual void onMouseUp(int x, int y) {}
+ virtual void onWheelUp(int x, int y) {}
+ virtual void onWheelDown(int x, int y) {}
virtual void onKey(_keyboardEvent *ke) {}
virtual void onTick() {}
@@ -297,34 +299,66 @@
setResult(1);
}
+ int oldHit = -1;
+ int newHit = -1;
+
+ // Find out which widget the mouse was over the last time, and
+ // which it is currently over. This assumes the widgets do not
+ // overlap.
+
for (i = 0; i < _numWidgets; i++) {
- bool oldHit = _widgets[i]->isHit(oldMouseX, oldMouseY);
- bool newHit = _widgets[i]->isHit(newMouseX, newMouseY);
+ if (_widgets[i]->isHit(oldMouseX, oldMouseY))
+ oldHit = i;
+ if (_widgets[i]->isHit(newMouseX, newMouseY))
+ newHit = i;
+ }
- if (!oldHit && newHit)
- _widgets[i]->onMouseEnter();
- if (oldHit && !newHit)
- _widgets[i]->onMouseExit();
- if (_gui->_vm->_input->_mouseX != oldMouseX || _gui->_vm->_input->_mouseY != oldMouseY)
- _widgets[i]->onMouseMove(newMouseX, newMouseY);
+ // Was the mouse inside a widget the last time?
+
+ if (oldHit >= 0) {
+ if (newHit != oldHit)
+ _widgets[oldHit]->onMouseExit();
+ }
+
+ // Is the mouse currently in a widget?
+
+ if (newHit >= 0) {
+ if (newHit != oldHit)
+ _widgets[newHit]->onMouseEnter();
if (me) {
switch (me->buttons) {
case RD_LEFTBUTTONDOWN:
- if (newHit)
- _widgets[i]->onMouseDown(newMouseX, newMouseY);
+ _widgets[newHit]->onMouseDown(newMouseX, newMouseY);
break;
case RD_LEFTBUTTONUP:
- if (newHit)
- _widgets[i]->onMouseUp(newMouseX, newMouseY);
- // So that slider widgets will know
- // when the user releases the mouse
- // button, even if the cursor is
- // outside of the slider's hit area.
- _widgets[i]->releaseMouse(newMouseX, newMouseY);
+ _widgets[newHit]->onMouseUp(newMouseX, newMouseY);
+ break;
+ case RD_WHEELUP:
+ _widgets[newHit]->onWheelUp(newMouseX, newMouseY);
+ break;
+ case RD_WHEELDOWN:
+ _widgets[newHit]->onWheelDown(newMouseX, newMouseY);
break;
}
}
+ }
+
+ // Some events are passed to the widgets regardless of where
+ // the mouse cursor is.
+
+ for (i = 0; i < _numWidgets; i++) {
+ if (me && me->buttons == RD_LEFTBUTTONUP) {
+ // So that slider widgets will know when the
+ // user releases the mouse button, even if the
+ // cursor is outside of the slider's hit area.
+ _widgets[i]->releaseMouse(newMouseX, newMouseY);
+ }
+
+ // This is to make it easier to drag the slider widget
+
+ if (newMouseX != oldMouseX || newMouseY != oldMouseY)
+ _widgets[i]->onMouseMove(newMouseX, newMouseY);
if (keyboardStatus == RD_OK)
_widgets[i]->onKey(&ke);
@@ -957,11 +991,15 @@
kLoadDialog
};
+// Slot button actions. Note that keyboard input generates positive actions
+
enum {
kSelectSlot = -1,
kDeselectSlot = -2,
- kStartEditing = 0,
- kCursorTick = 1
+ kWheelDown = -3,
+ kWheelUp = -4,
+ kStartEditing = -5,
+ kCursorTick = -6
};
class Slot : public Widget {
@@ -1031,6 +1069,14 @@
}
}
+ virtual void onWheelUp(int x, int y) {
+ _parent->onAction(this, kWheelUp);
+ }
+
+ virtual void onWheelDown(int x, int y) {
+ _parent->onAction(this, kWheelDown);
+ }
+
virtual void onKey(_keyboardEvent *ke) {
if (_editable) {
if (ke->keycode == 8)
@@ -1206,61 +1252,24 @@
setResult(0);
} else {
Slot *slot = (Slot *) widget;
+ int textWidth;
+ char tmp;
+ int i;
- if (result >= kStartEditing) {
- if (result == kStartEditing) {
- if (_selectedSlot >= 10)
- _firstPos = 5;
- else
- _firstPos = 4;
-
- strcpy(_editBuffer, slot->getText());
- _editPos = strlen(_editBuffer);
- _cursorTick = 0;
- _editBuffer[_editPos] = '_';
- _editBuffer[_editPos + 1] = 0;
- slot->setEditable(true);
- drawEditBuffer(slot);
- } else if (result == kCursorTick) {
- _cursorTick++;
- if (_cursorTick == 7) {
- _editBuffer[_editPos] = ' ';
- drawEditBuffer(slot);
- } else if (_cursorTick == 14) {
- _cursorTick = 0;
- _editBuffer[_editPos] = '_';
- drawEditBuffer(slot);
- }
- } else if (result == 8) {
- if (_editPos > _firstPos) {
- _editBuffer[_editPos - 1] = _editBuffer[_editPos];
- _editBuffer[_editPos--] = 0;
- drawEditBuffer(slot);
- }
- } else {
- int textWidth;
- char tmp;
-
- tmp = _editBuffer[_editPos];
- _editBuffer[_editPos] = 0;
- textWidth = _fr2->getTextWidth(_editBuffer);
- _editBuffer[_editPos] = tmp;
-
- if (textWidth < 340 && _editPos < SAVE_DESCRIPTION_LEN - 2) {
- _editBuffer[_editPos + 1] = _editBuffer[_editPos];
- _editBuffer[_editPos + 2] = 0;
- _editBuffer[_editPos++] = result;
- drawEditBuffer(slot);
- }
- }
- } else {
+ switch (result) {
+ case kWheelUp:
+ onAction(_upButton);
+ break;
+ case kWheelDown:
+ onAction(_downButton);
+ break;
+ case kSelectSlot:
+ case kDeselectSlot:
if (result == kSelectSlot)
_selectedSlot = _gui->_baseSlot + (slot->getY() - 72) / 35;
else if (result == kDeselectSlot)
_selectedSlot = -1;
- int i;
-
for (i = 0; i < 8; i++)
if (widget == _slotButton[i])
break;
@@ -1271,6 +1280,52 @@
_slotButton[j]->setState(0);
}
}
+ break;
+ case kStartEditing:
+ if (_selectedSlot >= 10)
+ _firstPos = 5;
+ else
+ _firstPos = 4;
+
+ strcpy(_editBuffer, slot->getText());
+ _editPos = strlen(_editBuffer);
+ _cursorTick = 0;
+ _editBuffer[_editPos] = '_';
+ _editBuffer[_editPos + 1] = 0;
+ slot->setEditable(true);
+ drawEditBuffer(slot);
+ break;
+ case kCursorTick:
+ _cursorTick++;
+ if (_cursorTick == 7) {
+ _editBuffer[_editPos] = ' ';
+ drawEditBuffer(slot);
+ } else if (_cursorTick == 14) {
+ _cursorTick = 0;
+ _editBuffer[_editPos] = '_';
+ drawEditBuffer(slot);
+ }
+ break;
+ case 8:
+ if (_editPos > _firstPos) {
+ _editBuffer[_editPos - 1] = _editBuffer[_editPos];
+ _editBuffer[_editPos--] = 0;
+ drawEditBuffer(slot);
+ }
+ break;
+ default:
+ tmp = _editBuffer[_editPos];
+ _editBuffer[_editPos] = 0;
+ textWidth = _fr2->getTextWidth(_editBuffer);
+ _editBuffer[_editPos] = tmp;
+
+ if (textWidth < 340 && _editPos < SAVE_DESCRIPTION_LEN - 2) {
+ _editBuffer[_editPos + 1] = _editBuffer[_editPos];
+ _editBuffer[_editPos + 2] = 0;
+ _editBuffer[_editPos++] = result;
+ drawEditBuffer(slot);
+ }
+ break;
}
}
}
More information about the Scummvm-git-logs
mailing list