97 lines
2.1 KiB
C++

#include "./widget.hpp"
#include <mijin/debug/assert.hpp>
namespace sdl_gpu_test
{
void Widget::enterTree(WidgetTree* tree, ParentWidget* parent)
{
MIJIN_ASSERT(mTree == nullptr && mParent == nullptr, "Widget is already in a tree.");
MIJIN_ASSERT_FATAL(tree != nullptr, "Missing argument: tree");
mTree = tree;
mParent = parent;
handleEnteredTree();
}
void Widget::invalidate()
{
if (mTree != nullptr)
{
mTree->invalidateWidget(this);
}
}
void ParentWidget::handleEnteredTree()
{
for (widget_ptr_t& child : mChildren)
{
child->enterTree(mTree, this);
}
}
void ParentWidget::handleMouseMotion(const sdlpp::MouseMotionEvent& event)
{
for (widget_ptr_t& child : mChildren)
{
child->handleMouseMotion(event);
}
}
EventResponse ParentWidget::handleMouseButton(const sdlpp::MouseButtonEvent& event)
{
for (widget_ptr_t& child : mChildren)
{
if (const EventResponse response = child->handleMouseButton(event); response == EventResponse::HANDLED)
{
return EventResponse::HANDLED;
}
}
return EventResponse::UNHANDLED;
}
Widget* ParentWidget::addChild(widget_ptr_t&& child)
{
mChildren.push_back(std::move(child));
if (mTree != nullptr)
{
mChildren.back()->enterTree(mTree, this);
}
return mChildren.back().get();
}
void WidgetTree::init(const WidgetTreeInitArgs& args)
{
MIJIN_ASSERT_FATAL(args.renderer != nullptr, "Missing argument: renderer.");
mRenderer = args.renderer;
mRootWidget.enterTree(this, nullptr);
}
void WidgetTree::revalidateWidgets()
{
for (Widget* widget : mInvalidWidgets)
{
widget->revalidate();
}
mInvalidWidgets.clear();
}
void WidgetTree::notifyMouseMoved(const sdlpp::MouseMotionEvent& event)
{
mRootWidget.handleMouseMotion(event);
}
EventResponse WidgetTree::notifyMouseButton(const sdlpp::MouseButtonEvent& event)
{
return mRootWidget.handleMouseButton(event);
}
void WidgetTree::invalidateWidget(Widget* widget) noexcept
{
mInvalidWidgets.insert(widget);
}
}