package main import ( "strings" "gioui.org/io/event" "gioui.org/io/key" "gioui.org/layout" "git.julianfamily.org/keepassgo/clipboard" ) const ( shortcutSearch = "search" shortcutSave = "save" shortcutLock = "lock" shortcutNewEntry = "new-entry" shortcutCopyUser = "copy-user" shortcutCopyPassword = "copy-password" shortcutCopyURL = "copy-url" ) func (u *ui) processShortcuts(gtx layout.Context) { event.Op(gtx.Ops, u) for { ev, ok := gtx.Event( key.Filter{Focus: u, Name: "F", Required: key.ModShortcut}, key.Filter{Focus: u, Name: "S", Required: key.ModShortcut}, key.Filter{Focus: u, Name: "L", Required: key.ModShortcut}, key.Filter{Focus: u, Name: "N", Required: key.ModShortcut}, key.Filter{Focus: u, Name: "U", Required: key.ModShortcut}, key.Filter{Focus: u, Name: "P", Required: key.ModShortcut}, key.Filter{Focus: u, Name: "O", Required: key.ModShortcut}, ) if !ok { break } ke, ok := ev.(key.Event) if !ok || ke.State != key.Press { continue } switch ke.Name { case "F": _ = u.performShortcut(shortcutSearch) case "S": _ = u.performShortcut(shortcutSave) case "L": _ = u.performShortcut(shortcutLock) case "N": _ = u.performShortcut(shortcutNewEntry) case "U": _ = u.performShortcut(shortcutCopyUser) case "P": _ = u.performShortcut(shortcutCopyPassword) case "O": _ = u.performShortcut(shortcutCopyURL) } } } func (u *ui) performShortcut(name string) error { switch name { case shortcutSearch: return nil case shortcutSave: return u.saveAction() case shortcutLock: return u.lockAction() case shortcutNewEntry: u.state.SelectedEntryID = "" u.loadSelectedEntryIntoEditor() u.entryPath.SetText(strings.Join(u.currentPath, " / ")) return nil case shortcutCopyUser: return u.copySelectedFieldAction(clipboard.TargetUsername) case shortcutCopyPassword: return u.copySelectedFieldAction(clipboard.TargetPassword) case shortcutCopyURL: return u.copySelectedFieldAction(clipboard.TargetURL) default: return nil } }