Skip to content

Commit 12ef0a9

Browse files
authored
cmd/trayscale: implement folded navigation (#27)
* meta: update dependencies * cmd/gtkbuildergen: add "menu-model" and binding support * cmd/trayscale: remove menu workaround and add binding for folding * cmd/gtkbuildergen: set initial values of bindings * cmd/trayscale: implement navigation for the leaflet when folded
1 parent a17b5a1 commit 12ef0a9

File tree

8 files changed

+161
-86
lines changed

8 files changed

+161
-86
lines changed

Diff for: cmd/gtkbuildergen/init.tmpl

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
{{range .Properties -}}
55
{{$id}}.SetObjectProperty({{.Name | printf "%q"}}, {{if .Track}}{{$used.Add .Value}}{{else}}{{.Value}}{{end}})
66
{{end -}}
7+
{{range .Bindings -}}
8+
{{.Lookup.Value}}.NotifyProperty({{.Lookup.Name | printf "%q"}}, func() {
9+
{{$id}}.SetObjectProperty({{.Name | printf "%q"}}, {{.Lookup.Value}}.ObjectProperty({{.Lookup.Name | printf "%q"}}))
10+
})
11+
{{$id}}.SetObjectProperty({{.Name | printf "%q"}}, {{.Lookup.Value}}.ObjectProperty({{.Lookup.Name | printf "%q"}}))
12+
{{end -}}
713
{{range $i, $c := .Children -}}
814
{{- $cid := or .Object.ID (printf "%v%v" $id $i) -}}
915
{{if not ($used.Has $cid) -}}

Diff for: cmd/gtkbuildergen/uidef.go

+18-2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type Object struct {
5757

5858
Properties []Property `xml:"property"`
5959
Children []Child `xml:"child"`
60+
Bindings []Binding `xml:"binding"`
6061
}
6162

6263
func (obj Object) Type() Class {
@@ -116,9 +117,9 @@ var (
116117

117118
func (p Property) Value() string {
118119
switch p.Name {
119-
case "width-request", "height-request", "default-width", "default-height", "content", "stack", "spacing", "margin-top", "margin-bottom", "header-suffix", "activatable-widget":
120+
case "width-request", "height-request", "default-width", "default-height", "content", "stack", "spacing", "margin-top", "margin-bottom", "header-suffix", "activatable-widget", "menu-model":
120121
return p.RawValue
121-
case "show-start-title-buttons", "show-end-title-buttons", "primary", "vexpand", "hexpand", "visible", "has-frame":
122+
case "show-start-title-buttons", "show-end-title-buttons", "primary", "vexpand", "hexpand", "visible", "has-frame", "can-navigate-back":
122123
b, err := strconv.ParseBool(p.RawValue)
123124
if err != nil {
124125
return p.RawValue
@@ -365,3 +366,18 @@ func (v *Value) UnmarshalText(text []byte) error {
365366
v.Val = str
366367
return nil
367368
}
369+
370+
type Binding struct {
371+
XMLName xml.Name `xml:"binding"`
372+
373+
Name string `xml:"name,attr"`
374+
375+
Lookup Lookup `xml:"lookup"`
376+
}
377+
378+
type Lookup struct {
379+
XMLName xml.Name `xml:"lookup"`
380+
381+
Name string `xml:"name,attr"`
382+
Value string `xml:",chardata"`
383+
}

Diff for: cmd/trayscale/app.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,6 @@ func (a *App) init(ctx context.Context) {
273273

274274
a.win = NewMainWindow(&a.app.Application)
275275

276-
// Workaround for Cambalache limitations.
277-
a.win.MainMenuButton.SetMenuModel(MainMenu)
278-
279276
a.win.StatusSwitch.ConnectStateSet(func(s bool) bool {
280277
if s == a.win.StatusSwitch.State() {
281278
return false
@@ -296,6 +293,16 @@ func (a *App) init(ctx context.Context) {
296293
return true
297294
})
298295

296+
a.win.PeersStack.NotifyProperty("visible-child", func() {
297+
if a.win.PeersStack.VisibleChild() != nil {
298+
a.win.Leaflet.Navigate(adw.NavigationDirectionForward)
299+
}
300+
})
301+
302+
a.win.BackButton.ConnectClicked(func() {
303+
a.win.Leaflet.Navigate(adw.NavigationDirectionBack)
304+
})
305+
299306
a.win.ConnectCloseRequest(func() bool {
300307
maps.Clear(a.peerPages)
301308
a.win = nil

Diff for: cmd/trayscale/mainwindow.ui

+23-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
<child>
1313
<object class="AdwToastOverlay" id="ToastOverlay">
1414
<child>
15-
<object class="AdwLeaflet">
15+
<object class="AdwLeaflet" id="Leaflet">
16+
<property name="can-navigate-back">True</property>
1617
<child>
1718
<object class="GtkBox">
1819
<property name="orientation">vertical</property>
@@ -27,8 +28,14 @@
2728
<object class="GtkMenuButton" id="MainMenuButton">
2829
<property name="icon-name">open-menu-symbolic</property>
2930
<property name="primary">True</property>
31+
<!-- Custom fragments -->
32+
<property name="menu-model">MainMenu</property>
3033
</object>
3134
</child>
35+
<!-- Custom fragments -->
36+
<binding name="show-end-title-buttons">
37+
<lookup name="folded">Leaflet</lookup>
38+
</binding>
3239
</object>
3340
</child>
3441
<child>
@@ -50,6 +57,20 @@
5057
<child type="title">
5158
<object class="GtkBox"/>
5259
</child>
60+
<child type="start">
61+
<object class="GtkButton" id="BackButton">
62+
<property name="has-frame">False</property>
63+
<property name="icon-name">go-previous-symbolic</property>
64+
<!-- Custom fragments -->
65+
<binding name="visible">
66+
<lookup name="folded">Leaflet</lookup>
67+
</binding>
68+
</object>
69+
</child>
70+
<!-- Custom fragments -->
71+
<binding name="show-start-title-buttons">
72+
<lookup name="folded">Leaflet</lookup>
73+
</binding>
5374
</object>
5475
</child>
5576
<child>
@@ -60,6 +81,7 @@
6081
</child>
6182
</object>
6283
</child>
84+
<!-- Custom fragments -->
6385
</object>
6486
</child>
6587
</object>

Diff for: cmd/trayscale/trayscale.cmb

+9-5
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@
88
<object>
99
(1,1,"AdwApplicationWindow","MainWindow",None,None,None,None,None,None),
1010
(1,4,"AdwToastOverlay","ToastOverlay",1,None,None,None,2,None),
11-
(1,5,"AdwLeaflet",None,4,None,None,None,None,None),
11+
(1,5,"AdwLeaflet","Leaflet",4,None,None,None,None,""),
1212
(1,6,"GtkBox",None,5,None,None,None,None,None),
13-
(1,7,"AdwHeaderBar",None,6,None,None,None,None,None),
14-
(1,8,"GtkBox",None,5,None,None,None,1,None),
15-
(1,9,"AdwHeaderBar",None,8,None,None,None,1,None),
16-
(1,10,"GtkMenuButton","MainMenuButton",7,None,"end",None,1,None),
13+
(1,7,"AdwHeaderBar",None,6,None,None,None,None,"&lt;binding name=\"show-end-title-buttons\"&gt;\n &lt;lookup name=\"folded\"&gt;Leaflet&lt;/lookup&gt;\n&lt;/binding&gt;"),
14+
(1,8,"GtkBox",None,5,None,None,None,2,None),
15+
(1,9,"AdwHeaderBar",None,8,None,None,None,1,"&lt;binding name=\"show-start-title-buttons\"&gt;\n &lt;lookup name=\"folded\"&gt;Leaflet&lt;/lookup&gt;\n&lt;/binding&gt;"),
16+
(1,10,"GtkMenuButton","MainMenuButton",7,None,"end",None,1,"&lt;property name=\"menu-model\"&gt;MainMenu&lt;/property&gt;"),
1717
(1,11,"GtkStackSidebar",None,6,None,None,None,1,None),
1818
(1,15,"GtkBox",None,9,None,"title",None,None,None),
1919
(1,16,"GtkStack","PeersStack",8,None,None,None,2,None),
2020
(1,17,"GtkSwitch","StatusSwitch",7,None,"start",None,None,None),
21+
(1,18,"GtkButton","BackButton",9,None,"start",None,None,"&lt;binding name=\"visible\"&gt;\n &lt;lookup name=\"folded\"&gt;Leaflet&lt;/lookup&gt;\n&lt;/binding&gt;"),
2122
(2,3,"AdwStatusPage","PeerPage",None,None,None,None,None,None),
2223
(2,5,"AdwClamp",None,3,None,None,None,None,None),
2324
(2,7,"GtkBox",None,5,None,None,None,None,None),
@@ -73,6 +74,7 @@
7374
(1,1,"GtkWindow","default-height","600",None,None,None,None,None),
7475
(1,1,"GtkWindow","default-width","800",None,None,None,None,None),
7576
(1,1,"GtkWindow","title","Trayscale",None,None,None,None,None),
77+
(1,5,"AdwLeaflet","can-navigate-back","True",None,None,None,None,None),
7678
(1,6,"GtkOrientable","orientation","vertical",None,None,None,None,None),
7779
(1,6,"GtkWidget","width-request","360",None,None,None,None,None),
7880
(1,7,"AdwHeaderBar","show-end-title-buttons","False",None,None,None,None,None),
@@ -86,6 +88,8 @@
8688
(1,11,"GtkWidget","width-request","270",None,None,None,None,None),
8789
(1,16,"GtkStack","transition-type","slide-up-down",None,None,None,None,None),
8890
(1,16,"GtkWidget","vexpand","True",None,None,None,None,None),
91+
(1,18,"GtkButton","has-frame","False",None,None,None,None,None),
92+
(1,18,"GtkButton","icon-name","go-previous-symbolic",None,None,None,None,None),
8993
(2,7,"GtkBox","spacing","12",None,None,None,None,None),
9094
(2,7,"GtkOrientable","orientation","vertical",None,None,None,None,None),
9195
(2,8,"AdwPreferencesGroup","title","Tailscale IPs",None,None,None,None,None),

Diff for: cmd/trayscale/ui.go

+52-29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: go.mod

+13-8
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ require (
66
deedles.dev/mk v0.1.0
77
github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20220417101956-dcc3707dc307
88
github.com/diamondburned/gotk4/pkg v0.0.0-20220925114733-8c5529b9df15
9-
golang.org/x/exp v0.0.0-20221002003631-540bb7301a08
10-
tailscale.com v1.30.2
9+
golang.org/x/exp v0.0.0-20221019170559-20944726eadf
10+
tailscale.com v1.32.0
1111
)
1212

1313
require (
@@ -17,24 +17,29 @@ require (
1717
github.com/fxamacker/cbor/v2 v2.4.0 // indirect
1818
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
1919
github.com/google/go-cmp v0.5.9 // indirect
20+
github.com/gorilla/websocket v1.4.2 // indirect
2021
github.com/hdevalence/ed25519consensus v0.1.0 // indirect
2122
github.com/josharian/native v1.0.0 // indirect
22-
github.com/jsimonetti/rtnetlink v1.2.2 // indirect
23+
github.com/jsimonetti/rtnetlink v1.2.3 // indirect
24+
github.com/json-iterator/go v1.1.10 // indirect
2325
github.com/klauspost/compress v1.15.11 // indirect
26+
github.com/mattn/go-isatty v0.0.16 // indirect
2427
github.com/mdlayher/netlink v1.6.2 // indirect
2528
github.com/mdlayher/socket v0.2.3 // indirect
2629
github.com/mitchellh/go-ps v1.0.0 // indirect
30+
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
31+
github.com/modern-go/reflect2 v1.0.1 // indirect
2732
github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect
2833
github.com/tcnksm/go-httpstat v0.2.0 // indirect
2934
github.com/x448/float16 v0.8.4 // indirect
3035
go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect
3136
go4.org/netipx v0.0.0-20220925034521-797b0c90d8ab // indirect
3237
go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 // indirect
33-
golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect
34-
golang.org/x/net v0.0.0-20221002022538-bcab6841153b // indirect
35-
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 // indirect
36-
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect
37-
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect
38+
golang.org/x/crypto v0.1.0 // indirect
39+
golang.org/x/net v0.1.0 // indirect
40+
golang.org/x/sync v0.1.0 // indirect
41+
golang.org/x/sys v0.1.0 // indirect
42+
golang.org/x/time v0.1.0 // indirect
3843
golang.zx2c4.com/wireguard/windows v0.5.3 // indirect
3944
nhooyr.io/websocket v1.8.7 // indirect
4045
)

0 commit comments

Comments
 (0)