lumi
/
element.go
102 строки · 2.1 Кб
1package lumi
2
3import (
4kelo "gitverse.ru/metalcore/kelo"
5"gitverse.ru/metalcore/lumi/attr"
6"gitverse.ru/metalcore/lumi/base"
7"gitverse.ru/metalcore/lumi/event"
8)
9
10type Element struct {
11node kelo.ElementValuer
12parent kelo.NodeValuer
13elementType ElementType
14definition string
15childes []any
16
17updated chan bool
18created bool
19}
20
21func NewElement(elementType ElementType, definition string, childes ...any) *Element {
22e := &Element{
23elementType: elementType,
24definition: definition,
25updated: make(chan bool),
26created: false,
27childes: []any{},
28}
29
30if definition != "" {
31e.node = kelo.GetDocument().CreateElement(e.definition)
32}
33
34for _, child := range childes {
35switch child.(type) {
36case attr.Setter:
37child.(attr.Setter).SetAttribute(e.node)
38case event.Setter:
39child.(event.Setter).SetEvent(e.node)
40default:
41e.childes = append(e.childes, child)
42}
43}
44
45go e.update()
46
47return e
48}
49
50func (e *Element) Node() kelo.NodeValuer {
51return e.node
52}
53
54func (e *Element) Render(parent kelo.NodeValuer) kelo.NodeValuer {
55e.parent = parent
56switch e.elementType {
57case ElementTypeText:
58return kelo.GetDocument().CreateTextNode(e.definition)
59case ElementTypeElement:
60//todo: временная очистка потом переделать на обновление данных
61
62e.node.SetInnerHTML("")
63for _, child := range e.childes {
64switch child.(type) {
65case base.Renderer:
66e.node.AppendChild(child.(base.Renderer).Render(e.node))
67case base.RenderFunc:
68e.node.AppendChild(child.(base.RenderFunc)(e.node))
69case string:
70e.node.AppendChild(kelo.GetDocument().CreateTextNode(child.(string)))
71case []byte:
72e.node.AppendChild(kelo.GetDocument().CreateTextNode(child.(string)))
73}
74}
75if !e.created {
76e.created = true
77}
78return e.node
79}
80return nil
81}
82
83func (e *Element) SetElementType(elementType ElementType) {
84e.elementType = elementType
85}
86
87func (e *Element) SetDefinition(definition string) {
88e.definition = definition
89}
90
91func (e *Element) Update() {
92e.updated <- true
93}
94
95func (e *Element) update() {
96for {
97<-e.updated
98if e.created {
99e.Render(e.parent)
100}
101}
102}
103