From aa1fca84d5a0ad5537d98d9d4fd07ca319c6ef75 Mon Sep 17 00:00:00 2001 From: juander Date: Fri, 6 Nov 2020 11:48:49 +0100 Subject: [PATCH] d2core/ui: Introduce clickable widgets not all widgets need to be clickable, so let's make it it's own interface. --- d2core/d2ui/ui_manager.go | 35 ++++++++++++++++++++--------------- d2core/d2ui/widget.go | 7 ++++++- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/d2core/d2ui/ui_manager.go b/d2core/d2ui/ui_manager.go index f2030308..5137a697 100644 --- a/d2core/d2ui/ui_manager.go +++ b/d2core/d2ui/ui_manager.go @@ -12,16 +12,17 @@ import ( // UIManager manages a collection of UI elements (buttons, textboxes, labels) type UIManager struct { - asset *d2asset.AssetManager - renderer d2interface.Renderer - inputManager d2interface.InputManager - audio d2interface.AudioProvider - widgets []Widget - cursorButtons CursorButton - CursorX int - CursorY int - pressedWidget Widget - clickSfx d2interface.SoundEffect + asset *d2asset.AssetManager + renderer d2interface.Renderer + inputManager d2interface.InputManager + audio d2interface.AudioProvider + widgets []Widget + clickableWidgets []ClickableWidget + cursorButtons CursorButton + CursorX int + CursorY int + pressedWidget ClickableWidget + clickSfx d2interface.SoundEffect } // Note: methods for creating buttons and stuff are in their respective files @@ -44,6 +45,7 @@ func (ui *UIManager) Initialize() { // Reset resets the state of the UI manager. Typically called for new screens func (ui *UIManager) Reset() { ui.widgets = nil + ui.clickableWidgets = nil ui.pressedWidget = nil } @@ -54,8 +56,12 @@ func (ui *UIManager) addWidget(widget Widget) { log.Print(err) } - ui.widgets = append(ui.widgets, widget) + clickable, ok := widget.(ClickableWidget) + if ok { + ui.clickableWidgets = append(ui.clickableWidgets, clickable) + } + ui.widgets = append(ui.widgets, widget) widget.bindManager(ui) } @@ -67,13 +73,12 @@ func (ui *UIManager) OnMouseButtonUp(event d2interface.MouseEvent) bool { // activate previously pressed widget if cursor is still hovering w := ui.pressedWidget - if w != nil && ui.contains(w, ui.CursorX, ui.CursorY) && w.GetVisible() && w. - GetEnabled() { + if w != nil && ui.contains(w, ui.CursorX, ui.CursorY) && w.GetVisible() && w.GetEnabled() { w.Activate() } // unpress all widgets that are pressed - for _, w := range ui.widgets { + for _, w := range ui.clickableWidgets { w.SetPressed(false) } } @@ -87,7 +92,7 @@ func (ui *UIManager) OnMouseButtonDown(event d2interface.MouseEvent) bool { if event.Button() == d2enum.MouseButtonLeft { // find and press a widget on screen ui.pressedWidget = nil - for _, w := range ui.widgets { + for _, w := range ui.clickableWidgets { if ui.contains(w, ui.CursorX, ui.CursorY) && w.GetVisible() && w.GetEnabled() { w.SetPressed(true) ui.pressedWidget = w diff --git a/d2core/d2ui/widget.go b/d2core/d2ui/widget.go index 7e3307b2..f2ac7ea6 100644 --- a/d2core/d2ui/widget.go +++ b/d2core/d2ui/widget.go @@ -4,9 +4,14 @@ package d2ui type Widget interface { Drawable bindManager(ui *UIManager) - GetEnabled() 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()