diff --git a/checkbox.go b/checkbox.go index 2909158..ac5ad7d 100644 --- a/checkbox.go +++ b/checkbox.go @@ -49,6 +49,7 @@ func (button *checkboxData) init(session Session) { button.viewsContainerData.init(session) button.tag = "Checkbox" button.systemClass = "ruiGridLayout ruiCheckbox" + button.get = button.getFunc button.set = button.setFunc button.remove = button.removeFunc button.changed = button.propertyChanged @@ -99,6 +100,17 @@ func (button *checkboxData) propertyChanged(tag PropertyName) { } } +func (button *checkboxData) getFunc(tag PropertyName) any { + switch tag { + case CheckboxChangedEvent: + if listeners := getOneArgEventRawListeners[Checkbox, bool](button, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return button.viewData.getFunc(tag) +} + func (button *checkboxData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { case ClickEvent: diff --git a/colorPicker.go b/colorPicker.go index 38335d2..4cd9885 100644 --- a/colorPicker.go +++ b/colorPicker.go @@ -66,6 +66,7 @@ func (picker *colorPickerData) init(session Session) { picker.hasHtmlDisabled = true picker.properties[Padding] = Px(0) picker.normalize = normalizeColorPickerTag + picker.get = picker.getFunc picker.set = picker.setFunc picker.changed = picker.propertyChanged } @@ -80,6 +81,17 @@ func normalizeColorPickerTag(tag PropertyName) PropertyName { return normalizeDataListTag(tag) } +func (picker *colorPickerData) getFunc(tag PropertyName) any { + switch tag { + case ColorChangedEvent: + if listeners := getTwoArgEventRawListeners[ColorPicker, Color](picker, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return picker.viewData.getFunc(tag) +} + func (picker *colorPickerData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { case ColorChangedEvent: diff --git a/datePicker.go b/datePicker.go index 212beba..6fc4cbc 100644 --- a/datePicker.go +++ b/datePicker.go @@ -139,6 +139,7 @@ func (picker *datePickerData) init(session Session) { picker.hasHtmlDisabled = true picker.normalize = normalizeDatePickerTag picker.set = picker.setFunc + picker.get = picker.getFunc picker.changed = picker.propertyChanged } @@ -198,6 +199,17 @@ func stringToDate(value string) (time.Time, bool) { return time.Now(), false } +func (picker *datePickerData) getFunc(tag PropertyName) any { + switch tag { + case DateChangedEvent: + if listeners := getTwoArgEventRawListeners[DatePicker, time.Time](picker, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return picker.viewData.getFunc(tag) +} + func (picker *datePickerData) setFunc(tag PropertyName, value any) []PropertyName { setDateValue := func(tag PropertyName) []PropertyName { diff --git a/dropDownList.go b/dropDownList.go index cc4474c..0dde4da 100644 --- a/dropDownList.go +++ b/dropDownList.go @@ -51,6 +51,7 @@ func (list *dropDownListData) init(session Session) { list.tag = "DropDownList" list.hasHtmlDisabled = true list.normalize = normalizeDropDownListTag + list.get = list.getFunc list.set = list.setFunc list.changed = list.propertyChanged } @@ -67,6 +68,17 @@ func normalizeDropDownListTag(tag PropertyName) PropertyName { return tag } +func (list *dropDownListData) getFunc(tag PropertyName) any { + switch tag { + case DropDownEvent: + if listeners := getTwoArgEventRawListeners[DropDownList, int](list, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return list.viewData.getFunc(tag) +} + func (list *dropDownListData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { case Items: diff --git a/editView.go b/editView.go index 0fa171a..98c32ad 100644 --- a/editView.go +++ b/editView.go @@ -121,6 +121,7 @@ func (edit *editViewData) init(session Session) { edit.hasHtmlDisabled = true edit.tag = "EditView" edit.normalize = normalizeEditViewTag + edit.get = edit.getFunc edit.set = edit.setFunc edit.changed = edit.propertyChanged } @@ -148,6 +149,17 @@ func normalizeEditViewTag(tag PropertyName) PropertyName { return normalizeDataListTag(tag) } +func (edit *editViewData) getFunc(tag PropertyName) any { + switch tag { + case EditTextChangedEvent: + if listeners := getTwoArgEventRawListeners[EditView, string](edit, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return edit.viewData.getFunc(tag) +} + func (edit *editViewData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { case Text: diff --git a/events.go b/events.go index 05484f4..891fb48 100644 --- a/events.go +++ b/events.go @@ -233,7 +233,7 @@ func setNoArgEventListener[V View](view View, tag PropertyName, value any) []Pro func getNoArgEventListeners[V View](view View, subviewID []string, tag PropertyName) []noArgListener[V] { if view = getSubview(view, subviewID); view != nil { - if value := view.Get(tag); value != nil { + if value := view.getRaw(tag); value != nil { if result, ok := value.([]noArgListener[V]); ok { return result } diff --git a/events1arg.go b/events1arg.go index 8a5217c..de645b1 100644 --- a/events1arg.go +++ b/events1arg.go @@ -242,7 +242,7 @@ func setOneArgEventListener[V View, T any](view View, tag PropertyName, value an func getOneArgEventListeners[V View, E any](view View, subviewID []string, tag PropertyName) []oneArgListener[V, E] { if view = getSubview(view, subviewID); view != nil { - if value := view.Get(tag); value != nil { + if value := view.getRaw(tag); value != nil { if result, ok := value.([]oneArgListener[V, E]); ok { return result } diff --git a/events2arg.go b/events2arg.go index 475e03c..6ddf18a 100644 --- a/events2arg.go +++ b/events2arg.go @@ -316,7 +316,7 @@ func setTwoArgEventListener[V View, T any](view View, tag PropertyName, value an func getTwoArgEventListeners[V View, E any](view View, subviewID []string, tag PropertyName) []twoArgListener[V, E] { if view = getSubview(view, subviewID); view != nil { - if value := view.Get(tag); value != nil { + if value := view.getRaw(tag); value != nil { if result, ok := value.([]twoArgListener[V, E]); ok { return result } diff --git a/filePicker.go b/filePicker.go index 2853a06..e418002 100644 --- a/filePicker.go +++ b/filePicker.go @@ -131,6 +131,7 @@ func (picker *filePickerData) init(session Session) { picker.hasHtmlDisabled = true picker.files = []FileInfo{} //picker.loader = map[int]func(FileInfo, []byte){} + picker.get = picker.getFunc picker.set = picker.setFunc picker.changed = picker.propertyChanged @@ -165,6 +166,17 @@ func (picker *filePickerData) LoadFile(file FileInfo, result func(FileInfo, []by } } +func (picker *filePickerData) getFunc(tag PropertyName) any { + switch tag { + case FileSelectedEvent: + if listeners := getOneArgEventRawListeners[FilePicker, []FileInfo](picker, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return picker.viewData.getFunc(tag) +} + func (picker *filePickerData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { diff --git a/imageView.go b/imageView.go index fb5df6d..eda75a0 100644 --- a/imageView.go +++ b/imageView.go @@ -97,6 +97,7 @@ func (imageView *imageViewData) init(session Session) { imageView.tag = "ImageView" imageView.systemClass = "ruiImageView" imageView.normalize = normalizeImageViewTag + imageView.get = imageView.getFunc imageView.set = imageView.setFunc imageView.changed = imageView.propertyChanged } @@ -122,6 +123,17 @@ func normalizeImageViewTag(tag PropertyName) PropertyName { return tag } +func (imageView *imageViewData) getFunc(tag PropertyName) any { + switch tag { + case LoadedEvent, ErrorEvent: + if listeners := getNoArgEventRawListeners[ImageView](imageView, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return imageView.viewData.getFunc(tag) +} + func (imageView *imageViewData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { diff --git a/listView.go b/listView.go index 46ab44e..9f82aee 100644 --- a/listView.go +++ b/listView.go @@ -310,6 +310,18 @@ func (listView *listViewData) getFunc(tag PropertyName) any { return rowGap } return AutoSize() + + case ListItemClickedEvent, ListItemSelectedEvent: + if listeners := getOneArgEventRawListeners[ListView, int](listView, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + + case ListItemCheckedEvent: + if listeners := getOneArgEventRawListeners[ListView, []int](listView, nil, tag); len(listeners) > 0 { + return listeners + } + return nil } return listView.viewData.getFunc(tag) } diff --git a/mediaPlayer.go b/mediaPlayer.go index b0271db..8b1e683 100644 --- a/mediaPlayer.go +++ b/mediaPlayer.go @@ -589,6 +589,7 @@ type MediaSource struct { func (player *mediaPlayerData) init(session Session) { player.viewData.init(session) player.tag = "MediaPlayer" + player.get = player.getFunc player.set = player.setFunc player.changed = player.propertyChanged } @@ -597,6 +598,39 @@ func (player *mediaPlayerData) Focusable() bool { return true } +func (player *mediaPlayerData) getFunc(tag PropertyName) any { + switch tag { + case AbortEvent, CanPlayEvent, CanPlayThroughEvent, CompleteEvent, EmptiedEvent, LoadStartEvent, + EndedEvent, LoadedDataEvent, LoadedMetadataEvent, PauseEvent, PlayEvent, PlayingEvent, + ProgressEvent, SeekedEvent, SeekingEvent, StalledEvent, SuspendEvent, WaitingEvent: + + if listeners := getNoArgEventRawListeners[MediaPlayer](player, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + + case DurationChangedEvent, RateChangedEvent, TimeUpdateEvent, VolumeChangedEvent: + if listeners := getOneArgEventRawListeners[MediaPlayer, float64](player, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + + case PlayerErrorEvent: + if value := player.getRaw(tag); value != nil { + if listeners, ok := value.([]mediaPlayerErrorListener); ok && len(listeners) > 0 { + result := make([]any, 0, len(listeners)) + for _, listener := range listeners { + result = append(result, listener.rawListener()) + } + return result + } + } + return nil + } + + return player.viewData.getFunc(tag) +} + func (player *mediaPlayerData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { diff --git a/numberPicker.go b/numberPicker.go index 33f6705..47e9440 100644 --- a/numberPicker.go +++ b/numberPicker.go @@ -129,6 +129,7 @@ func (picker *numberPickerData) init(session Session) { picker.tag = "NumberPicker" picker.hasHtmlDisabled = true picker.normalize = normalizeNumberPickerTag + picker.get = picker.getFunc picker.set = picker.setFunc picker.changed = picker.propertyChanged } @@ -147,6 +148,17 @@ func normalizeNumberPickerTag(tag PropertyName) PropertyName { return normalizeDataListTag(tag) } +func (picker *numberPickerData) getFunc(tag PropertyName) any { + switch tag { + case NumberChangedEvent: + if listeners := getTwoArgEventRawListeners[NumberPicker, float64](picker, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return picker.viewData.getFunc(tag) +} + func (picker *numberPickerData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { case NumberChangedEvent: diff --git a/tableView.go b/tableView.go index a88955d..2bbac70 100644 --- a/tableView.go +++ b/tableView.go @@ -593,6 +593,7 @@ func (table *tableViewData) init(session Session) { table.cellViews = []View{} table.cellFrame = []Frame{} table.normalize = normalizeTableViewTag + table.get = table.getFunc table.set = table.setFunc table.changed = table.propertyChanged } @@ -618,6 +619,23 @@ func (table *tableViewData) Focusable() bool { return GetTableSelectionMode(table) != NoneSelection } +func (table *tableViewData) getFunc(tag PropertyName) any { + switch tag { + case TableCellClickedEvent, TableCellSelectedEvent: + if listeners := getTwoArgEventRawListeners[TableView, int](table, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + + case TableRowClickedEvent, TableRowSelectedEvent: + if listeners := getOneArgEventRawListeners[TableView, int](table, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return table.viewData.getFunc(tag) +} + func (table *tableViewData) setFunc(tag PropertyName, value any) []PropertyName { setLineStyle := func() []PropertyName { diff --git a/tabsLayout.go b/tabsLayout.go index b14efb8..20c7a36 100644 --- a/tabsLayout.go +++ b/tabsLayout.go @@ -163,6 +163,7 @@ func (tabsLayout *tabsLayoutData) init(session Session) { tabsLayout.viewsContainerData.init(session) tabsLayout.tag = "TabsLayout" tabsLayout.systemClass = "ruiTabsLayout" + tabsLayout.get = tabsLayout.getFunc tabsLayout.set = tabsLayout.setFunc tabsLayout.changed = tabsLayout.propertyChanged } @@ -172,6 +173,23 @@ func tabsLayoutCurrent(view View, defaultValue int) int { return result } +func (tabsLayout *tabsLayoutData) getFunc(tag PropertyName) any { + switch tag { + case CurrentTabChangedEvent: + if listeners := getTwoArgEventRawListeners[TabsLayout, int](tabsLayout, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + + case TabCloseEvent: + if listeners := getOneArgEventRawListeners[TabsLayout, int](tabsLayout, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return tabsLayout.viewsContainerData.getFunc(tag) +} + func (tabsLayout *tabsLayoutData) setFunc(tag PropertyName, value any) []PropertyName { switch tag { case CurrentTabChangedEvent: diff --git a/timePicker.go b/timePicker.go index 0579e5a..907d004 100644 --- a/timePicker.go +++ b/timePicker.go @@ -120,6 +120,7 @@ func (picker *timePickerData) init(session Session) { picker.tag = "TimePicker" picker.hasHtmlDisabled = true picker.normalize = normalizeTimePickerTag + picker.get = picker.getFunc picker.set = picker.setFunc picker.changed = picker.propertyChanged } @@ -167,6 +168,17 @@ func stringToTime(value string) (time.Time, bool) { return result, true } +func (picker *timePickerData) getFunc(tag PropertyName) any { + switch tag { + case TimeChangedEvent: + if listeners := getTwoArgEventRawListeners[TimePicker, time.Time](picker, nil, tag); len(listeners) > 0 { + return listeners + } + return nil + } + return picker.viewData.getFunc(tag) +} + func (picker *timePickerData) setFunc(tag PropertyName, value any) []PropertyName { setTimeValue := func(tag PropertyName) []PropertyName { diff --git a/view.go b/view.go index d4735dc..6a6d730 100644 --- a/view.go +++ b/view.go @@ -308,8 +308,57 @@ func (view *viewData) getFunc(tag PropertyName) any { } else { return nil } + + case FocusEvent, LostFocusEvent: + if listeners := getNoArgEventRawListeners[View](view, nil, tag); len(listeners) > 0 { + + } + + case KeyDownEvent, KeyUpEvent: + if listeners := getOneArgEventRawListeners[View, KeyEvent](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case ClickEvent, DoubleClickEvent, MouseDown, MouseUp, MouseMove, MouseOut, MouseOver, ContextMenuEvent: + if listeners := getOneArgEventRawListeners[View, MouseEvent](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case PointerDown, PointerUp, PointerMove, PointerOut, PointerOver, PointerCancel: + if listeners := getOneArgEventRawListeners[View, PointerEvent](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case TouchStart, TouchEnd, TouchMove, TouchCancel: + if listeners := getOneArgEventRawListeners[View, TouchEvent](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case TransitionRunEvent, TransitionStartEvent, TransitionEndEvent, TransitionCancelEvent: + if listeners := getOneArgEventRawListeners[View, PropertyName](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case AnimationStartEvent, AnimationEndEvent, AnimationIterationEvent, AnimationCancelEvent: + if listeners := getOneArgEventRawListeners[View, string](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case ResizeEvent, ScrollEvent: + if listeners := getOneArgEventRawListeners[View, Frame](view, nil, tag); len(listeners) > 0 { + return listeners + } + + case DragStartEvent, DragEndEvent, DragEnterEvent, DragLeaveEvent, DragOverEvent, DropEvent: + if listeners := getOneArgEventRawListeners[View, DragAndDropEvent](view, nil, tag); len(listeners) > 0 { + return listeners + } + + default: + return viewStyleGet(view, tag) } - return viewStyleGet(view, tag) + + return nil } func (view *viewData) removeFunc(tag PropertyName) []PropertyName {