Added "item-separators" property to DropDownList and GetDropDownItemSeparators function

This commit is contained in:
Alexei Anoshenko 2024-09-03 19:55:14 +03:00
parent 10cf3a69fc
commit 5707ca3088
5 changed files with 109 additions and 46 deletions

View File

@ -5,6 +5,7 @@
* Added "transform" property and Transform interface * Added "transform" property and Transform interface
* Added OpenRawResource, GetCheckboxChangedListeners functions * Added OpenRawResource, GetCheckboxChangedListeners functions
* Added RemoveClientItem method to Session interface * Added RemoveClientItem method to Session interface
* Added "item-separators" property to DropDownList and GetDropDownItemSeparators function
* Added NewPath and NewPathFromSvg methods to Canvas interface * Added NewPath and NewPathFromSvg methods to Canvas interface
* Removed NewPath function * Removed NewPath function
* Removed Reset methods from Path interface * Removed Reset methods from Path interface

View File

@ -3643,6 +3643,13 @@ float32, float64, int, int8…int64, uint, uint8…uint64.
func GetDropDownDisabledItems(view View, subviewID ...string) []int func GetDropDownDisabledItems(view View, subviewID ...string) []int
Между пунктами списка можно добавлять разделителями. Для этого используется свойство "item-separators" (константа ItemSeparators).
Данному свойству присваивается массив индексов пунктов после которых необходимо добавить разделители.
Свойству "item-separators" могут присваиваться теже типы данных что и свойству "disabled-items".
Прочитать значение свойства "item-separators" можно с помощью функции
func GetDropDownItemSeparators(view View, subviewID ...string) []int
Выбранное значение определяется int свойством "current" (константа Current). Значение по умолчанию 0. Выбранное значение определяется int свойством "current" (константа Current). Значение по умолчанию 0.
Прочитать значение данного свойства можно с помощью функции Прочитать значение данного свойства можно с помощью функции

View File

@ -3620,6 +3620,13 @@ You can read the value of the "disabled-items" property using the function
func GetDropDownDisabledItems(view View, subviewID ...string) []int func GetDropDownDisabledItems(view View, subviewID ...string) []int
You can add separators between list items. To do this, use the "item-separators" property (the ItemSeparators constant).
This property is assigned an array of item indices after which separators must be added.
The "item-separators" property can be assigned the same data types as the "disabled-items" property.
You can read the value of the "item-separators" property using the function
func GetDropDownItemSeparators(view View, subviewID ...string) []int
The selected value is determined by the int property "current" (Current constant). The default is 0. The selected value is determined by the int property "current" (Current constant). The default is 0.
You can read the value of this property using the function You can read the value of this property using the function

View File

