From f942405184c2d6067fb5303b58a225edf7e452b1 Mon Sep 17 00:00:00 2001 From: LaG1924 <12997935+LaG1924@users.noreply.github.com> Date: Sat, 29 Jul 2017 19:55:16 +0500 Subject: 2017-07-29 --- src/Event.hpp | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/Event.hpp (limited to 'src/Event.hpp') diff --git a/src/Event.hpp b/src/Event.hpp new file mode 100644 index 0000000..2d830a4 --- /dev/null +++ b/src/Event.hpp @@ -0,0 +1,116 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Vector.hpp" +#include "Packet.hpp" + +enum class EventType { + Echo, + ChunkChanged, + ConnectToServer, + ConnectionSuccessfull, + GlobalAppState, + Disconnect, + SendPacket, + ReceivePacket, +}; + +struct EchoData { + std::chrono::time_point time; +}; + +struct ChunkChangedData { + Vector chunkPosition; +}; + +struct ConnectToServerData { + std::string address; + unsigned short port; +}; + +struct ConnectionSuccessfullData { + +}; + +enum class GlobalState { + InitialLoading, + MainMenu, + Loading, + InGame, + PauseMenu, + Exiting, +}; + +struct GlobalAppStateData { + GlobalState state; +}; + +struct DisconnectData { + +}; + +struct SendPacketData { + std::shared_ptr packet; +}; + +struct ReceivePacketData { + std::shared_ptr packet; +}; + +using EventData = std::variant; + +struct Event { + EventType type; + EventData data; +}; + +class EventListener { + friend class EventAgregator; + + using HandlerFunc = std::function; + + std::map handlers; //TODO: There must be more elegant solution than std::variant of all data + + std::mutex eventsMutex; + + std::queue events; + + void PushEvent(Event event); + +public: + EventListener(); + ~EventListener(); + bool IsEventsQueueIsNotEmpty(); + + void RegisterHandler(EventType type, HandlerFunc handler); + + void HandleEvent(); +}; + +class EventAgregator { + friend EventListener; + + EventAgregator() = default; + static std::queue eventsToHandle; + static std::mutex queueMutex; + static bool isStarted; + static std::vector listeners; + static std::mutex listenersMutex; + + static void EventHandlingLoop(); + + static void RegisterListener(EventListener &listener); + static void UnregisterListener(EventListener &listener); + +public: + static void PushEvent(EventType type, EventData data); +}; \ No newline at end of file -- cgit v1.2.3