OpenDiablo2/d2core/d2gui/widget.go

178 lines
3.9 KiB
Go

package d2gui
import (
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
)
// MouseHandler is a handler function for mouse events
type MouseHandler func(d2interface.MouseEvent)
// MouseMoveHandler is a handler function for mouse movement events
type MouseMoveHandler func(d2interface.MouseMoveEvent)
type widget interface {
render(target d2interface.Surface)
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
}
// SetPosition sets the widget position
func (w *widgetBase) SetPosition(x, y int) {
w.x = x
w.y = y
}
// GetPosition returns the widget position
func (w *widgetBase) GetPosition() (x, y int) {
return w.x, w.y
}
// GetOffset gets the widget offset
func (w *widgetBase) GetOffset() (x, y 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
}
// SetLayer sets the widget layer (for rendering order)
func (w *widgetBase) SetLayer(layer int) {
w.layer = layer
}
// SetVisible sets the widget's visibility
func (w *widgetBase) SetVisible(visible bool) {
w.visible = visible
}
// SetExpanding tells the widget to expand (or not) when inside of a layout
func (w *widgetBase) SetExpanding(expanding bool) {
w.expanding = expanding
}
// SetMouseEnterHandler sets the handler function for mouse-enter events
func (w *widgetBase) SetMouseEnterHandler(handler MouseMoveHandler) {
w.mouseEnterHandler = handler
}
// SetMouseLeaveHandler sets the handler function for mouse-leave events
func (w *widgetBase) SetMouseLeaveHandler(handler MouseMoveHandler) {
w.mouseLeaveHandler = handler
}
// SetMouseClickHandler sets the handler function for mouse-click events
func (w *widgetBase) SetMouseClickHandler(handler MouseHandler) {
w.mouseClickHandler = handler
}
func (w *widgetBase) getPosition() (x, y int) {
return w.x, w.y
}
func (w *widgetBase) getSize() (width, height 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(_ d2interface.Surface) { /* NOOP */ }
func (w *widgetBase) advance(_ 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(_ d2interface.MouseMoveEvent) bool {
return false
}
func (w *widgetBase) onMouseOver(_ d2interface.MouseMoveEvent) bool {
return false
}
func (w *widgetBase) onMouseButtonDown(_ d2interface.MouseEvent) bool {
return false
}
func (w *widgetBase) onMouseButtonUp(_ d2interface.MouseEvent) bool {
return false
}