-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathtimeMenu.go
84 lines (67 loc) · 1.72 KB
/
timeMenu.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
package main
import (
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
// timeMenu extends widget.Menu
type timeMenu struct {
*widget.Menu
width, height float32
}
// NewSizedMenu creates a sized menu
func newTimeMenu(m *fyne.Menu, s fyne.Size) *timeMenu {
wid := &timeMenu{Menu: widget.NewMenu(m)}
wid.width = s.Width
wid.height = s.Height
wid.ExtendBaseWidget(wid)
return wid
}
// MinSize defines the minimum size of this menu
func (s *timeMenu) MinSize() fyne.Size {
return fyne.NewSize(s.width, s.height)
}
// CreateRenderer applies the custom layout
func (s *timeMenu) CreateRenderer() fyne.WidgetRenderer {
r := s.Menu.CreateRenderer()
return &sizedMenuRenderer{WidgetRenderer: r, sized: s}
}
type sizedMenuRenderer struct {
fyne.WidgetRenderer
sized *timeMenu
scrolled bool
}
// Layout sets size and position
func (r *sizedMenuRenderer) Layout(_ fyne.Size) {
pos := fyne.NewPos(-theme.Padding(), -theme.Padding())
size := fyne.NewSize(r.sized.width, r.sized.height)
for _, o := range r.Objects() {
o.Move(pos)
o.Resize(size)
}
}
func (r *sizedMenuRenderer) Objects() []fyne.CanvasObject {
objs := r.WidgetRenderer.Objects()
scroll := objs[1].(*container.Scroll)
if !r.scrolled {
r.scrolled = true
textHeight := widget.NewLabel("").MinSize().Height + theme.Padding()
yOff := textHeight * -1.25 // 2.25 lines would be time offset, but we have the "Now" too
hr := time.Now().Hour()
yOff += textHeight*(float32(hr)*4) - theme.Padding()
mn := time.Now().Minute()
if mn >= 15 {
yOff += textHeight
}
if mn >= 30 {
yOff += textHeight
}
if mn >= 45 {
yOff += textHeight
}
scroll.Offset = fyne.NewPos(0, yOff)
}
return objs
}