diff options
author | Mark Kopenga <mkopenga@gmail.com> | 2018-08-14 11:05:26 +0200 |
---|---|---|
committer | Mark Kopenga <mkopenga@gmail.com> | 2018-08-14 11:05:26 +0200 |
commit | dfafb988713a79664139d15ad471736a5a4b1b90 (patch) | |
tree | ebde4bd5c64ce8e1fe5e8670657c708984b0e8ff /pkg/gui/confirmation_panel.go | |
parent | f2dfcb6e12d78f3e7b890d5bd43be7b032e1df88 (diff) |
tried to update to latest master
Diffstat (limited to 'pkg/gui/confirmation_panel.go')
-rw-r--r-- | pkg/gui/confirmation_panel.go | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/pkg/gui/confirmation_panel.go b/pkg/gui/confirmation_panel.go new file mode 100644 index 000000000..3bec18419 --- /dev/null +++ b/pkg/gui/confirmation_panel.go @@ -0,0 +1,149 @@ +// lots of this has been directly ported from one of the example files, will brush up later + +// Copyright 2014 The gocui Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gui + +import ( + "strings" + + "github.com/fatih/color" + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +func (gui *Gui) wrappedConfirmationFunction(function func(*gocui.Gui, *gocui.View) error) func(*gocui.Gui, *gocui.View) error { + return func(g *gocui.Gui, v *gocui.View) error { + if function != nil { + if err := function(g, v); err != nil { + panic(err) + } + } + return gui.closeConfirmationPrompt(g) + } +} + +func (gui *Gui) closeConfirmationPrompt(g *gocui.Gui) error { + view, err := g.View("confirmation") + if err != nil { + panic(err) + } + if err := gui.returnFocus(g, view); err != nil { + panic(err) + } + g.DeleteKeybindings("confirmation") + return g.DeleteView("confirmation") +} + +func (gui *Gui) getMessageHeight(message string, width int) int { + lines := strings.Split(message, "\n") + lineCount := 0 + for _, line := range lines { + lineCount += len(line)/width + 1 + } + return lineCount +} + +func (gui *Gui) getConfirmationPanelDimensions(g *gocui.Gui, prompt string) (int, int, int, int) { + width, height := g.Size() + panelWidth := width / 2 + panelHeight := gui.getMessageHeight(prompt, panelWidth) + return width/2 - panelWidth/2, + height/2 - panelHeight/2 - panelHeight%2 - 1, + width/2 + panelWidth/2, + height/2 + panelHeight/2 +} + +func (gui *Gui) createPromptPanel(g *gocui.Gui, currentView *gocui.View, title string, handleConfirm func(*gocui.Gui, *gocui.View) error) error { + g.SetViewOnBottom("commitMessage") + // only need to fit one line + x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(g, "") + if confirmationView, err := g.SetView("confirmation", x0, y0, x1, y1, 0); err != nil { + if err != gocui.ErrUnknownView { + return err + } + + confirmationView.Editable = true + confirmationView.Title = title + gui.switchFocus(g, currentView, confirmationView) + return gui.setKeyBindings(g, handleConfirm, nil) + } + return nil +} + +func (gui *Gui) createConfirmationPanel(g *gocui.Gui, currentView *gocui.View, title, prompt string, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error { + g.SetViewOnBottom("commitMessage") + g.Update(func(g *gocui.Gui) error { + // delete the existing confirmation panel if it exists + if view, _ := g.View("confirmation"); view != nil { + if err := gui.closeConfirmationPrompt(g); err != nil { + panic(err) + } + } + x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(g, prompt) + if confirmationView, err := g.SetView("confirmation", x0, y0, x1, y1, 0); err != nil { + if err != gocui.ErrUnknownView { + return err + } + confirmationView.Title = title + confirmationView.FgColor = gocui.ColorWhite + gui.renderString(g, "confirmation", prompt) + gui.switchFocus(g, currentView, confirmationView) + return gui.setKeyBindings(g, handleConfirm, handleClose) + } + return nil + }) + return nil +} + +func (gui *Gui) handleNewline(g *gocui.Gui, v *gocui.View) error { + // resising ahead of time so that the top line doesn't get hidden to make + // room for the cursor on the second line + x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(g, v.Buffer()) + if _, err := g.SetView("confirmation", x0, y0, x1, y1+1, 0); err != nil { + if err != gocui.ErrUnknownView { + return err + } + } + + v.EditNewLine() + return nil +} + +func (gui *Gui) setKeyBindings(g *gocui.Gui, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error { + gui.renderString(g, "options", "esc: close, enter: confirm") + if err := g.SetKeybinding("confirmation", gocui.KeyEnter, gocui.ModNone, gui.wrappedConfirmationFunction(handleConfirm)); err != nil { + return err + } + if err := g.SetKeybinding("confirmation", gocui.KeyTab, gocui.ModNone, gui.handleNewline); err != nil { + return err + } + return g.SetKeybinding("confirmation", gocui.KeyEsc, gocui.ModNone, gui.wrappedConfirmationFunction(handleClose)) +} + +func (gui *Gui) createMessagePanel(g *gocui.Gui, currentView *gocui.View, title, prompt string) error { + return gui.createConfirmationPanel(g, currentView, title, prompt, nil, nil) +} + +func (gui *Gui) createErrorPanel(g *gocui.Gui, message string) error { + currentView := g.CurrentView() + colorFunction := color.New(color.FgRed).SprintFunc() + coloredMessage := colorFunction(strings.TrimSpace(message)) + return gui.createConfirmationPanel(g, currentView, "Error", coloredMessage, nil, nil) +} + +func (gui *Gui) resizePopupPanel(g *gocui.Gui, v *gocui.View) error { + // If the confirmation panel is already displayed, just resize the width, + // otherwise continue + content := utils.TrimTrailingNewline(v.Buffer()) + x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(g, content) + vx0, vy0, vx1, vy1 := v.Dimensions() + if vx0 == x0 && vy0 == y0 && vx1 == x1 && vy1 == y1 { + return nil + } + gui.Log.Info("resizing popup panel") + _, err := g.SetView(v.Name(), x0, y0, x1, y1, 0) + return err +} |