AeonGUI
A portable video game graphic user interface library.
Loading...
Searching...
No Matches
Node.hpp
1/*
2Copyright (C) 2019,2020,2023-2026 Rodrigo Jose Hernandez Cordoba
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16#ifndef AEONGUI_NODE_H
17#define AEONGUI_NODE_H
18#include <cstdint>
19#include <vector>
20#include <memory>
21#include <functional>
22#include <variant>
23#include "aeongui/Platform.hpp"
24#include "aeongui/AttributeMap.hpp"
25#include "aeongui/dom/EventTarget.hpp"
26#include "aeongui/dom/DOMString.hpp"
27
28namespace AeonGUI
29{
30 class Canvas;
31 namespace DOM
32 {
33 class Document;
34 class Element;
41 class Node : public EventTarget
42 {
43 public:
60
63 DLL Node ( Node* aParent = nullptr );
68 DLL Node* AddNode ( std::unique_ptr<Node> aNode );
73 DLL std::unique_ptr<Node> RemoveNode ( const Node* aNode );
77 DLL void TraverseDepthFirstPreOrder ( const std::function<void ( Node& ) >& aAction );
81 DLL void TraverseDepthFirstPreOrder ( const std::function<void ( const Node& ) >& aAction ) const;
85 DLL void TraverseDepthFirstPostOrder ( const std::function<void ( Node& ) >& aAction );
89 DLL void TraverseDepthFirstPostOrder ( const std::function<void ( const Node& ) >& aAction ) const;
94 DLL void TraverseDepthFirstPreOrder ( const std::function<void ( Node& ) >& aPreamble, const std::function<void ( Node& ) >& aPostamble );
99 DLL void TraverseDepthFirstPreOrder ( const std::function<void ( const Node& ) >& aPreamble, const std::function<void ( const Node& ) >& aPostamble ) const;
105 DLL void TraverseDepthFirstPreOrder ( const std::function<void ( Node& ) >& aPreamble, const std::function<void ( Node& ) >& aPostamble, const std::function<bool ( Node& ) >& aUnaryPredicate );
111 DLL void TraverseDepthFirstPreOrder ( const std::function<void ( const Node& ) >& aPreamble, const std::function<void ( const Node& ) >& aPostamble, const std::function<bool ( const Node& ) >& aUnaryPredicate ) const;
112
116 DLL void StackTraverseDepthFirstPreOrder ( const std::function<void ( Node& ) >& aAction );
120 DLL void StackTraverseDepthFirstPreOrder ( const std::function<void ( const Node& ) >& aAction ) const;
124 DLL void StackTraverseDepthFirstPostOrder ( const std::function<void ( Node& ) >& aAction );
128 DLL void StackTraverseDepthFirstPostOrder ( const std::function<void ( const Node& ) >& aAction ) const;
133 DLL void StackTraverseDepthFirstPreOrder ( const std::function<void ( Node& ) >& aPreamble, const std::function<void ( Node& ) >& aPostamble );
138 DLL void StackTraverseDepthFirstPreOrder ( const std::function<void ( const Node& ) >& aPreamble, const std::function<void ( const Node& ) >& aPostamble ) const;
144 DLL void StackTraverseDepthFirstPreOrder ( const std::function<void ( Node& ) >& aPreamble, const std::function<void ( Node& ) >& aPostamble, const std::function<bool ( Node& ) >& aUnaryPredicate );
150 DLL void StackTraverseDepthFirstPreOrder ( const std::function<void ( const Node& ) >& aPreamble, const std::function<void ( const Node& ) >& aPostamble, const std::function<bool ( const Node& ) >& aUnaryPredicate ) const;
151
155 DLL virtual void Update ( double aDocumentTime );
159 DLL virtual void DrawStart ( Canvas& aCanvas ) const;
163 DLL virtual void DrawFinish ( Canvas& aCanvas ) const;
170 DLL virtual void OnLoad ();
177 DLL virtual void OnUnload ();
182 DLL virtual bool IsDrawEnabled() const;
183 DLL virtual ~Node();
188 DLL Node* parentNode() const;
192 DLL Node* parentElement() const;
196 virtual NodeType nodeType() const = 0;
200 const std::vector<std::unique_ptr<Node>>& childNodes() const;
207 DLL Document* ownerDocument() const;
213 DLL Element* querySelector ( const DOMString& aSelector ) const;
219 DLL std::vector<Element*> querySelectorAll ( const DOMString& aSelector ) const;
221 private:
222 DLL virtual void OnAncestorChanged();
223 Node* mParent{};
224 std::vector<std::unique_ptr<Node>> mChildren{};
225 mutable std::vector<std::unique_ptr<Node>>::size_type mIterator{ 0 };
226 };
227 }
228}
229#endif
Platform-specific DLL import/export macros and compiler helpers.
Abstract 2D rendering surface.
Definition Canvas.hpp:40
Represents a DOM Document.
Definition Document.hpp:40
Base class for DOM elements.
Definition Element.hpp:46
Base class for objects that can receive DOM events.
Definition EventTarget.hpp:58
Base class for all nodes in the DOM tree.
Definition Node.hpp:42
void TraverseDepthFirstPreOrder(const std::function< void(const Node &) > &aPreamble, const std::function< void(const Node &) > &aPostamble) const
Traverse pre-order with pre/post callbacks (const).
void TraverseDepthFirstPostOrder(const std::function< void(Node &) > &aAction)
Traverse the tree depth-first in post-order.
virtual void DrawStart(Canvas &aCanvas) const
Begin drawing this node on the canvas.
Definition Node.cpp:101
void StackTraverseDepthFirstPreOrder(const std::function< void(const Node &) > &aPreamble, const std::function< void(const Node &) > &aPostamble) const
Stack-based pre-order with pre/post callbacks (const, reentrant-safe).
virtual void Update(double aDocumentTime)
Update animation state for this node.
Definition Node.cpp:96
Node * AddNode(std::unique_ptr< Node > aNode)
Add a child node.
Definition Node.cpp:382
void StackTraverseDepthFirstPreOrder(const std::function< void(const Node &) > &aPreamble, const std::function< void(const Node &) > &aPostamble, const std::function< bool(const Node &) > &aUnaryPredicate) const
Stack-based pre-order with pre/post/predicate (const, reentrant-safe).
void TraverseDepthFirstPreOrder(const std::function< void(Node &) > &aPreamble, const std::function< void(Node &) > &aPostamble, const std::function< bool(Node &) > &aUnaryPredicate)
Traverse pre-order with pre/post callbacks and a predicate filter.
Document * ownerDocument() const
Get the owning Document for this node.
Definition Node.cpp:37
std::vector< Element * > querySelectorAll(const DOMString &aSelector) const
Find all descendant elements matching a CSS selector.
Definition Node.cpp:71
void StackTraverseDepthFirstPreOrder(const std::function< void(Node &) > &aPreamble, const std::function< void(Node &) > &aPostamble, const std::function< bool(Node &) > &aUnaryPredicate)
Stack-based pre-order with pre/post callbacks and predicate (reentrant-safe).
void StackTraverseDepthFirstPostOrder(const std::function< void(const Node &) > &aAction) const
Stack-based depth-first post-order traversal (const, reentrant-safe).
virtual void DrawFinish(Canvas &aCanvas) const
Finish drawing this node on the canvas.
Definition Node.cpp:107
std::unique_ptr< Node > RemoveNode(const Node *aNode)
Remove a child node.
Definition Node.cpp:394
void StackTraverseDepthFirstPreOrder(const std::function< void(const Node &) > &aAction) const
Stack-based depth-first pre-order traversal (const, reentrant-safe).
virtual void OnLoad()
Definition Node.cpp:113
void TraverseDepthFirstPreOrder(const std::function< void(const Node &) > &aAction) const
Traverse the tree depth-first in pre-order (const).
virtual NodeType nodeType() const =0
Get the node type.
virtual void OnUnload()
Definition Node.cpp:118
NodeType
DOM node type constants.
Definition Node.hpp:46
@ ENTITY_NODE
An Entity node (legacy).
Definition Node.hpp:52
@ ATTRIBUTE_NODE
An Attribute node (legacy).
Definition Node.hpp:48
@ CDATA_SECTION_NODE
A CDATASection node.
Definition Node.hpp:50
@ TEXT_NODE
A Text node.
Definition Node.hpp:49
@ COMMENT_NODE
A Comment node.
Definition Node.hpp:54
@ DOCUMENT_TYPE_NODE
A DocumentType node.
Definition Node.hpp:56
@ ENTITY_REFERENCE_NODE
An EntityReference node (legacy).
Definition Node.hpp:51
@ NOTATION_NODE
A Notation node (legacy).
Definition Node.hpp:58
@ PROCESSING_INSTRUCTION_NODE
A ProcessingInstruction node.
Definition Node.hpp:53
@ DOCUMENT_FRAGMENT_NODE
A DocumentFragment node.
Definition Node.hpp:57
@ DOCUMENT_NODE
A Document node.
Definition Node.hpp:55
@ ELEMENT_NODE
An Element node.
Definition Node.hpp:47
virtual bool IsDrawEnabled() const
Definition Node.cpp:91
Element * querySelector(const DOMString &aSelector) const
Find the first descendant element matching a CSS selector.
Definition Node.cpp:51
const std::vector< std::unique_ptr< Node > > & childNodes() const
Get the list of child nodes.
Definition Node.cpp:32
Node * parentElement() const
Get the parent element (same as parentNode for elements).
Definition Node.cpp:127
void StackTraverseDepthFirstPreOrder(const std::function< void(Node &) > &aPreamble, const std::function< void(Node &) > &aPostamble)
Stack-based pre-order with pre/post callbacks (reentrant-safe).
Node * parentNode() const
Get the parent node.
Definition Node.cpp:123
void TraverseDepthFirstPostOrder(const std::function< void(const Node &) > &aAction) const
Traverse the tree depth-first in post-order (const).
void TraverseDepthFirstPreOrder(const std::function< void(Node &) > &aAction)
Traverse the tree depth-first in pre-order.
void TraverseDepthFirstPreOrder(const std::function< void(Node &) > &aPreamble, const std::function< void(Node &) > &aPostamble)
Traverse pre-order with separate pre and post callbacks.
void StackTraverseDepthFirstPostOrder(const std::function< void(Node &) > &aAction)
Stack-based depth-first post-order traversal (reentrant-safe).
Node(Node *aParent=nullptr)
Construct a node with an optional parent.
Definition Node.cpp:29
void StackTraverseDepthFirstPreOrder(const std::function< void(Node &) > &aAction)
Stack-based depth-first pre-order traversal (reentrant-safe).
void TraverseDepthFirstPreOrder(const std::function< void(const Node &) > &aPreamble, const std::function< void(const Node &) > &aPostamble, const std::function< bool(const Node &) > &aUnaryPredicate) const
Traverse pre-order with pre/post callbacks and predicate (const).