• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

fyne-io / fyne / 19600282979

22 Nov 2025 07:35PM UTC coverage: 60.973% (+0.02%) from 60.949%
19600282979

Pull #5987

github

redawl
Fix window.Resize()
Pull Request #5987: Mouse handling optimization

6 of 6 new or added lines in 2 files covered. (100.0%)

6 existing lines in 2 files now uncovered.

25799 of 42312 relevant lines covered (60.97%)

698.27 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.76
/container/navigation.go
1
package container
2

3
import (
4
        "fyne.io/fyne/v2"
5
        "fyne.io/fyne/v2/layout"
6
        "fyne.io/fyne/v2/theme"
7
        "fyne.io/fyne/v2/widget"
8
)
9

10
// Navigation container is used to provide your application with a control bar and an area for content objects.
11
// Objects can be any CanvasObject, and only the most recent one will be visible.
12
//
13
// Since: 2.7
14
type Navigation struct {
15
        widget.BaseWidget
16

17
        Root      fyne.CanvasObject
18
        Title     string
19
        OnBack    func()
20
        OnForward func()
21

22
        level  int
23
        stack  fyne.Container
24
        titles []string
25
}
26

27
// NewNavigation creates a new navigation container with a given root object.
28
//
29
// Since: 2.7
30
func NewNavigation(root fyne.CanvasObject) *Navigation {
×
31
        return NewNavigationWithTitle(root, "")
×
32
}
×
33

34
// NewNavigationWithTitle creates a new navigation container with a given root object and a default title.
35
//
36
// Since: 2.7
37
func NewNavigationWithTitle(root fyne.CanvasObject, s string) *Navigation {
4✔
38
        var nav *Navigation
4✔
39
        nav = &Navigation{
4✔
40
                Root:      root,
4✔
41
                Title:     s,
4✔
42
                OnBack:    func() { _ = nav.Back() },
4✔
43
                OnForward: func() { _ = nav.Forward() },
×
44
        }
45
        return nav
4✔
46
}
47

48
// Push puts the given object on top of the navigation stack and hides the object below.
49
//
50
// Since: 2.7
51
func (nav *Navigation) Push(obj fyne.CanvasObject) {
1✔
52
        nav.PushWithTitle(obj, nav.Title)
1✔
53
}
1✔
54

55
// PushWithTitle puts the given CanvasObject on top, hides the object below, and uses the given title as label text.
56
//
57
// Since: 2.7
58
func (nav *Navigation) PushWithTitle(obj fyne.CanvasObject, s string) {
7✔
59
        obj.Show()
7✔
60
        objs := nav.stack.Objects[:nav.level]
7✔
61
        if len(objs) > 0 {
13✔
62
                objs[len(objs)-1].Hide()
6✔
63
        }
6✔
64
        nav.stack.Objects = append(objs, obj)
7✔
65
        nav.titles = append(nav.titles[:nav.level], s)
7✔
66
        nav.level++
7✔
67
        nav.Refresh()
7✔
68
}
69

70
// Back returns the top level CanvasObject, adjusts the title accordingly, and disabled the back button
71
// when no more objects are left to go back to.
72
//
73
// Since: 2.7
74
func (nav *Navigation) Back() fyne.CanvasObject {
11✔
75
        if nav.level == 0 || nav.level == 1 && nav.Root != nil {
16✔
76
                return nil
5✔
77
        }
5✔
78

79
        objs := nav.stack.Objects
6✔
80
        objs[nav.level-1].Hide()
6✔
81
        if nav.level > 1 {
11✔
82
                objs[nav.level-2].Show()
5✔
83
        }
5✔
84

85
        nav.level--
6✔
86
        nav.Refresh()
6✔
87

6✔
88
        return objs[nav.level]
6✔
89
}
90

91
// Forward shows the next object in the stack again.
92
//
93
// Since: 2.7
94
func (nav *Navigation) Forward() fyne.CanvasObject {
95
        if nav.level >= len(nav.stack.Objects) {
4✔
96
                return nil
5✔
97
        }
1✔
98

1✔
99
        nav.stack.Objects[nav.level-1].Hide()
100
        nav.stack.Objects[nav.level].Show()
3✔
101
        nav.level++
3✔
102

3✔
103
        return nav.stack.Objects[nav.level-1]
3✔
104
}
3✔
105

