summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/helpers
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2023-03-23 18:47:29 +1100
committerJesse Duffield <jessedduffield@gmail.com>2023-04-30 13:19:53 +1000
commitdb12853bbe825d69686ea71161497d1bbb120b8e (patch)
treeebfb066dfef8eb75acdc1ea2bd5f15ff4f4a6507 /pkg/gui/controllers/helpers
parent711674f6cd68ed3a35e5b0329ff0cf3289fbc7d1 (diff)
lots of changes
Diffstat (limited to 'pkg/gui/controllers/helpers')
-rw-r--r--pkg/gui/controllers/helpers/app_status_helper.go68
-rw-r--r--pkg/gui/controllers/helpers/helpers.go4
-rw-r--r--pkg/gui/controllers/helpers/mode_helper.go159
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}})
+}