@ -21,6 +21,7 @@ type dropDownListData struct {
viewData viewData
items []string items []string
disabledItems []any disabledItems []any
itemSeparators []any
dropDownListener []func(DropDownList, int, int) dropDownListener []func(DropDownList, int, int)
} }
@ -42,6 +43,7 @@ func (list *dropDownListData) init(session Session) {
list.hasHtmlDisabled = true list.hasHtmlDisabled = true
list.items = []string{} list.items = []string{}
list.disabledItems = []any{} list.disabledItems = []any{}
list.itemSeparators = []any{}
list.dropDownListener = []func(DropDownList, int, int){} list.dropDownListener = []func(DropDownList, int, int){}
} }
@ -77,6 +79,15 @@ func (list *dropDownListData) remove(tag string) {
list.propertyChangedEvent(tag) list.propertyChangedEvent(tag)
} }
case ItemSeparators, "separators":
if len(list.itemSeparators) > 0 {
list.itemSeparators = []any{}
if list.created {
updateInnerHTML(list.htmlID(), list.session)
}
list.propertyChangedEvent(ItemSeparators)
}
case DropDownEvent: case DropDownEvent:
if len(list.dropDownListener) > 0 { if len(list.dropDownListener) > 0 {
list.dropDownListener = []func(DropDownList, int, int){} list.dropDownListener = []func(DropDownList, int, int){}
@ -95,7 +106,6 @@ func (list *dropDownListData) remove(tag string) {
default: default:
list.viewData.remove(tag) list.viewData.remove(tag)
return
} }
} }
@ -114,7 +124,30 @@ func (list *dropDownListData) set(tag string, value any) bool {
return list.setItems(value) return list.setItems(value)
case DisabledItems: case DisabledItems:
return list.setDisabledItems(value) items, ok := list.parseIndicesArray(value)
if !ok {
notCompatibleType(tag, value)
return false
}
list.disabledItems = items
if list.created {
updateInnerHTML(list.htmlID(), list.session)
}
list.propertyChangedEvent(tag)
return true
case ItemSeparators, "separators":
items, ok := list.parseIndicesArray(value)
if !ok {
notCompatibleType(ItemSeparators, value)
return false
}
list.itemSeparators = items
if list.created {
updateInnerHTML(list.htmlID(), list.session)
}
list.propertyChangedEvent(ItemSeparators)
return true
case DropDownEvent: case DropDownEvent:
listeners, ok := valueToEventWithOldListeners[DropDownList, int](value) listeners, ok := valueToEventWithOldListeners[DropDownList, int](value)
@ -312,89 +345,75 @@ func anyToStringArray(value any) ([]string, bool) {
return []string{}, false return []string{}, false
} }
func (list *dropDownListData) setDisabledItems(value any) bool { func (list *dropDownListData) parseIndicesArray(value any) ([]any, bool) {
switch value := value.(type) { switch value := value.(type) {
case []int: case []int:
list.disabledItems = make([]any, len(value)) items := make([]any, len(value))
for i, n := range value { for i, n := range value {
list.disabledItems[i] = n items[i] = n
} }
return items, true
case []any: case []any:
disabledItems := make([]any, len(value)) items := make([]any, len(value))
for i, val := range value { for i, val := range value {
if val == nil { if val == nil {
notCompatibleType(DisabledItems, value) return nil, false
return false
} }
switch val := val.(type) { switch val := val.(type) {
case string: case string:
if isConstantName(val) { if isConstantName(val) {
disabledItems[i] = val items[i] = val
} else { } else {
n, err := strconv.Atoi(val) n, err := strconv.Atoi(val)
if err != nil { if err != nil {
notCompatibleType(DisabledItems, value) return nil, false
return false
} }
disabledItems[i] = n items[i] = n
} }
default: default:
if n, ok := isInt(val); ok { if n, ok := isInt(val); ok {
disabledItems[i] = n items[i] = n
} else { } else {
notCompatibleType(DisabledItems, value) return nil, false
return false
} }
} }
} }
list.disabledItems = disabledItems return items, true
case string: case string:
values := strings.Split(value, ",") values := strings.Split(value, ",")
disabledItems := make([]any, len(values)) items := make([]any, len(values))
for i, str := range values { for i, str := range values {
str = strings.Trim(str, " ") str = strings.Trim(str, " ")
if str == "" { if str == "" {
notCompatibleType(DisabledItems, value) return nil, false
return false
} }
if isConstantName(str) { if isConstantName(str) {
disabledItems[i] = str items[i] = str
} else { } else {
n, err := strconv.Atoi(str) n, err := strconv.Atoi(str)
if err != nil { if err != nil {
notCompatibleType(DisabledItems, value) return nil, false
return false
} }
disabledItems[i] = n items[i] = n
} }
} }
list.disabledItems = disabledItems return items, true
case []DataValue: case []DataValue:
disabledItems := make([]any, 0, len(value)) items := make([]any, 0, len(value))
for _, val := range value { for _, val := range value {
if !val.IsObject() { if !val.IsObject() {
disabledItems = append(disabledItems, val.Value()) items = append(items, val.Value())
} }
} }
return list.setDisabledItems(disabledItems) return list.parseIndicesArray(items)
default:
notCompatibleType(DisabledItems, value)
return false
} }
if list.created { return nil, false
updateInnerHTML(list.htmlID(), list.session)
}
list.propertyChangedEvent(Items)
return true
} }
func (list *dropDownListData) Get(tag string) any { func (list *dropDownListData) Get(tag string) any {
@ -409,6 +428,9 @@ func (list *dropDownListData) get(tag string) any {
case DisabledItems: case DisabledItems:
return list.disabledItems return list.disabledItems
case ItemSeparators:
return list.itemSeparators
case Current: case Current:
result, _ := intProperty(list, Current, list.session, 0) result, _ := intProperty(list, Current, list.session, 0)
return result return result
@ -433,6 +455,7 @@ func (list *dropDownListData) htmlSubviews(self View, buffer *strings.Builder) {
current := GetCurrent(list) current := GetCurrent(list)
notTranslate := GetNotTranslate(list) notTranslate := GetNotTranslate(list)
disabledItems := GetDropDownDisabledItems(list) disabledItems := GetDropDownDisabledItems(list)
separators := GetDropDownItemSeparators(list)
for i, item := range list.items { for i, item := range list.items {
disabled := false disabled := false
for _, index := range disabledItems { for _, index := range disabledItems {
@ -455,6 +478,12 @@ func (list *dropDownListData) htmlSubviews(self View, buffer *strings.Builder) {
buffer.WriteString(item) buffer.WriteString(item)
buffer.WriteString("</option>") buffer.WriteString("</option>")
for _, index := range separators {
if i == index {
buffer.WriteString("<hr>")
break
}
}
} }
} }
} }
@ -512,15 +541,9 @@ func GetDropDownItems(view View, subviewID ...string) []string {
return []string{} return []string{}
} }
// GetDropDownDisabledItems return the list of DropDownList disabled item indexes. func getIndicesArray(view View, tag string) []int {
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
func GetDropDownDisabledItems(view View, subviewID ...string) []int {
if len(subviewID) > 0 && subviewID[0] != "" {
view = ViewByID(view, subviewID[0])
}
if view != nil { if view != nil {
if value := view.Get(DisabledItems); value != nil { if value := view.Get(tag); value != nil {
if values, ok := value.([]any); ok { if values, ok := value.([]any); ok {
count := len(values) count := len(values)
if count > 0 { if count > 0 {
@ -547,3 +570,23 @@ func GetDropDownDisabledItems(view View, subviewID ...string) []int {
} }
return []int{} return []int{}
} }
// GetDropDownDisabledItems return an array of disabled(non selectable) items indices of DropDownList.
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
func GetDropDownDisabledItems(view View, subviewID ...string) []int {
if len(subviewID) > 0 && subviewID[0] != "" {
view = ViewByID(view, subviewID[0])
}
return getIndicesArray(view, DisabledItems)
}
// GetDropDownItemSeparators return an array of indices of DropDownList items after which a separator should be added.
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
func GetDropDownItemSeparators(view View, subviewID ...string) []int {
if len(subviewID) > 0 && subviewID[0] != "" {
view = ViewByID(view, subviewID[0])
}
return getIndicesArray(view, ItemSeparators)
}

View File

@ -457,8 +457,13 @@ const (
Items = "items" Items = "items"
// DisabledItems is the constant for the "disabled-items" property tag. // DisabledItems is the constant for the "disabled-items" property tag.
// The "disabled-items" []int property specifies an array of disabled(non selectable) items indices of DropDownList.
DisabledItems = "disabled-items" DisabledItems = "disabled-items"
// ItemSeparators is the constant for the "item-separators" property tag.
// The "item-separators" []int property specifies an array of indices of DropDownList items after which a separator should be added.
ItemSeparators = "item-separators"
// Current is the constant for the "current" property tag. // Current is the constant for the "current" property tag.
Current = "current" Current = "current"