mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-06-17 00:18:05 +02:00
add commit count via gocui subtitle
This commit is contained in:
4
Gopkg.lock
generated
4
Gopkg.lock
generated
@ -189,11 +189,11 @@
|
|||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
digest = "1:145fe566d21b0e2579e1600f09e4e4b01da017676ba8e079de75a2e21111538b"
|
digest = "1:71e6c15797951d3fabaa944d70253e36a6cee96bf54ca0bc43ca3de3b4814bbb"
|
||||||
name = "github.com/jesseduffield/gocui"
|
name = "github.com/jesseduffield/gocui"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
pruneopts = "NUT"
|
pruneopts = "NUT"
|
||||||
revision = "c4051ef0fbcbe519bc1d082a579a38100c7cf044"
|
revision = "2cb6e95bbbf850bb32cc1799e07d08ff0f144746"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:ac6d01547ec4f7f673311b4663909269bfb8249952de3279799289467837c3cc"
|
digest = "1:ac6d01547ec4f7f673311b4663909269bfb8249952de3279799289467837c3cc"
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package gui
|
package gui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/jesseduffield/gocui"
|
"github.com/jesseduffield/gocui"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +33,6 @@ func (gui *Gui) handleCommitConfirm(g *gocui.Gui, v *gocui.View) error {
|
|||||||
|
|
||||||
func (gui *Gui) handleCommitClose(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleCommitClose(g *gocui.Gui, v *gocui.View) error {
|
||||||
g.SetViewOnBottom("commitMessage")
|
g.SetViewOnBottom("commitMessage")
|
||||||
g.SetViewOnBottom("commitMessageCount")
|
|
||||||
return gui.switchFocus(g, v, gui.getFilesView(g))
|
return gui.switchFocus(g, v, gui.getFilesView(g))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,3 +46,34 @@ func (gui *Gui) handleCommitFocused(g *gocui.Gui, v *gocui.View) error {
|
|||||||
)
|
)
|
||||||
return gui.renderString(g, "options", message)
|
return gui.renderString(g, "options", message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) simpleEditor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
|
||||||
|
switch {
|
||||||
|
case key == gocui.KeyBackspace || key == gocui.KeyBackspace2:
|
||||||
|
v.EditDelete(true)
|
||||||
|
case key == gocui.KeyDelete:
|
||||||
|
v.EditDelete(false)
|
||||||
|
case key == gocui.KeyArrowDown:
|
||||||
|
v.MoveCursor(0, 1, false)
|
||||||
|
case key == gocui.KeyArrowUp:
|
||||||
|
v.MoveCursor(0, -1, false)
|
||||||
|
case key == gocui.KeyArrowLeft:
|
||||||
|
v.MoveCursor(-1, 0, false)
|
||||||
|
case key == gocui.KeyArrowRight:
|
||||||
|
v.MoveCursor(1, 0, false)
|
||||||
|
case key == gocui.KeyTab:
|
||||||
|
v.EditNewLine()
|
||||||
|
case key == gocui.KeySpace:
|
||||||
|
v.EditWrite(' ')
|
||||||
|
case key == gocui.KeyInsert:
|
||||||
|
v.Overwrite = !v.Overwrite
|
||||||
|
default:
|
||||||
|
v.EditWrite(ch)
|
||||||
|
}
|
||||||
|
|
||||||
|
v.Subtitle = gui.getBufferLength(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) getBufferLength(view *gocui.View) string {
|
||||||
|
return " " + strconv.Itoa(strings.Count(view.Buffer(), "")-1) + " "
|
||||||
|
}
|
||||||
|
@ -115,20 +115,6 @@ func (gui *Gui) createConfirmationPanel(g *gocui.Gui, currentView *gocui.View, t
|
|||||||
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 {
|
func (gui *Gui) setKeyBindings(g *gocui.Gui, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error {
|
||||||
actions := gui.Tr.TemplateLocalize(
|
actions := gui.Tr.TemplateLocalize(
|
||||||
"CloseConfirm",
|
"CloseConfirm",
|
||||||
@ -143,9 +129,6 @@ func (gui *Gui) setKeyBindings(g *gocui.Gui, handleConfirm, handleClose func(*go
|
|||||||
if err := g.SetKeybinding("confirmation", gocui.KeyEnter, gocui.ModNone, gui.wrappedConfirmationFunction(handleConfirm)); err != nil {
|
if err := g.SetKeybinding("confirmation", gocui.KeyEnter, gocui.ModNone, gui.wrappedConfirmationFunction(handleConfirm)); err != nil {
|
||||||
return err
|
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))
|
return g.SetKeybinding("confirmation", gocui.KeyEsc, gocui.ModNone, gui.wrappedConfirmationFunction(handleClose))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
"github.com/jesseduffield/gocui"
|
"github.com/jesseduffield/gocui"
|
||||||
"github.com/jesseduffield/lazygit/pkg/commands"
|
"github.com/jesseduffield/lazygit/pkg/commands"
|
||||||
"strconv"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (gui *Gui) stagedFiles() []commands.File {
|
func (gui *Gui) stagedFiles() []commands.File {
|
||||||
@ -219,60 +218,6 @@ func (gui *Gui) handleFileSelect(g *gocui.Gui, v *gocui.View) error {
|
|||||||
return gui.renderString(g, "main", content)
|
return gui.renderString(g, "main", content)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) simpleEditor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
|
|
||||||
switch {
|
|
||||||
case key == gocui.KeyBackspace || key == gocui.KeyBackspace2:
|
|
||||||
v.EditDelete(true)
|
|
||||||
case key == gocui.KeyDelete:
|
|
||||||
v.EditDelete(false)
|
|
||||||
case key == gocui.KeyArrowDown:
|
|
||||||
v.MoveCursor(0, 1, false)
|
|
||||||
case key == gocui.KeyArrowUp:
|
|
||||||
v.MoveCursor(0, -1, false)
|
|
||||||
case key == gocui.KeyArrowLeft:
|
|
||||||
v.MoveCursor(-1, 0, false)
|
|
||||||
case key == gocui.KeyArrowRight:
|
|
||||||
v.MoveCursor(1, 0, false)
|
|
||||||
case key == gocui.KeyTab:
|
|
||||||
v.EditNewLine()
|
|
||||||
case key == gocui.KeySpace:
|
|
||||||
v.EditWrite(' ')
|
|
||||||
case key == gocui.KeyInsert:
|
|
||||||
v.Overwrite = !v.Overwrite
|
|
||||||
default:
|
|
||||||
v.EditWrite(ch)
|
|
||||||
}
|
|
||||||
|
|
||||||
gui.renderCommitCount(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gui *Gui) getCommitCount(view *gocui.View) int {
|
|
||||||
return strings.Count(view.Buffer(), "") - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gui *Gui) renderCommitCount(view *gocui.View) error {
|
|
||||||
num := 0
|
|
||||||
offset := 5
|
|
||||||
count := gui.getCommitCount(view)
|
|
||||||
_, y0, x1, _ := gui.getConfirmationPanelDimensions(gui.g, view.Buffer())
|
|
||||||
|
|
||||||
if count > 99 {
|
|
||||||
num = 3
|
|
||||||
} else if count > 9 {
|
|
||||||
num = 2
|
|
||||||
} else {
|
|
||||||
num = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := gui.g.SetView("commitMessageCount", x1-num-offset, y0-1, x1-offset+1, y0+1, 0); err != nil {
|
|
||||||
if err != gocui.ErrUnknownView {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return gui.renderString(gui.g, "commitMessageCount", strconv.Itoa(count))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gui *Gui) handleCommitPress(g *gocui.Gui, filesView *gocui.View) error {
|
func (gui *Gui) handleCommitPress(g *gocui.Gui, filesView *gocui.View) error {
|
||||||
if len(gui.stagedFiles()) == 0 && !gui.State.HasMergeConflicts {
|
if len(gui.stagedFiles()) == 0 && !gui.State.HasMergeConflicts {
|
||||||
return gui.createErrorPanel(g, gui.Tr.SLocalize("NoStagedFilesToCommit"))
|
return gui.createErrorPanel(g, gui.Tr.SLocalize("NoStagedFilesToCommit"))
|
||||||
@ -280,9 +225,8 @@ func (gui *Gui) handleCommitPress(g *gocui.Gui, filesView *gocui.View) error {
|
|||||||
commitMessageView := gui.getCommitMessageView(g)
|
commitMessageView := gui.getCommitMessageView(g)
|
||||||
g.Update(func(g *gocui.Gui) error {
|
g.Update(func(g *gocui.Gui) error {
|
||||||
g.SetViewOnTop("commitMessage")
|
g.SetViewOnTop("commitMessage")
|
||||||
g.SetViewOnTop("commitMessageCount")
|
|
||||||
gui.switchFocus(g, filesView, commitMessageView)
|
gui.switchFocus(g, filesView, commitMessageView)
|
||||||
gui.renderCommitCount(commitMessageView)
|
commitMessageView.Subtitle = gui.getBufferLength(commitMessageView)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
|
@ -264,15 +264,6 @@ func (gui *Gui) layout(g *gocui.Gui) error {
|
|||||||
commitMessageView.Editable = true
|
commitMessageView.Editable = true
|
||||||
commitMessageView.Editor = gocui.EditorFunc(gui.simpleEditor)
|
commitMessageView.Editor = gocui.EditorFunc(gui.simpleEditor)
|
||||||
}
|
}
|
||||||
if commitMessageCountView, err := g.SetView("commitMessageCount", 0, 0, width/2, height/2, 0); err != nil {
|
|
||||||
if err != gocui.ErrUnknownView {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
g.SetViewOnBottom("commitMessageCount")
|
|
||||||
commitMessageCountView.Frame = false
|
|
||||||
commitMessageCountView.BgColor = gocui.ColorDefault
|
|
||||||
commitMessageCountView.FgColor = gocui.ColorWhite
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if appStatusView, err := g.SetView("appStatus", -1, optionsTop, width, optionsTop+2, 0); err != nil {
|
if appStatusView, err := g.SetView("appStatus", -1, optionsTop, width, optionsTop+2, 0); err != nil {
|
||||||
|
24
vendor/github.com/jesseduffield/gocui/gui.go
generated
vendored
24
vendor/github.com/jesseduffield/gocui/gui.go
generated
vendored
@ -476,6 +476,11 @@ func (g *Gui) flush() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if v.Subtitle != "" {
|
||||||
|
if err := g.drawSubtitle(v, fgColor, bgColor); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err := g.draw(v); err != nil {
|
if err := g.draw(v); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -582,6 +587,25 @@ func (g *Gui) drawTitle(v *View, fgColor, bgColor Attribute) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// drawSubtitle draws the subtitle of the view.
|
||||||
|
func (g *Gui) drawSubtitle(v *View, fgColor, bgColor Attribute) error {
|
||||||
|
if v.y0 < 0 || v.y0 >= g.maxY {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
start := v.x1 - 5 - len(v.Subtitle)
|
||||||
|
for i, ch := range v.Subtitle {
|
||||||
|
x := start + i
|
||||||
|
if x >= v.x1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err := g.SetRune(x, v.y0, ch, fgColor, bgColor); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// draw manages the cursor and calls the draw function of a view.
|
// draw manages the cursor and calls the draw function of a view.
|
||||||
func (g *Gui) draw(v *View) error {
|
func (g *Gui) draw(v *View) error {
|
||||||
if g.Cursor {
|
if g.Cursor {
|
||||||
|
3
vendor/github.com/jesseduffield/gocui/view.go
generated
vendored
3
vendor/github.com/jesseduffield/gocui/view.go
generated
vendored
@ -77,6 +77,9 @@ type View struct {
|
|||||||
// If Frame is true, Title allows to configure a title for the view.
|
// If Frame is true, Title allows to configure a title for the view.
|
||||||
Title string
|
Title string
|
||||||
|
|
||||||
|
// If Frame is true, Subtitle allows to configure a subtitle for the view.
|
||||||
|
Subtitle string
|
||||||
|
|
||||||
// If Mask is true, the View will display the mask instead of the real
|
// If Mask is true, the View will display the mask instead of the real
|
||||||
// content
|
// content
|
||||||
Mask rune
|
Mask rune
|
||||||
|
Reference in New Issue
Block a user