mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-09-11 16:16:28 -04:00
Each command a side panel handles in the focused main view needed its own delegation channel: a HasKeybindings getter, an IBaseContext Add method, a BaseContext field + getter, a baseController nil default, and an attach.go registration — roughly five touch points per command. With three commands (click, stage, toggle-patch) that was already a lot of boilerplate, and it doesn't scale to the discard / copy commands coming next. Replace the three channels with one: a side panel exposes a single FocusedMainViewActions interface via GetFocusedMainViewActions (nil when its diff offers no actions), and the controllers implement that interface directly. The stage and toggle-patch handlers, already unified to a plain error return, become one PrimaryAction method whose meaning is the panel's business (stage for the files panel, patch toggle for the commit panels); the click handler becomes OnClick. MainViewController is now a thin dispatcher: fetch the actions from the panel beneath, call the method. Adding a command is now one interface method, an implementation in the two or three controllers, and a keybinding — no plumbing. The toggle-patch channel did double duty as the "this panel builds a custom patch" signal for the inclusion gutter (shown only beneath a patch-building panel, not the staging files panel). Collapsing the channels removes that proxy, so make the classification explicit on DiffMainViewContext, whose marker method now returns a DiffMainViewType (none / staging / patch-building) instead of being a bare marker. The gutter shows only beneath a panel whose type is patch-building (commit files, local commits, sub-commits, stash). Behavior-preserving. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package context
|
|
|
|
import (
|
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/filetree"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/presentation/icons"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
type WorkingTreeContext struct {
|
|
*filetree.FileTreeViewModel
|
|
*ListContextTrait
|
|
}
|
|
|
|
var (
|
|
_ types.IListContext = (*WorkingTreeContext)(nil)
|
|
_ types.IFilterableContext = (*WorkingTreeContext)(nil)
|
|
_ types.DiffMainViewContext = (*WorkingTreeContext)(nil)
|
|
)
|
|
|
|
func (self *WorkingTreeContext) GetDiffMainViewType() types.DiffMainViewType {
|
|
return types.DiffMainViewTypeStaging
|
|
}
|
|
|
|
func NewWorkingTreeContext(c *ContextCommon) *WorkingTreeContext {
|
|
viewModel := filetree.NewFileTreeViewModel(
|
|
func() []*models.File { return c.Model().Files },
|
|
c.Common,
|
|
c.UserConfig().Gui.ShowFileTree,
|
|
)
|
|
|
|
getDisplayStrings := func(_ int, _ int) [][]string {
|
|
showFileIcons := icons.IsIconEnabled() && c.UserConfig().Gui.ShowFileIcons
|
|
showNumstat := c.UserConfig().Gui.ShowNumstatInFilesView
|
|
lines := presentation.RenderFileTree(viewModel, c.Model().Submodules, showFileIcons, showNumstat, &c.UserConfig().Gui.CustomIcons, c.UserConfig().Gui.ShowRootItemInFileTree)
|
|
return lo.Map(lines, func(line string, _ int) []string {
|
|
return []string{line}
|
|
})
|
|
}
|
|
|
|
ctx := &WorkingTreeContext{
|
|
FileTreeViewModel: viewModel,
|
|
ListContextTrait: &ListContextTrait{
|
|
Context: NewSimpleContext(NewBaseContext(NewBaseContextOpts{
|
|
View: c.Views().Files,
|
|
WindowName: "files",
|
|
Key: FILES_CONTEXT_KEY,
|
|
Kind: types.SIDE_CONTEXT,
|
|
Focusable: true,
|
|
})),
|
|
ListRenderer: ListRenderer{
|
|
list: viewModel,
|
|
getDisplayStrings: getDisplayStrings,
|
|
},
|
|
c: c,
|
|
},
|
|
}
|
|
|
|
return ctx
|
|
}
|