From 5b8d4ff0a3d0dabe620374c65e36c08b7f501cf2 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Wed, 10 Apr 2019 12:47:03 +0200 Subject: ui: only allow a single tunnel to be active at any time Signed-off-by: Alexander Neumann Signed-off-by: Jason A. Donenfeld --- ui/confview.go | 49 ++++++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 21 deletions(-) (limited to 'ui/confview.go') diff --git a/ui/confview.go b/ui/confview.go index b424720a..230d4dd7 100644 --- a/ui/confview.go +++ b/ui/confview.go @@ -42,8 +42,9 @@ type labelTextLine struct { } type toggleActiveLine struct { - composite *walk.Composite - button *walk.PushButton + composite *walk.Composite + button *walk.PushButton + tunnelTracker *TunnelTracker } type interfaceView struct { @@ -195,6 +196,10 @@ func (tal *toggleActiveLine) update(state service.TunnelState) { enabled, text = false, "" } + if tt := tal.tunnelTracker; tt != nil && tt.InTransition() { + enabled = false + } + tal.button.SetEnabled(enabled) tal.button.SetText(text) tal.button.SetVisible(state != service.TunnelUnknown) @@ -430,28 +435,30 @@ var crossThreadMessageHijack = windows.NewCallback(func(hwnd win.HWND, msg uint3 return win.CallWindowProc(cv.originalWndProc, hwnd, msg, wParam, lParam) }) -func (cv *ConfView) onToggleActiveClicked() { - state, err := cv.tunnel.State() - if err != nil { - walk.MsgBox(cv.Form(), "Failed to retrieve tunnel state", fmt.Sprintf("Error: %s", err.Error()), walk.MsgBoxIconError) - return - } - - cv.interfaze.toggleActive.button.SetEnabled(false) +func (cv *ConfView) TunnelTracker() *TunnelTracker { + return cv.interfaze.toggleActive.tunnelTracker +} - switch state { - case service.TunnelStarted: - if err := cv.tunnel.Stop(); err != nil { - walk.MsgBox(cv.Form(), "Failed to stop tunnel", fmt.Sprintf("Error: %s", err.Error()), walk.MsgBoxIconError) - } +func (cv *ConfView) SetTunnelTracker(tunnelTracker *TunnelTracker) { + cv.interfaze.toggleActive.tunnelTracker = tunnelTracker +} - case service.TunnelStopped: - if err := cv.tunnel.Start(); err != nil { - walk.MsgBox(cv.Form(), "Failed to start tunnel", fmt.Sprintf("Error: %s", err.Error()), walk.MsgBoxIconError) - } +func (cv *ConfView) onToggleActiveClicked() { + cv.interfaze.toggleActive.button.SetEnabled(false) - default: - panic("unexpected state") + var title string + var err error + tt := cv.TunnelTracker() + if activeTunnel := tt.ActiveTunnel(); activeTunnel != nil && activeTunnel.Name == cv.tunnel.Name { + title = "Failed to deactivate tunnel" + err = tt.DeactivateTunnel() + } else { + title = "Failed to activate tunnel" + err = tt.ActivateTunnel(cv.tunnel) + } + if err != nil { + walk.MsgBox(cv.Form(), title, err.Error(), walk.MsgBoxIconError) + return } cv.setTunnel(cv.tunnel) -- cgit v1.2.3-59-g8ed1b