forked from NaiJi/project-kyoku
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.4 KiB
C++
165 lines
3.4 KiB
C++
#include "menudrop.h"
|
|
#include "core/corefactory.h"
|
|
|
|
MenuDrop::MenuDrop(const std::shared_ptr<kku::CoreFactory>& factory) :
|
|
_is_locked(false),
|
|
_button_height(27),
|
|
_button_index(0)
|
|
{
|
|
_is_visible = false;
|
|
_content_rect = factory->getRectangle();
|
|
_content_rect->setColor(kku::Color{200, 200, 200, 255});
|
|
}
|
|
|
|
void MenuDrop::input(const kku::SystemEvent& event)
|
|
{
|
|
if (!_is_visible)
|
|
return;
|
|
|
|
Widget::input(event);
|
|
|
|
switch (event.type)
|
|
{
|
|
default:
|
|
break;
|
|
|
|
case kku::SystemEvent::Type::MouseRelease:
|
|
{
|
|
const auto position = std::get<kku::SystemEvent::Mouse>(event.data).position;
|
|
if (isUnderMouse(position))
|
|
{
|
|
setVisibility(false);
|
|
for (auto& submenu : _submenus)
|
|
{
|
|
submenu->unlock();
|
|
submenu->setVisibility(false);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case kku::SystemEvent::Type::MouseMove:
|
|
{
|
|
const auto position = std::get<kku::SystemEvent::Mouse>(event.data).position;
|
|
if (!isUnderMouse(position))
|
|
{
|
|
if (!isLocked() && !hasActiveSubmenus())
|
|
setVisibility(false);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool MenuDrop::hasActiveSubmenus() const
|
|
{
|
|
return std::any_of(_submenus.begin(), _submenus.end(),
|
|
[](const auto& submenu) -> bool
|
|
{
|
|
return submenu->_is_visible;
|
|
});
|
|
}
|
|
|
|
void MenuDrop::update(const kku::microsec& dt)
|
|
{
|
|
Widget::update(dt);
|
|
}
|
|
|
|
void MenuDrop::display() const
|
|
{
|
|
if (_is_visible)
|
|
_content_rect->display();
|
|
|
|
Widget::display();
|
|
}
|
|
|
|
void MenuDrop::setRect(const kku::Area<float>& rect)
|
|
{
|
|
_content_rect->setRect(rect);
|
|
}
|
|
|
|
void MenuDrop::setPosition(const kku::Point& position)
|
|
{
|
|
_content_rect->setPosition(position);
|
|
}
|
|
|
|
void MenuDrop::move(const kku::Vector2<float>& delta)
|
|
{
|
|
_content_rect->move(delta);
|
|
|
|
Widget::move(delta);
|
|
|
|
for (auto& submenu : _submenus)
|
|
submenu->move(delta);
|
|
}
|
|
|
|
bool MenuDrop::isUnderMouse(const kku::Point& position) const
|
|
{
|
|
return _is_visible && _content_rect->contains(position);
|
|
}
|
|
|
|
void MenuDrop::setVisibility(bool is_visible)
|
|
{
|
|
Widget::setVisibility(is_visible);
|
|
|
|
if (!is_visible)
|
|
_is_locked = false;
|
|
}
|
|
|
|
void MenuDrop::addPushButton(const std::shared_ptr<PushButton>& button)
|
|
{
|
|
add(button);
|
|
}
|
|
|
|
void MenuDrop::addCascadeButton(const std::shared_ptr<CascadeMenuButton>& button)
|
|
{
|
|
auto& submenu = button->submenu();
|
|
_submenus.emplace_back(submenu);
|
|
add(button);
|
|
|
|
submenu->setParent(_parent);
|
|
}
|
|
|
|
void MenuDrop::addSeparator(const std::shared_ptr<MenuSeparator>& separator)
|
|
{
|
|
add(separator);
|
|
}
|
|
|
|
void MenuDrop::add(const std::shared_ptr<Widget> &widget)
|
|
{
|
|
const auto& parent_rect = _content_rect->getRect();
|
|
|
|
widget->setRect(kku::Area<float>{parent_rect.left,
|
|
parent_rect.top + (parent_rect.height * _button_index),
|
|
parent_rect.width,
|
|
static_cast<float>(_button_height)});
|
|
|
|
addChild(widget);
|
|
++_button_index;
|
|
}
|
|
|
|
void MenuDrop::lock()
|
|
{
|
|
_is_locked = true;
|
|
}
|
|
|
|
void MenuDrop::unlock()
|
|
{
|
|
_is_locked = false;
|
|
}
|
|
|
|
bool MenuDrop::isLocked() const
|
|
{
|
|
return _is_locked;
|
|
}
|
|
|
|
kku::Area<float> MenuDrop::getRect() const
|
|
{
|
|
return _content_rect->getRect();
|
|
}
|
|
|
|
kku::Point MenuDrop::getPosition() const
|
|
{
|
|
return _content_rect->getPosition();
|
|
}
|