diff --git a/events/main.go b/events/main.go
index cc26f10..de6105d 100644
--- a/events/main.go
+++ b/events/main.go
@@ -21,9 +21,16 @@ type EventData struct {
-type Monitor struct {
- Document *element.Node
- State *map[string]element.State
- EventList *element.EventList
- Adapter *adapter.Adapter
- History *map[string]element.EventList
-}
-
-func (m *Monitor) RunEvents() bool {
+// func GetEvents(el *element.Node, state *map[string]element.State, prevEvents *map[string]element.EventList) *map[string]element.EventList {
+// data := RLData{
+// MP: rl.GetMousePosition(),
+// LB: rl.IsMouseButtonDown(rl.MouseLeftButton),
+// RB: rl.IsMouseButtonPressed(rl.MouseRightButton),
+// WD: rl.GetMouseWheelMove(),
+// KP: rl.GetKeyPressed(),
+// }
+// // fmt.Println(data.WD)
+// // Mouse over
+// // fmt.Println(len(*prevEvents))
+// loop(el, state, data, prevEvents)
+// return prevEvents
+// }
+
+func RunEvents(events *map[string]element.EventList) bool {
@@ -31 +38 @@ func (m *Monitor) RunEvents() bool {
- for _, evt := range *m.History {
+ for _, evt := range *events {
@@ -46,5 +53 @@ func (m *Monitor) RunEvents() bool {
-func (m *Monitor) GetEvents(data *EventData) {
- m.CalcEvents(m.Document, data)
-}
-
-func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
+func GetEvents(el *element.Node, state *map[string]element.State, data EventData, eventTracker *map[string]element.EventList, a *adapter.Adapter) {
@@ -53,5 +56 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- for _, v := range el.Children {
- m.CalcEvents(v, data)
- }
-
- mHistory := *m.History
+ et := *eventTracker
@@ -59 +58 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- evt := mHistory[el.Properties.Id].Event
+ evt := et[el.Properties.Id].Event
@@ -61 +60 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- s := *m.State
+ s := *state
@@ -65,10 +64,9 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- evt = element.Event{
- X: data.Position[0],
- Y: data.Position[1],
- MouseUp: true,
- MouseLeave: true,
- Target: el,
- }
- (*m.History)[el.Properties.Id] = element.EventList{
- Event: evt,
- List: []string{},
+ et[el.Properties.Id] = element.EventList{
+ Event: element.Event{
+ X: data.Position[0],
+ Y: data.Position[1],
+ MouseUp: true,
+ MouseLeave: true,
+ Target: el,
+ },
+ List: []string{},
@@ -75,0 +74,2 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
+
+ evt = et[el.Properties.Id].Event
@@ -125,2 +125,3 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- // !TODO: for now just emit a event, will have to add el.scrollX
- el.ScrollY = int(utils.Max(float32(el.ScrollY+(-data.Scroll)), 0.0))
+ // for now just emit a event, will have to add el.scrollX
+ evt.Target.ScrollY = int(utils.Max(float32(evt.Target.ScrollY+(-data.Scroll)), 0.0))
+
@@ -130,2 +130,0 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
-
- // data.Scroll = 0
@@ -149 +148 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- m.Adapter.DispatchEvent(element.Event{
+ a.DispatchEvent(element.Event{
@@ -170,0 +170 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
+ fmt.Println(el.Properties.Id, el.Value)
@@ -204 +204 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
- (*m.History)[el.Properties.Id] = element.EventList{
+ et[el.Properties.Id] = element.EventList{
@@ -207,0 +208,5 @@ func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
+
+ eventTracker = &et
+ for _, v := range el.Children {
+ GetEvents(v, state, data, eventTracker, a)
+ }
package events
import (
"fmt"
adapter "gui/adapters"
"gui/element"
"gui/utils"
"slices"
)
type EventData struct {
Position []int
Click bool
Context bool
Scroll int
Key int
KeyState bool
}
type Monitor struct {
Document *element.Node
State *map[string]element.State
EventList *element.EventList
Adapter *adapter.Adapter
History *map[string]element.EventList
}
func (m *Monitor) RunEvents() bool {
eventRan := false
for _, evt := range *m.History {
if len(evt.List) > 0 {
for _, v := range evt.List {
if len(evt.Event.Target.Properties.EventListeners[v]) > 0 {
for _, handler := range evt.Event.Target.Properties.EventListeners[v] {
handler(evt.Event)
eventRan = true
}
}
}
}
}
return eventRan
}
func (m *Monitor) GetEvents(data *EventData) {
m.CalcEvents(m.Document, data)
}
func (m *Monitor) CalcEvents(el *element.Node, data *EventData) {
// loop through state to build events, then use multithreading to complete
// map
for _, v := range el.Children {
m.CalcEvents(v, data)
}
mHistory := *m.History
eventList := []string{}
evt := mHistory[el.Properties.Id].Event
s := *m.State
self := s[el.Properties.Id]
if evt.Target == nil {
evt = element.Event{
X: data.Position[0],
Y: data.Position[1],
MouseUp: true,
MouseLeave: true,
Target: el,
}
(*m.History)[el.Properties.Id] = element.EventList{
Event: evt,
List: []string{},
}
}
var isMouseOver bool
if self.X < float32(data.Position[0]) && self.X+self.Width > float32(data.Position[0]) {
if self.Y < float32(data.Position[1]) && self.Y+self.Height > float32(data.Position[1]) {
// Mouse is over element
isMouseOver = true
if !slices.Contains(el.ClassList.Classes, ":hover") {
el.ClassList.Add(":hover")
}
if data.Click && !evt.MouseDown {
evt.MouseDown = true
evt.MouseUp = false
if el.OnMouseDown != nil {
el.OnMouseDown(evt)
}
eventList = append(eventList, "mousedown")
}
if !data.Click && !evt.MouseUp {
evt.MouseUp = true
evt.MouseDown = false
evt.Click = false
if el.OnMouseUp != nil {
el.OnMouseUp(evt)
}
eventList = append(eventList, "mouseup")
}
if data.Click && !evt.Click {
evt.Click = true
if el.OnClick != nil {
el.OnClick(evt)
}
eventList = append(eventList, "click")
}
if data.Context {
evt.ContextMenu = true
if el.OnContextMenu != nil {
el.OnContextMenu(evt)
}
eventList = append(eventList, "contextmenu")
}
if data.Scroll != 0 {
// fmt.Println(data.WD)
// !TODO: for now just emit a event, will have to add el.scrollX
el.ScrollY = int(utils.Max(float32(el.ScrollY+(-data.Scroll)), 0.0))
if el.OnScroll != nil {
el.OnScroll(evt)
}
// data.Scroll = 0
eventList = append(eventList, "scroll")
}
if !evt.MouseEnter {
evt.MouseEnter = true
evt.MouseOver = true
evt.MouseLeave = false
if el.OnMouseEnter != nil {
el.OnMouseEnter(evt)
}
if el.OnMouseOver != nil {
el.OnMouseEnter(evt)
}
eventList = append(eventList, "mouseenter")
eventList = append(eventList, "mouseover")
// Let the adapter know the cursor has changed
m.Adapter.DispatchEvent(element.Event{
Name: "cursor",
Data: self.Cursor,
})
}
if evt.X != int(data.Position[0]) && evt.Y != int(data.Position[1]) {
evt.X = int(data.Position[0])
evt.Y = int(data.Position[1])
if el.OnMouseMove != nil {
el.OnMouseMove(evt)
}
eventList = append(eventList, "mousemove")
}
// Get the keycode of the pressed key
// issue: need to only add the text data and events to focused elements and only
// one at a time
if data.Key != 0 {
if el.Properties.Editable {
el.Value = el.InnerText
ProcessKeyEvent(el, int(data.Key))
el.InnerText = el.Value
eventList = append(eventList, "keypress")
}
}
} else {
isMouseOver = false
if slices.Contains(el.ClassList.Classes, ":hover") {
el.ClassList.Remove(":hover")
}
}
} else {
isMouseOver = false
if slices.Contains(el.ClassList.Classes, ":hover") {
el.ClassList.Remove(":hover")
}
}
// fmt.Println(isMouseOver)
if !isMouseOver && !evt.MouseLeave {
evt.MouseEnter = false
evt.MouseOver = false
evt.MouseLeave = true
el.Properties.Hover = false
if el.OnMouseLeave != nil {
el.OnMouseLeave(evt)
}
eventList = append(eventList, "mouseleave")
}
(*m.History)[el.Properties.Id] = element.EventList{
Event: evt,
List: eventList,
}
}
// ProcessKeyEvent processes key events for text entry.
func ProcessKeyEvent(n *element.Node, key int) {
// Handle key events for text entry
switch key {
case 8:
// Backspace: remove the last character
if len(n.Value) > 0 {
n.Value = n.Value[:len(n.Value)-1]
n.InnerText = n.InnerText[:len(n.InnerText)-1]
}
case 65:
// Select All: set the entire text as selected
if key == 17 || key == 345 {
n.Properties.Selected = []float32{0, float32(len(n.Value))}
} else {
// Otherwise, append 'A' to the text
n.Value += "A"
}
case 67:
// Copy: copy the selected text (in this case, print it)
if key == 17 || key == 345 {
fmt.Println("Copy:", n.Value)
} else {
// Otherwise, append 'C' to the text
n.Value += "C"
}
case 86:
// Paste: paste the copied text (in this case, set it to "Pasted")
if key == 17 || key == 345 {
n.Value = "Pasted"
} else {
// Otherwise, append 'V' to the text
n.Value += "V"
}
default:
// Record other key presses
n.Value += string(rune(key))
}
}