1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/********************************************************************
*
*	Created:	8/4/2014   11:15
*
*	File:		fsIGestureHandlingComponent.h
*
*	Author:		Mick Waites
*	
*	Purpose:	Base class for components which accept translated
*				input.
*
*********************************************************************/

#ifndef fsIGestureHandlingComponenthdr
#define fsIGestureHandlingComponenthdr

#include <vector>

#include "fsIMessageListenerComponent.h"
#include "../../fsIInputManager.h"

struct fsPoint;
class fsCEntity;


class fsIGestureHandlingComponent : public fsIMessageListenerComponent
{
public:

	fsBool hitTest(const fsPoint& pPos) const;

protected:

	struct sGesturePoint
	{
		sGesturePoint() : mInGesture(false)
		{
		}

		fsPoint mPrevPos;
		fsBool mInGesture;
	};

	enum
	{
		eSTATE_NOT_IN_GESTURE = 0,
		eSTATE_MOUSE_OVER,
		eSTATE_EVALUATING_GESTURE_TYPE,
		eSTATE_IN_TAP_GESTURE,
		eSTATE_IN_DRAG_GESTURE,
		eSTATE_IN_PINCH_GESTURE,

		eSTATE_WAITING_FOR_ALL_POINTS_TO_RELEASE
	};

	virtual void stolenInputDo();

	void gestureTypesSet(fsBool pHandleTaps, fsBool pHandleDragEvent, fsBool pHandlePinchEvents);

	fsBool messageProcessDo(const fsCUniqueId& pMessageType,
	                        const fsIMessageDispatcher::sMessageParameters& pParam) override;
	void listenersRegisterDo() override;
	void listenersDeregisterDo() override;
	void gestureReset();

	fsIGestureHandlingComponent(fsCEntity* pParent, fsBool pHandleTaps, fsBool pHandleDragEvent,
	                            fsBool pHandlePinchEvents);
	virtual ~fsIGestureHandlingComponent();<--- Destructor in derived class

	std::vector<sGesturePoint> mGesturePoints;

	fsS32 mGestureState;
	fsS32 mNumPointsDown;

	fsBool mHighlighted;

private:

	virtual fsBool hitTestDo(const fsPoint& pPos) const;
	virtual fsBool acceptingInputGet() const = 0;
	virtual fsBool highlightSetDo() { return false; }

	virtual void onTap(const fsPoint& pStartPos) {}
	virtual void onDragStart(const fsPoint& pStartPos) {}
	virtual void onDragMove(const fsPoint& pCurrPos) {}
	virtual void onDragEnd(const fsPoint& pEndPos) {}

	virtual void onPinchStart(const fsPoint& pStartPosPointA, const fsPoint& pStartPosPointB) {}
	virtual void onPinchMove(const fsPoint& pCurrPos, const fsPoint& pDelta, fsS32 pPointID) {}
	virtual void onPinchEnd(const fsPoint& pCurrPos, const fsPoint& pDelta, fsS32 pPointID)	{}

	fsBool dragMessageStolen(const fsCUniqueId& pMessageType, const fsIMessageDispatcher::sMessageParameters& pParam);

	fsBool downStealProcess(const fsIInputManager::sPointerMsgParam& pParam);
	fsBool pointerDownProcess(const fsIInputManager::sPointerMsgParam& pParam);
	fsBool pointerMoveProcess(const fsPoint& pPos, fsS32 pPtrIndex, fsBool pPtrDown);
	fsBool pointerUpProcess(const fsPoint& pPos, fsS32 pPtrIndex);

	fsBool gestureStartProcess(const fsIInputManager::sPointerMsgParam& pParam);
	fsBool mouseMoveProcess(const fsPoint& pPos);

	void tapEndProcess(const fsPoint& pPos);
	void tapStartProcess(const fsPoint& pPos, fsS32 pPtrIndex);
	void dragStartProcess(const fsPoint& pPos, fsS32 pPtrIndex);
	void dragEndProcess(const fsPoint& pPos, fsS32 pPtrIndex);
	void pinchEndProcess(const fsPoint& pPos, fsS32 pPtrIndex);
	void pinchStartProcess(const fsPoint& pPos, fsS32 pPtrIndex);

	fsBool highlightSet(fsBool pHighlight);

	static const fsS32 mDragDistanceThreshold = 16;

	const fsBool mMousePointerType;

	fsBool mHandleTaps;
	fsBool mHandleDragEvents;
	fsBool mHandlePinchEvents;
};

#endif