package ui import ( "gioui.org/layout" "gioui.org/unit" "gioui.org/widget" "gioui.org/widget/material" "git.wxccs.org/iceking2nd/winauth-go/internal/i18n" ) // settingsAction is what the settings popup returns to the caller. type settingsAction int const ( settingsActionNone settingsAction = iota settingsActionSetPassword settingsActionChangePassword settingsActionImportLegacy settingsActionExport settingsActionRestoreBackup settingsActionPreferences settingsActionAbout ) // settingsMenu is the small popup that opens when the user clicks the // gear button in the main window's top bar. type settingsMenu struct { setPwBtn widget.Clickable changePwBtn widget.Clickable importBtn widget.Clickable exportBtn widget.Clickable restoreBtn widget.Clickable prefsBtn widget.Clickable aboutBtn widget.Clickable cancelBtn widget.Clickable } func newSettingsMenu() *settingsMenu { return &settingsMenu{} } // Pick returns the chosen action and whether the menu should close. func (m *settingsMenu) Pick(gtx layout.Context) (settingsAction, bool) { switch { case m.setPwBtn.Clicked(gtx): return settingsActionSetPassword, true case m.changePwBtn.Clicked(gtx): return settingsActionChangePassword, true case m.importBtn.Clicked(gtx): return settingsActionImportLegacy, true case m.exportBtn.Clicked(gtx): return settingsActionExport, true case m.restoreBtn.Clicked(gtx): return settingsActionRestoreBackup, true case m.prefsBtn.Clicked(gtx): return settingsActionPreferences, true case m.aboutBtn.Clicked(gtx): return settingsActionAbout, true case m.cancelBtn.Clicked(gtx): return settingsActionNone, true } return settingsActionNone, false } func (m *settingsMenu) Layout(gtx layout.Context, th *material.Theme) layout.Dimensions { fillBackground(gtx, activePalette.ScrimBg) row := func(btn *widget.Clickable, label string) layout.FlexChild { return layout.Rigid(func(gtx layout.Context) layout.Dimensions { return layout.Inset{Top: unit.Dp(4), Bottom: unit.Dp(4)}.Layout(gtx, func(gtx layout.Context) layout.Dimensions { gtx.Constraints.Min.X = gtx.Constraints.Max.X return material.Button(th, btn, label).Layout(gtx) }) }) } return layout.Center.Layout(gtx, func(gtx layout.Context) layout.Dimensions { gtx.Constraints.Max.X = gtx.Dp(280) return widget.Border{ Color: activePalette.DialogBorder, CornerRadius: unit.Dp(4), Width: unit.Dp(1), }.Layout(gtx, func(gtx layout.Context) layout.Dimensions { fillBackground(gtx, activePalette.DialogBg) return layout.UniformInset(unit.Dp(16)).Layout(gtx, func(gtx layout.Context) layout.Dimensions { return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(material.H6(th, i18n.T("menu_settings")).Layout), layout.Rigid(layout.Spacer{Height: unit.Dp(12)}.Layout), row(&m.setPwBtn, i18n.T("menu_set_password")), row(&m.changePwBtn, i18n.T("menu_change_password")), row(&m.importBtn, i18n.T("menu_import_legacy")), row(&m.exportBtn, i18n.T("menu_export")), row(&m.restoreBtn, i18n.T("menu_restore_backup")), row(&m.prefsBtn, i18n.T("menu_preferences")), row(&m.aboutBtn, i18n.T("menu_about")), layout.Rigid(layout.Spacer{Height: unit.Dp(8)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { return layout.Flex{Axis: layout.Horizontal, Spacing: layout.SpaceStart}.Layout(gtx, layout.Rigid(material.Button(th, &m.cancelBtn, i18n.T("btn_cancel")).Layout), ) }), ) }) }) }) }