97 lines
2.1 KiB
C++
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);
|
|
}
|
|
} |