mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-01-13 21:07:31 -05:00
1f49df62d1
* d2ui/tooltip: Make it invisible by default * d2ui/button: Add GetToggled() method * d2player/HUD: Add tooltip for minipanel button * d2ui/button: Add disabled frame to minipanel buttons * d2ui/widget_group: Add SetEnable method for clickable widgets * d2player/mini_panel: move menu button here from HUD * d2ui/button: toggled buttons take preference over disabled buttons * d2player/help_overlay: Make panel only use widgets * d2player/hud: Group most widgets into widget group * d2ui/custom_widget: Allow tooltip to be attached * d2player/hud: Attach staminaBar tooltip to staminaBar * d2player/hud: Attach experienceBar tooltip to experienceBar widget * d2ui/ui_manager: Always draw tooltips last * d2player/help_overlay: It should be drawn over the HUD * d2player/globeWidget: Move tooltip here from HUD * d2core/tooltip: Automatically add tooltips to the uiManager * d2core/ui_manager: Remove special handling of widgetGroups for rendering * d2player/help_overlay: Add button to widget group * d2player/hud: Attack runwalk tooltip to button * d2player/mini_panel: Add panelButton to its own widget group * d2core/widget_group: When a clickable is added, it's also added to uiManager * d2player/globeWidget: make tooltip un/lock on click * d2player/hud: Add runbutton to widget group * d2player/mini_panel: Add group for tooltips this allows us to move the tooltip with the panelbuttons. They can't be in the general panelGroup as they would all become visible when the panel is opened. * d2core/button: Remove debug log when a button with tooltip is hovered
171 lines
4.0 KiB
Go
171 lines
4.0 KiB
Go
package d2ui
|
|
|
|
// RenderPriority determines in which order ui elements are drawn.
|
|
// The higher the number the later an element is drawn.
|
|
type RenderPriority int
|
|
|
|
// Render priorities that determine the order in which widgets/widgetgroups are
|
|
// rendered. The higher the later it is rendered
|
|
const (
|
|
RenderPriorityBackground RenderPriority = iota
|
|
RenderPrioritySkilltree
|
|
RenderPrioritySkilltreeIcon
|
|
RenderPriorityHeroStatsPanel
|
|
RenderPriorityHUDPanel
|
|
RenderPriorityMinipanel
|
|
RenderPriorityHelpPanel
|
|
RenderPriorityForeground
|
|
)
|
|
|
|
// Widget defines an object that is a UI widget
|
|
type Widget interface {
|
|
Drawable
|
|
bindManager(ui *UIManager)
|
|
GetManager() (ui *UIManager)
|
|
OnMouseMove(x int, y int)
|
|
OnHoverStart(callback func())
|
|
OnHoverEnd(callback func())
|
|
isHovered() bool
|
|
hoverStart()
|
|
hoverEnd()
|
|
Contains(x, y int) (contained bool)
|
|
}
|
|
|
|
// ClickableWidget defines an object that can be clicked
|
|
type ClickableWidget interface {
|
|
Widget
|
|
SetEnabled(enabled bool)
|
|
SetPressed(pressed bool)
|
|
GetEnabled() bool
|
|
GetPressed() bool
|
|
OnActivated(callback func())
|
|
Activate()
|
|
}
|
|
|
|
// BaseWidget contains default functionality that all widgets share
|
|
type BaseWidget struct {
|
|
manager *UIManager
|
|
x int
|
|
y int
|
|
width int
|
|
height int
|
|
renderPriority RenderPriority
|
|
visible bool
|
|
|
|
hovered bool
|
|
onHoverStartCb func()
|
|
onHoverEndCb func()
|
|
}
|
|
|
|
// NewBaseWidget creates a new BaseWidget with defaults
|
|
func NewBaseWidget(manager *UIManager) *BaseWidget {
|
|
return &BaseWidget{
|
|
manager: manager,
|
|
x: 0,
|
|
y: 0,
|
|
width: 0,
|
|
height: 0,
|
|
visible: true,
|
|
renderPriority: RenderPriorityBackground,
|
|
}
|
|
}
|
|
|
|
func (b *BaseWidget) bindManager(manager *UIManager) {
|
|
b.manager = manager
|
|
}
|
|
|
|
// GetSize returns the size of the widget
|
|
func (b *BaseWidget) GetSize() (width, height int) {
|
|
return b.width, b.height
|
|
}
|
|
|
|
// SetPosition sets the position of the widget
|
|
func (b *BaseWidget) SetPosition(x, y int) {
|
|
b.x, b.y = x, y
|
|
}
|
|
|
|
// OffsetPosition moves the widget by x and y
|
|
func (b *BaseWidget) OffsetPosition(x, y int) {
|
|
b.x += x
|
|
b.y += y
|
|
}
|
|
|
|
// GetPosition returns the position of the widget
|
|
func (b *BaseWidget) GetPosition() (x, y int) {
|
|
return b.x, b.y
|
|
}
|
|
|
|
// GetVisible returns whether the widget is visible
|
|
func (b *BaseWidget) GetVisible() (visible bool) {
|
|
return b.visible
|
|
}
|
|
|
|
// SetVisible make the widget visible, not visible
|
|
func (b *BaseWidget) SetVisible(visible bool) {
|
|
b.visible = visible
|
|
}
|
|
|
|
// GetRenderPriority returns the order in which this widget is rendered
|
|
func (b *BaseWidget) GetRenderPriority() (prio RenderPriority) {
|
|
return b.renderPriority
|
|
}
|
|
|
|
// SetRenderPriority sets the order in which this widget is rendered
|
|
func (b *BaseWidget) SetRenderPriority(prio RenderPriority) {
|
|
b.renderPriority = prio
|
|
}
|
|
|
|
// OnHoverStart sets a function that is called if the hovering of the widget starts
|
|
func (b *BaseWidget) OnHoverStart(callback func()) {
|
|
b.onHoverStartCb = callback
|
|
}
|
|
|
|
// HoverStart is called when the hovering of the widget starts
|
|
func (b *BaseWidget) hoverStart() {
|
|
b.hovered = true
|
|
if b.onHoverStartCb != nil {
|
|
b.onHoverStartCb()
|
|
}
|
|
}
|
|
|
|
// OnHoverEnd sets a function that is called if the hovering of the widget ends
|
|
func (b *BaseWidget) OnHoverEnd(callback func()) {
|
|
b.onHoverEndCb = callback
|
|
}
|
|
|
|
// hoverEnd is called when the widget hovering ends
|
|
func (b *BaseWidget) hoverEnd() {
|
|
b.hovered = false
|
|
if b.onHoverEndCb != nil {
|
|
b.onHoverEndCb()
|
|
}
|
|
}
|
|
|
|
func (b *BaseWidget) isHovered() bool {
|
|
return b.hovered
|
|
}
|
|
|
|
// Contains determines whether a given x,y coordinate lands within a Widget
|
|
func (b *BaseWidget) Contains(x, y int) bool {
|
|
wx, wy := b.GetPosition()
|
|
ww, wh := b.GetSize()
|
|
|
|
return x >= wx && x <= wx+ww && y >= wy && y <= wy+wh
|
|
}
|
|
|
|
// GetManager returns the uiManager
|
|
func (b *BaseWidget) GetManager() (ui *UIManager) {
|
|
return b.manager
|
|
}
|
|
|
|
// OnMouseMove is called when the mouse is moved
|
|
func (b *BaseWidget) OnMouseMove(x, y int) {
|
|
if b.Contains(x, y) {
|
|
if !b.isHovered() {
|
|
b.hoverStart()
|
|
}
|
|
} else if b.isHovered() {
|
|
b.hoverEnd()
|
|
}
|
|
}
|