1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import EventEmitter from 'node:events'
- import exception from 'tui-lib/util/exception'
- export default class Element extends EventEmitter {
- // The basic class containing methods for working with an element hierarchy.
- // Generally speaking, you usually want to extend DisplayElement instead of
- // this class.
- constructor() {
- super()
- this.children = []
- this.parent = null
- }
- eachDescendant(fn) {
- // Run a function on this element, all of its children, all of their
- // children, etc.
- fn(this)
- for (const child of this.children) {
- child.eachDescendant(fn)
- }
- }
- addChild(child, afterIndex = this.children.length, {fixLayout = true} = {}) {
- // TODO Don't let a direct ancestor of this be added as a child. Don't
- // let itself be one of its childs either!
- if (child === this) {
- throw exception(
- 'EINVALIDHIERARCHY', 'An element cannot be a child of itself')
- }
- child.parent = this
- if (afterIndex === this.children.length) {
- this.children.push(child)
- } else {
- this.children.splice(afterIndex, 0, child)
- }
- if (fixLayout) {
- child.fixLayout()
- }
- }
- removeChild(child, {fixLayout = true} = {}) {
- // Removes the given child element from the children list of this
- // element. It won't be rendered in the future. If the given element
- // isn't a direct child of this element, nothing will happen.
- if (child.parent !== this) {
- return
- }
- child.parent = null
- this.children.splice(this.children.indexOf(child), 1)
- if (fixLayout) {
- this.fixLayout()
- }
- }
- get root() {
- let el = this
- while (el.parent) {
- el = el.parent
- }
- return el
- }
- get directAncestors() {
- const ancestors = []
- let el = this
- while (el.parent) {
- el = el.parent
- ancestors.push(el)
- }
- return ancestors
- }
- }
|