forked from planetdecred/godcr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
log_page.go
118 lines (99 loc) · 2.6 KB
/
log_page.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
package ui
import (
"sync"
"gioui.org/io/clipboard"
"gioui.org/layout"
"gioui.org/unit"
"gioui.org/widget"
"github.com/planetdecred/godcr/ui/decredmaterial"
"github.com/planetdecred/godcr/ui/values"
)
const PageLog = "Log"
type logPage struct {
theme *decredmaterial.Theme
common *pageCommon
copyLog *widget.Clickable
copyIcon *widget.Image
entriesList layout.List
fullLog string
logEntries []decredmaterial.Label
entriesLock sync.Mutex
}
func LogPage(common *pageCommon) Page {
pg := &logPage{
common: common,
theme: common.theme,
entriesList: layout.List{
Axis: layout.Vertical,
ScrollToEnd: true,
},
copyLog: new(widget.Clickable),
logEntries: make([]decredmaterial.Label, 0, 20),
}
pg.copyIcon = common.icons.copyIcon
pg.copyIcon.Scale = 0.25
go pg.watchLogs(*common.internalLog)
return pg
}
func (pg *logPage) OnResume() {
}
func (pg *logPage) copyLogEntries(gtx C) {
go func() {
pg.entriesLock.Lock()
defer pg.entriesLock.Unlock()
clipboard.WriteOp{Text: pg.fullLog}.Add(gtx.Ops)
}()
}
func (pg *logPage) watchLogs(internalLog chan string) {
for l := range internalLog {
entry := l[:len(l)-1]
pg.entriesLock.Lock()
pg.fullLog += l
pg.logEntries = append(pg.logEntries, pg.theme.Body1(entry))
pg.entriesLock.Unlock()
}
}
func (pg *logPage) Layout(gtx C) D {
common := pg.common
container := func(gtx C) D {
page := SubPage{
title: "Wallet log",
back: func() {
common.changePage(PageDebug)
},
extraItem: pg.copyLog,
extra: func(gtx C) D {
return layout.Center.Layout(gtx, func(gtx C) D {
return decredmaterial.Clickable(gtx, pg.copyLog, func(gtx C) D {
sz := gtx.Constraints.Max.X
pg.copyIcon.Scale = float32(sz) / float32(gtx.Px(unit.Dp(float32(sz))))
return pg.copyIcon.Layout(gtx)
})
})
},
handleExtra: func() {
pg.copyLogEntries(gtx)
},
body: func(gtx C) D {
background := common.theme.Color.Surface
card := common.theme.Card()
card.Color = background
return card.Layout(gtx, func(gtx C) D {
gtx.Constraints.Min.X = gtx.Constraints.Max.X
gtx.Constraints.Min.Y = gtx.Constraints.Max.Y
return layout.UniformInset(values.MarginPadding15).Layout(gtx, func(gtx C) D {
return pg.entriesList.Layout(gtx, len(pg.logEntries), func(gtx C, i int) D {
pg.entriesLock.Lock()
defer pg.entriesLock.Unlock()
return pg.logEntries[i].Layout(gtx)
})
})
})
},
}
return common.SubPageLayout(gtx, page)
}
return pg.common.UniformPadding(gtx, container)
}
func (pg *logPage) handle() {}
func (pg *logPage) onClose() {}