File: EventDispatcher.h

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (85 lines) | stat: -rw-r--r-- 3,362 bytes parent folder | download
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
/*
 * EventDispatcher.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */
#pragma once

VCMI_LIB_NAMESPACE_BEGIN
class Point;
VCMI_LIB_NAMESPACE_END

class AEventsReceiver;
enum class MouseButton;
enum class EShortcut;
enum class InputMode;

/// Class that receives events from event producers and dispatches it to UI elements that are interested in this event
class EventDispatcher
{
	using EventReceiversList = std::list<AEventsReceiver *>;

	/// list of UI elements that are interested in particular event
	EventReceiversList lclickable;
	EventReceiversList rclickable;
	EventReceiversList hoverable;
	EventReceiversList keyinterested;
	EventReceiversList motioninterested;
	EventReceiversList draginterested;
	EventReceiversList dragPopupInterested;
	EventReceiversList timeinterested;
	EventReceiversList wheelInterested;
	EventReceiversList doubleClickInterested;
	EventReceiversList textInterested;
	EventReceiversList panningInterested;
	EventReceiversList inputModeChangeInterested;

	void handleLeftButtonClick(const Point & position, int tolerance, bool isPressed);
	void handleDoubleButtonClick(const Point & position, int tolerance);
	AEventsReceiver * findElementInToleranceRange(const EventReceiversList & list, const Point & position, int eventToTest, int tolerance);

	template<typename Functor>
	void processLists(ui16 activityFlag, const Functor & cb);

public:
	/// add specified UI element as interested. Uses unnamed enum from AEventsReceiver for activity flags
	void activateElement(AEventsReceiver * elem, ui16 activityFlag);

	/// removes specified UI element as interested for specified activities
	void deactivateElement(AEventsReceiver * elem, ui16 activityFlag);

	/// Regular timer event
	void dispatchTimer(uint32_t msPassed);

	/// Shortcut events (e.g. keyboard keys)
	void dispatchShortcutPressed(const std::vector<EShortcut> & shortcuts);
	void dispatchShortcutReleased(const std::vector<EShortcut> & shortcuts);

	/// Mouse events
	void dispatchMouseLeftButtonPressed(const Point & position, int tolerance);
	void dispatchMouseLeftButtonReleased(const Point & position, int tolerance);
	void dispatchMouseScrolled(const Point & distance, const Point & position);
	void dispatchMouseDoubleClick(const Point & position, int tolerance);
	void dispatchMouseMoved(const Point & distance, const Point & position);

	void dispatchMouseDragged(const Point & currentPosition, const Point & lastUpdateDistance);
	void dispatchMouseDraggedPopup(const Point & currentPosition, const Point & lastUpdateDistance);

	void dispatchShowPopup(const Point & position, int tolerance);
	void dispatchClosePopup(const Point & position);

	void dispatchGesturePanningStarted(const Point & initialPosition);
	void dispatchGesturePanningEnded(const Point & initialPosition, const Point & finalPosition);
	void dispatchGesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance);
	void dispatchGesturePinch(const Point & initialPosition, double distance);

	/// Text input events
	void dispatchTextInput(const std::string & text);
	void dispatchTextEditing(const std::string & text);

	void dispatchInputModeChanged(const InputMode & modi);
};