From 9167c9df65fcc28e0e6a826d1d87abdb3e299f37 Mon Sep 17 00:00:00 2001 From: Jesse Duffield <jessedduffield@gmail.com> Date: Mon, 5 Apr 2021 00:31:52 +1000 Subject: [PATCH] more refactoring --- pkg/gui/app_status_manager.go | 4 +-- pkg/gui/commit_message_panel.go | 2 +- pkg/gui/confirmation_panel.go | 4 +-- pkg/gui/credentials_panel.go | 4 +-- pkg/gui/files_panel.go | 4 +-- pkg/gui/layout.go | 6 ++-- pkg/gui/main_panels.go | 14 ++++----- pkg/gui/pty.go | 10 ++----- pkg/gui/searching.go | 7 +++-- pkg/gui/tasks_adapter.go | 30 ++++---------------- pkg/gui/updates.go | 2 +- pkg/gui/view_helpers.go | 18 +++++------- vendor/github.com/jesseduffield/gocui/gui.go | 15 ++++++---- 13 files changed, 48 insertions(+), 72 deletions(-) diff --git a/pkg/gui/app_status_manager.go b/pkg/gui/app_status_manager.go index aa1df4c04..1fcad4f30 100644 --- a/pkg/gui/app_status_manager.go +++ b/pkg/gui/app_status_manager.go @@ -97,10 +97,10 @@ func (gui *Gui) renderAppStatus() { for range ticker.C { appStatus := gui.statusManager.getStatusString() if appStatus == "" { - gui.renderString("appStatus", "") + gui.renderString(gui.Views.AppStatus, "") return } - gui.renderString("appStatus", appStatus) + gui.renderString(gui.Views.AppStatus, appStatus) } }) } diff --git a/pkg/gui/commit_message_panel.go b/pkg/gui/commit_message_panel.go index 346fbcff3..7cd6d2ee3 100644 --- a/pkg/gui/commit_message_panel.go +++ b/pkg/gui/commit_message_panel.go @@ -59,7 +59,7 @@ func (gui *Gui) handleCommitMessageFocused() error { }, ) - gui.renderString("options", message) + gui.renderString(gui.Views.Options, message) return nil } diff --git a/pkg/gui/confirmation_panel.go b/pkg/gui/confirmation_panel.go index 9b3566eb1..a3cec023f 100644 --- a/pkg/gui/confirmation_panel.go +++ b/pkg/gui/confirmation_panel.go @@ -227,7 +227,7 @@ func (gui *Gui) createPopupPanel(opts createPopupPanelOpts) error { }) } - gui.renderString("confirmation", opts.prompt) + gui.renderString(gui.Views.Confirmation, opts.prompt) return gui.setKeyBindings(opts) }) @@ -243,7 +243,7 @@ func (gui *Gui) setKeyBindings(opts createPopupPanelOpts) error { }, ) - gui.renderString("options", actions) + gui.renderString(gui.Views.Options, actions) var onConfirm func() error if opts.handleConfirmPrompt != nil { onConfirm = gui.wrappedPromptConfirmationFunction(opts.handlersManageFocus, opts.handleConfirmPrompt, func() string { return gui.Views.Confirmation.Buffer() }) diff --git a/pkg/gui/credentials_panel.go b/pkg/gui/credentials_panel.go index 107a5038c..5911ddff0 100644 --- a/pkg/gui/credentials_panel.go +++ b/pkg/gui/credentials_panel.go @@ -13,7 +13,7 @@ type credentials chan string func (gui *Gui) promptUserForCredential(passOrUname string) string { gui.credentials = make(chan string) gui.g.Update(func(g *gocui.Gui) error { - credentialsView, _ := g.View("credentials") + credentialsView := gui.Views.Credentials switch passOrUname { case "username": credentialsView.Title = gui.Tr.CredentialsUsername @@ -67,7 +67,7 @@ func (gui *Gui) handleCredentialsViewFocused() error { }, ) - gui.renderString("options", message) + gui.renderString(gui.Views.Options, message) return nil } diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 261635770..9d9dfd9a2 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -344,7 +344,7 @@ func (gui *Gui) handleWIPCommitPress() error { return gui.createErrorPanel(gui.Tr.SkipHookPrefixNotConfigured) } - _ = gui.renderStringSync("commitMessage", skipHookPreifx) + _ = gui.renderStringSync(gui.Views.CommitMessage, skipHookPreifx) if err := gui.Views.CommitMessage.SetCursor(len(skipHookPreifx), 0); err != nil { return err } @@ -393,7 +393,7 @@ func (gui *Gui) handleCommitPress() error { return gui.createErrorPanel(fmt.Sprintf("%s: %s", gui.Tr.LcCommitPrefixPatternError, err.Error())) } prefix := rgx.ReplaceAllString(gui.getCheckedOutBranch().Name, prefixReplace) - gui.renderString("commitMessage", prefix) + gui.renderString(gui.Views.CommitMessage, prefix) if err := gui.Views.CommitMessage.SetCursor(len(prefix), 0); err != nil { return err } diff --git a/pkg/gui/layout.go b/pkg/gui/layout.go index d319873c7..bf2954fb7 100644 --- a/pkg/gui/layout.go +++ b/pkg/gui/layout.go @@ -48,8 +48,8 @@ func (gui *Gui) layout(g *gocui.Gui) error { viewDimensions := gui.getWindowDimensions(informationStr, appStatus) // reading more lines into main view buffers upon resize - prevMainView, err := gui.g.View("main") - if err == nil { + prevMainView := gui.Views.Main + if prevMainView != nil { _, prevMainHeight := prevMainView.Size() newMainHeight := viewDimensions["main"].Y1 - viewDimensions["main"].Y0 - 1 heightDiff := newMainHeight - prevMainHeight @@ -230,7 +230,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { gui.Views.Information.BgColor = gocui.ColorDefault gui.Views.Information.FgColor = gocui.ColorGreen gui.Views.Information.Frame = false - gui.renderString("information", INFO_SECTION_PADDING+informationStr) + gui.renderString(gui.Views.Information, INFO_SECTION_PADDING+informationStr) } if gui.State.OldInformation != informationStr { gui.setViewContent(gui.Views.Information, informationStr) diff --git a/pkg/gui/main_panels.go b/pkg/gui/main_panels.go index 4fdc6336b..cd9e57ece 100644 --- a/pkg/gui/main_panels.go +++ b/pkg/gui/main_panels.go @@ -110,29 +110,29 @@ func (t *runFunctionTask) GetKind() TaskKind { // return &runFunctionTask{f: f} // } -func (gui *Gui) runTaskForView(viewName string, task updateTask) error { +func (gui *Gui) runTaskForView(view *gocui.View, task updateTask) error { gui.Log.Warn("running new task for view") switch task.GetKind() { case RENDER_STRING: specificTask := task.(*renderStringTask) - return gui.newStringTask(viewName, specificTask.str) + return gui.newStringTask(view, specificTask.str) case RENDER_STRING_WITHOUT_SCROLL: specificTask := task.(*renderStringWithoutScrollTask) - return gui.newStringTaskWithoutScroll(viewName, specificTask.str) + return gui.newStringTaskWithoutScroll(view, specificTask.str) case RUN_FUNCTION: specificTask := task.(*runFunctionTask) - return gui.newTask(viewName, specificTask.f) + return gui.newTask(view, specificTask.f) case RUN_COMMAND: specificTask := task.(*runCommandTask) - return gui.newCmdTask(viewName, specificTask.cmd, specificTask.prefix) + return gui.newCmdTask(view, specificTask.cmd, specificTask.prefix) case RUN_PTY: specificTask := task.(*runPtyTask) - return gui.newPtyTask(viewName, specificTask.cmd, specificTask.prefix) + return gui.newPtyTask(view, specificTask.cmd, specificTask.prefix) } return nil @@ -143,7 +143,7 @@ func (gui *Gui) refreshMainView(opts *viewUpdateOpts, view *gocui.View) error { view.Wrap = !opts.noWrap view.Highlight = opts.highlight - if err := gui.runTaskForView(view.Name(), opts.task); err != nil { + if err := gui.runTaskForView(view, opts.task); err != nil { gui.Log.Error(err) return nil } diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go index d25c71af2..67182d9bc 100644 --- a/pkg/gui/pty.go +++ b/pkg/gui/pty.go @@ -6,6 +6,7 @@ import ( "os/exec" "github.com/creack/pty" + "github.com/jesseduffield/gocui" ) func (gui *Gui) onResize() error { @@ -29,22 +30,17 @@ func (gui *Gui) onResize() error { // which is just an io.Reader. the pty package lets us wrap a command in a // pseudo-terminal meaning we'll get the behaviour we want from the underlying // command. -func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd, prefix string) error { +func (gui *Gui) newPtyTask(view *gocui.View, cmd *exec.Cmd, prefix string) error { width, _ := gui.Views.Main.Size() pager := gui.GitCommand.GetPager(width) if pager == "" { // if we're not using a custom pager we don't need to use a pty - return gui.newCmdTask(viewName, cmd, prefix) + return gui.newCmdTask(view, cmd, prefix) } cmd.Env = append(cmd.Env, "GIT_PAGER="+pager) - view, err := gui.g.View(viewName) - if err != nil { - return nil // swallowing for now - } - _, height := view.Size() _, oy := view.Origin() diff --git a/pkg/gui/searching.go b/pkg/gui/searching.go index 79a7eb127..6a30f8af3 100644 --- a/pkg/gui/searching.go +++ b/pkg/gui/searching.go @@ -16,7 +16,7 @@ func (gui *Gui) handleOpenSearch(viewName string) error { gui.State.Searching.isSearching = true gui.State.Searching.view = view - gui.renderString("search", "") + gui.renderString(gui.Views.Search, "") if err := gui.pushContext(gui.State.Contexts.Search); err != nil { return err @@ -27,6 +27,7 @@ func (gui *Gui) handleOpenSearch(viewName string) error { func (gui *Gui) handleSearch() error { gui.State.Searching.searchString = gui.Views.Search.Buffer() + gui.Log.Warn(gui.State.Searching.searchString) if err := gui.returnFromContext(); err != nil { return err } @@ -49,7 +50,7 @@ func (gui *Gui) onSelectItemWrapper(innerFunc func(int) error) func(int, int, in return func(y int, index int, total int) error { if total == 0 { gui.renderString( - "search", + gui.Views.Search, fmt.Sprintf( "no matches for '%s' %s", gui.State.Searching.searchString, @@ -62,7 +63,7 @@ func (gui *Gui) onSelectItemWrapper(innerFunc func(int) error) func(int, int, in return nil } gui.renderString( - "search", + gui.Views.Search, fmt.Sprintf( "matches for '%s' (%d of %d) %s", gui.State.Searching.searchString, diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go index 8df7acd3e..bc2fb8a24 100644 --- a/pkg/gui/tasks_adapter.go +++ b/pkg/gui/tasks_adapter.go @@ -8,17 +8,12 @@ import ( "github.com/jesseduffield/lazygit/pkg/tasks" ) -func (gui *Gui) newCmdTask(viewName string, cmd *exec.Cmd, prefix string) error { +func (gui *Gui) newCmdTask(view *gocui.View, cmd *exec.Cmd, prefix string) error { gui.Log.WithField( "command", strings.Join(cmd.Args, " "), ).Debug("RunCommand") - view, err := gui.g.View(viewName) - if err != nil { - return nil // swallowing for now - } - _, height := view.Size() _, oy := view.Origin() @@ -41,12 +36,7 @@ func (gui *Gui) newCmdTask(viewName string, cmd *exec.Cmd, prefix string) error return nil } -func (gui *Gui) newTask(viewName string, f func(chan struct{}) error) error { - view, err := gui.g.View(viewName) - if err != nil { - return nil // swallowing for now - } - +func (gui *Gui) newTask(view *gocui.View, f func(chan struct{}) error) error { manager := gui.getManager(view) if err := manager.NewTask(f); err != nil { @@ -56,16 +46,11 @@ func (gui *Gui) newTask(viewName string, f func(chan struct{}) error) error { return nil } -func (gui *Gui) newStringTask(viewName string, str string) error { - view, err := gui.g.View(viewName) - if err != nil { - return nil // swallowing for now - } - +func (gui *Gui) newStringTask(view *gocui.View, str string) error { manager := gui.getManager(view) f := func(stop chan struct{}) error { - gui.renderString(viewName, str) + gui.renderString(view, str) return nil } @@ -76,12 +61,7 @@ func (gui *Gui) newStringTask(viewName string, str string) error { return nil } -func (gui *Gui) newStringTaskWithoutScroll(viewName string, str string) error { - view, err := gui.g.View(viewName) - if err != nil { - return nil // swallowing for now - } - +func (gui *Gui) newStringTaskWithoutScroll(view *gocui.View, str string) error { manager := gui.getManager(view) f := func(stop chan struct{}) error { diff --git a/pkg/gui/updates.go b/pkg/gui/updates.go index 5f550dbd6..0d33c8728 100644 --- a/pkg/gui/updates.go +++ b/pkg/gui/updates.go @@ -52,7 +52,7 @@ func (gui *Gui) startUpdating(newVersion string) { func (gui *Gui) onUpdateFinish(statusId int, err error) error { gui.State.Updating = false gui.statusManager.removeStatus(statusId) - gui.renderString("appStatus", "") + gui.renderString(gui.Views.AppStatus, "") if err != nil { return gui.createErrorPanel("Update failed: " + err.Error()) } diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 15d513509..a7d64559c 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -207,24 +207,20 @@ func (gui *Gui) setViewContent(v *gocui.View, s string) { } // renderString resets the origin of a view and sets its content -func (gui *Gui) renderString(viewName, s string) { +func (gui *Gui) renderString(view *gocui.View, s string) { gui.g.Update(func(*gocui.Gui) error { - return gui.renderStringSync(viewName, s) + return gui.renderStringSync(view, s) }) } -func (gui *Gui) renderStringSync(viewName, s string) error { - v, err := gui.g.View(viewName) - if err != nil { - return nil // return gracefully if view has been deleted - } - if err := v.SetOrigin(0, 0); err != nil { +func (gui *Gui) renderStringSync(view *gocui.View, s string) error { + if err := view.SetOrigin(0, 0); err != nil { return err } - if err := v.SetCursor(0, 0); err != nil { + if err := view.SetCursor(0, 0); err != nil { return err } - gui.setViewContent(v, s) + gui.setViewContent(view, s) return nil } @@ -238,7 +234,7 @@ func (gui *Gui) optionsMapToString(optionsMap map[string]string) string { } func (gui *Gui) renderOptionsMap(optionsMap map[string]string) { - gui.renderString("options", gui.optionsMapToString(optionsMap)) + gui.renderString(gui.Views.Options, gui.optionsMapToString(optionsMap)) } func (gui *Gui) trimmedContent(v *gocui.View) string { diff --git a/vendor/github.com/jesseduffield/gocui/gui.go b/vendor/github.com/jesseduffield/gocui/gui.go index bd331a688..a15e5b71c 100644 --- a/vendor/github.com/jesseduffield/gocui/gui.go +++ b/vendor/github.com/jesseduffield/gocui/gui.go @@ -1002,12 +1002,7 @@ func (g *Gui) draw(v *View) error { func (g *Gui) onKey(ev *GocuiEvent) error { switch ev.Type { case eventKey: - if g.currentView != nil && g.currentView.Editable && g.currentView.Editor != nil { - matched := g.currentView.Editor.Edit(g.currentView, Key(ev.Key), ev.Ch, Modifier(ev.Mod)) - if matched { - break - } - } + _, err := g.execKeybindings(g.currentView, ev) if err != nil { return err @@ -1095,6 +1090,14 @@ func (g *Gui) execKeybindings(v *View, ev *GocuiEvent) (matched bool, err error) if matchingParentViewKb != nil { return g.execKeybinding(v.ParentView, matchingParentViewKb) } + + if g.currentView != nil && g.currentView.Editable && g.currentView.Editor != nil { + matched := g.currentView.Editor.Edit(g.currentView, Key(ev.Key), ev.Ch, Modifier(ev.Mod)) + if matched { + return true, nil + } + } + if globalKb != nil { return g.execKeybinding(v, globalKb) }