AsloEngine/asloengine/clickable.cpp
2019-08-29 18:42:28 +02:00

100 lines
No EOL
2.1 KiB
C++
Executable file

#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;
}
}