package ui import ( "fmt" "os" "proxy_socks5/service" "regexp" "strconv" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) const reg = "^[0-9]*[1-9][0-9]*$" type UI struct { Options *Options mw *fyne.Window } func New(op ...Option) GUIApp { opts := &Options{} for _, o := range op { o(opts) } if err := opts.Validate(); err != nil { panic(fmt.Errorf("init ui failed: %v", err)) } //fyne a := app.New() w := a.NewWindow(fmt.Sprintf("%v %v", opts.Name, opts.Version)) var port string label := widget.NewLabel("") label.Hidden = true input := widget.NewEntry() input.SetPlaceHolder("Please Input The Port...") w.SetContent(container.NewVBox( label, input, widget.NewButton("Listen", func() { port = input.Text r, _ := regexp.Compile(reg) if r.MatchString(port) { //是数字 i, _ := strconv.ParseInt(port, 10, 64) if 1 < 0 || i > 65535 { port = "1080" } } else { //否则 port = "1080" } input.Hidden = true label.Hidden = false label.TextStyle.Bold = true label.SetText(fmt.Sprintf("Listening at %v Succeed!!!", port)) service.RunServe(port) }), )) w.Resize(fyne.NewSize(240, 100)) return &UI{ Options: opts, mw: &w, } } func (u *UI) Run(exitCh chan os.Signal) int { window := *u.mw window.ShowAndRun() return 0 } func (u *UI) Close() { window := *u.mw window.Close() }