1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-12-14 11:23:09 +02:00
lazygit/pkg/gui/list_context_config.go
Stefan Haller de3e4838ad Store WorkingTreeState in model
This is the working tree state at the time the model commits were loaded. This
avoids a visual glitch with the "You Are Here" label appearing at times when it
is not supposed to.
2023-03-01 09:12:00 +01:00

306 lines
8.7 KiB
Go

package gui
import (
"log"
"github.com/jesseduffield/generics/slices"
"github.com/jesseduffield/lazygit/pkg/commands/git_commands"
"github.com/jesseduffield/lazygit/pkg/commands/models"
"github.com/jesseduffield/lazygit/pkg/commands/types/enums"
"github.com/jesseduffield/lazygit/pkg/gui/context"
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
"github.com/jesseduffield/lazygit/pkg/gui/style"
"github.com/jesseduffield/lazygit/pkg/gui/types"
)
func (gui *Gui) menuListContext() *context.MenuContext {
return context.NewMenuContext(
gui.Views.Menu,
gui.c,
gui.getMenuOptions,
func(content string) {
gui.Views.Tooltip.SetContent(content)
},
)
}
func (gui *Gui) filesListContext() *context.WorkingTreeContext {
return context.NewWorkingTreeContext(
func() []*models.File { return gui.State.Model.Files },
gui.Views.Files,
func(startIdx int, length int) [][]string {
lines := presentation.RenderFileTree(gui.State.Contexts.Files.FileTreeViewModel, gui.State.Modes.Diffing.Ref, gui.State.Model.Submodules)
return slices.Map(lines, func(line string) []string {
return []string{line}
})
},
nil,
gui.withDiffModeCheck(gui.filesRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) branchesListContext() *context.BranchesContext {
return context.NewBranchesContext(
func() []*models.Branch { return gui.State.Model.Branches },
gui.Views.Branches,
func(startIdx int, length int) [][]string {
return presentation.GetBranchListDisplayStrings(gui.State.Model.Branches, gui.State.ScreenMode != SCREEN_NORMAL, gui.State.Modes.Diffing.Ref, gui.Tr)
},
nil,
gui.withDiffModeCheck(gui.branchesRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) remotesListContext() *context.RemotesContext {
return context.NewRemotesContext(
func() []*models.Remote { return gui.State.Model.Remotes },
gui.Views.Remotes,
func(startIdx int, length int) [][]string {
return presentation.GetRemoteListDisplayStrings(gui.State.Model.Remotes, gui.State.Modes.Diffing.Ref)
},
nil,
gui.withDiffModeCheck(gui.remotesRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) remoteBranchesListContext() *context.RemoteBranchesContext {
return context.NewRemoteBranchesContext(
func() []*models.RemoteBranch { return gui.State.Model.RemoteBranches },
gui.Views.RemoteBranches,
func(startIdx int, length int) [][]string {
return presentation.GetRemoteBranchListDisplayStrings(gui.State.Model.RemoteBranches, gui.State.Modes.Diffing.Ref)
},
nil,
gui.withDiffModeCheck(gui.remoteBranchesRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) withDiffModeCheck(f func() error) func() error {
return func() error {
if gui.State.Modes.Diffing.Active() {
return gui.renderDiff()
}
return f()
}
}
func (gui *Gui) tagsListContext() *context.TagsContext {
return context.NewTagsContext(
func() []*models.Tag { return gui.State.Model.Tags },
gui.Views.Tags,
func(startIdx int, length int) [][]string {
return presentation.GetTagListDisplayStrings(gui.State.Model.Tags, gui.State.Modes.Diffing.Ref)
},
nil,
gui.withDiffModeCheck(gui.tagsRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) branchCommitsListContext() *context.LocalCommitsContext {
return context.NewLocalCommitsContext(
func() []*models.Commit { return gui.State.Model.Commits },
gui.Views.Commits,
func(startIdx int, length int) [][]string {
selectedCommitSha := ""
if gui.currentContext().GetKey() == context.LOCAL_COMMITS_CONTEXT_KEY {
selectedCommit := gui.State.Contexts.LocalCommits.GetSelected()
if selectedCommit != nil {
selectedCommitSha = selectedCommit.Sha
}
}
showYouAreHereLabel := gui.State.Model.WorkingTreeStateAtLastCommitRefresh == enums.REBASE_MODE_REBASING
return presentation.GetCommitListDisplayStrings(
gui.Common,
gui.State.Model.Commits,
gui.State.ScreenMode != SCREEN_NORMAL,
gui.helpers.CherryPick.CherryPickedCommitShaSet(),
gui.State.Modes.Diffing.Ref,
gui.c.UserConfig.Gui.TimeFormat,
gui.c.UserConfig.Git.ParseEmoji,
selectedCommitSha,
startIdx,
length,
gui.shouldShowGraph(),
gui.State.Model.BisectInfo,
showYouAreHereLabel,
)
},
OnFocusWrapper(gui.onCommitFocus),
gui.withDiffModeCheck(gui.branchCommitsRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) subCommitsListContext() *context.SubCommitsContext {
return context.NewSubCommitsContext(
func() []*models.Commit { return gui.State.Model.SubCommits },
gui.Views.SubCommits,
func(startIdx int, length int) [][]string {
selectedCommitSha := ""
if gui.currentContext().GetKey() == context.SUB_COMMITS_CONTEXT_KEY {
selectedCommit := gui.State.Contexts.SubCommits.GetSelected()
if selectedCommit != nil {
selectedCommitSha = selectedCommit.Sha
}
}
return presentation.GetCommitListDisplayStrings(
gui.Common,
gui.State.Model.SubCommits,
gui.State.ScreenMode != SCREEN_NORMAL,
gui.helpers.CherryPick.CherryPickedCommitShaSet(),
gui.State.Modes.Diffing.Ref,
gui.c.UserConfig.Gui.TimeFormat,
gui.c.UserConfig.Git.ParseEmoji,
selectedCommitSha,
startIdx,
length,
gui.shouldShowGraph(),
git_commands.NewNullBisectInfo(),
false,
)
},
nil,
gui.withDiffModeCheck(gui.subCommitsRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) shouldShowGraph() bool {
if gui.State.Modes.Filtering.Active() {
return false
}
value := gui.c.UserConfig.Git.Log.ShowGraph
switch value {
case "always":
return true
case "never":
return false
case "when-maximised":
return gui.State.ScreenMode != SCREEN_NORMAL
}
log.Fatalf("Unknown value for git.log.showGraph: %s. Expected one of: 'always', 'never', 'when-maximised'", value)
return false
}
func (gui *Gui) reflogCommitsListContext() *context.ReflogCommitsContext {
return context.NewReflogCommitsContext(
func() []*models.Commit { return gui.State.Model.FilteredReflogCommits },
gui.Views.ReflogCommits,
func(startIdx int, length int) [][]string {
return presentation.GetReflogCommitListDisplayStrings(
gui.State.Model.FilteredReflogCommits,
gui.State.ScreenMode != SCREEN_NORMAL,
gui.helpers.CherryPick.CherryPickedCommitShaSet(),
gui.State.Modes.Diffing.Ref,
gui.c.UserConfig.Gui.TimeFormat,
gui.c.UserConfig.Git.ParseEmoji,
)
},
nil,
gui.withDiffModeCheck(gui.reflogCommitsRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) stashListContext() *context.StashContext {
return context.NewStashContext(
func() []*models.StashEntry { return gui.State.Model.StashEntries },
gui.Views.Stash,
func(startIdx int, length int) [][]string {
return presentation.GetStashEntryListDisplayStrings(gui.State.Model.StashEntries, gui.State.Modes.Diffing.Ref)
},
nil,
gui.withDiffModeCheck(gui.stashRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) commitFilesListContext() *context.CommitFilesContext {
return context.NewCommitFilesContext(
func() []*models.CommitFile { return gui.State.Model.CommitFiles },
gui.Views.CommitFiles,
func(startIdx int, length int) [][]string {
if gui.State.Contexts.CommitFiles.CommitFileTreeViewModel.Len() == 0 {
return [][]string{{style.FgRed.Sprint("(none)")}}
}
lines := presentation.RenderCommitFileTree(gui.State.Contexts.CommitFiles.CommitFileTreeViewModel, gui.State.Modes.Diffing.Ref, gui.git.Patch.PatchManager)
return slices.Map(lines, func(line string) []string {
return []string{line}
})
},
nil,
gui.withDiffModeCheck(gui.commitFilesRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) submodulesListContext() *context.SubmodulesContext {
return context.NewSubmodulesContext(
func() []*models.SubmoduleConfig { return gui.State.Model.Submodules },
gui.Views.Submodules,
func(startIdx int, length int) [][]string {
return presentation.GetSubmoduleListDisplayStrings(gui.State.Model.Submodules)
},
nil,
gui.withDiffModeCheck(gui.submodulesRenderToMain),
nil,
gui.c,
)
}
func (gui *Gui) suggestionsListContext() *context.SuggestionsContext {
return context.NewSuggestionsContext(
func() []*types.Suggestion { return gui.State.Suggestions },
gui.Views.Suggestions,
func(startIdx int, length int) [][]string {
return presentation.GetSuggestionListDisplayStrings(gui.State.Suggestions)
},
nil,
nil,
func(types.OnFocusLostOpts) error {
gui.deactivateConfirmationPrompt()
return nil
},
gui.c,
)
}
func (gui *Gui) getListContexts() []types.IListContext {
return []types.IListContext{
gui.State.Contexts.Menu,
gui.State.Contexts.Files,
gui.State.Contexts.Branches,
gui.State.Contexts.Remotes,
gui.State.Contexts.RemoteBranches,
gui.State.Contexts.Tags,
gui.State.Contexts.LocalCommits,
gui.State.Contexts.ReflogCommits,
gui.State.Contexts.SubCommits,
gui.State.Contexts.Stash,
gui.State.Contexts.CommitFiles,
gui.State.Contexts.Submodules,
gui.State.Contexts.Suggestions,
}
}