From 51a410523acd4687a91ff6b48e05a4c7d711126a Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 28 Apr 2019 12:27:06 +0200 Subject: updater: add initial skeleton Signed-off-by: Jason A. Donenfeld --- ui/updatepage.go | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 ui/updatepage.go (limited to 'ui/updatepage.go') diff --git a/ui/updatepage.go b/ui/updatepage.go new file mode 100644 index 00000000..85b8558b --- /dev/null +++ b/ui/updatepage.go @@ -0,0 +1,106 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. + */ + +package ui + +import ( + "fmt" + "golang.zx2c4.com/wireguard/windows/updater" + + "github.com/lxn/walk" +) + +type UpdatePage struct { + *walk.TabPage +} + +func NewUpdatePage() (*UpdatePage, error) { + up := &UpdatePage{} + var err error + + if up.TabPage, err = walk.NewTabPage(); err != nil { + return nil, err + } + + up.SetTitle("An Update is Available!") + up.SetImage(iconProvider.updateAvailableImage) + //TODO: make title bold + up.SetLayout(walk.NewVBoxLayout()) + up.Layout().SetMargins(walk.Margins{18, 18, 18, 18}) + + instructions, _ := walk.NewTextLabel(up) + instructions.SetText("An update to WireGuard is available. It is highly advisable to update without delay.") + + status, _ := walk.NewTextLabel(up) + status.SetText("Status: Waiting for user") + + bar, _ := walk.NewProgressBar(up) + bar.SetVisible(false) + + button, _ := walk.NewPushButton(up) + button.SetText("Update Now") + + walk.NewVSpacer(up) + + button.Clicked().Attach(func() { + up.SetSuspended(true) + button.SetEnabled(false) + button.SetVisible(false) + bar.SetVisible(true) + bar.SetMarqueeMode(true) + up.SetSuspended(false) + progress := updater.DownloadVerifyAndExecute() + go func() { + for { + dp := <-progress + retNow := false + up.Synchronize(func() { + if dp.Error != nil { + up.SetSuspended(true) + bar.SetVisible(false) + bar.SetValue(0) + bar.SetRange(0, 1) + bar.SetMarqueeMode(false) + button.SetVisible(true) + button.SetEnabled(true) + status.SetText(fmt.Sprintf("Error: %v. Please try again.", dp.Error)) + up.SetSuspended(false) + retNow = true + return + } + if len(dp.Activity) > 0 { + status.SetText(fmt.Sprintf("Status: %s", dp.Activity)) + } + if dp.BytesTotal > 0 { + bar.SetMarqueeMode(false) + bar.SetRange(0, int(dp.BytesTotal)) + bar.SetValue(int(dp.BytesDownloaded)) + } else { + bar.SetMarqueeMode(true) + bar.SetValue(0) + bar.SetRange(0, 1) + } + if dp.Complete { + up.SetSuspended(true) + bar.SetVisible(false) + bar.SetValue(0) + bar.SetRange(0, 0) + bar.SetMarqueeMode(false) + button.SetVisible(true) + button.SetEnabled(true) + status.SetText("Status: Complete!") + up.SetSuspended(false) + retNow = true + return + } + }) + if retNow { + return + } + } + }() + }) + return up, nil +} -- cgit v1.2.3-59-g8ed1b