-
Notifications
You must be signed in to change notification settings - Fork 0
/
button.go
115 lines (99 loc) · 2.72 KB
/
button.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main
import (
"image/color"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/text"
"golang.org/x/image/font"
)
type Button struct {
x, y float64
w, h int
rect *ebiten.Image
op ebiten.DrawImageOptions
title string
titleW int
grid Grid
buttonIcon *ebiten.Image
fontFace font.Face
hovered bool
active bool
disabled bool
}
func NewButton(w, h int, x, y float64, title string, active bool, buttonIcon *ebiten.Image, fontFace font.Face) Button {
rect := ebiten.NewImage(w, h)
rect.Fill(color.RGBA{255, 0, 0, 255})
op := ebiten.DrawImageOptions{}
op.GeoM.Translate(x, y)
return Button{
rect: rect,
op: op,
title: title,
x: x, y: y, w: w, h: h,
titleW: text.BoundString(mononokiFFace, title).Dx(),
active: active,
buttonIcon: buttonIcon,
fontFace: fontFace,
}
}
func (b *Button) Draw(screen *ebiten.Image) {
if b.buttonIcon == nil {
textColor := color.RGBA{255, 255, 255, 255}
if b.disabled {
textColor = color.RGBA{0x4b, 0x4b, 0x4b, 255}
}
text.Draw(screen, b.title, b.fontFace, int(b.x)+b.w/2-b.titleW/2, int(b.y)+b.h/2+18/2-5, textColor)
} else {
iconOps := ebiten.DrawImageOptions{}
iconOps.GeoM.Translate(b.x+2, b.y+2)
if b.disabled {
iconOps.ColorScale.ScaleAlpha(0.3)
}
screen.DrawImage(b.buttonIcon, &iconOps)
}
rowSize := b.w * 4
bytes := make([]byte, b.w*b.h*4)
var bColor byte = 0x87
var bColorSelected byte = 0xff
if b.hovered {
bColor = 0xff
} else if b.disabled {
bColor = 0x4b
bColorSelected = 0x5b
}
if !b.active {
for i := 0; i < rowSize; i++ {
for h := 0; h < 1; h++ { // Border width = 1
bytes[i+rowSize*h] = bColor // Top border
bytes[i+rowSize*(b.h-1)-rowSize*h] = bColor // Bottom border
}
}
for i := 0; i < b.h; i++ {
for h := 0; h < 1; h++ { // Border width = 1
for j := 0; j < 4; j++ {
bytes[rowSize*i+(h*4)+j] = bColor // Left border
bytes[rowSize*(i+1)+(h*4)-(j+1)] = bColor // Right border
}
}
}
} else {
for i := 0; i < rowSize; i++ {
for h := 0; h < 2; h++ { // Border width = 2
bytes[i+rowSize*h] = bColorSelected // Top border
bytes[i+rowSize*(b.h-1)-rowSize*h] = bColorSelected // Bottom border
}
}
for i := 0; i < b.h; i++ {
for h := 0; h < 2; h++ { // Border width = 2
for j := 0; j < 4; j++ {
bytes[rowSize*i+(h*4)+j] = bColorSelected // Left border
bytes[rowSize*(i+1)-(h*4)-(j+1)] = bColorSelected // Right border
}
}
}
}
b.rect.WritePixels(bytes)
screen.DrawImage(b.rect, &b.op)
}
func (b *Button) hover(x, y int) {
b.hovered = !b.disabled && x >= int(b.x) && x <= int(b.x)+b.w && y >= int(b.y) && y <= int(b.y)+b.h
}