rui_orig/colorPicker.go

253 lines
6.7 KiB
Go
Raw Normal View History

2021-09-07 17:36:50 +03:00
package rui
import (
"strings"
)
// Constants for [ColorPicker] specific properties and events.
2021-09-07 17:36:50 +03:00
const (
// ColorChangedEvent is the constant for "color-changed" property tag.
//
// Used by `ColorPicker`.
// Event generated when color picker value has been changed.
//
// General listener format:
// `func(picker rui.ColorPicker, newColor, oldColor rui.Color)`.
//
// where:
// picker - Interface of a color picker which generated this event,
// newColor - New color value,
// oldColor - Old color value.
//
// Allowed listener formats:
// `func(picker rui.ColorPicker, newColor rui.Color)`,
// `func(newColor, oldColor rui.Color)`,
// `func(newColor rui.Color)`,
// `func(picker rui.ColorPicker)`,
// `func()`.
2021-09-07 17:36:50 +03:00
ColorChangedEvent = "color-changed"
// ColorPickerValue is the constant for "color-picker-value" property tag.
//
// Used by `ColorPicker`.
// Define current color picker value.
//
// Supported types: `Color`, `string`.
//
// Internal type is `Color`, other types converted to it during assignment.
// See `Color` description for more details.
ColorPickerValue = "color-picker-value"
2021-09-07 17:36:50 +03:00
)
// ColorPicker represent a ColorPicker view
2021-09-07 17:36:50 +03:00
type ColorPicker interface {
View
}
type colorPickerData struct {
viewData
2024-05-18 18:57:41 +03:00
dataList
2023-04-23 18:27:04 +03:00
colorChangedListeners []func(ColorPicker, Color, Color)
2021-09-07 17:36:50 +03:00
}
// NewColorPicker create new ColorPicker object and return it
func NewColorPicker(session Session, params Params) ColorPicker {
view := new(colorPickerData)
view.init(session)
2021-09-07 17:36:50 +03:00
setInitParams(view, params)
return view
}
func newColorPicker(session Session) View {
return NewColorPicker(session, nil)
}
func (picker *colorPickerData) init(session Session) {
picker.viewData.init(session)
2021-09-07 17:36:50 +03:00
picker.tag = "ColorPicker"
2024-04-23 18:24:51 +03:00
picker.hasHtmlDisabled = true
2023-04-23 18:27:04 +03:00
picker.colorChangedListeners = []func(ColorPicker, Color, Color){}
2021-09-07 17:36:50 +03:00
picker.properties[Padding] = Px(0)
2024-05-18 18:57:41 +03:00
picker.dataListInit()
2021-09-07 17:36:50 +03:00
}
2022-05-22 12:54:02 +03:00
func (picker *colorPickerData) String() string {
return getViewString(picker, nil)
2022-05-22 12:54:02 +03:00
}
2021-09-07 17:36:50 +03:00
func (picker *colorPickerData) normalizeTag(tag string) string {
tag = strings.ToLower(tag)
switch tag {
case Value, ColorTag:
2021-09-07 17:36:50 +03:00
return ColorPickerValue
}
2024-05-18 18:57:41 +03:00
return picker.normalizeDataListTag(tag)
2021-09-07 17:36:50 +03:00
}
func (picker *colorPickerData) Remove(tag string) {
picker.remove(picker.normalizeTag(tag))
}
func (picker *colorPickerData) remove(tag string) {
switch tag {
case ColorChangedEvent:
if len(picker.colorChangedListeners) > 0 {
2023-04-23 18:27:04 +03:00
picker.colorChangedListeners = []func(ColorPicker, Color, Color){}
picker.propertyChangedEvent(tag)
}
2021-09-07 17:36:50 +03:00
case ColorPickerValue:
oldColor := GetColorPickerValue(picker)
2021-09-07 17:36:50 +03:00
delete(picker.properties, ColorPickerValue)
picker.colorChanged(oldColor)
2024-05-18 18:57:41 +03:00
case DataList:
if len(picker.dataList.dataList) > 0 {
picker.setDataList(picker, []string{}, true)
}
2021-09-07 17:36:50 +03:00
default:
picker.viewData.remove(tag)
}
}
2022-07-26 18:36:00 +03:00
func (picker *colorPickerData) Set(tag string, value any) bool {
2021-09-07 17:36:50 +03:00
return picker.set(picker.normalizeTag(tag), value)
}
2022-07-26 18:36:00 +03:00
func (picker *colorPickerData) set(tag string, value any) bool {
2021-09-07 17:36:50 +03:00
if value == nil {
picker.remove(tag)
return true
}
switch tag {
case ColorChangedEvent:
2023-04-23 18:27:04 +03:00
listeners, ok := valueToEventWithOldListeners[ColorPicker, Color](value)
2022-07-27 20:31:57 +03:00
if !ok {
notCompatibleType(tag, value)
return false
} else if listeners == nil {
2023-04-23 18:27:04 +03:00
listeners = []func(ColorPicker, Color, Color){}
2021-09-07 17:36:50 +03:00
}
2022-07-27 20:31:57 +03:00
picker.colorChangedListeners = listeners
picker.propertyChangedEvent(tag)
2021-09-07 17:36:50 +03:00
return true
case ColorPickerValue:
oldColor := GetColorPickerValue(picker)
2021-09-07 17:36:50 +03:00
if picker.setColorProperty(ColorPickerValue, value) {
picker.colorChanged(oldColor)
2021-09-07 17:36:50 +03:00
return true
}
2024-05-18 18:57:41 +03:00
case DataList:
return picker.setDataList(picker, value, picker.created)
2021-09-07 17:36:50 +03:00
default:
return picker.viewData.set(tag, value)
}
return false
}
func (picker *colorPickerData) colorChanged(oldColor Color) {
if newColor := GetColorPickerValue(picker); oldColor != newColor {
if picker.created {
2022-11-02 20:10:19 +03:00
picker.session.callFunc("setInputValue", picker.htmlID(), newColor.rgbString())
}
2021-09-07 17:36:50 +03:00
for _, listener := range picker.colorChangedListeners {
2023-04-23 18:27:04 +03:00
listener(picker, newColor, oldColor)
2021-09-07 17:36:50 +03:00
}
picker.propertyChangedEvent(ColorTag)
2021-09-07 17:36:50 +03:00
}
}
2022-07-26 18:36:00 +03:00
func (picker *colorPickerData) Get(tag string) any {
2021-09-07 17:36:50 +03:00
return picker.get(picker.normalizeTag(tag))
}
2022-07-26 18:36:00 +03:00
func (picker *colorPickerData) get(tag string) any {
2021-09-07 17:36:50 +03:00
switch tag {
case ColorChangedEvent:
return picker.colorChangedListeners
2024-05-18 18:57:41 +03:00
case DataList:
return picker.dataList.dataList
2021-09-07 17:36:50 +03:00
default:
return picker.viewData.get(tag)
}
}
func (picker *colorPickerData) htmlTag() string {
return "input"
}
2024-05-18 18:57:41 +03:00
func (picker *colorPickerData) htmlSubviews(self View, buffer *strings.Builder) {
picker.dataListHtmlSubviews(self, buffer)
}
2021-09-07 17:36:50 +03:00
func (picker *colorPickerData) htmlProperties(self View, buffer *strings.Builder) {
picker.viewData.htmlProperties(self, buffer)
buffer.WriteString(` type="color" value="`)
buffer.WriteString(GetColorPickerValue(picker).rgbString())
2021-09-07 17:36:50 +03:00
buffer.WriteByte('"')
buffer.WriteString(` oninput="editViewInputEvent(this)"`)
2022-04-15 15:41:44 +03:00
if picker.getRaw(ClickEvent) == nil {
buffer.WriteString(` onclick="stopEventPropagation(this, event)"`)
}
2024-05-18 18:57:41 +03:00
2024-05-29 15:31:58 +03:00
picker.dataListHtmlProperties(picker, buffer)
2021-09-07 17:36:50 +03:00
}
func (picker *colorPickerData) handleCommand(self View, command string, data DataObject) bool {
switch command {
case "textChanged":
if text, ok := data.PropertyValue("text"); ok {
oldColor := GetColorPickerValue(picker)
2021-09-07 17:36:50 +03:00
if color, ok := StringToColor(text); ok {
picker.properties[ColorPickerValue] = color
if color != oldColor {
for _, listener := range picker.colorChangedListeners {
2023-04-23 18:27:04 +03:00
listener(picker, color, oldColor)
2021-09-07 17:36:50 +03:00
}
}
}
}
return true
}
return picker.viewData.handleCommand(self, command, data)
}
// GetColorPickerValue returns the value of ColorPicker subview.
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
func GetColorPickerValue(view View, subviewID ...string) Color {
if len(subviewID) > 0 && subviewID[0] != "" {
view = ViewByID(view, subviewID[0])
2021-09-07 17:36:50 +03:00
}
if view != nil {
2022-07-28 12:11:27 +03:00
if value, ok := colorProperty(view, ColorPickerValue, view.Session()); ok {
return value
2021-09-07 17:36:50 +03:00
}
2022-07-28 12:11:27 +03:00
for _, tag := range []string{ColorPickerValue, Value, ColorTag} {
2022-05-23 15:22:14 +03:00
if value := valueFromStyle(view, tag); value != nil {
2021-09-07 17:36:50 +03:00
if result, ok := valueToColor(value, view.Session()); ok {
return result
}
}
}
}
return 0
}
// GetColorChangedListeners returns the ColorChangedListener list of an ColorPicker subview.
// If there are no listeners then the empty list is returned
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
2023-04-23 18:27:04 +03:00
func GetColorChangedListeners(view View, subviewID ...string) []func(ColorPicker, Color, Color) {
return getEventWithOldListeners[ColorPicker, Color](view, subviewID, ColorChangedEvent)
2021-09-07 17:36:50 +03:00
}