mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-03 07:59:38 +00:00
MACVENTURE: Revamp double click detection
This commit is contained in:
parent
5b63e29d5e
commit
0aef29a8c5
@ -20,9 +20,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "common/file.h"
|
||||
#include "common/timer.h"
|
||||
#include "common/system.h"
|
||||
#include "image/bmp.h"
|
||||
|
||||
@ -92,11 +90,6 @@ static const Graphics::MenuData menuSubItems[] = {
|
||||
};
|
||||
|
||||
|
||||
static void cursorTimerHandler(void *refCon) {
|
||||
Gui *gui = (Gui *)refCon;
|
||||
gui->processCursorTick();
|
||||
}
|
||||
|
||||
bool commandsWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
|
||||
bool mainGameWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
|
||||
bool outConsoleWindowCallback(Graphics::WindowClick, Common::Event &event, void *gui);
|
||||
@ -117,7 +110,6 @@ Gui::Gui(MacVentureEngine *engine, Common::MacResManager *resman) {
|
||||
_dialog = nullptr;
|
||||
|
||||
_cursor = new Cursor(this);
|
||||
g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 500000, this, "macVentureCursor");
|
||||
|
||||
_consoleText = new ConsoleText(this);
|
||||
|
||||
@ -886,8 +878,7 @@ WindowReference Gui::findWindowAtPoint(Common::Point point) {
|
||||
win = findWindow(it->refcon);
|
||||
if (win && it->refcon != kDiplomaWindow) { //HACK, diploma should be cosnidered
|
||||
if (win->getDimensions().contains(point)) {
|
||||
if (win->isActive())
|
||||
return it->refcon;
|
||||
return it->refcon;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -979,7 +970,10 @@ void Gui::checkSelect(const WindowData &data, const Common::Event &event, const
|
||||
child = (*it).obj;
|
||||
}
|
||||
}
|
||||
if (child != 0) selectDraggable(child, ref, event.mouse, data.scrollPos);
|
||||
if (child != 0) {
|
||||
selectDraggable(child, ref, event.mouse, data.scrollPos);
|
||||
bringToFront(ref);
|
||||
}
|
||||
}
|
||||
|
||||
bool Gui::canBeSelected(ObjID obj, const Common::Event &event, const Common::Rect &clickRect, WindowReference ref) {
|
||||
@ -1375,10 +1369,6 @@ bool Gui::processInventoryEvents(WindowClick click, Common::Event & event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void Gui::processCursorTick() {
|
||||
_cursor->tick();
|
||||
}
|
||||
|
||||
void Gui::handleSingleClick(Common::Point pos) {
|
||||
debug("Single Click");
|
||||
// HACK THERE HAS TO BE A MORE ELEGANT WAY
|
||||
|
@ -29,6 +29,8 @@
|
||||
|
||||
#include "graphics/font.h"
|
||||
|
||||
#include "common/timer.h"
|
||||
|
||||
#include "macventure/macventure.h"
|
||||
#include "macventure/container.h"
|
||||
#include "macventure/image.h"
|
||||
@ -123,8 +125,6 @@ public:
|
||||
bool processDiplomaEvents(WindowClick click, Common::Event &event);
|
||||
bool processInventoryEvents(WindowClick click, Common::Event &event);
|
||||
|
||||
void processCursorTick();
|
||||
|
||||
const WindowData& getWindowData(WindowReference reference);
|
||||
|
||||
const Graphics::Font& getCurrentFont();
|
||||
@ -244,32 +244,35 @@ private: // Methods
|
||||
|
||||
};
|
||||
|
||||
static void cursorTimerHandler(void *refCon);
|
||||
|
||||
class Cursor {
|
||||
enum ClickState {
|
||||
kCursorIdle = 0,
|
||||
kCursorSC = 1,
|
||||
kCursorNoTick = 2,
|
||||
kCursorSCTrans = 3,
|
||||
kCursorExecSC = 4,
|
||||
kCursorExecDC = 5,
|
||||
kCursorSCStart = 1,
|
||||
kCursorSCDrag = 2,
|
||||
kCursorDCStart = 3,
|
||||
kCursorDCDo = 4,
|
||||
kCursorSCSink = 5,
|
||||
kCursorStateCount
|
||||
};
|
||||
|
||||
enum CursorInput { // Columns for the FSM transition table
|
||||
kTickCol = 0,
|
||||
kButtonDownCol = 1,
|
||||
kButtonUpCol = 2,
|
||||
kButtonDownCol = 0,
|
||||
kButtonUpCol = 1,
|
||||
kTickCol = 2,
|
||||
kCursorInputCount
|
||||
};
|
||||
|
||||
|
||||
ClickState _transitionTable[kCursorStateCount][kCursorInputCount] = {
|
||||
/* kCursorIdle */ {kCursorIdle, kCursorIdle, kCursorSC },
|
||||
/* kCursorSC */ {kCursorExecSC, kCursorSCTrans, kCursorExecDC },
|
||||
/* IgnoreTick */ {kCursorNoTick, kCursorNoTick, kCursorExecSC },
|
||||
/* SC Transition */ {kCursorNoTick, kCursorNoTick, kCursorExecDC },
|
||||
/* Exec SC */ {kCursorIdle, kCursorExecSC, kCursorExecSC }, // Trap state
|
||||
/* Exec DC */ {kCursorIdle, kCursorExecDC, kCursorExecDC } // Trap state
|
||||
/* Button down, Button Up, Tick */
|
||||
/* Idle */ {kCursorSCStart, kCursorIdle, kCursorIdle },
|
||||
/* SC Start */ {kCursorSCStart, kCursorDCStart, kCursorSCDrag},
|
||||
/* SC Do */ {kCursorSCDrag, kCursorIdle, kCursorSCDrag},
|
||||
/* DC Start */ {kCursorDCDo, kCursorDCStart, kCursorSCSink},
|
||||
/* DC Do */ {kCursorDCDo, kCursorIdle, kCursorDCDo },
|
||||
/* SC Sink */ {kCursorIdle, kCursorIdle, kCursorIdle },
|
||||
};
|
||||
|
||||
public:
|
||||
@ -281,12 +284,10 @@ public:
|
||||
~Cursor() {}
|
||||
|
||||
void tick() {
|
||||
executeState();
|
||||
changeState(kTickCol);
|
||||
}
|
||||
|
||||
bool processEvent(const Common::Event &event) {
|
||||
|
||||
if (event.type == Common::EVENT_MOUSEMOVE) {
|
||||
_pos = event.mouse;
|
||||
return true;
|
||||
@ -310,17 +311,49 @@ public:
|
||||
private:
|
||||
|
||||
void changeState(CursorInput input) {
|
||||
debug(4, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
|
||||
_state = _transitionTable[_state][input];
|
||||
debug(1, "Change cursor state: [%d] -> [%d]", _state, _transitionTable[_state][input]);
|
||||
if (_state != _transitionTable[_state][input]) {
|
||||
executeStateOut();
|
||||
_state = _transitionTable[_state][input];
|
||||
executeStateIn();
|
||||
}
|
||||
}
|
||||
|
||||
void executeState() {
|
||||
if (_state == kCursorExecSC) {
|
||||
void executeStateIn() {
|
||||
switch (_state) {
|
||||
case kCursorSCStart:
|
||||
g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
|
||||
break;
|
||||
case kCursorDCStart:
|
||||
g_system->getTimerManager()->installTimerProc(&cursorTimerHandler, 300000, this, "macVentureCursor");
|
||||
break;
|
||||
case kCursorSCSink:
|
||||
_gui->handleSingleClick(_pos);
|
||||
changeState(kTickCol);
|
||||
} else if (_state == kCursorExecDC) {
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void executeStateOut() {
|
||||
switch (_state) {
|
||||
case kCursorIdle:
|
||||
break;
|
||||
case kCursorSCStart:
|
||||
g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
|
||||
break;
|
||||
case kCursorSCDrag:
|
||||
_gui->handleSingleClick(_pos);
|
||||
break;
|
||||
case kCursorDCStart:
|
||||
g_system->getTimerManager()->removeTimerProc(&cursorTimerHandler);
|
||||
break;
|
||||
case kCursorDCDo:
|
||||
_gui->handleDoubleClick(_pos);
|
||||
changeState(kTickCol);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,9 +363,14 @@ private:
|
||||
|
||||
Common::Point _pos;
|
||||
ClickState _state;
|
||||
|
||||
};
|
||||
|
||||
static void cursorTimerHandler(void *refCon) {
|
||||
Cursor *cursor = (Cursor *)refCon;
|
||||
cursor->tick();
|
||||
}
|
||||
|
||||
|
||||
class ConsoleText {
|
||||
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user