add: gui and tsdiag
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
package gui
|
||||
|
||||
import (
|
||||
"gioui.org/layout"
|
||||
"gioui.org/widget"
|
||||
"gioui.org/widget/material"
|
||||
|
||||
"tslink/core"
|
||||
)
|
||||
|
||||
type settingsPage struct {
|
||||
app *App
|
||||
list widget.List
|
||||
|
||||
theme widget.Enum
|
||||
lang widget.Enum
|
||||
restart widget.Clickable
|
||||
}
|
||||
|
||||
func newSettingsPage(a *App) *settingsPage {
|
||||
p := &settingsPage{app: a}
|
||||
p.list.Axis = layout.Vertical
|
||||
p.theme.Value = "dark"
|
||||
if !a.th.Dark {
|
||||
p.theme.Value = "light"
|
||||
}
|
||||
p.lang.Value = "zh"
|
||||
if a.th.Lang == LangEN {
|
||||
p.lang.Value = "en"
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *settingsPage) Layout(a *App, gtx C, st core.State) D {
|
||||
th := a.th
|
||||
|
||||
if p.theme.Update(gtx) {
|
||||
th.SetDark(p.theme.Value == "dark")
|
||||
}
|
||||
if p.lang.Update(gtx) {
|
||||
if p.lang.Value == "en" {
|
||||
th.Lang = LangEN
|
||||
} else {
|
||||
th.Lang = LangZH
|
||||
}
|
||||
}
|
||||
if p.restart.Clicked(gtx) && a.opt.Supervisor != nil {
|
||||
a.opt.Supervisor.Restart()
|
||||
a.notify(th.T(KStateRetrying), LevelInfo)
|
||||
}
|
||||
|
||||
items := []layout.Widget{
|
||||
func(gtx C) D { return p.appearanceCard(a, gtx) },
|
||||
func(gtx C) D { return p.aboutCard(a, gtx, st) },
|
||||
}
|
||||
return material.List(th.Theme, &p.list).Layout(gtx, len(items), func(gtx C, i int) D {
|
||||
return layout.Inset{Bottom: SpaceMD}.Layout(gtx, items[i])
|
||||
})
|
||||
}
|
||||
|
||||
func (p *settingsPage) appearanceCard(a *App, gtx C) D {
|
||||
th := a.th
|
||||
card := th.Card()
|
||||
card.Title = th.T(KNavSettings)
|
||||
return card.Layout(th, gtx, func(gtx C) D {
|
||||
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
|
||||
layout.Rigid(func(gtx C) D {
|
||||
return p.settingRow(a, gtx, th.T(KSetTheme), "", func(gtx C) D {
|
||||
return th.Segmented(gtx, &p.theme, []SegmentOption{
|
||||
{Key: "dark", Label: th.T(KSetThemeDark), Count: -1},
|
||||
{Key: "light", Label: th.T(KSetThemeLight), Count: -1},
|
||||
})
|
||||
})
|
||||
}),
|
||||
layout.Rigid(th.Divider),
|
||||
layout.Rigid(func(gtx C) D {
|
||||
hint := ""
|
||||
if !th.HasCJK {
|
||||
hint = th.T(KSetFontMissing)
|
||||
}
|
||||
return p.settingRow(a, gtx, th.T(KSetLanguage), hint, func(gtx C) D {
|
||||
return th.Segmented(gtx, &p.lang, []SegmentOption{
|
||||
{Key: "zh", Label: "中文", Count: -1},
|
||||
{Key: "en", Label: "English", Count: -1},
|
||||
})
|
||||
})
|
||||
}),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
func (p *settingsPage) settingRow(a *App, gtx C, label, hint string, control layout.Widget) D {
|
||||
th := a.th
|
||||
return layout.Inset{Top: SpaceSM, Bottom: SpaceSM}.Layout(gtx, func(gtx C) D {
|
||||
return layout.Flex{Alignment: layout.Middle}.Layout(gtx,
|
||||
layout.Flexed(1, func(gtx C) D {
|
||||
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
|
||||
layout.Rigid(th.Body(label).Layout),
|
||||
layout.Rigid(func(gtx C) D {
|
||||
if hint == "" {
|
||||
return D{}
|
||||
}
|
||||
return th.Caption(hint).Layout(gtx)
|
||||
}),
|
||||
)
|
||||
}),
|
||||
layout.Rigid(control),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
func (p *settingsPage) aboutCard(a *App, gtx C, st core.State) D {
|
||||
th := a.th
|
||||
card := th.Card()
|
||||
card.Title = th.T(KSetAbout)
|
||||
card.Trailing = func(gtx C) D {
|
||||
return th.Button(gtx, &p.restart, ButtonStyle{
|
||||
Kind: ButtonSubtle, Text: th.T(KRetry), Icon: IconRefresh,
|
||||
})
|
||||
}
|
||||
|
||||
cfgPath := a.opt.ConfigPath
|
||||
if a.opt.ConfigURL != "" {
|
||||
cfgPath = a.opt.ConfigURL
|
||||
}
|
||||
fontPath := a.fonts.CJKPath
|
||||
if fontPath == "" {
|
||||
fontPath = th.T(KNone)
|
||||
}
|
||||
|
||||
return card.Layout(th, gtx, func(gtx C) D {
|
||||
rows := []KV{
|
||||
{Key: th.T(KSetVersion), Value: orDash(a.opt.Version), Mono: true},
|
||||
{Key: "Runtime", Value: runtimeInfo(), Mono: true},
|
||||
{Key: th.T(KSetConfigPath), Value: orDash(cfgPath), Mono: true},
|
||||
{Key: th.T(KSetFont), Value: fontPath, Mono: true},
|
||||
{Key: th.T(KStateRunning), Value: st.Phase.String()},
|
||||
}
|
||||
if st.Err != "" {
|
||||
rows = append(rows, KV{Key: th.T(KError), Value: st.Err, Level: LevelFail})
|
||||
}
|
||||
return th.KVList(gtx, rows)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user