#include "menubar.h" #include "iostream" MenuBar::MenuBar(const std::shared_ptr& font) : _font(font), _amount_buttons(0), _button_width(170) { _bar_rect.setFillColor(sf::Color(88, 57, 107)); } void MenuBar::input(const sf::Event &event) { switch (event.type) { default: break; case sf::Event::MouseButtonReleased: if (!isUnderMouse(event.mouseButton.x, event.mouseButton.y)) { for (auto& submenu : _submenus) submenu->unlock(); } break; } Widget::input(event); } void MenuBar::update(const sf::Time& dt) { Widget::update(dt); } void MenuBar::draw(sf::RenderTarget& target, sf::RenderStates states) const { if (_is_visible) target.draw(_bar_rect, states); Widget::draw(target, states); } void MenuBar::setRect(const sf::FloatRect& rect) { _bar_rect.setPosition(rect.left, rect.top); _bar_rect.setSize({rect.width, rect.height}); // Buttons will not resize } void MenuBar::setPosition(const sf::Vector2f& position) { _bar_rect.setPosition(position); } void MenuBar::move(const sf::Vector2f &delta) { _bar_rect.move(delta); Widget::move(delta); for (auto& menu : _submenus) menu->move(delta); } bool MenuBar::isUnderMouse(int mouse_x, int mouse_y) const { bool bar_under_mouse = _bar_rect.getGlobalBounds().contains(mouse_x, mouse_y); bool submenus_under_mouse = std::any_of(_children.begin(), _children.end(), [x=mouse_x, y=mouse_y](const auto& child) { return child->isUnderMouse(x, y); }); return bar_under_mouse || submenus_under_mouse; } void MenuBar::addRootSubMenu(std::string name, const std::shared_ptr& submenu) { const auto new_button = std::make_shared(name, _font); std::size_t current_index = _amount_buttons; new_button->setRect(sf::FloatRect(current_index * _button_width, 0, _button_width, _bar_rect.getSize().y)); new_button->setCallback([submenu=submenu]() { submenu->setVisibility(true); submenu->lock(); }); submenu->setPosition({static_cast(current_index * _button_width), _bar_rect.getSize().y}); new_button->setFillColors(sf::Color(171, 141, 189), sf::Color(48, 27, 57)); addChild(new_button); addChild(submenu); _submenus.emplace_back(submenu); ++_amount_buttons; } void MenuBar::addDependentSubmenu(const std::shared_ptr &submenu) { _submenus.emplace_back(submenu);; } void MenuBar::setVisibility(bool is_visible) { Widget::setVisibility(is_visible); for (auto& submenu : _submenus) submenu->setVisibility(false); } sf::FloatRect MenuBar::rect() const { return _bar_rect.getGlobalBounds(); } sf::Vector2f MenuBar::position() const { return _bar_rect.getPosition(); }