#pragma once #include #include "Point.hpp" #include "Box.hpp" namespace Raven { enum class EventType { NoneEvent, MouseButton, MouseMove, RelayoutSubtree, RepaintRect, FocusUpdate, ActivationUpdate, }; class Event { public: Event() {} virtual EventType type() { return EventType::NoneEvent; } virtual const char *name() { return "NoneEvent"; } virtual ~Event() = default; }; class MouseButtonEvent : public Event { private: bool m_was_left_button_pressed; bool m_was_right_button_pressed; bool m_did_scroll_up; bool m_did_scroll_down; Point m_point; public: MouseButtonEvent(bool was_left_button_pressed, bool was_right_button_pressed, bool did_scroll_up, bool did_scroll_down, Point point) : m_was_left_button_pressed(was_left_button_pressed) , m_was_right_button_pressed(was_right_button_pressed) , m_did_scroll_up(did_scroll_up) , m_did_scroll_down(did_scroll_down) , m_point(point) {} EventType type() { return EventType::MouseButton; } const char *name() { return "MouseButton"; } bool was_left_button_pressed() { return m_was_left_button_pressed; } bool was_right_button_pressed() { return m_was_right_button_pressed; } bool did_scroll_up() { return m_did_scroll_up; } bool did_scroll_down() { return m_did_scroll_down; } Point &point() { return m_point; } }; class MouseMoveEvent : public Event { private: Point m_point; public: MouseMoveEvent(Point point) : m_point(point) {} EventType type() { return EventType::MouseMove; } const char *name() { return "MouseMove"; } Point &point() { return m_point; } void set_point(Point point) { m_point = point; } }; class RepaintRectEvent : public Event { private: bool m_grouping { true }; Box m_box; public: RepaintRectEvent(bool grouping, Box box) : m_grouping(grouping) , m_box(box) {} EventType type() { return EventType::RepaintRect; } const char *name() { return "RepaintRect"; } bool grouping() { return m_grouping; } Box &box() { return m_box; } void set_grouping(bool grouping) { m_grouping = grouping; } void set_box(Box box) { m_box = box; } }; class RelayoutSubtreeEvent : public Event { public: RelayoutSubtreeEvent() {} EventType type() { return EventType::RelayoutSubtree; } const char *name() { return "RelayoutSubtree"; } }; class FocusUpdateEvent : public Event { private: bool m_focus_status; public: FocusUpdateEvent(bool focus_status) : m_focus_status(focus_status) {} EventType type() { return EventType::FocusUpdate; } const char *name() { return "FocusUpdate"; } bool focus_status() { return m_focus_status; } }; class ActivationUpdateEvent : public Event { private: bool m_activation_status; public: ActivationUpdateEvent(bool activation_status) : m_activation_status(activation_status) {} EventType type() { return EventType::ActivationUpdate; } const char *name() { return "ActivationUpdate"; } bool activation_status() { return m_activation_status; } }; }