Added Properties iterator to DataObject

This commit is contained in:
Alexei Anoshenko 2025-07-03 12:49:41 +03:00
parent 90b1d44597
commit 86f3f4c731
12 changed files with 145 additions and 154 deletions

View File

@ -245,8 +245,7 @@ func parseAnimation(obj DataObject) AnimationProperty {
animation := new(animationData)
animation.init()
for i := range obj.PropertyCount() {
if node := obj.Property(i); node != nil {
for node := range obj.Properties() {
tag := PropertyName(node.Tag())
if node.Type() == TextNode {
animation.Set(tag, node.Text())
@ -254,7 +253,6 @@ func parseAnimation(obj DataObject) AnimationProperty {
animation.Set(tag, node)
}
}
}
return animation
}
@ -493,8 +491,8 @@ func animationSet(properties Properties, tag PropertyName, value any) []Property
case DataNode:
parseObject := func(obj DataObject) (AnimatedProperty, bool) {
result := AnimatedProperty{}
for i := range obj.PropertyCount() {
if node := obj.Property(i); node.Type() == TextNode {
for node := range obj.Properties() {
if node.Type() == TextNode {
propTag := strings.ToLower(node.Tag())
switch propTag {
case "from", "0", "0%":

View File

@ -66,9 +66,8 @@ func createBackground(obj DataObject) BackgroundElement {
return nil
}
count := obj.PropertyCount()
for i := range count {
if node := obj.Property(i); node.Type() == TextNode {
for node := range obj.Properties() {
if node.Type() == TextNode {
if value := node.Text(); value != "" {
result.Set(PropertyName(node.Tag()), value)
}

View File

@ -436,8 +436,7 @@ func (border *borderProperty) String() string {
func (border *borderProperty) setBorderObject(obj DataObject) bool {
result := true
for i := range obj.PropertyCount() {
if node := obj.Property(i); node != nil {
for node := range obj.Properties() {
tag := PropertyName(node.Tag())
switch node.Type() {
case TextNode:
@ -453,9 +452,6 @@ func (border *borderProperty) setBorderObject(obj DataObject) bool {
default:
result = false
}
} else {
result = false
}
}
return result
}

18
data.go
View File

@ -3,6 +3,7 @@ package rui
import (
"errors"
"fmt"
"iter"
"slices"
"strings"
"unicode"
@ -27,6 +28,9 @@ type DataObject interface {
// Tag returns data object tag
Tag() string
// Properties() returns an iterator to access the properties
Properties() iter.Seq[DataNode]
// PropertyCount returns properties count
PropertyCount() int
@ -142,6 +146,16 @@ func (object *dataObject) Tag() string {
return object.tag
}
func (object *dataObject) Properties() iter.Seq[DataNode] {
return func(yield func(DataNode) bool) {
for _, node := range object.property {
if !yield(node) {
return
}
}
}
}
func (object *dataObject) PropertyCount() int {
if object.property != nil {
return len(object.property)
@ -231,10 +245,14 @@ func (object *dataObject) SetPropertyValue(tag, value string) {
// SetPropertyObject - set a property with tag by object
func (object *dataObject) SetPropertyObject(tag string, obj DataObject) {
if obj != nil {
node := new(dataNode)
node.tag = tag
node.value = obj
object.setNode(node)
} else {
object.RemovePropertyByTag(tag)
}
}
func (object *dataObject) ToParams() Params {

View File

@ -159,8 +159,7 @@ func NewFilterProperty(params Params) FilterProperty {
func newFilterProperty(obj DataObject) FilterProperty {
filter := new(filterData)
filter.init()
for i := range obj.PropertyCount() {
if node := obj.Property(i); node != nil {
for node := range obj.Properties() {
tag := node.Tag()
switch node.Type() {
case TextNode:
@ -177,7 +176,6 @@ func newFilterProperty(obj DataObject) FilterProperty {
ErrorLog(`Invalid value of "` + tag + `"`)
}
}
}
if len(filter.properties) > 0 {
return filter

View File

@ -118,9 +118,7 @@ func (properties *propertyList) writeToBuffer(buffer *strings.Builder,
}
func parseProperties(properties Properties, object DataObject) {
count := object.PropertyCount()
for i := range count {
if node := object.Property(i); node != nil {
for node := range object.Properties() {
switch node.Type() {
case TextNode:
properties.Set(PropertyName(node.Tag()), node.Text())
@ -132,7 +130,6 @@ func parseProperties(properties Properties, object DataObject) {
properties.Set(PropertyName(node.Tag()), node.ArrayElements())
}
}
}
}
func propertiesGet(properties Properties, tag PropertyName) any {

View File

@ -735,8 +735,8 @@ func (session *sessionData) handleSessionInfo(params DataObject) {
if node := params.PropertyByTag("storage"); node != nil && node.Type() == ObjectNode {
if obj := node.Object(); obj != nil {
for i := range obj.PropertyCount() {
if element := obj.Property(i); element.Type() == TextNode {
for element := range obj.Properties() {
if element.Type() == TextNode {
session.clientStorage[element.Tag()] = element.Text()
}
}

View File

@ -62,8 +62,8 @@ func loadStringResources(text string) {
table = map[string]string{}
}
for i := range obj.PropertyCount() {
if prop := obj.Property(i); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
table[prop.Tag()] = prop.Text()
}
}
@ -73,8 +73,8 @@ func loadStringResources(text string) {
tag := data.Tag()
if tag == "strings" {
for i := range data.PropertyCount() {
if prop := data.Property(i); prop != nil && prop.Type() == ObjectNode {
for prop := range data.Properties() {
if prop.Type() == ObjectNode {
parseStrings(prop.Object(), prop.Tag())
}
}

View File

@ -731,8 +731,8 @@ func (table *tableViewData) setFunc(tag PropertyName, value any) []PropertyName
case DataObject:
params := Params{}
for k := range value.PropertyCount() {
if prop := value.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range value.Properties() {
if prop.Type() == TextNode {
params[PropertyName(prop.Tag())] = prop.Text()
}
}

View File

@ -694,12 +694,9 @@ func (theme *theme) addText(themeText string) bool {
return false
}
count := data.PropertyCount()
objToStyle := func(obj DataObject) ViewStyle {
params := Params{}
for i := range obj.PropertyCount() {
if node := obj.Property(i); node != nil {
for node := range obj.Properties() {
switch node.Type() {
case ArrayNode:
params[PropertyName(node.Tag())] = node.ArrayElements()
@ -711,19 +708,16 @@ func (theme *theme) addText(themeText string) bool {
params[PropertyName(node.Tag())] = node.Text()
}
}
}
return NewViewStyle(params)
}
for i := range count {
if d := data.Property(i); d != nil {
for d := range data.Properties() {
switch tag := d.Tag(); tag {
case "constants":
if d.Type() == ObjectNode {
if obj := d.Object(); obj != nil {
objCount := obj.PropertyCount()
for k := range objCount {
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
theme.constants[prop.Tag()] = prop.Text()
}
}
@ -733,9 +727,8 @@ func (theme *theme) addText(themeText string) bool {
case "constants:touch":
if d.Type() == ObjectNode {
if obj := d.Object(); obj != nil {
objCount := obj.PropertyCount()
for k := range objCount {
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
theme.touchConstants[prop.Tag()] = prop.Text()
}
}
@ -745,9 +738,8 @@ func (theme *theme) addText(themeText string) bool {
case "colors":
if d.Type() == ObjectNode {
if obj := d.Object(); obj != nil {
objCount := obj.PropertyCount()
for k := range objCount {
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
theme.colors[prop.Tag()] = prop.Text()
}
}
@ -757,9 +749,8 @@ func (theme *theme) addText(themeText string) bool {
case "colors:dark":
if d.Type() == ObjectNode {
if obj := d.Object(); obj != nil {
objCount := obj.PropertyCount()
for k := range objCount {
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
theme.darkColors[prop.Tag()] = prop.Text()
}
}
@ -769,9 +760,8 @@ func (theme *theme) addText(themeText string) bool {
case "images":
if d.Type() == ObjectNode {
if obj := d.Object(); obj != nil {
objCount := obj.PropertyCount()
for k := range objCount {
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
theme.images[prop.Tag()] = prop.Text()
}
}
@ -781,9 +771,8 @@ func (theme *theme) addText(themeText string) bool {
case "images:dark":
if d.Type() == ObjectNode {
if obj := d.Object(); obj != nil {
objCount := obj.PropertyCount()
for k := range objCount {
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
theme.darkImages[prop.Tag()] = prop.Text()
}
}
@ -818,7 +807,6 @@ func (theme *theme) addText(themeText string) bool {
}
}
}
}
theme.sortMediaStyles()
return true

View File

@ -352,8 +352,8 @@ func valueToTransformProperty(value any) TransformProperty {
parseObject := func(obj DataObject) TransformProperty {
transform := NewTransformProperty(nil)
ok := true
for i := range obj.PropertyCount() {
if prop := obj.Property(i); prop.Type() == TextNode {
for prop := range obj.Properties() {
if prop.Type() == TextNode {
if !transform.Set(PropertyName(prop.Tag()), prop.Text()) {
ok = false
}

View File

@ -371,8 +371,7 @@ func (view *viewData) setFunc(tag PropertyName, value any) []PropertyName {
case changeListeners:
switch value := value.(type) {
case DataObject:
for i := range value.PropertyCount() {
node := value.Property(i)
for node := range value.Properties() {
if node.Type() == TextNode {
if text := node.Text(); text != "" {
view.changeListener[PropertyName(node.Tag())] = newOneArgListenerBinding[View, PropertyName](text)
@ -496,9 +495,7 @@ func (view *viewData) setFunc(tag PropertyName, value any) []PropertyName {
case DataObject:
data := map[string]string{}
count := value.PropertyCount()
for i := range count {
node := value.Property(i)
for node := range value.Properties() {
if node.Type() == TextNode {
data[node.Tag()] = node.Text()
} else {