mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-30 11:37:16 +02:00
Instead of TextPaintable fragments being an offset+length view into the layout node, they are now a view into the paintable instead. This removes an awkward time window where we'd have bogus state in text fragments after layout invalidation but before relayout. It also makes the code slightly nicer in general, since there's less mixing of layout and painting concepts.
71 lines
2.6 KiB
C++
71 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWeb/HTML/BrowsingContext.h>
|
|
#include <LibWeb/Layout/Label.h>
|
|
#include <LibWeb/Layout/LabelableNode.h>
|
|
#include <LibWeb/Page/EventHandler.h>
|
|
#include <LibWeb/Painting/TextPaintable.h>
|
|
|
|
namespace Web::Painting {
|
|
|
|
JS::NonnullGCPtr<TextPaintable> TextPaintable::create(Layout::TextNode const& layout_node, String const& text_for_rendering)
|
|
{
|
|
return layout_node.heap().allocate_without_realm<TextPaintable>(layout_node, text_for_rendering);
|
|
}
|
|
|
|
TextPaintable::TextPaintable(Layout::TextNode const& layout_node, String const& text_for_rendering)
|
|
: Paintable(layout_node)
|
|
, m_text_for_rendering(text_for_rendering)
|
|
{
|
|
}
|
|
|
|
bool TextPaintable::wants_mouse_events() const
|
|
{
|
|
return layout_node().first_ancestor_of_type<Layout::Label>();
|
|
}
|
|
|
|
DOM::Node* TextPaintable::mouse_event_target() const
|
|
{
|
|
if (auto* label = layout_node().first_ancestor_of_type<Layout::Label>()) {
|
|
if (auto* control = const_cast<Layout::Label*>(label)->labeled_control())
|
|
return &control->dom_node();
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
TextPaintable::DispatchEventOfSameName TextPaintable::handle_mousedown(Badge<EventHandler>, CSSPixelPoint position, unsigned button, unsigned)
|
|
{
|
|
auto* label = layout_node().first_ancestor_of_type<Layout::Label>();
|
|
if (!label)
|
|
return DispatchEventOfSameName::No;
|
|
const_cast<Layout::Label*>(label)->handle_mousedown_on_label({}, position, button);
|
|
const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_paintable(this);
|
|
return DispatchEventOfSameName::Yes;
|
|
}
|
|
|
|
TextPaintable::DispatchEventOfSameName TextPaintable::handle_mouseup(Badge<EventHandler>, CSSPixelPoint position, unsigned button, unsigned)
|
|
{
|
|
auto* label = layout_node().first_ancestor_of_type<Layout::Label>();
|
|
if (!label)
|
|
return DispatchEventOfSameName::No;
|
|
|
|
const_cast<Layout::Label*>(label)->handle_mouseup_on_label({}, position, button);
|
|
const_cast<HTML::BrowsingContext&>(browsing_context()).event_handler().set_mouse_event_tracking_paintable(nullptr);
|
|
return DispatchEventOfSameName::Yes;
|
|
}
|
|
|
|
TextPaintable::DispatchEventOfSameName TextPaintable::handle_mousemove(Badge<EventHandler>, CSSPixelPoint position, unsigned button, unsigned)
|
|
{
|
|
auto* label = layout_node().first_ancestor_of_type<Layout::Label>();
|
|
if (!label)
|
|
return DispatchEventOfSameName::No;
|
|
const_cast<Layout::Label*>(label)->handle_mousemove_on_label({}, position, button);
|
|
return DispatchEventOfSameName::Yes;
|
|
}
|
|
|
|
}
|