package ui import ( "gioui.org/layout" "gioui.org/unit" "gioui.org/widget" "gioui.org/widget/material" "git.wxccs.org/iceking2nd/winauth-go/internal/i18n" ) // setPasswordDialog collects a new password and a confirmation. Leaving // both fields empty disables encryption (passphrase = nil). type setPasswordDialog struct { pwEd widget.Editor confirmEd widget.Editor okBtn widget.Clickable cancelBtn widget.Clickable errorMsg string } func newSetPasswordDialog() *setPasswordDialog { d := &setPasswordDialog{} d.pwEd.SingleLine = true d.pwEd.Mask = '*' d.confirmEd.SingleLine = true d.confirmEd.Mask = '*' return d } // Layout takes onDone(password, ok). ok=true on submit; an empty // password byte slice signals "disable encryption", a non-empty slice // is the new passphrase. func (d *setPasswordDialog) Layout( gtx layout.Context, th *material.Theme, onDone func(password []byte, ok bool), ) layout.Dimensions { if d.okBtn.Clicked(gtx) { pw := d.pwEd.Text() confirm := d.confirmEd.Text() if pw != confirm { d.errorMsg = i18n.T("msg_password_mismatch") } else { onDone([]byte(pw), true) return layout.Dimensions{Size: gtx.Constraints.Max} } } if d.cancelBtn.Clicked(gtx) { onDone(nil, false) return layout.Dimensions{Size: gtx.Constraints.Max} } body := func(gtx layout.Context) layout.Dimensions { return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(labeledEditor(th, i18n.T("label_password"), &d.pwEd, "")), layout.Rigid(labeledEditor(th, i18n.T("label_password_confirm"), &d.confirmEd, "")), layout.Rigid(layout.Spacer{Height: unit.Dp(4)}.Layout), layout.Rigid(material.Caption(th, i18n.T("hint_password_empty_disables")).Layout), layout.Rigid(errorLabel(th, d.errorMsg)), ) } return modalCard(gtx, th, i18n.T("dialog_set_password_title"), i18n.T("btn_ok"), i18n.T("btn_cancel"), &d.okBtn, &d.cancelBtn, body) }