diff options
author | LaG1924 <12997935+LaG1924@users.noreply.github.com> | 2017-07-29 16:55:16 +0200 |
---|---|---|
committer | LaG1924 <12997935+LaG1924@users.noreply.github.com> | 2017-07-29 16:55:16 +0200 |
commit | f942405184c2d6067fb5303b58a225edf7e452b1 (patch) | |
tree | 83e70c7e3019e5b195c9caf41194b2113fa76d7f /src/Event.hpp | |
parent | 2017-07-26 (diff) | |
download | AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.gz AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.bz2 AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.lz AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.xz AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.zst AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.zip |
Diffstat (limited to '')
-rw-r--r-- | src/Event.hpp | 116 |
1 files changed, 116 insertions, 0 deletions
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 <queue> +#include <map> +#include <thread> +#include <mutex> +#include <condition_variable> +#include <chrono> +#include <variant> +#include <functional> + +#include "Vector.hpp" +#include "Packet.hpp" + +enum class EventType { + Echo, + ChunkChanged, + ConnectToServer, + ConnectionSuccessfull, + GlobalAppState, + Disconnect, + SendPacket, + ReceivePacket, +}; + +struct EchoData { + std::chrono::time_point<std::chrono::high_resolution_clock> 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> packet; +}; + +struct ReceivePacketData { + std::shared_ptr<Packet> packet; +}; + +using EventData = std::variant<EchoData, ChunkChangedData, ConnectToServerData, ConnectionSuccessfullData, + GlobalAppStateData, DisconnectData, SendPacketData, ReceivePacketData>; + +struct Event { + EventType type; + EventData data; +}; + +class EventListener { + friend class EventAgregator; + + using HandlerFunc = std::function<void(EventData)>; + + std::map<EventType, HandlerFunc> handlers; //TODO: There must be more elegant solution than std::variant of all data + + std::mutex eventsMutex; + + std::queue<Event> 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<Event> eventsToHandle; + static std::mutex queueMutex; + static bool isStarted; + static std::vector<EventListener *> 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 |