//go:build windows /* SPDX-License-Identifier: MIT * * Phobos */ package ui import ( "strings" "github.com/lxn/walk" "golang.zx2c4.com/wireguard/windows/conf" "golang.zx2c4.com/wireguard/windows/l18n" ) type LinkDialog struct { *walk.Dialog linkEdit *walk.TextEdit acceptPB *walk.PushButton link string } func runLinkDialog(owner walk.Form) (string, bool) { dlg, err := newLinkDialog(owner) if err != nil { return "", false } if dlg.Run() != walk.DlgCmdOK { return "", false } return dlg.link, true } func clipboardPhobosLink() string { text, err := walk.Clipboard().Text() if err != nil || !conf.IsPhobosLink(text) { return "" } return strings.TrimSpace(text) } func newLinkDialog(owner walk.Form) (*LinkDialog, error) { var disposables walk.Disposables defer disposables.Treat() dlg := new(LinkDialog) var err error layout := walk.NewGridLayout() layout.SetSpacing(6) layout.SetMargins(walk.Margins{10, 10, 10, 10}) layout.SetColumnStretchFactor(0, 1) if dlg.Dialog, err = walk.NewDialog(owner); err != nil { return nil, err } disposables.Add(dlg) dlg.SetTitle(l18n.Sprintf("Import tunnel from link")) dlg.SetLayout(layout) dlg.SetMinMaxSize(walk.Size{500, 220}, walk.Size{0, 0}) if icon, err := loadSystemIcon("imageres", -3, 32); err == nil { dlg.SetIcon(icon) } hintLabel, err := walk.NewTextLabel(dlg) if err != nil { return nil, err } layout.SetRange(hintLabel, walk.Rectangle{0, 0, 2, 1}) hintLabel.SetText(l18n.Sprintf("Paste a phobos:// link. The tunnel name is taken from the link.")) if dlg.linkEdit, err = walk.NewTextEdit(dlg); err != nil { return nil, err } layout.SetRange(dlg.linkEdit, walk.Rectangle{0, 1, 2, 1}) dlg.linkEdit.SetText(clipboardPhobosLink()) dlg.linkEdit.TextChanged().Attach(dlg.updateAcceptButton) buttonsContainer, err := walk.NewComposite(dlg) if err != nil { return nil, err } layout.SetRange(buttonsContainer, walk.Rectangle{0, 2, 2, 1}) buttonsLayout := walk.NewHBoxLayout() buttonsLayout.SetMargins(walk.Margins{}) buttonsContainer.SetLayout(buttonsLayout) walk.NewHSpacer(buttonsContainer) if dlg.acceptPB, err = walk.NewPushButton(buttonsContainer); err != nil { return nil, err } dlg.acceptPB.SetText(l18n.Sprintf("&Import")) dlg.acceptPB.Clicked().Attach(dlg.onImport) cancelPB, err := walk.NewPushButton(buttonsContainer) if err != nil { return nil, err } cancelPB.SetText(l18n.Sprintf("Cancel")) cancelPB.Clicked().Attach(dlg.Cancel) dlg.SetCancelButton(cancelPB) dlg.SetDefaultButton(dlg.acceptPB) dlg.updateAcceptButton() disposables.Spare() return dlg, nil } func (dlg *LinkDialog) updateAcceptButton() { dlg.acceptPB.SetEnabled(conf.IsPhobosLink(dlg.linkEdit.Text())) } func (dlg *LinkDialog) onImport() { link := strings.TrimSpace(dlg.linkEdit.Text()) if _, _, err := conf.DecodePhobosLink(link); err != nil { showErrorCustom(dlg, l18n.Sprintf("Invalid link"), err.Error()) return } dlg.link = link dlg.Accept() }