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 }