-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmenu_bar.go
138 lines (126 loc) · 4.48 KB
/
menu_bar.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package ux
import (
"fmt"
"image"
"image/color"
"gioui.org/io/pointer"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/op/clip"
"gioui.org/op/paint"
"gioui.org/unit"
"gioui.org/widget"
"gioui.org/widget/material"
"gioui.org/x/component"
)
type MenuBarAction func()
type MenuBar struct {
menus []MenuBarItem
}
func NewMenuBar() *MenuBar {
return &MenuBar{}
}
func (m *MenuBar) AddMenuBarItem(menus []MenuBarItem) *MenuBar {
for key := range menus {
menus[key].menuContextArea = component.ContextArea{
Activation: pointer.ButtonPrimary,
AbsolutePosition: true,
}
}
m.menus = menus
return m
}
type MenuBarItem struct {
Title string
menuContextArea component.ContextArea
Items []MenuBarItemElement
}
type MenuBarItemElement struct {
Name string
click widget.Clickable
Action MenuBarAction
}
func (m *MenuBar) Layout(gtx layout.Context) layout.Dimensions {
var items []layout.FlexChild
for key := range m.menus {
if len(items) > 0 {
items = append(items, layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return material.Body1(th.Theme, "|").Layout(gtx)
}),
)
}))
}
items = append(items, layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return layout.Stack{}.Layout(gtx,
layout.Stacked(func(gtx layout.Context) layout.Dimensions {
return layout.Inset{Left: unit.Dp(3), Right: unit.Dp(3)}.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return material.Body2(th.Theme, m.menus[key].Title).Layout(gtx)
})
}),
layout.Expanded(func(gtx layout.Context) layout.Dimensions {
var subItems []layout.FlexChild
for subKey := range m.menus[key].Items {
subItems = append(subItems, layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
return layout.Inset{Top: unit.Dp(0), Bottom: unit.Dp(5)}.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return m.menus[key].Items[subKey].click.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
if m.menus[key].Items[subKey].click.Hovered() {
fmt.Println("hovered")
DrawBackground(gtx, gtx.Constraints.Max, th.Color.MenuBarHoveredColor)
gtx.Execute(op.InvalidateCmd{})
}
return material.Body2(th.Theme, m.menus[key].Items[subKey].Name).Layout(gtx)
})
})
}),
)
}))
}
return m.menus[key].menuContextArea.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
offset := layout.Inset{
Top: unit.Dp(20),
}
return offset.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return widget.Border{
Color: th.Color.MenuBarBorderColor,
Width: unit.Dp(1),
CornerRadius: th.Size.DefaultElementRadiusSize,
}.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return layout.Background{}.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
defer clip.UniformRRect(image.Rectangle{Max: gtx.Constraints.Min}, gtx.Dp(th.Size.DefaultElementRadiusSize)).Push(gtx.Ops).Pop()
paint.Fill(gtx.Ops, th.Color.MenuBarBgColor)
return layout.Dimensions{Size: gtx.Constraints.Min}
}, func(gtx layout.Context) layout.Dimensions {
return layout.UniformInset(unit.Dp(4)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
return layout.Flex{Axis: layout.Vertical}.Layout(gtx, subItems...)
})
})
})
})
})
}),
)
}),
)
}))
}
return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, items...)
}
// DrawBackground 在给定的尺寸上绘制一个背景颜色
func DrawBackground(gtx layout.Context, size image.Point, col color.NRGBA) {
defer clip.Rect{Max: size}.Push(gtx.Ops).Pop()
paint.Fill(gtx.Ops, col)
}
//
// return layout.Stack{}.Layout(gtx,
// layout.Stacked(func(gtx layout.Context) layout.Dimensions {
// return layout.Inset{Top: unit.Dp(3), Bottom: unit.Dp(3)}.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
// return Body1(m.theme, "▼").Layout(gtx)
// })
// }),
// )