Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
2.9 KB go
//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()
}