@@ -2,7 +2,9 @@ package tray
22
33import (
44 _ "embed"
5+ "fmt"
56
7+ "deedles.dev/trayscale/internal/tsutil"
68 "fyne.io/systray"
79)
810
@@ -22,21 +24,25 @@ func statusIcon(online bool) []byte {
2224}
2325
2426type Tray struct {
25- showItem * systray.MenuItem
26- quitItem * systray.MenuItem
27+ showItem * systray.MenuItem
28+ quitItem * systray.MenuItem
29+ selfNodeItem * systray.MenuItem
2730}
2831
2932func New (online bool ) * Tray {
3033 systray .SetIcon (statusIcon (online ))
3134 systray .SetTitle ("Trayscale" )
3235
36+ selfNodeItem := systray .AddMenuItem ("" , "" )
37+ systray .AddSeparator ()
3338 showWindow := systray .AddMenuItem ("Show" , "" )
3439 systray .AddSeparator ()
3540 quit := systray .AddMenuItem ("Quit" , "" )
3641
3742 return & Tray {
38- showItem : showWindow ,
39- quitItem : quit ,
43+ showItem : showWindow ,
44+ quitItem : quit ,
45+ selfNodeItem : selfNodeItem ,
4046 }
4147}
4248
@@ -48,12 +54,45 @@ func (t *Tray) ShowChan() <-chan struct{} {
4854 return t .showItem .ClickedCh
4955}
5056
51- func (t * Tray ) SetOnlineStatus (online bool ) {
57+ func (t * Tray ) setOnlineStatus (online bool ) {
58+ systray .SetIcon (statusIcon (online ))
59+ }
60+
61+ func (t * Tray ) Update (s tsutil.Status , previousOnlineStatus bool ) {
5262 if t == nil {
5363 return
5464 }
5565
56- systray .SetIcon (statusIcon (online ))
66+ if s .Online () != previousOnlineStatus {
67+ t .setOnlineStatus (s .Online ())
68+ }
69+
70+ var title string
71+ if s .Status != nil && s .Status .Self != nil {
72+ // A naive approach to get first available TS IP.
73+ // Ways to refine: sort and get the "Less"er or prefer
74+ // first IPv4 in the list.
75+ var ipInfo string
76+ if len (s .Status .Self .TailscaleIPs ) > 0 {
77+ ipInfo = fmt .Sprintf (
78+ " (%s)" ,
79+ s .Status .Self .TailscaleIPs [0 ].String (),
80+ )
81+ }
82+
83+ title = fmt .Sprintf (
84+ "This device: %s%s" ,
85+ s .Status .Self .HostName ,
86+ ipInfo ,
87+ )
88+ }
89+
90+ if title == "" {
91+ t .selfNodeItem .Hide ()
92+ } else {
93+ t .selfNodeItem .SetTitle (title )
94+ t .selfNodeItem .Show ()
95+ }
5796}
5897
5998var systrayExit = make (chan func (), 1 )
0 commit comments