3✔
106
// SetTitle changes the root navigation title shown by default.
107
//
108
// Since: 2.7
109
func (nav *Navigation) SetTitle(s string) {
110
        nav.Title = s
111
        nav.Refresh()
1✔
112
}
1✔
113

1✔
114
// SetCurrentTitle changes the navigation title for the current level.
1✔
115
//
116
// Since: 2.7
117
func (nav *Navigation) SetCurrentTitle(s string) {
118
        if nav.level > 1 && nav.level-1 < len(nav.titles) {
119
                nav.titles[nav.level-1] = s
2✔
120
                nav.Refresh()
3✔
121
        }
1✔
122
}
1✔
123

1✔
124
func (nav *Navigation) setup() {
125
        objs := []fyne.CanvasObject{}
126
        titles := []string{}
6✔
127
        if nav.Root != nil {
6✔
128
                objs = append(objs, nav.Root)
6✔
129
                titles = append(titles, nav.Title)
9✔
130
        }
3✔
131
        nav.level = len(objs)
3✔
132
        nav.stack.Layout = layout.NewStackLayout()
3✔
133
        nav.stack.Objects = objs
6✔
134
        nav.titles = titles
6✔
135
        nav.ExtendBaseWidget(nav)
6✔
136
}
6✔
137

6✔
138
var _ fyne.WidgetRenderer = (*navigatorRenderer)(nil)
139

140
type navigatorRenderer struct {
141
        nav     *Navigation
142
        back    widget.Button
143
        forward widget.Button
144
        title   widget.Label
145
        object  fyne.CanvasObject
146
}
147

148
func (nav *Navigation) CreateRenderer() fyne.WidgetRenderer {
149
        r := &navigatorRenderer{
150
                nav: nav,
6✔
151
                title: widget.Label{
6✔
152
                        Text:      nav.Title,
6✔
153
                        Alignment: fyne.TextAlignCenter,
6✔
154
                },
6✔
155
                back: widget.Button{
6✔
156
                        Icon:     theme.NavigateBackIcon(),
6✔
157
                        OnTapped: nav.OnBack,
6✔
158
                },
6✔
159
                forward: widget.Button{
6✔
160
                        Icon:     theme.NavigateNextIcon(),
6✔
161
                        OnTapped: nav.OnForward,
6✔
162
                },
6✔
163
        }
6✔
164
        r.back.Disable()
6✔
165
        r.forward.Disable()
6✔
166

6✔
167
        nav.setup()
6✔
168

6✔
169
        r.object = NewBorder(
6✔
170
                NewStack(NewHBox(&r.back, layout.NewSpacer(), &r.forward), &r.title),
6✔
171
                nil,
6✔
172
                nil,
6✔
173
                nil,
6✔
174
                &nav.stack,
6✔
175
        )
6✔
176

6✔
177
        return r
6✔
178
}
6✔
179

6✔
180
func (r *navigatorRenderer) Destroy() {
6✔
181
}
182

6✔
183
func (r *navigatorRenderer) Layout(s fyne.Size) {
6✔
184
        r.object.Resize(s)
185
}
×
UNCOV
186

×
187
func (r *navigatorRenderer) MinSize() fyne.Size {
×
188
        return r.object.MinSize()
189
}
×
UNCOV
190

×
191
func (r *navigatorRenderer) Objects() []fyne.CanvasObject {
×
192
        return []fyne.CanvasObject{r.object}
193
}
×
UNCOV
194

×
UNCOV
195
func (r *navigatorRenderer) Refresh() {
×
196
        if r.nav.level < 1 || r.nav.level == 1 && r.nav.Root != nil {
197
                r.back.Disable()
18✔
198
        } else {
20✔
199
                r.back.Enable()
2✔
200
        }
18✔
201

16✔
202
        if r.nav.level == len(r.nav.stack.Objects) {
16✔
203
                r.forward.Disable()
204
        } else {
29✔
205
                r.forward.Enable()
11✔
206
        }
18✔
207

7✔
208
        if r.nav.level-1 >= 0 && r.nav.level-1 < len(r.nav.titles) {
7✔
209
                r.title.Text = r.nav.titles[r.nav.level-1]
210
        } else {
35✔
211
                r.title.Text = r.nav.Title
17✔
212
        }
18✔
213

1✔
214
        r.object.Refresh()
1✔
215
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc