100 lines
No EOL
2.1 KiB
C++
Executable file
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;
|
|
|
|
}
|
|
|
|
} |