OpenDiablo2/d2core/d2ui/widget.go

173 lines
4.1 KiB
Go
Raw Normal View History

2019-11-10 13:51:02 +00:00
package d2ui
// RenderPriority determines in which order ui elements are drawn.
// The higher the number the later an element is drawn.
type RenderPriority int
Ui hud polishing (#938) * 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
2020-11-21 10:35:32 +00:00
// 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
2020-11-13 20:08:43 +00:00
RenderPriorityHeroStatsPanel
RenderPriorityQuestLog
RenderPriorityInventory
Ui hud polishing (#938) * 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
2020-11-21 10:35:32 +00:00
RenderPriorityHUDPanel
RenderPriorityMinipanel
RenderPriorityHelpPanel
RenderPriorityForeground
)
// Widget defines an object that is a UI widget
type Widget interface {
Drawable
bindManager(ui *UIManager)
2020-11-13 20:08:43 +00:00
GetManager() (ui *UIManager)
OnMouseMove(x int, y int)
2020-11-13 20:08:43 +00:00
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)
2019-10-26 03:41:54 +00:00
SetPressed(pressed bool)
GetEnabled() bool
2019-10-26 03:41:54 +00:00
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
2020-11-13 20:08:43 +00:00
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
}
2020-11-13 20:08:43 +00:00
// 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()
}
}