#include "headers/clickable.hpp" namespace asloengine { Clickable::Clickable(sf::Mouse::Button _click_button) : click_button(_click_button) {} Clickable::~Clickable() {} void Clickable::set_clickable(sf::FloatRect rect, sf::RenderWindow *window) { clickable_rect = rect; clickable_window = window; } void Clickable::update_clickable(sf::FloatRect rect) { clickable_rect = rect; } bool Clickable::is_mouse_in() const { sf::Vector2i mouse_position = sf::Mouse::getPosition(*clickable_window); sf::Vector2f mouse_world_position = clickable_window->mapPixelToCoords(mouse_position); return clickable_rect.contains(mouse_world_position.x, mouse_world_position.y); } Clickable::ClickAction Clickable::get_click_action() const { if (pressed) { if (!sf::Mouse::isButtonPressed(click_button)) { pressed = false; return ClickAction::Released; } } else { if (sf::Mouse::isButtonPressed(click_button)) { pressed = true; return ClickAction::Pressed; } } return ClickAction::Nothing; } bool Clickable::clicked_press() const { ClickAction action = get_click_action(); return action == ClickAction::Pressed && is_mouse_in(); } bool Clickable::clicked_release() const { ClickAction action = get_click_action(); return action == ClickAction::Released && is_mouse_in(); } bool Clickable::clicked_press_and_release() const { ClickAction action = get_click_action(); if (clicking) { if (action == ClickAction::Released) { clicking = false; return is_mouse_in(); } } else { if (action == ClickAction::Pressed) { clicking = is_mouse_in(); } } return false; } }