From afa6185263f07d6f34246a26be73e3eafdd4c37f Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 1 May 2019 18:30:07 +0200 Subject: ui: use icons instead of unicode font Signed-off-by: Jason A. Donenfeld --- .gitignore | 1 + Makefile | 5 ++- build.bat | 7 +++- installer/wireguard.wxs | 4 +-- resources.rc | 5 ++- ui/icon/128.png | Bin 8419 -> 0 bytes ui/icon/16.png | Bin 869 -> 0 bytes ui/icon/256.png | Bin 17786 -> 0 bytes ui/icon/32.png | Bin 1951 -> 0 bytes ui/icon/48.png | Bin 2986 -> 0 bytes ui/icon/64.png | Bin 3922 -> 0 bytes ui/icon/add.svg | 2 ++ ui/icon/delete.svg | 2 ++ ui/icon/export.svg | 2 ++ ui/icon/icon.ico | Bin 117355 -> 0 bytes ui/icon/wireguard.svg | 2 ++ ui/iconprovider.go | 16 ++++----- ui/managewindow.go | 2 +- ui/tray.go | 2 +- ui/tunnelspage.go | 90 ++++++++++++++++++++++++++---------------------- ui/ui.go | 12 ++----- 21 files changed, 87 insertions(+), 65 deletions(-) delete mode 100644 ui/icon/128.png delete mode 100644 ui/icon/16.png delete mode 100644 ui/icon/256.png delete mode 100644 ui/icon/32.png delete mode 100644 ui/icon/48.png delete mode 100644 ui/icon/64.png create mode 100644 ui/icon/add.svg create mode 100644 ui/icon/delete.svg create mode 100644 ui/icon/export.svg delete mode 100644 ui/icon/icon.ico create mode 100644 ui/icon/wireguard.svg diff --git a/.gitignore b/.gitignore index dcb7cf60..0f02248c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ *.bak *.syso .idea +*.ico diff --git a/Makefile b/Makefile index c9a26d0a..76c4c6d3 100644 --- a/Makefile +++ b/Makefile @@ -8,13 +8,16 @@ export GOROOT := $(PWD)/.deps/goroot rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) SOURCE_FILES := $(call rwildcard,,*.go *.c *.h) .deps/prepared -RESOURCE_FILES := resources.rc version.h manifest.xml ui/icon/icon.ico +RESOURCE_FILES := resources.rc version.h manifest.xml $(patsubst %.svg,%.ico,$(wildcard ui/icon/*.svg)) DEPLOYMENT_HOST ?= winvm DEPLOYMENT_PATH ?= Desktop all: amd64/wireguard.exe x86/wireguard.exe +%.ico: %.svg + convert -background none $< -define icon:auto-resize="256,128,96,64,48,32,16" $@ + .deps/prepared: export GOROOT := $(OLD_GOROOT) .deps/prepared: $(wildcard golang-*.patch) rm -rf .deps && mkdir -p .deps diff --git a/build.bat b/build.bat index 250b90eb..2d13b1d9 100644 --- a/build.bat +++ b/build.bat @@ -5,11 +5,12 @@ rem Copyright (C) 2019 WireGuard LLC. All Rights Reserved. set STARTDIR=%cd% set OLDPATH=%PATH% -if exist .deps\prepared goto :build +if exist .deps\prepared goto :render :installdeps rmdir /s /q .deps 2> NUL mkdir .deps || goto :error cd .deps || goto :error + call :download imagemagick.zip https://imagemagick.org/download/binaries/ImageMagick-7.0.8-42-portable-Q16-x64.zip 584e069f56456ce7dde40220948ff9568ac810688c892c5dfb7f6db902aa05aa "convert.exe colors.xml delegates.xml" || goto :error call :download go.zip https://dl.google.com/go/go1.12.3.windows-amd64.zip 1806e089e85b84f192d782a7f70f90a32e0eccfd181405857e612f806ec04059 || goto :error rem Mirror of https://musl.cc/i686-w64-mingw32-native.zip call :download mingw-x86.zip https://download.wireguard.com/windows-toolchain/distfiles/i686-w64-mingw32-native-20190425.zip 5810b4a9af34c12690ec355ad2a237d2a4c16f5e8cb68988dc0f2e48457534d0 || goto :error @@ -22,6 +23,10 @@ if exist .deps\prepared goto :build copy /y NUL prepared > NUL || goto :error cd .. || goto :error +:render + echo [+] Rendering icons + for %%a in ("ui\icon\*.svg") do "%STARTDIR%\.deps\convert.exe" -background none "%%~fa" -define icon:auto-resize="256,128,96,64,48,32,16" "%%~dpna.ico" || goto :error + :build set PATH=%STARTDIR%\.deps\go\bin\;%PATH% set CFLAGS=-O3 -Wall -std=gnu11 diff --git a/installer/wireguard.wxs b/installer/wireguard.wxs index 747d56fa..643a226d 100644 --- a/installer/wireguard.wxs +++ b/installer/wireguard.wxs @@ -26,10 +26,10 @@ - + - + diff --git a/resources.rc b/resources.rc index 1677ae13..89e90bc6 100644 --- a/resources.rc +++ b/resources.rc @@ -8,7 +8,10 @@ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST manifest.xml -1 ICON ui/icon/icon.ico +$wireguard.ico ICON ui/icon/wireguard.ico +add.ico ICON ui/icon/add.ico +delete.ico ICON ui/icon/delete.ico +export.ico ICON ui/icon/export.ico VS_VERSION_INFO VERSIONINFO FILEVERSION WIREGUARD_WINDOWS_VERSION_ARRAY diff --git a/ui/icon/128.png b/ui/icon/128.png deleted file mode 100644 index a3ba1ca0..00000000 Binary files a/ui/icon/128.png and /dev/null differ diff --git a/ui/icon/16.png b/ui/icon/16.png deleted file mode 100644 index 51c71e0e..00000000 Binary files a/ui/icon/16.png and /dev/null differ diff --git a/ui/icon/256.png b/ui/icon/256.png deleted file mode 100644 index 7b5f63e5..00000000 Binary files a/ui/icon/256.png and /dev/null differ diff --git a/ui/icon/32.png b/ui/icon/32.png deleted file mode 100644 index ee4acd97..00000000 Binary files a/ui/icon/32.png and /dev/null differ diff --git a/ui/icon/48.png b/ui/icon/48.png deleted file mode 100644 index 24ab1cb2..00000000 Binary files a/ui/icon/48.png and /dev/null differ diff --git a/ui/icon/64.png b/ui/icon/64.png deleted file mode 100644 index e0295697..00000000 Binary files a/ui/icon/64.png and /dev/null differ diff --git a/ui/icon/add.svg b/ui/icon/add.svg new file mode 100644 index 00000000..2e1dd028 --- /dev/null +++ b/ui/icon/add.svg @@ -0,0 +1,2 @@ + + diff --git a/ui/icon/delete.svg b/ui/icon/delete.svg new file mode 100644 index 00000000..6c204271 --- /dev/null +++ b/ui/icon/delete.svg @@ -0,0 +1,2 @@ + + diff --git a/ui/icon/export.svg b/ui/icon/export.svg new file mode 100644 index 00000000..caef7a2c --- /dev/null +++ b/ui/icon/export.svg @@ -0,0 +1,2 @@ + + diff --git a/ui/icon/icon.ico b/ui/icon/icon.ico deleted file mode 100644 index 9fd9f330..00000000 Binary files a/ui/icon/icon.ico and /dev/null differ diff --git a/ui/icon/wireguard.svg b/ui/icon/wireguard.svg new file mode 100644 index 00000000..b8ac5273 --- /dev/null +++ b/ui/icon/wireguard.svg @@ -0,0 +1,2 @@ + + diff --git a/ui/iconprovider.go b/ui/iconprovider.go index f9d3597e..64d5775d 100644 --- a/ui/iconprovider.go +++ b/ui/iconprovider.go @@ -17,7 +17,7 @@ type rectAndState struct { } type IconProvider struct { - baseIcon *walk.Icon + wireguardIcon *walk.Icon imagesByRectAndState map[rectAndState]*walk.Bitmap iconsByState map[service.TunnelState]*walk.Icon stoppedBrush *walk.SolidColorBrush @@ -121,10 +121,10 @@ func NewIconProvider(dpi int) (*IconProvider, error) { var disposables walk.Disposables defer disposables.Treat() - if tsip.baseIcon, err = walk.NewIconFromResourceId(1); err != nil { + if tsip.wireguardIcon, err = walk.NewIconFromResource("$wireguard.ico"); err != nil { return nil, err } - disposables.Add(tsip.baseIcon) + disposables.Add(tsip.wireguardIcon) if tsip.stoppedBrush, err = walk.NewSolidColorBrush(hexColor(colorStopped)); err != nil { return nil, err @@ -202,9 +202,9 @@ func (tsip *IconProvider) Dispose() { tsip.startedPen.Dispose() tsip.startedPen = nil } - if tsip.baseIcon != nil { - tsip.baseIcon.Dispose() - tsip.baseIcon = nil + if tsip.wireguardIcon != nil { + tsip.wireguardIcon.Dispose() + tsip.wireguardIcon = nil } if tsip.updateAvailableImage != nil { tsip.updateAvailableImage.Dispose() @@ -299,7 +299,7 @@ func (tsip *IconProvider) IconWithOverlayForState(state service.TunnelState) (*w return icon, nil } - size := tsip.baseIcon.Size() + size := tsip.wireguardIcon.Size() bmp, err := walk.NewBitmapWithTransparentPixels(size) if err != nil { @@ -313,7 +313,7 @@ func (tsip *IconProvider) IconWithOverlayForState(state service.TunnelState) (*w } defer canvas.Dispose() - if err := canvas.DrawImage(tsip.baseIcon, walk.Point{}); err != nil { + if err := canvas.DrawImage(tsip.wireguardIcon, walk.Point{}); err != nil { return nil, err } diff --git a/ui/managewindow.go b/ui/managewindow.go index 01e7f734..91dc39fb 100644 --- a/ui/managewindow.go +++ b/ui/managewindow.go @@ -41,7 +41,7 @@ func NewManageTunnelsWindow() (*ManageTunnelsWindow, error) { return nil, err } - mtw.SetIcon(iconProvider.baseIcon) + mtw.SetIcon(iconProvider.wireguardIcon) mtw.SetTitle("WireGuard") font, err := walk.NewFont("Segoe UI", 9, 0) if err != nil { diff --git a/ui/tray.go b/ui/tray.go index 492f820c..4f22fc4d 100644 --- a/ui/tray.go +++ b/ui/tray.go @@ -48,7 +48,7 @@ func NewTray(mtw *ManageTunnelsWindow) (*Tray, error) { func (tray *Tray) setup() error { tray.SetToolTip("WireGuard: Deactivated") tray.SetVisible(true) - tray.SetIcon(iconProvider.baseIcon) + tray.SetIcon(iconProvider.wireguardIcon) tray.MouseDown().Attach(func(x, y int, button walk.MouseButton) { if button == walk.LeftButton { diff --git a/ui/tunnelspage.go b/ui/tunnelspage.go index a305496e..1eca896a 100644 --- a/ui/tunnelspage.go +++ b/ui/tunnelspage.go @@ -55,47 +55,55 @@ func NewTunnelsPage() (*TunnelsPage, error) { tp.tunnelsView.ItemActivated().Attach(tp.onTunnelsViewItemActivated) tp.tunnelsView.CurrentIndexChanged().Attach(tp.updateConfView) - // ToolBar actions - { - // HACK: Because of https://github.com/lxn/walk/issues/481 - // we need to put the ToolBar into its own Composite. - toolBarContainer, _ := walk.NewComposite(tunnelsContainer) - hlayout := walk.NewHBoxLayout() - hlayout.SetMargins(walk.Margins{}) - toolBarContainer.SetLayout(hlayout) - - tunnelsToolBar, _ := walk.NewToolBarWithOrientationAndButtonStyle(toolBarContainer, walk.Horizontal, walk.ToolBarButtonTextOnly) - - importAction := walk.NewAction() - importAction.SetText("Import tunnels from file...") - importAction.Triggered().Attach(tp.onImport) - - addAction := walk.NewAction() - addAction.SetText("Add empty tunnel") - addAction.Triggered().Attach(tp.onAddTunnel) - - exportTunnelsAction := walk.NewAction() - exportTunnelsAction.SetText("Export tunnels to zip...") - exportTunnelsAction.Triggered().Attach(tp.onExportTunnels) - - addMenu, _ := walk.NewMenu() - tp.AddDisposable(addMenu) - addMenu.Actions().Add(addAction) - addMenu.Actions().Add(importAction) - addMenuAction, _ := tunnelsToolBar.Actions().AddMenu(addMenu) - addMenuAction.SetText("➕") - - deleteAction := walk.NewAction() - tunnelsToolBar.Actions().Add(deleteAction) - deleteAction.SetText("➖") - deleteAction.Triggered().Attach(tp.onDelete) - - settingsMenu, _ := walk.NewMenu() - tp.AddDisposable(settingsMenu) - settingsMenu.Actions().Add(exportTunnelsAction) - settingsMenuAction, _ := tunnelsToolBar.Actions().AddMenu(settingsMenu) - settingsMenuAction.SetText("⚙") - } + // HACK: Because of https://github.com/lxn/walk/issues/481 + // we need to put the ToolBar into its own Composite. + toolBarContainer, _ := walk.NewComposite(tunnelsContainer) + hlayout := walk.NewHBoxLayout() + hlayout.SetMargins(walk.Margins{}) + toolBarContainer.SetLayout(hlayout) + + tunnelsToolBar, _ := walk.NewToolBarWithOrientationAndButtonStyle(toolBarContainer, walk.Horizontal, walk.ToolBarButtonImageOnly) + imageSize := walk.Size{tp.DPI() / 6, tp.DPI() / 6} // Dividing by six is the same as dividing by 96 and multiplying by 16. TODO: Use dynamic DPI + imageList, _ := walk.NewImageList(imageSize, walk.RGB(255, 255, 255)) + tunnelsToolBar.SetImageList(imageList) + + addMenu, _ := walk.NewMenu() + tp.AddDisposable(addMenu) + importAction := walk.NewAction() + importAction.SetText("Import tunnel(s) from file...") + importAction.Triggered().Attach(tp.onImport) + addAction := walk.NewAction() + addAction.SetText("Add empty tunnel") + addAction.Triggered().Attach(tp.onAddTunnel) + addMenu.Actions().Add(addAction) + addMenu.Actions().Add(importAction) + addMenuAction := walk.NewMenuAction(addMenu) + addMenuActionIcon, _ := walk.NewIconFromResourceWithSize("add.ico", imageSize) + addMenuActionImage, _ := walk.NewBitmapFromIcon(addMenuActionIcon, imageSize) + addMenuAction.SetImage(addMenuActionImage) + addMenuAction.SetToolTip(importAction.Text()) + addMenuAction.Triggered().Attach(tp.onImport) + tunnelsToolBar.Actions().Add(addMenuAction) + + tunnelsToolBar.Actions().Add(walk.NewSeparatorAction()) + + deleteAction := walk.NewAction() + deleteActionIcon, _ := walk.NewIconFromResourceWithSize("delete.ico", imageSize) + deleteActionImage, _ := walk.NewBitmapFromIcon(deleteActionIcon, imageSize) + deleteAction.SetImage(deleteActionImage) + deleteAction.SetToolTip("Remove selected tunnel(s)") + deleteAction.Triggered().Attach(tp.onDelete) + tunnelsToolBar.Actions().Add(deleteAction) + + tunnelsToolBar.Actions().Add(walk.NewSeparatorAction()) + + exportAction := walk.NewAction() + exportActionIcon, _ := walk.NewIconFromResourceWithSize("export.ico", imageSize) + exportActionImage, _ := walk.NewBitmapFromIcon(exportActionIcon, imageSize) + exportAction.SetImage(exportActionImage) + exportAction.SetToolTip("Export all tunnels to zip...") + exportAction.Triggered().Attach(tp.onExportTunnels) + tunnelsToolBar.Actions().Add(exportAction) currentTunnelContainer, _ := walk.NewComposite(tp) vlayout = walk.NewVBoxLayout() diff --git a/ui/ui.go b/ui/ui.go index 2625423a..4aeb4f42 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -124,20 +124,14 @@ func onAbout(owner walk.Form) { dlg, _ := walk.NewDialogWithFixedSize(owner) dlg.SetTitle("About WireGuard") dlg.SetLayout(vbl) - dlg.SetIcon(iconProvider.baseIcon) + dlg.SetIcon(iconProvider.wireguardIcon) font, _ := walk.NewFont("Segoe UI", 9, 0) dlg.SetFont(font) - icon, err := walk.NewIconFromResourceIdWithSize(1, walk.Size{128, 128}) - if err != nil { - panic(err) - } - dlg.AddDisposable(icon) - iv, _ := walk.NewImageView(dlg) - iv.SetImage(icon) - + logo, _ := walk.NewIconFromResourceWithSize("$wireguard.ico", walk.Size{owner.DPI() * 4 / 3, owner.DPI() * 4 / 3}) + iv.SetImage(logo) wgFont, _ := walk.NewFont("Segoe UI", 16, walk.FontBold) wgLbl, _ := walk.NewLabel(dlg) -- cgit v1.2.3-59-g8ed1b