From 3e8cf39903775ecb6b8ebe03d43591453fe3c7d8 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 26 Apr 2019 20:05:24 +0200 Subject: ui: simplify everything Signed-off-by: Jason A. Donenfeld --- ui/managewindow.go | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 ui/managewindow.go (limited to 'ui/managewindow.go') diff --git a/ui/managewindow.go b/ui/managewindow.go new file mode 100644 index 00000000..85c55844 --- /dev/null +++ b/ui/managewindow.go @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package ui + +import ( + "github.com/lxn/walk" + "github.com/lxn/win" + "golang.zx2c4.com/wireguard/windows/service" +) + +type ManageTunnelsWindow struct { + *walk.MainWindow + + tunnelsPage *TunnelsPage + logPage *LogPage + + tunnelChangedCB *service.TunnelChangeCallback +} + +func NewManageTunnelsWindow() (*ManageTunnelsWindow, error) { + var err error + + var disposables walk.Disposables + defer disposables.Treat() + + mtw := &ManageTunnelsWindow{} + + mtw.MainWindow, err = walk.NewMainWindowWithName("WireGuard") + if err != nil { + return nil, err + } + disposables.Add(mtw) + + mtw.SetIcon(iconProvider.baseIcon) + mtw.SetTitle("WireGuard") + font, err := walk.NewFont("Segoe UI", 9, 0) + if err != nil { + return nil, err + } + mtw.AddDisposable(font) + mtw.SetFont(font) + mtw.SetSize(walk.Size{900, 600}) + mtw.SetLayout(walk.NewVBoxLayout()) + mtw.Closing().Attach(func(canceled *bool, reason walk.CloseReason) { + // "Close to tray" instead of exiting application + onQuit() + }) + mtw.VisibleChanged().Attach(func() { + if mtw.Visible() { + mtw.tunnelsPage.updateConfView() + win.SetForegroundWindow(mtw.Handle()) + win.BringWindowToTop(mtw.Handle()) + + mtw.logPage.scrollToBottom() + } + }) + + tabWidget, _ := walk.NewTabWidget(mtw) + + mtw.tunnelsPage, _ = NewTunnelsPage() + tabWidget.Pages().Add(mtw.tunnelsPage.TabPage) + + mtw.logPage, _ = NewLogPage() + tabWidget.Pages().Add(mtw.logPage.TabPage) + + disposables.Spare() + + mtw.tunnelChangedCB = service.IPCClientRegisterTunnelChange(mtw.onTunnelChange) + mtw.onTunnelChange(nil, service.TunnelUnknown, nil) + + return mtw, nil +} + +func (mtw *ManageTunnelsWindow) Dispose() { + if mtw.tunnelChangedCB != nil { + mtw.tunnelChangedCB.Unregister() + mtw.tunnelChangedCB = nil + } + mtw.MainWindow.Dispose() +} + +func (mtw *ManageTunnelsWindow) onTunnelChange(tunnel *service.Tunnel, state service.TunnelState, err error) { + globalState, err2 := service.IPCClientGlobalState() + mtw.Synchronize(func() { + if err2 == nil { + icon, err2 := iconProvider.IconWithOverlayForState(globalState) + if err2 == nil { + mtw.SetIcon(icon) + } + } + + if err != nil && mtw.Visible() { + errMsg := err.Error() + if len(errMsg) > 0 && errMsg[len(errMsg)-1] != '.' { + errMsg += "." + } + walk.MsgBox(mtw, "Tunnel Error", errMsg+"\n\nPlease consult the log for more information.", walk.MsgBoxIconWarning) + } + }) +} -- cgit v1.2.3-59-g8ed1b