summaryrefslogtreecommitdiff
path: root/Libraries/LibWeb/Layout/LayoutNode.h
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-08-21 17:50:41 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-21 17:57:24 +0200
commitd47f77169f8c3bdb6675a67a736b5591a752b52c (patch)
tree4ad2cb19410f7fafd5e17a05548dc18ecd3e6612 /Libraries/LibWeb/Layout/LayoutNode.h
parentcf4870c93e274ad7f0620f86241b85de9a2adc76 (diff)
downloadserenity-d47f77169f8c3bdb6675a67a736b5591a752b52c.zip
LibWeb: Remember the selection state of each LayoutNode
Instead of computing it on the fly while painting each layout node, they now remember their selection state. This avoids a whole bunch of tree traversal while painting with anything selected.
Diffstat (limited to 'Libraries/LibWeb/Layout/LayoutNode.h')
-rw-r--r--Libraries/LibWeb/Layout/LayoutNode.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/Libraries/LibWeb/Layout/LayoutNode.h b/Libraries/LibWeb/Layout/LayoutNode.h
index b441c3afe2..246d40761f 100644
--- a/Libraries/LibWeb/Layout/LayoutNode.h
+++ b/Libraries/LibWeb/Layout/LayoutNode.h
@@ -43,6 +43,14 @@ namespace Web {
struct HitTestResult {
RefPtr<LayoutNode> layout_node;
int index_in_node { 0 };
+
+ enum InternalPosition {
+ None,
+ Before,
+ Inside,
+ After,
+ };
+ InternalPosition internal_position { None };
};
enum class HitTestType {
@@ -142,6 +150,17 @@ public:
float font_size() const;
+ enum class SelectionState {
+ None, // No selection
+ Start, // Selection starts in this LayoutNode
+ End, // Selection ends in this LayoutNode
+ StartAndEnd, // Selection starts and ends in this LayoutNode
+ Full, // Selection starts before and ends after this LayoutNode
+ };
+
+ SelectionState selection_state() const { return m_selection_state; }
+ void set_selection_state(SelectionState state) { m_selection_state = state; }
+
protected:
LayoutNode(DOM::Document&, DOM::Node*);
@@ -155,6 +174,7 @@ private:
bool m_has_style { false };
bool m_visible { true };
bool m_children_are_inline { false };
+ SelectionState m_selection_state { SelectionState::None };
};
class LayoutNodeWithStyle : public LayoutNode {