8
8
9
9
"fyne.io/fyne/v2"
10
10
"fyne.io/fyne/v2/dialog"
11
+ "fyne.io/fyne/v2/driver/desktop"
11
12
"fyne.io/fyne/v2/storage"
12
13
"github.com/ErikKalkoken/janice/internal/jsondocument"
13
14
)
@@ -18,48 +19,37 @@ const (
18
19
)
19
20
20
21
func (u * UI ) makeMenu () * fyne.MainMenu {
21
- recentItem := fyne .NewMenuItem ("Open Recent" , nil )
22
- recentItem .ChildMenu = fyne .NewMenu ("" )
22
+ // File menu
23
+ openRecentItem := fyne .NewMenuItem ("Open Recent" , nil )
24
+ openRecentItem .ChildMenu = fyne .NewMenu ("" )
25
+
26
+ fileSettingsItem := fyne .NewMenuItem ("Settings..." , u .showSettingsDialog )
27
+ fileSettingsItem .Shortcut = & desktop.CustomShortcut {KeyName : fyne .KeyComma , Modifier : fyne .KeyModifierControl }
28
+ u .window .Canvas ().AddShortcut (addShortcutFromMenuItem (fileSettingsItem ))
29
+
30
+ fileReloadItem := fyne .NewMenuItem ("Reload" , u .fileReload )
31
+ fileReloadItem .Shortcut = & desktop.CustomShortcut {KeyName : fyne .KeyR , Modifier : fyne .KeyModifierAlt }
32
+ u .window .Canvas ().AddShortcut (addShortcutFromMenuItem (fileReloadItem ))
33
+
34
+ fileOpenItem := fyne .NewMenuItem ("Open File..." , u .fileOpen )
35
+ fileOpenItem .Shortcut = & desktop.CustomShortcut {KeyName : fyne .KeyO , Modifier : fyne .KeyModifierControl }
36
+ u .window .Canvas ().AddShortcut (addShortcutFromMenuItem (fileOpenItem ))
37
+
38
+ fileNewItem := fyne .NewMenuItem ("New" , u .fileNew )
39
+ fileNewItem .Shortcut = & desktop.CustomShortcut {KeyName : fyne .KeyN , Modifier : fyne .KeyModifierControl }
40
+ u .window .Canvas ().AddShortcut (addShortcutFromMenuItem (fileNewItem ))
41
+
23
42
u .fileMenu = fyne .NewMenu ("File" ,
24
- fyne .NewMenuItem ("New" , func () {
25
- u .reset ()
26
- }),
43
+ fileNewItem ,
27
44
fyne .NewMenuItemSeparator (),
28
- fyne .NewMenuItem ("Open File..." , func () {
29
- d := dialog .NewFileOpen (func (reader fyne.URIReadCloser , err error ) {
30
- if err != nil {
31
- u .showErrorDialog ("Failed to read folder" , err )
32
- return
33
- }
34
- if reader == nil {
35
- return
36
- }
37
- u .loadDocument (reader )
38
- }, u .window )
39
- d .Show ()
40
- filterEnabled := u .app .Preferences ().BoolWithFallback (settingExtensionFilter , settingExtensionDefault )
41
- if filterEnabled {
42
- f := storage .NewExtensionFileFilter ([]string {".json" })
43
- d .SetFilter (f )
44
- }
45
- }),
46
- recentItem ,
45
+ fileOpenItem ,
46
+ openRecentItem ,
47
47
fyne .NewMenuItem ("Open From Clipboard" , func () {
48
48
r := strings .NewReader (u .window .Clipboard ().Content ())
49
49
reader := jsondocument .MakeURIReadCloser (r , "CLIPBOARD" )
50
50
u .loadDocument (reader )
51
51
}),
52
- fyne .NewMenuItem ("Reload" , func () {
53
- if u .currentFile == nil {
54
- return
55
- }
56
- reader , err := storage .Reader (u .currentFile )
57
- if err != nil {
58
- u .showErrorDialog ("Failed to reload file" , err )
59
- return
60
- }
61
- u .loadDocument (reader )
62
- }),
52
+ fileReloadItem ,
63
53
fyne .NewMenuItemSeparator (),
64
54
fyne .NewMenuItem ("Export Selection To File..." , func () {
65
55
byt , err := u .extractSelection ()
@@ -91,10 +81,10 @@ func (u *UI) makeMenu() *fyne.MainMenu {
91
81
u .window .Clipboard ().SetContent (string (byt ))
92
82
}),
93
83
fyne .NewMenuItemSeparator (),
94
- fyne .NewMenuItem ("Settings..." , func () {
95
- u .showSettingsDialog ()
96
- }),
84
+ fileSettingsItem ,
97
85
)
86
+
87
+ // View menu
98
88
toogleSelectionFrame := fyne .NewMenuItem ("Show selected element" , func () {
99
89
u .toogleViewSelection ()
100
90
})
@@ -104,16 +94,6 @@ func (u *UI) makeMenu() *fyne.MainMenu {
104
94
})
105
95
toogleDetailFrame .Checked = u .value .isShown ()
106
96
u .viewMenu = fyne .NewMenu ("View" ,
107
- fyne .NewMenuItem ("Scroll to top" , func () {
108
- u .treeWidget .ScrollToTop ()
109
- }),
110
- fyne .NewMenuItem ("Scroll to bottom" , func () {
111
- u .treeWidget .ScrollToBottom ()
112
- }),
113
- fyne .NewMenuItem ("Scroll to selection" , func () {
114
- u .scrollTo (u .selection .selectedUID )
115
- }),
116
- fyne .NewMenuItemSeparator (),
117
97
fyne .NewMenuItem ("Expand All" , func () {
118
98
u .treeWidget .OpenAllBranches ()
119
99
}),
@@ -124,6 +104,25 @@ func (u *UI) makeMenu() *fyne.MainMenu {
124
104
toogleSelectionFrame ,
125
105
toogleDetailFrame ,
126
106
)
107
+
108
+ // Go menu
109
+ goTopItem := fyne .NewMenuItem ("Go to top" , u .treeWidget .ScrollToTop )
110
+ goTopItem .Shortcut = & desktop.CustomShortcut {KeyName : fyne .KeyHome , Modifier : fyne .KeyModifierControl }
111
+ u .window .Canvas ().AddShortcut (addShortcutFromMenuItem (goTopItem ))
112
+
113
+ goBottomItem := fyne .NewMenuItem ("Go to bottom" , u .treeWidget .ScrollToBottom )
114
+ goBottomItem .Shortcut = & desktop.CustomShortcut {KeyName : fyne .KeyEnd , Modifier : fyne .KeyModifierControl }
115
+ u .window .Canvas ().AddShortcut (addShortcutFromMenuItem (goBottomItem ))
116
+
117
+ u .goMenu = fyne .NewMenu ("Go" ,
118
+ goTopItem ,
119
+ goBottomItem ,
120
+ fyne .NewMenuItem ("Go to selection" , func () {
121
+ u .scrollTo (u .selection .selectedUID )
122
+ }),
123
+ )
124
+
125
+ // Help menu
127
126
helpMenu := fyne .NewMenu ("Help" ,
128
127
fyne .NewMenuItem ("Report a bug" , func () {
129
128
url , _ := url .Parse (websiteURL + "/issues" )
@@ -134,10 +133,53 @@ func (u *UI) makeMenu() *fyne.MainMenu {
134
133
u .showAboutDialog ()
135
134
}),
136
135
)
137
- main := fyne .NewMainMenu (u .fileMenu , u .viewMenu , helpMenu )
136
+
137
+ main := fyne .NewMainMenu (u .fileMenu , u .viewMenu , u .goMenu , helpMenu )
138
138
return main
139
139
}
140
140
141
+ func (u * UI ) fileOpen () {
142
+ d := dialog .NewFileOpen (func (reader fyne.URIReadCloser , err error ) {
143
+ if err != nil {
144
+ u .showErrorDialog ("Failed to read folder" , err )
145
+ return
146
+ }
147
+ if reader == nil {
148
+ return
149
+ }
150
+ u .loadDocument (reader )
151
+ }, u .window )
152
+ d .Show ()
153
+ filterEnabled := u .app .Preferences ().BoolWithFallback (settingExtensionFilter , settingExtensionDefault )
154
+ if filterEnabled {
155
+ f := storage .NewExtensionFileFilter ([]string {".json" })
156
+ d .SetFilter (f )
157
+ }
158
+ }
159
+
160
+ // fileNew resets the app to it's initial state
161
+ func (u * UI ) fileNew () {
162
+ u .document .Reset ()
163
+ u .setTitle ("" )
164
+ u .statusBar .reset ()
165
+ u .welcomeMessage .Show ()
166
+ u .toogleHasDocument (false )
167
+ u .selection .reset ()
168
+ u .value .reset ()
169
+ }
170
+
171
+ func (u * UI ) fileReload () {
172
+ if u .currentFile == nil {
173
+ return
174
+ }
175
+ reader , err := storage .Reader (u .currentFile )
176
+ if err != nil {
177
+ u .showErrorDialog ("Failed to reload file" , err )
178
+ return
179
+ }
180
+ u .loadDocument (reader )
181
+ }
182
+
141
183
func (u * UI ) extractSelection () ([]byte , error ) {
142
184
uid := u .selection .selectedUID
143
185
n := u .document .Value (uid )
@@ -224,3 +266,15 @@ func (u *UI) toogleViewDetail() {
224
266
menuItem .Checked = u .value .isShown ()
225
267
u .viewMenu .Refresh ()
226
268
}
269
+
270
+ // addShortcutFromMenuItem is a helper for defining shortcuts.
271
+ // It allows to add an already defined shortcut from a menu item to the canvas.
272
+ //
273
+ // For example:
274
+ //
275
+ // window.Canvas().AddShortcut(menuItem)
276
+ func addShortcutFromMenuItem (item * fyne.MenuItem ) (fyne.Shortcut , func (fyne.Shortcut )) {
277
+ return item .Shortcut , func (s fyne.Shortcut ) {
278
+ item .Action ()
279
+ }
280
+ }
0 commit comments