mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-30 03:23:08 +03:00
allow rendering to main panels from anywhere
This commit is contained in:
@ -1,124 +1,48 @@
|
||||
package gui
|
||||
|
||||
import (
|
||||
"os/exec"
|
||||
|
||||
"github.com/jesseduffield/gocui"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
)
|
||||
|
||||
type viewUpdateOpts struct {
|
||||
title string
|
||||
|
||||
task updateTask
|
||||
}
|
||||
|
||||
type refreshMainOpts struct {
|
||||
pair MainContextPair
|
||||
main *viewUpdateOpts
|
||||
secondary *viewUpdateOpts
|
||||
}
|
||||
|
||||
type updateTask interface {
|
||||
IsUpdateTask()
|
||||
}
|
||||
|
||||
type renderStringTask struct {
|
||||
str string
|
||||
}
|
||||
|
||||
func (t *renderStringTask) IsUpdateTask() {}
|
||||
|
||||
func NewRenderStringTask(str string) *renderStringTask {
|
||||
return &renderStringTask{str: str}
|
||||
}
|
||||
|
||||
type renderStringWithoutScrollTask struct {
|
||||
str string
|
||||
}
|
||||
|
||||
func (t *renderStringWithoutScrollTask) IsUpdateTask() {}
|
||||
|
||||
func NewRenderStringWithoutScrollTask(str string) *renderStringWithoutScrollTask {
|
||||
return &renderStringWithoutScrollTask{str: str}
|
||||
}
|
||||
|
||||
type renderStringWithScrollTask struct {
|
||||
str string
|
||||
originX int
|
||||
originY int
|
||||
}
|
||||
|
||||
func (t *renderStringWithScrollTask) IsUpdateTask() {}
|
||||
|
||||
func NewRenderStringWithScrollTask(str string, originX int, originY int) *renderStringWithScrollTask {
|
||||
return &renderStringWithScrollTask{str: str, originX: originX, originY: originY}
|
||||
}
|
||||
|
||||
type runCommandTask struct {
|
||||
cmd *exec.Cmd
|
||||
prefix string
|
||||
}
|
||||
|
||||
func (t *runCommandTask) IsUpdateTask() {}
|
||||
|
||||
func NewRunCommandTask(cmd *exec.Cmd) *runCommandTask {
|
||||
return &runCommandTask{cmd: cmd}
|
||||
}
|
||||
|
||||
func NewRunCommandTaskWithPrefix(cmd *exec.Cmd, prefix string) *runCommandTask {
|
||||
return &runCommandTask{cmd: cmd, prefix: prefix}
|
||||
}
|
||||
|
||||
type runPtyTask struct {
|
||||
cmd *exec.Cmd
|
||||
prefix string
|
||||
}
|
||||
|
||||
func (t *runPtyTask) IsUpdateTask() {}
|
||||
|
||||
func NewRunPtyTask(cmd *exec.Cmd) *runPtyTask {
|
||||
return &runPtyTask{cmd: cmd}
|
||||
}
|
||||
|
||||
func (gui *Gui) runTaskForView(view *gocui.View, task updateTask) error {
|
||||
func (gui *Gui) runTaskForView(view *gocui.View, task types.UpdateTask) error {
|
||||
switch v := task.(type) {
|
||||
case *renderStringTask:
|
||||
return gui.newStringTask(view, v.str)
|
||||
case *types.RenderStringTask:
|
||||
return gui.newStringTask(view, v.Str)
|
||||
|
||||
case *renderStringWithoutScrollTask:
|
||||
return gui.newStringTaskWithoutScroll(view, v.str)
|
||||
case *types.RenderStringWithoutScrollTask:
|
||||
return gui.newStringTaskWithoutScroll(view, v.Str)
|
||||
|
||||
case *renderStringWithScrollTask:
|
||||
return gui.newStringTaskWithScroll(view, v.str, v.originX, v.originY)
|
||||
case *types.RenderStringWithScrollTask:
|
||||
return gui.newStringTaskWithScroll(view, v.Str, v.OriginX, v.OriginY)
|
||||
|
||||
case *runCommandTask:
|
||||
return gui.newCmdTask(view, v.cmd, v.prefix)
|
||||
case *types.RunCommandTask:
|
||||
return gui.newCmdTask(view, v.Cmd, v.Prefix)
|
||||
|
||||
case *runPtyTask:
|
||||
return gui.newPtyTask(view, v.cmd, v.prefix)
|
||||
case *types.RunPtyTask:
|
||||
return gui.newPtyTask(view, v.Cmd, v.Prefix)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (gui *Gui) moveMainContextPairToTop(pair MainContextPair) {
|
||||
gui.setWindowContext(pair.main)
|
||||
gui.moveToTopOfWindow(pair.main)
|
||||
if pair.secondary != nil {
|
||||
gui.setWindowContext(pair.secondary)
|
||||
gui.moveToTopOfWindow(pair.secondary)
|
||||
func (gui *Gui) moveMainContextPairToTop(pair types.MainContextPair) {
|
||||
gui.setWindowContext(pair.Main)
|
||||
gui.moveToTopOfWindow(pair.Main)
|
||||
if pair.Secondary != nil {
|
||||
gui.setWindowContext(pair.Secondary)
|
||||
gui.moveToTopOfWindow(pair.Secondary)
|
||||
}
|
||||
}
|
||||
|
||||
func (gui *Gui) refreshMainView(opts *viewUpdateOpts, context types.Context) error {
|
||||
func (gui *Gui) RefreshMainView(opts *types.ViewUpdateOpts, context types.Context) error {
|
||||
view := context.GetView()
|
||||
|
||||
if opts.title != "" {
|
||||
view.Title = opts.title
|
||||
if opts.Title != "" {
|
||||
view.Title = opts.Title
|
||||
}
|
||||
|
||||
if err := gui.runTaskForView(view, opts.task); err != nil {
|
||||
if err := gui.runTaskForView(view, opts.Task); err != nil {
|
||||
gui.c.Log.Error(err)
|
||||
return nil
|
||||
}
|
||||
@ -126,41 +50,36 @@ func (gui *Gui) refreshMainView(opts *viewUpdateOpts, context types.Context) err
|
||||
return nil
|
||||
}
|
||||
|
||||
type MainContextPair struct {
|
||||
main types.Context
|
||||
secondary types.Context
|
||||
func (gui *Gui) normalMainContextPair() types.MainContextPair {
|
||||
return types.NewMainContextPair(
|
||||
gui.State.Contexts.Normal,
|
||||
gui.State.Contexts.NormalSecondary,
|
||||
)
|
||||
}
|
||||
|
||||
func (gui *Gui) normalMainContextPair() MainContextPair {
|
||||
return MainContextPair{
|
||||
main: gui.State.Contexts.Normal,
|
||||
secondary: gui.State.Contexts.NormalSecondary,
|
||||
}
|
||||
func (gui *Gui) stagingMainContextPair() types.MainContextPair {
|
||||
return types.NewMainContextPair(
|
||||
gui.State.Contexts.Staging,
|
||||
gui.State.Contexts.StagingSecondary,
|
||||
)
|
||||
}
|
||||
|
||||
func (gui *Gui) stagingMainContextPair() MainContextPair {
|
||||
return MainContextPair{
|
||||
main: gui.State.Contexts.Staging,
|
||||
secondary: gui.State.Contexts.StagingSecondary,
|
||||
}
|
||||
func (gui *Gui) patchBuildingMainContextPair() types.MainContextPair {
|
||||
return types.NewMainContextPair(
|
||||
gui.State.Contexts.CustomPatchBuilder,
|
||||
gui.State.Contexts.CustomPatchBuilderSecondary,
|
||||
)
|
||||
}
|
||||
|
||||
func (gui *Gui) patchBuildingMainContextPair() MainContextPair {
|
||||
return MainContextPair{
|
||||
main: gui.State.Contexts.CustomPatchBuilder,
|
||||
secondary: gui.State.Contexts.CustomPatchBuilderSecondary,
|
||||
}
|
||||
func (gui *Gui) mergingMainContextPair() types.MainContextPair {
|
||||
return types.NewMainContextPair(
|
||||
gui.State.Contexts.MergeConflicts,
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
||||
func (gui *Gui) mergingMainContextPair() MainContextPair {
|
||||
return MainContextPair{
|
||||
main: gui.State.Contexts.MergeConflicts,
|
||||
secondary: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func (gui *Gui) allMainContextPairs() []MainContextPair {
|
||||
return []MainContextPair{
|
||||
func (gui *Gui) allMainContextPairs() []types.MainContextPair {
|
||||
return []types.MainContextPair{
|
||||
gui.normalMainContextPair(),
|
||||
gui.stagingMainContextPair(),
|
||||
gui.patchBuildingMainContextPair(),
|
||||
@ -168,34 +87,34 @@ func (gui *Gui) allMainContextPairs() []MainContextPair {
|
||||
}
|
||||
}
|
||||
|
||||
func (gui *Gui) refreshMainViews(opts refreshMainOpts) error {
|
||||
func (gui *Gui) refreshMainViews(opts types.RefreshMainOpts) error {
|
||||
// need to reset scroll positions of all other main views
|
||||
for _, pair := range gui.allMainContextPairs() {
|
||||
if pair.main != opts.pair.main {
|
||||
_ = pair.main.GetView().SetOrigin(0, 0)
|
||||
if pair.Main != opts.Pair.Main {
|
||||
_ = pair.Main.GetView().SetOrigin(0, 0)
|
||||
}
|
||||
if pair.secondary != nil && pair.secondary != opts.pair.secondary {
|
||||
_ = pair.secondary.GetView().SetOrigin(0, 0)
|
||||
if pair.Secondary != nil && pair.Secondary != opts.Pair.Secondary {
|
||||
_ = pair.Secondary.GetView().SetOrigin(0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
if opts.main != nil {
|
||||
if err := gui.refreshMainView(opts.main, opts.pair.main); err != nil {
|
||||
if opts.Main != nil {
|
||||
if err := gui.RefreshMainView(opts.Main, opts.Pair.Main); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if opts.secondary != nil {
|
||||
if err := gui.refreshMainView(opts.secondary, opts.pair.secondary); err != nil {
|
||||
if opts.Secondary != nil {
|
||||
if err := gui.RefreshMainView(opts.Secondary, opts.Pair.Secondary); err != nil {
|
||||
return err
|
||||
}
|
||||
} else if opts.pair.secondary != nil {
|
||||
opts.pair.secondary.GetView().Clear()
|
||||
} else if opts.Pair.Secondary != nil {
|
||||
opts.Pair.Secondary.GetView().Clear()
|
||||
}
|
||||
|
||||
gui.moveMainContextPairToTop(opts.pair)
|
||||
gui.moveMainContextPairToTop(opts.Pair)
|
||||
|
||||
gui.splitMainPanel(opts.secondary != nil)
|
||||
gui.splitMainPanel(opts.Secondary != nil)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user