Implement button classification

selection
NaiJi ✨ 3 years ago
parent 5540361f94
commit be0367bba0

@ -1,42 +1,12 @@
#include "button.h"
Button::Button(const std::string &text) :
_pressed(false)
Button::Button(const std::string &text)
{
setText(text);
_button_text.setFillColor(sf::Color::Black);
_button_content.setFillColor(sf::Color::White);
}
void Button::input(const sf::Event& event)
{
switch (event.type)
{
default:
break;
case sf::Event::MouseButtonPressed:
if (isUnderMouse(event.mouseButton.x, event.mouseButton.y))
{
_pressed = true;
_button_content.setFillColor(sf::Color(155, 155, 155));
}
break;
case sf::Event::MouseButtonReleased:
if (_pressed)
{
_button_content.setFillColor(sf::Color::White);
_pressed = false;
if (isUnderMouse(event.mouseButton.x, event.mouseButton.y))
_on_click_callback();
}
break;
}
Widget::input(event);
}
void Button::update()
{
Widget::update();
@ -63,7 +33,7 @@ void Button::setPosition(const sf::Vector2f &position)
bool Button::isUnderMouse(int mouse_x, int mouse_y) const
{
return _button_content.getGlobalBounds().contains(mouse_x, mouse_y);
return _is_visible && _button_content.getGlobalBounds().contains(mouse_x, mouse_y);
}
void Button::setFillColor(sf::Color&& color)
@ -75,9 +45,3 @@ void Button::setText(const std::string& text)
{
_button_text.setString(text);
}
void Button::setCallback(std::function<void(void)> callback)
{
_on_click_callback = callback;
}

@ -8,24 +8,20 @@
class Button : public Widget
{
public:
Button(const std::string& text);
explicit Button(const std::string& text);
virtual void input(const sf::Event& event) override;
virtual void update() override;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
virtual void setRect(const sf::FloatRect& rect) override;
virtual void setPosition(const sf::Vector2f& position) override;
virtual bool isUnderMouse(int mouse_x, int mouse_y) const override;
virtual void input(const sf::Event& event) override = 0;
virtual void update() override final;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override final;
virtual void setRect(const sf::FloatRect& rect) override final;
virtual void setPosition(const sf::Vector2f& position) override final;
virtual bool isUnderMouse(int mouse_x, int mouse_y) const override final;
void setFillColor(sf::Color&& color);
void setText(const std::string& text);
void setCallback(std::function<void(void)> callback);
virtual void setFillColor(sf::Color&& color);
virtual void setText(const std::string& text);
private:
protected:
sf::RectangleShape _button_content;
sf::Text _button_text;
bool _pressed;
std::function<void(void)> _on_click_callback;
};

@ -0,0 +1,35 @@
#include "cascademenubutton.h"
#include "menudrop.h"
CascadeMenuButton::CascadeMenuButton(const std::string& text) :
Button(text)
{}
void CascadeMenuButton::input(const sf::Event& event)
{
Button::input(event);
switch (event.type)
{
default:
break;
case sf::Event::MouseMoved:
if (isUnderMouse(event.mouseButton.x, event.mouseButton.y))
{
_button_content.setFillColor(sf::Color(84, 158, 253));
_submenu->lock();
}
else
{
_button_content.setFillColor(sf::Color::White);
_submenu->unlock();
}
break;
}
}
void CascadeMenuButton::setSubmenu(const std::shared_ptr<MenuDrop>& submenu)
{
_submenu = submenu;
}

@ -0,0 +1,18 @@
#pragma once
#include "button.h"
class MenuDrop;
class CascadeMenuButton : public Button
{
public:
explicit CascadeMenuButton(const std::string& text);
virtual void input(const sf::Event& event) override final;
void setSubmenu(const std::shared_ptr<MenuDrop>& submenu);
private:
std::shared_ptr<MenuDrop> _submenu;
};

@ -1,22 +0,0 @@
#pragma once
#include "widget.h"
#include <SFML/Graphics/RectangleShape.hpp>
class MenuButton : public Widget
{
public:
explicit MenuButton(std::string&& text);
virtual void input(const sf::Event& event) = 0;
virtual void update() = 0;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const = 0;
virtual void setRect(const sf::FloatRect& rect) = 0;
virtual void setPosition(const sf::Vector2f& position) = 0;
virtual bool isUnderMouse(int mouse_x, int mouse_y) const = 0;
virtual bool isActive() const = 0;
virtual void setActive(bool is_active) = 0;
virtual void setHovered(bool is_hovered) = 0;
};

@ -1,53 +1,98 @@
#include "menudrop.h"
#include "menuseparator.h"
void MenuDrop::input(const sf::Event &event)
MenuDrop::MenuDrop() :
_is_locked(false),
_button_height(27),
_button_index(0)
{}
void MenuDrop::input(const sf::Event& event)
{
for (auto& child : _children)
child->input(event);
if (!_is_visible)
return;
switch (event.type)
{
default:
break;
case sf::Event::MouseMoved:
if (isUnderMouse(event.mouseButton.x, event.mouseButton.y))
{
Widget::input(event);
}
else
{
if (!isLocked())
setVisibility(false);
}
break;
}
}
void MenuDrop::update()
{
for (auto& child : _children)
child->update();
Widget::update();
}
void MenuDrop::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
if (!_is_visible)
return;
for (auto& child : _children)
child->draw(target, states);
target.draw(_content_rect);
Widget::draw(target, states);
}
void MenuDrop::setRect(const sf::FloatRect& rect)
{
(void)rect;
/*_bar_rect.setPosition(rect.left, rect.top);
_bar_rect.setSize({rect.width, rect.height});
_bar_button_rect.setSize(sf::Vector2f(100, _bar_rect.getSize().y));*/
_content_rect.setPosition(rect.left, rect.top);
_content_rect.setSize({rect.width, rect.height});
}
void MenuDrop::setPosition(const sf::Vector2f& position)
{
(void)position;
//_bar_rect.setPosition(position);
_content_rect.setPosition(position);
}
bool MenuDrop::isUnderMouse(int mouse_x, int mouse_y) const
{
(void)mouse_x;
(void)mouse_y;
return false;//_bar_rect.getGlobalBounds().contains(mouse_x, mouse_y);
return _is_visible && _content_rect.getGlobalBounds().contains(mouse_x, mouse_y);
}
void MenuDrop::addButton(const std::shared_ptr<Button>& button)
{
add(button);
}
void MenuDrop::addSeparator()
{
add(std::make_shared<MenuSeparator>());
}
void MenuDrop::trigger()
void MenuDrop::add(const std::shared_ptr<Widget> &widget)
{
bool new_visibility = !_is_visible;
const auto& parent_size = _content_rect.getSize();
const auto& parent_position = _content_rect.getPosition();
setVisibility(new_visibility);
for (const auto& child : _children)
child->setVisibility(new_visibility);
widget->setRect(sf::FloatRect(parent_position.x,
parent_position.y + (_button_height * _button_index),
parent_size.x,
_button_height));
addChild(widget);
}
void MenuDrop::lock()
{
_is_locked = true;
}
void MenuDrop::unlock()
{
_is_locked = false;
}
bool MenuDrop::isLocked() const
{
return _is_locked;
}

