golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/ui/aboutdialog.go (about)

     1  /* SPDX-License-Identifier: MIT
     2   *
     3   * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved.
     4   */
     5  
     6  package ui
     7  
     8  import (
     9  	"runtime"
    10  	"strings"
    11  
    12  	"github.com/lxn/walk"
    13  	"github.com/lxn/win"
    14  	"golang.org/x/sys/windows"
    15  	"golang.zx2c4.com/wireguard/windows/driver"
    16  
    17  	"golang.zx2c4.com/wireguard/windows/l18n"
    18  	"golang.zx2c4.com/wireguard/windows/version"
    19  )
    20  
    21  var (
    22  	easterEggIndex     = -1
    23  	showingAboutDialog *walk.Dialog
    24  )
    25  
    26  func onAbout(owner walk.Form) {
    27  	showError(runAboutDialog(owner), owner)
    28  }
    29  
    30  func runAboutDialog(owner walk.Form) error {
    31  	if showingAboutDialog != nil {
    32  		showingAboutDialog.Show()
    33  		raise(showingAboutDialog.Handle())
    34  		return nil
    35  	}
    36  
    37  	vbl := walk.NewVBoxLayout()
    38  	vbl.SetMargins(walk.Margins{80, 20, 80, 20})
    39  	vbl.SetSpacing(10)
    40  
    41  	var disposables walk.Disposables
    42  	defer disposables.Treat()
    43  
    44  	var err error
    45  	showingAboutDialog, err = walk.NewDialogWithFixedSize(owner)
    46  	if err != nil {
    47  		return err
    48  	}
    49  	defer func() {
    50  		showingAboutDialog = nil
    51  	}()
    52  	disposables.Add(showingAboutDialog)
    53  	showingAboutDialog.SetTitle(l18n.Sprintf("About WireGuard"))
    54  	showingAboutDialog.SetLayout(vbl)
    55  	if icon, err := loadLogoIcon(32); err == nil {
    56  		showingAboutDialog.SetIcon(icon)
    57  	}
    58  
    59  	font, _ := walk.NewFont("Segoe UI", 9, 0)
    60  	showingAboutDialog.SetFont(font)
    61  
    62  	iv, err := walk.NewImageView(showingAboutDialog)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	iv.SetCursor(walk.CursorHand())
    67  	iv.MouseUp().Attach(func(x, y int, button walk.MouseButton) {
    68  		if button == walk.LeftButton {
    69  			win.ShellExecute(showingAboutDialog.Handle(), nil, windows.StringToUTF16Ptr("https://www.wireguard.com/"), nil, nil, win.SW_SHOWNORMAL)
    70  		} else if easterEggIndex >= 0 && button == walk.RightButton {
    71  			if icon, err := loadSystemIcon("moricons", int32(easterEggIndex), 128); err == nil {
    72  				iv.SetImage(icon)
    73  				easterEggIndex++
    74  			} else {
    75  				easterEggIndex = -1
    76  				if logo, err := loadLogoIcon(128); err == nil {
    77  					iv.SetImage(logo)
    78  				}
    79  			}
    80  		}
    81  	})
    82  	if logo, err := loadLogoIcon(128); err == nil {
    83  		iv.SetImage(logo)
    84  	}
    85  	iv.Accessibility().SetName(l18n.Sprintf("WireGuard logo image"))
    86  
    87  	wgLbl, err := walk.NewTextLabel(showingAboutDialog)
    88  	if err != nil {
    89  		return err
    90  	}
    91  	wgFont, _ := walk.NewFont("Segoe UI", 16, walk.FontBold)
    92  	wgLbl.SetFont(wgFont)
    93  	wgLbl.SetTextAlignment(walk.AlignHCenterVNear)
    94  	wgLbl.SetText("WireGuard")
    95  
    96  	detailsLbl, err := walk.NewTextLabel(showingAboutDialog)
    97  	if err != nil {
    98  		return err
    99  	}
   100  	detailsLbl.SetTextAlignment(walk.AlignHCenterVNear)
   101  	detailsLbl.SetText(l18n.Sprintf("App version: %s\nDriver version: %s\nGo version: %s\nOperating system: %s\nArchitecture: %s", version.Number, driver.Version(), strings.TrimPrefix(runtime.Version(), "go"), version.OsName(), version.Arch()))
   102  
   103  	copyrightLbl, err := walk.NewTextLabel(showingAboutDialog)
   104  	if err != nil {
   105  		return err
   106  	}
   107  	copyrightFont, _ := walk.NewFont("Segoe UI", 7, 0)
   108  	copyrightLbl.SetFont(copyrightFont)
   109  	copyrightLbl.SetTextAlignment(walk.AlignHCenterVNear)
   110  	copyrightLbl.SetText("Copyright © 2015-2022 Jason A. Donenfeld. All Rights Reserved.")
   111  
   112  	buttonCP, err := walk.NewComposite(showingAboutDialog)
   113  	if err != nil {
   114  		return err
   115  	}
   116  	hbl := walk.NewHBoxLayout()
   117  	hbl.SetMargins(walk.Margins{VNear: 10})
   118  	buttonCP.SetLayout(hbl)
   119  	walk.NewHSpacer(buttonCP)
   120  	closePB, err := walk.NewPushButton(buttonCP)
   121  	if err != nil {
   122  		return err
   123  	}
   124  	closePB.SetAlignment(walk.AlignHCenterVNear)
   125  	closePB.SetText(l18n.Sprintf("Close"))
   126  	closePB.Clicked().Attach(showingAboutDialog.Accept)
   127  	donatePB, err := walk.NewPushButton(buttonCP)
   128  	if err != nil {
   129  		return err
   130  	}
   131  	donatePB.SetAlignment(walk.AlignHCenterVNear)
   132  	donatePB.SetText(l18n.Sprintf("♥ &Donate!"))
   133  	donatePB.Clicked().Attach(func() {
   134  		if easterEggIndex == -1 {
   135  			easterEggIndex = 0
   136  		}
   137  		win.ShellExecute(showingAboutDialog.Handle(), nil, windows.StringToUTF16Ptr("https://www.wireguard.com/donations/"), nil, nil, win.SW_SHOWNORMAL)
   138  		showingAboutDialog.Accept()
   139  	})
   140  	walk.NewHSpacer(buttonCP)
   141  
   142  	showingAboutDialog.SetDefaultButton(donatePB)
   143  	showingAboutDialog.SetCancelButton(closePB)
   144  
   145  	disposables.Spare()
   146  
   147  	showingAboutDialog.Run()
   148  
   149  	return nil
   150  }