lumi

Форк
0
/
element.go 
102 строки · 2.1 Кб
1
package lumi
2

3
import (
4
	kelo "gitverse.ru/metalcore/kelo"
5
	"gitverse.ru/metalcore/lumi/attr"
6
	"gitverse.ru/metalcore/lumi/base"
7
	"gitverse.ru/metalcore/lumi/event"
8
)
9

10
type Element struct {
11
	node        kelo.ElementValuer
12
	parent      kelo.NodeValuer
13
	elementType ElementType
14
	definition  string
15
	childes     []any
16

17
	updated chan bool
18
	created bool
19
}
20

21
func NewElement(elementType ElementType, definition string, childes ...any) *Element {
22
	e := &Element{
23
		elementType: elementType,
24
		definition:  definition,
25
		updated:     make(chan bool),
26
		created:     false,
27
		childes:     []any{},
28
	}
29

30
	if definition != "" {
31
		e.node = kelo.GetDocument().CreateElement(e.definition)
32
	}
33

34
	for _, child := range childes {
35
		switch child.(type) {
36
		case attr.Setter:
37
			child.(attr.Setter).SetAttribute(e.node)
38
		case event.Setter:
39
			child.(event.Setter).SetEvent(e.node)
40
		default:
41
			e.childes = append(e.childes, child)
42
		}
43
	}
44

45
	go e.update()
46

47
	return e
48
}
49

50
func (e *Element) Node() kelo.NodeValuer {
51
	return e.node
52
}
53

54
func (e *Element) Render(parent kelo.NodeValuer) kelo.NodeValuer {
55
	e.parent = parent
56
	switch e.elementType {
57
	case ElementTypeText:
58
		return kelo.GetDocument().CreateTextNode(e.definition)
59
	case ElementTypeElement:
60
		//todo: временная очистка потом переделать на обновление данных
61

62
		e.node.SetInnerHTML("")
63
		for _, child := range e.childes {
64
			switch child.(type) {
65
			case base.Renderer:
66
				e.node.AppendChild(child.(base.Renderer).Render(e.node))
67
			case base.RenderFunc:
68
				e.node.AppendChild(child.(base.RenderFunc)(e.node))
69
			case string:
70
				e.node.AppendChild(kelo.GetDocument().CreateTextNode(child.(string)))
71
			case []byte:
72
				e.node.AppendChild(kelo.GetDocument().CreateTextNode(child.(string)))
73
			}
74
		}
75
		if !e.created {
76
			e.created = true
77
		}
78
		return e.node
79
	}
80
	return nil
81
}
82

83
func (e *Element) SetElementType(elementType ElementType) {
84
	e.elementType = elementType
85
}
86

87
func (e *Element) SetDefinition(definition string) {
88
	e.definition = definition
89
}
90

91
func (e *Element) Update() {
92
	e.updated <- true
93
}
94

95
func (e *Element) update() {
96
	for {
97
		<-e.updated
98
		if e.created {
99
			e.Render(e.parent)
100
		}
101
	}
102
}
103

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.