@ -1,13 +1,14 @@
#pragma once
#include "widget.h"
#include "menubutton.h"
#include "button.h"
#include <SFML/Graphics/RectangleShape.hpp>
class MenuDrop : public Widget
{
public:
explicit MenuDrop();
virtual void input(const sf::Event& event) override;
virtual void update() override;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
@ -15,12 +16,19 @@ public:
virtual void setPosition(const sf::Vector2f& position) override;
virtual bool isUnderMouse(int mouse_x, int mouse_y) const override;
void trigger();
void addButton(const std::shared_ptr<Button>& button);
void addSeparator();
void lock();
void unlock();
bool isLocked() const;
private:
sf::RectangleShape _content_rect;
sf::RectangleShape _bar_button_rect;
bool _is_locked;
std::size_t _button_height;
std::size_t _button_index;
sf::RectangleShape _drop_rect;
sf::RectangleShape _drop_button_rect;
void add(const std::shared_ptr<Widget>& widget);
};

@ -0,0 +1,34 @@
#include "menuseparator.h"
void MenuSeparator::input(const sf::Event& event)
{
Widget::input(event);
}
void MenuSeparator::update()
{
Widget::update();
}
void MenuSeparator::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
target.draw(_line, states);
}
void MenuSeparator::setRect(const sf::FloatRect& rect)
{
_rect = rect;
//_line
}
void MenuSeparator::setPosition(const sf::Vector2f& position)
{
(void)position;
}
bool MenuSeparator::isUnderMouse(int mouse_x, int mouse_y) const
{
return _is_visible && _rect.contains(mouse_x, mouse_y);
}

@ -0,0 +1,21 @@
#pragma once
#include "widget.h"
#include <SFML/Graphics/VertexArray.hpp>
class MenuSeparator : public Widget
{
public:
virtual void input(const sf::Event& event) override;
virtual void update() override;
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
virtual void setRect(const sf::FloatRect& rect) override;
virtual void setPosition(const sf::Vector2f& position) override;
virtual bool isUnderMouse(int mouse_x, int mouse_y) const override;
private:
sf::VertexArray _line;
sf::FloatRect _rect;
};

@ -0,0 +1,40 @@
#include "pushbutton.h"
PushButton::PushButton(const std::string& text) :
Button(text),
_pressed(false)
{}
void PushButton::input(const sf::Event& event)
{
Button::input(event);
switch (event.type)
{
default:
break;
case sf::Event::MouseButtonPressed:
if (isUnderMouse(event.mouseButton.x, event.mouseButton.y))
{
_pressed = true;
_button_content.setFillColor(sf::Color(155, 155, 155));
}
break;
case sf::Event::MouseButtonReleased:
if (_pressed)
{
_button_content.setFillColor(sf::Color::White);
_pressed = false;
if (isUnderMouse(event.mouseButton.x, event.mouseButton.y))
_on_click_callback();
}
break;
}
}
void PushButton::setCallback(std::function<void(void)> callback)
{
_on_click_callback = callback;
}

@ -0,0 +1,17 @@
#pragma once
#include "button.h"
class PushButton : public Button
{
public:
explicit PushButton(const std::string& text);
virtual void input(const sf::Event& event) override final;
void setCallback(std::function<void(void)> callback);
private:
bool _pressed;
std::function<void(void)> _on_click_callback;
};

@ -24,6 +24,8 @@ void Widget::draw(sf::RenderTarget& target, sf::RenderStates states) const
void Widget::setVisibility(bool is_visible)
{
_is_visible = is_visible;
for (auto& child : _children)
child->setVisibility(false);
}
void Widget::addChild(const std::shared_ptr<Widget> &child)

Loading…
Cancel
Save