1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-07-03 11:55:22 +00:00
OpenDiablo2/d2core/d2gui/widget.go
Maxime Lavigne (malavv) f7e0912f5f
Fixing D2GUI based event propagation with d2input. #531 (#559)
d2input made the move to immutable events. (ex. MouseMove) but
d2gui was using "local events" for its recursive layouts. Meaning
when entering a sub-layout, the original event was modified to have
the cursor relative to the x, and y of the parent layout.

After tossing ideas with Grav, we considered (1) making events modifiable,
(2) having an event constructor, (3) changing sub-Layout to use screen layout.

We choose (3), and this is the relevant commit.
2020-07-08 09:15:20 -04:00

168 lines
3.3 KiB
Go

package d2gui
import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
)
type MouseHandler func(d2interface.MouseEvent)
type MouseMoveHandler func(d2interface.MouseMoveEvent)
type widget interface {
render(target d2interface.Surface) error
advance(elapsed float64) error
onMouseMove(event d2interface.MouseMoveEvent) bool
onMouseEnter(event d2interface.MouseMoveEvent) bool
onMouseLeave(event d2interface.MouseMoveEvent) bool
onMouseOver(event d2interface.MouseMoveEvent) bool
onMouseButtonDown(event d2interface.MouseEvent) bool
onMouseButtonUp(event d2interface.MouseEvent) bool
onMouseButtonClick(event d2interface.MouseEvent) bool
getPosition() (int, int)
setOffset(x, y int)
SetScreenPos(x, y int)
ScreenPos() (x, y int)
getSize() (int, int)
getLayer() int
isVisible() bool
isExpanding() bool
}
type widgetBase struct {
x int
y int
Sx int
Sy int
layer int
visible bool
expanding bool
offsetX int
offsetY int
mouseEnterHandler MouseMoveHandler
mouseLeaveHandler MouseMoveHandler
mouseClickHandler MouseHandler
}
func (w *widgetBase) SetPosition(x, y int) {
w.x = x
w.y = y
}
func (w *widgetBase) GetPosition() (int, int) {
return w.x, w.y
}
func (w *widgetBase) GetOffset() (int, int) {
return w.offsetX, w.offsetY
}
// SetScreenPos sets the screen position
func (w *widgetBase) SetScreenPos(x, y int) {
w.Sx, w.Sy = x, y
}
// ScreenPos returns the screen position
func (w *widgetBase) ScreenPos() (x, y int) {
return w.Sx, w.Sy
}
func (w *widgetBase) setOffset(x, y int) {
w.offsetX = x
w.offsetY = y
}
func (w *widgetBase) SetLayer(layer int) {
w.layer = layer
}
func (w *widgetBase) SetVisible(visible bool) {
w.visible = visible
}
func (w *widgetBase) SetExpanding(expanding bool) {
w.expanding = expanding
}
func (w *widgetBase) SetMouseEnterHandler(handler MouseMoveHandler) {
w.mouseEnterHandler = handler
}
func (w *widgetBase) SetMouseLeaveHandler(handler MouseMoveHandler) {
w.mouseLeaveHandler = handler
}
func (w *widgetBase) SetMouseClickHandler(handler MouseHandler) {
w.mouseClickHandler = handler
}
func (w *widgetBase) getPosition() (int, int) {
return w.x, w.y
}
func (w *widgetBase) getSize() (int, int) {
return 0, 0
}
func (w *widgetBase) getLayer() int {
return w.layer
}
func (w *widgetBase) isVisible() bool {
return w.visible
}
func (w *widgetBase) isExpanding() bool {
return w.expanding
}
func (w *widgetBase) render(target d2interface.Surface) error {
return nil
}
func (w *widgetBase) advance(elapsed float64) error {
return nil
}
func (w *widgetBase) onMouseEnter(event d2interface.MouseMoveEvent) bool {
if w.mouseEnterHandler != nil {
w.mouseEnterHandler(event)
}
return false
}
func (w *widgetBase) onMouseLeave(event d2interface.MouseMoveEvent) bool {
if w.mouseLeaveHandler != nil {
w.mouseLeaveHandler(event)
}
return false
}
func (w *widgetBase) onMouseButtonClick(event d2interface.MouseEvent) bool {
if w.mouseClickHandler != nil {
w.mouseClickHandler(event)
}
return false
}
func (w *widgetBase) onMouseMove(event d2interface.MouseMoveEvent) bool {
return false
}
func (w *widgetBase) onMouseOver(event d2interface.MouseMoveEvent) bool {
return false
}
func (w *widgetBase) onMouseButtonDown(event d2interface.MouseEvent) bool {
return false
}
func (w *widgetBase) onMouseButtonUp(event d2interface.MouseEvent) bool {
return false
}