From 861d6f48afd41b13ec3fde775ecf49d97beae6e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szymon=20=C5=81=C4=85giewka?= Date: Wed, 5 Jul 2023 21:54:20 +0200 Subject: [PATCH] cmd/trayscale: support showing "This device: node (IP)" --- internal/tray/tray.go | 51 ++++++++++++++++++++++++++++++++++++++----- internal/ui/app.go | 2 +- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/internal/tray/tray.go b/internal/tray/tray.go index aa13bc83..2a27f06a 100644 --- a/internal/tray/tray.go +++ b/internal/tray/tray.go @@ -2,7 +2,9 @@ package tray import ( _ "embed" + "fmt" + "deedles.dev/trayscale/internal/tsutil" "fyne.io/systray" ) @@ -22,21 +24,25 @@ func statusIcon(online bool) []byte { } type Tray struct { - showItem *systray.MenuItem - quitItem *systray.MenuItem + showItem *systray.MenuItem + quitItem *systray.MenuItem + selfNodeItem *systray.MenuItem } func New(online bool) *Tray { systray.SetIcon(statusIcon(online)) systray.SetTitle("Trayscale") + selfNodeItem := systray.AddMenuItem("", "") + systray.AddSeparator() showWindow := systray.AddMenuItem("Show", "") systray.AddSeparator() quit := systray.AddMenuItem("Quit", "") return &Tray{ - showItem: showWindow, - quitItem: quit, + showItem: showWindow, + quitItem: quit, + selfNodeItem: selfNodeItem, } } @@ -48,12 +54,45 @@ func (t *Tray) ShowChan() <-chan struct{} { return t.showItem.ClickedCh } -func (t *Tray) SetOnlineStatus(online bool) { +func (t *Tray) setOnlineStatus(online bool) { + systray.SetIcon(statusIcon(online)) +} + +func (t *Tray) Update(s tsutil.Status, previousOnlineStatus bool) { if t == nil { return } - systray.SetIcon(statusIcon(online)) + if s.Online() != previousOnlineStatus { + t.setOnlineStatus(s.Online()) + } + + var title string + if s.Status != nil && s.Status.Self != nil { + // A naive approach to get first available TS IP. + // Ways to refine: sort and get the "Less"er or prefer + // first IPv4 in the list. + var ipInfo string + if len(s.Status.Self.TailscaleIPs) > 0 { + ipInfo = fmt.Sprintf( + " (%s)", + s.Status.Self.TailscaleIPs[0].String(), + ) + } + + title = fmt.Sprintf( + "This device: %s%s", + s.Status.Self.HostName, + ipInfo, + ) + } + + if title == "" { + t.selfNodeItem.Hide() + } else { + t.selfNodeItem.SetTitle(title) + t.selfNodeItem.Show() + } } var systrayExit = make(chan func(), 1) diff --git a/internal/ui/app.go b/internal/ui/app.go index 5cbdfbf5..2acd57ef 100644 --- a/internal/ui/app.go +++ b/internal/ui/app.go @@ -166,10 +166,10 @@ func (a *App) updatePeers(status tsutil.Status) { func (a *App) update(s tsutil.Status) { online := s.Online() + a.tray.Update(s, a.online) if a.online != online { a.online = online a.notify(online) // TODO: Notify on startup if not connected? - a.tray.SetOnlineStatus(online) } if a.win == nil { return