diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2023-03-23 18:47:29 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2023-04-30 13:19:53 +1000 |
commit | db12853bbe825d69686ea71161497d1bbb120b8e (patch) | |
tree | ebfb066dfef8eb75acdc1ea2bd5f15ff4f4a6507 /pkg/gui/controllers/helpers | |
parent | 711674f6cd68ed3a35e5b0329ff0cf3289fbc7d1 (diff) |
lots of changes
Diffstat (limited to 'pkg/gui/controllers/helpers')
-rw-r--r-- | pkg/gui/controllers/helpers/app_status_helper.go | 68 | ||||
-rw-r--r-- | pkg/gui/controllers/helpers/helpers.go | 4 | ||||
-rw-r--r-- | pkg/gui/controllers/helpers/mode_helper.go | 159 |
3 files changed, 231 insertions, 0 deletions
diff --git a/pkg/gui/controllers/helpers/app_status_helper.go b/pkg/gui/controllers/helpers/app_status_helper.go new file mode 100644 index 000000000..f125ebf7b --- /dev/null +++ b/pkg/gui/controllers/helpers/app_status_helper.go @@ -0,0 +1,68 @@ +package helpers + +import ( + "time" + + "github.com/jesseduffield/lazygit/pkg/gui/status" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type AppStatusHelper struct { + c *HelperCommon + + statusMgr func() *status.StatusManager +} + +func NewAppStatusHelper(c *HelperCommon, statusMgr func() *status.StatusManager) *AppStatusHelper { + return &AppStatusHelper{ + c: c, + statusMgr: statusMgr, + } +} + +func (self *AppStatusHelper) Toast(message string) { + self.statusMgr().AddToastStatus(message) + + self.renderAppStatus() +} + +// withWaitingStatus wraps a function and shows a waiting status while the function is still executing +func (self *AppStatusHelper) WithWaitingStatus(message string, f func() error) { + go utils.Safe(func() { + self.statusMgr().WithWaitingStatus(message, func() { + self.renderAppStatus() + + if err := f(); err != nil { + self.c.OnUIThread(func() error { + return self.c.Error(err) + }) + } + }) + }) +} + +func (self *AppStatusHelper) HasStatus() bool { + return self.statusMgr().HasStatus() +} + +func (self *AppStatusHelper) GetStatusString() string { + return self.statusMgr().GetStatusString() +} + +func (self *AppStatusHelper) renderAppStatus() { + go utils.Safe(func() { + ticker := time.NewTicker(time.Millisecond * 50) + defer ticker.Stop() + for range ticker.C { + appStatus := self.statusMgr().GetStatusString() + self.c.OnUIThread(func() error { + self.c.SetViewContent(self.c.Views().AppStatus, appStatus) + return nil + }) + + if appStatus == "" { + return + } + } + }) +} diff --git a/pkg/gui/controllers/helpers/helpers.go b/pkg/gui/controllers/helpers/helpers.go index c250a09b5..a1da39032 100644 --- a/pkg/gui/controllers/helpers/helpers.go +++ b/pkg/gui/controllers/helpers/helpers.go @@ -42,6 +42,8 @@ type Helpers struct { View *ViewHelper Refresh *RefreshHelper Confirmation *ConfirmationHelper + Mode *ModeHelper + AppStatus *AppStatusHelper } func NewStubHelpers() *Helpers { @@ -70,5 +72,7 @@ func NewStubHelpers() *Helpers { View: &ViewHelper{}, Refresh: &RefreshHelper{}, Confirmation: &ConfirmationHelper{}, + Mode: &ModeHelper{}, + AppStatus: &AppStatusHelper{}, } } diff --git a/pkg/gui/controllers/helpers/mode_helper.go b/pkg/gui/controllers/helpers/mode_helper.go new file mode 100644 index 000000000..a97625ac7 --- /dev/null +++ b/pkg/gui/controllers/helpers/mode_helper.go @@ -0,0 +1,159 @@ +package helpers + +import ( + "fmt" + + "github.com/jesseduffield/generics/slices" + "github.com/jesseduffield/lazygit/pkg/commands/types/enums" + "github.com/jesseduffield/lazygit/pkg/gui/presentation" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +type ModeHelper struct { + c *HelperCommon + + diffHelper *DiffHelper + patchBuildingHelper *PatchBuildingHelper + cherryPickHelper *CherryPickHelper + mergeAndRebaseHelper *MergeAndRebaseHelper + bisectHelper *BisectHelper +} + +func NewModeHelper( + c *HelperCommon, + diffHelper *DiffHelper, + patchBuildingHelper *PatchBuildingHelper, + cherryPickHelper *CherryPickHelper, + mergeAndRebaseHelper *MergeAndRebaseHelper, + bisectHelper *BisectHelper, +) *ModeHelper { + return &ModeHelper{ + c: c, + diffHelper: diffHelper, + patchBuildingHelper: patchBuildingHelper, + cherryPickHelper: cherryPickHelper, + mergeAndRebaseHelper: mergeAndRebaseHelper, + bisectHelper: bisectHelper, + } +} + +type ModeStatus struct { + IsActive func() bool + Description func() string + Reset func() error +} + +func (self *ModeHelper) Statuses() []ModeStatus { + return []ModeStatus{ + { + IsActive: self.c.Modes().Diffing.Active, + Description: func() string { + return self.withResetButton( + fmt.Sprintf( + "%s %s", + self.c.Tr.LcShowingGitDiff, + "git diff "+self.diffHelper.DiffStr(), + ), + style.FgMagenta, + ) + }, + Reset: self.diffHelper.ExitDiffMode, + }, + { + IsActive: self.c.Git().Patch.PatchBuilder.Active, + Description: func() string { + return self.withResetButton(self.c.Tr.LcBuildingPatch, style.FgYellow.SetBold()) + }, + Reset: self.patchBuildingHelper.Reset, + }, + { + IsActive: self.c.Modes().Filtering.Active, + Description: func() string { + return self.withResetButton( + fmt.Sprintf( + "%s '%s'", + self.c.Tr.LcFilteringBy, + self.c.Modes().Filtering.GetPath(), + ), + style.FgRed, + ) + }, + Reset: self.ExitFilterMode, + }, + { + IsActive: self.c.Modes().CherryPicking.Active, + Description: func() string { + copiedCount := len(self.c.Modes().CherryPicking.CherryPickedCommits) + text := self.c.Tr.LcCommitsCopied + if copiedCount == 1 { + text = self.c.Tr.LcCommitCopied + } + + return self.withResetButton( + fmt.Sprintf( + "%d %s", + copiedCount, + text, + ), + style.FgCyan, + ) + }, + Reset: self.cherryPickHelper.Reset, + }, + { + IsActive: func() bool { + return self.c.Git().Status.WorkingTreeState() != enums.REBASE_MODE_NONE + }, + Description: func() string { + workingTreeState := self.c.Git().Status.WorkingTreeState() + return self.withResetButton( + presentation.FormatWorkingTreeState(workingTreeState), style.FgYellow, + ) + }, + Reset: self.mergeAndRebaseHelper.AbortMergeOrRebaseWithConfirm, + }, + { + IsActive: func() bool { + return self.c.Model().BisectInfo.Started() + }, + Description: func() string { + return self.withResetButton("bisecting", style.FgGreen) + }, + Reset: self.bisectHelper.Reset, + }, + } +} + +func (self *ModeHelper) withResetButton(content string, textStyle style.TextStyle) string { + return textStyle.Sprintf( + "%s %s", + content, + style.AttrUnderline.Sprint(self.c.Tr.ResetInParentheses), + ) +} + +func (self *ModeHelper) GetActiveMode() (ModeStatus, bool) { + return slices.Find(self.Statuses(), func(mode ModeStatus) bool { + return mode.IsActive() + }) +} + +func (self *ModeHelper) IsAnyModeActive() bool { + return slices.Some(self.Statuses(), func(mode ModeStatus) bool { + return mode.IsActive() + }) +} + +func (self *ModeHelper) ExitFilterMode() error { + return self.ClearFiltering() +} + +func (self *ModeHelper) ClearFiltering() error { + self.c.Modes().Filtering.Reset() + if self.c.State().GetRepoState().GetScreenMode() == types.SCREEN_HALF { + self.c.State().GetRepoState().SetScreenMode(types.SCREEN_NORMAL) + } + + return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.COMMITS}}) +} |