/* * Copyright (C) 2023 Christopher J. Howard * * This file is part of Antkeeper source code. * * Antkeeper source code is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Antkeeper source code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Antkeeper source code. If not, see . */ #ifndef ANTKEEPER_INPUT_MOUSE_HPP #define ANTKEEPER_INPUT_MOUSE_HPP #include "input/device.hpp" #include "input/input-events.hpp" #include "input/mouse-button.hpp" #include "event/publisher.hpp" #include "math/vector.hpp" #include namespace input { /** * A virtual mouse which generates mouse-related input events. */ class mouse: public device { public: /** * Constructs a mouse input device. */ mouse() = default; /// Destructs a mouse input device. virtual ~mouse() = default; /** * Simulates a mouse button press. * * @param button Button to press. */ void press(mouse_button button); /** * Simulates a mouse button release. * * @param button Button to release. */ void release(mouse_button button); /** * Simulates mouse movement. * * @param position Mouse position, in pixels, relative to the window. * @param difference Relative movement of the mouse, in pixels. */ void move(const math::vector& position, const math::vector& difference); /** * Simulates mouse scrolling. * * @param velocity Scroll velocity. */ void scroll(const math::vector& velocity); /// Returns the current mouse position, in pixels, relative to the window. [[nodiscard]] inline const math::vector& get_position() const noexcept { return position; } /// Returns the channel through which mouse button pressed events are published. [[nodiscard]] inline ::event::channel& get_button_pressed_channel() noexcept { return button_pressed_publisher.channel(); } /// Returns the channel through which mouse button released events are published. [[nodiscard]] inline ::event::channel& get_button_released_channel() noexcept { return button_released_publisher.channel(); } /// Returns the channel through which mouse moved events are published. [[nodiscard]] inline ::event::channel& get_moved_channel() noexcept { return moved_publisher.channel(); } /// Returns the channel through which mouse scrolled events are published. [[nodiscard]] inline ::event::channel& get_scrolled_channel() noexcept { return scrolled_publisher.channel(); } /// Returns device_type::mouse. [[nodiscard]] inline virtual constexpr device_type get_device_type() const noexcept { return device_type::mouse; } private: math::vector position; ::event::publisher button_pressed_publisher; ::event::publisher button_released_publisher; ::event::publisher moved_publisher; ::event::publisher scrolled_publisher; }; } // namespace input #endif // ANTKEEPER_INPUT_MOUSE_HPP