1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-11-02 17:27:23 -04:00
OpenDiablo2/d2core/d2ui/label.go

91 lines
2.0 KiB
Go
Raw Normal View History

2019-11-10 08:51:02 -05:00
package d2ui
2019-10-24 09:31:59 -04:00
import (
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"image/color"
"log"
"strings"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface"
2019-10-24 09:31:59 -04:00
)
2019-10-25 19:37:04 -04:00
// Label represents a user interface label
type Label struct {
2019-10-24 09:31:59 -04:00
text string
X int
Y int
Alignment d2gui.HorizontalAlign
font d2interface.Font
Color color.Color
2019-10-24 09:31:59 -04:00
}
2019-10-25 19:37:04 -04:00
// CreateLabel creates a new instance of a UI label
func CreateLabel(fontPath, palettePath string) Label {
font, _ := d2asset.LoadFont(fontPath+".tbl", fontPath+".dc6", palettePath)
result := Label{
Alignment: d2gui.HorizontalAlignLeft,
Color: color.White,
font: font,
2019-10-24 09:31:59 -04:00
}
2020-06-25 17:28:48 -04:00
2019-10-24 09:31:59 -04:00
return result
}
// Render draws the label on the screen, respliting the lines to allow for other alignments
func (v *Label) Render(target d2interface.Surface) {
v.font.SetColor(v.Color)
target.PushTranslation(v.X, v.Y)
lines := strings.Split(v.text, "\n")
yOffset := 0
for _, line := range lines {
lw, lh := v.GetTextMetrics(line)
target.PushTranslation(v.getAlignOffset(lw), yOffset)
_ = v.font.RenderText(line, target)
yOffset += lh
target.Pop()
}
target.Pop()
2019-10-24 09:31:59 -04:00
}
// SetPosition moves the label to the specified location
func (v *Label) SetPosition(x, y int) {
2019-10-24 09:31:59 -04:00
v.X = x
v.Y = y
}
// GetSize returns the size of the label
func (v *Label) GetSize() (width, height int) {
return v.font.GetTextMetrics(v.text)
}
// GetTextMetrics returns the width and height of the enclosing rectangle in Pixels.
func (v *Label) GetTextMetrics(text string) (width, height int) {
return v.font.GetTextMetrics(text)
2019-10-24 09:31:59 -04:00
}
2019-10-25 19:12:42 -04:00
// SetText sets the label's text
2019-10-25 19:37:04 -04:00
func (v *Label) SetText(newText string) {
2019-10-24 09:31:59 -04:00
v.text = newText
}
2019-10-26 10:34:55 -04:00
func (v *Label) getAlignOffset(textWidth int) int {
switch v.Alignment {
case d2gui.HorizontalAlignLeft:
return 0
case d2gui.HorizontalAlignCenter:
return -textWidth / 2
case d2gui.HorizontalAlignRight:
return -textWidth
default:
log.Fatal("Invalid Alignment")
return 0
}
2019-10-26 10:34:55 -04:00
}