diff --git a/pkg/gui/constants/constants.go b/pkg/gui/constants/constants.go new file mode 100644 index 000000000..b6c786b73 --- /dev/null +++ b/pkg/gui/constants/constants.go @@ -0,0 +1,3 @@ +package constants + +const SEARCH_PREFIX = "search: " diff --git a/pkg/gui/controllers.go b/pkg/gui/controllers.go index 75366fcdd..95568f2c0 100644 --- a/pkg/gui/controllers.go +++ b/pkg/gui/controllers.go @@ -39,6 +39,19 @@ func (gui *Gui) resetControllers() { rebaseHelper, ) bisectHelper := helpers.NewBisectHelper(helperCommon) + windowHelper := helpers.NewWindowHelper(helperCommon, viewHelper) + modeHelper := helpers.NewModeHelper( + helperCommon, + diffHelper, + patchBuildingHelper, + cherryPickHelper, + rebaseHelper, + bisectHelper, + ) + appStatusHelper := helpers.NewAppStatusHelper( + helperCommon, + func() *status.StatusManager { return gui.statusManager }, + ) gui.helpers = &helpers.Helpers{ Refs: refsHelper, Host: helpers.NewHostHelper(helperCommon), @@ -60,21 +73,17 @@ func (gui *Gui) resetControllers() { Repos: helpers.NewRecentReposHelper(helperCommon, recordDirectoryHelper, gui.onNewRepo), RecordDirectory: recordDirectoryHelper, Update: helpers.NewUpdateHelper(helperCommon, gui.Updater), - Window: helpers.NewWindowHelper(helperCommon, viewHelper), + Window: windowHelper, View: viewHelper, Refresh: refreshHelper, Confirmation: helpers.NewConfirmationHelper(helperCommon), - Mode: helpers.NewModeHelper( - helperCommon, - diffHelper, - patchBuildingHelper, - cherryPickHelper, - rebaseHelper, - bisectHelper, - ), - AppStatus: helpers.NewAppStatusHelper( - helperCommon, - func() *status.StatusManager { return gui.statusManager }, + Mode: modeHelper, + AppStatus: appStatusHelper, + WindowArrangement: helpers.NewWindowArrangementHelper( + gui.c, + windowHelper, + modeHelper, + appStatusHelper, ), } diff --git a/pkg/gui/controllers/helpers/helpers.go b/pkg/gui/controllers/helpers/helpers.go index a1da39032..7e54597e5 100644 --- a/pkg/gui/controllers/helpers/helpers.go +++ b/pkg/gui/controllers/helpers/helpers.go @@ -34,45 +34,47 @@ type Helpers struct { AmendHelper *AmendHelper Snake *SnakeHelper // lives in context package because our contexts need it to render to main - Diff *DiffHelper - Repos *ReposHelper - RecordDirectory *RecordDirectoryHelper - Update *UpdateHelper - Window *WindowHelper - View *ViewHelper - Refresh *RefreshHelper - Confirmation *ConfirmationHelper - Mode *ModeHelper - AppStatus *AppStatusHelper + Diff *DiffHelper + Repos *ReposHelper + RecordDirectory *RecordDirectoryHelper + Update *UpdateHelper + Window *WindowHelper + View *ViewHelper + Refresh *RefreshHelper + Confirmation *ConfirmationHelper + Mode *ModeHelper + AppStatus *AppStatusHelper + WindowArrangement *WindowArrangementHelper } func NewStubHelpers() *Helpers { return &Helpers{ - Refs: &RefsHelper{}, - Bisect: &BisectHelper{}, - Suggestions: &SuggestionsHelper{}, - Files: &FilesHelper{}, - WorkingTree: &WorkingTreeHelper{}, - Tags: &TagsHelper{}, - MergeAndRebase: &MergeAndRebaseHelper{}, - MergeConflicts: &MergeConflictsHelper{}, - CherryPick: &CherryPickHelper{}, - Host: &HostHelper{}, - PatchBuilding: &PatchBuildingHelper{}, - Staging: &StagingHelper{}, - GPG: &GpgHelper{}, - Upstream: &UpstreamHelper{}, - AmendHelper: &AmendHelper{}, - Snake: &SnakeHelper{}, - Diff: &DiffHelper{}, - Repos: &ReposHelper{}, - RecordDirectory: &RecordDirectoryHelper{}, - Update: &UpdateHelper{}, - Window: &WindowHelper{}, - View: &ViewHelper{}, - Refresh: &RefreshHelper{}, - Confirmation: &ConfirmationHelper{}, - Mode: &ModeHelper{}, - AppStatus: &AppStatusHelper{}, + Refs: &RefsHelper{}, + Bisect: &BisectHelper{}, + Suggestions: &SuggestionsHelper{}, + Files: &FilesHelper{}, + WorkingTree: &WorkingTreeHelper{}, + Tags: &TagsHelper{}, + MergeAndRebase: &MergeAndRebaseHelper{}, + MergeConflicts: &MergeConflictsHelper{}, + CherryPick: &CherryPickHelper{}, + Host: &HostHelper{}, + PatchBuilding: &PatchBuildingHelper{}, + Staging: &StagingHelper{}, + GPG: &GpgHelper{}, + Upstream: &UpstreamHelper{}, + AmendHelper: &AmendHelper{}, + Snake: &SnakeHelper{}, + Diff: &DiffHelper{}, + Repos: &ReposHelper{}, + RecordDirectory: &RecordDirectoryHelper{}, + Update: &UpdateHelper{}, + Window: &WindowHelper{}, + View: &ViewHelper{}, + Refresh: &RefreshHelper{}, + Confirmation: &ConfirmationHelper{}, + Mode: &ModeHelper{}, + AppStatus: &AppStatusHelper{}, + WindowArrangement: &WindowArrangementHelper{}, } } diff --git a/pkg/gui/arrangement.go b/pkg/gui/controllers/helpers/window_arrangement_helper.go similarity index 87% rename from pkg/gui/arrangement.go rename to pkg/gui/controllers/helpers/window_arrangement_helper.go index 2b1a5333d..8efec0a22 100644 --- a/pkg/gui/arrangement.go +++ b/pkg/gui/controllers/helpers/window_arrangement_helper.go @@ -1,9 +1,9 @@ -package gui +package helpers import ( "github.com/jesseduffield/lazycore/pkg/boxlayout" + "github.com/jesseduffield/lazygit/pkg/gui/constants" "github.com/jesseduffield/lazygit/pkg/gui/context" - "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/mattn/go-runewidth" @@ -12,22 +12,20 @@ import ( // In this file we use the boxlayout package, along with knowledge about the app's state, // to arrange the windows (i.e. panels) on the screen. -const INFO_SECTION_PADDING = " " - -type WindowArranger struct { - c *helpers.HelperCommon - windowHelper *helpers.WindowHelper - modeHelper *helpers.ModeHelper - appStatusHelper *helpers.AppStatusHelper +type WindowArrangementHelper struct { + c *HelperCommon + windowHelper *WindowHelper + modeHelper *ModeHelper + appStatusHelper *AppStatusHelper } -func NewWindowArranger( - c *helpers.HelperCommon, - windowHelper *helpers.WindowHelper, - modeHelper *helpers.ModeHelper, - appStatusHelper *helpers.AppStatusHelper, -) *WindowArranger { - return &WindowArranger{ +func NewWindowArrangementHelper( + c *HelperCommon, + windowHelper *WindowHelper, + modeHelper *ModeHelper, + appStatusHelper *AppStatusHelper, +) *WindowArrangementHelper { + return &WindowArrangementHelper{ c: c, windowHelper: windowHelper, modeHelper: modeHelper, @@ -35,7 +33,9 @@ func NewWindowArranger( } } -func (self *WindowArranger) getWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions { +const INFO_SECTION_PADDING = " " + +func (self *WindowArrangementHelper) GetWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions { width, height := self.c.GocuiGui().Size() sideSectionWeight, mainSectionWeight := self.getMidSectionWeights() @@ -118,7 +118,7 @@ func MergeMaps[K comparable, V any](maps ...map[K]V) map[K]V { return result } -func (self *WindowArranger) mainSectionChildren() []*boxlayout.Box { +func (self *WindowArrangementHelper) mainSectionChildren() []*boxlayout.Box { currentWindow := self.windowHelper.CurrentWindow() // if we're not in split mode we can just show the one main panel. Likewise if @@ -144,7 +144,7 @@ func (self *WindowArranger) mainSectionChildren() []*boxlayout.Box { } } -func (self *WindowArranger) getMidSectionWeights() (int, int) { +func (self *WindowArrangementHelper) getMidSectionWeights() (int, int) { currentWindow := self.windowHelper.CurrentWindow() // we originally specified this as a ratio i.e. .20 would correspond to a weight of 1 against 4 @@ -174,12 +174,12 @@ func (self *WindowArranger) getMidSectionWeights() (int, int) { return sideSectionWeight, mainSectionWeight } -func (self *WindowArranger) infoSectionChildren(informationStr string, appStatus string) []*boxlayout.Box { +func (self *WindowArrangementHelper) infoSectionChildren(informationStr string, appStatus string) []*boxlayout.Box { if self.c.State().GetRepoState().IsSearching() { return []*boxlayout.Box{ { Window: "searchPrefix", - Size: runewidth.StringWidth(SEARCH_PREFIX), + Size: runewidth.StringWidth(constants.SEARCH_PREFIX), }, { Window: "search", @@ -212,7 +212,7 @@ func (self *WindowArranger) infoSectionChildren(informationStr string, appStatus return result } -func (self *WindowArranger) splitMainPanelSideBySide() bool { +func (self *WindowArrangementHelper) splitMainPanelSideBySide() bool { if !self.c.State().GetRepoState().GetSplitMainPanel() { return false } @@ -234,7 +234,7 @@ func (self *WindowArranger) splitMainPanelSideBySide() bool { } } -func (self *WindowArranger) getExtrasWindowSize(screenHeight int) int { +func (self *WindowArrangementHelper) getExtrasWindowSize(screenHeight int) int { if !self.c.State().GetShowExtrasWindow() { return 0 } @@ -256,7 +256,7 @@ func (self *WindowArranger) getExtrasWindowSize(screenHeight int) int { // too much space, but if you access it it should take up some space. This is // the default behaviour when accordion mode is NOT in effect. If it is in effect // then when it's accessed it will have weight 2, not 1. -func (self *WindowArranger) getDefaultStashWindowBox() *boxlayout.Box { +func (self *WindowArrangementHelper) getDefaultStashWindowBox() *boxlayout.Box { stashWindowAccessed := false self.c.Context().ForEach(func(context types.Context) { if context.GetWindowName() == "stash" { @@ -275,7 +275,7 @@ func (self *WindowArranger) getDefaultStashWindowBox() *boxlayout.Box { return box } -func (self *WindowArranger) sidePanelChildren(width int, height int) []*boxlayout.Box { +func (self *WindowArrangementHelper) sidePanelChildren(width int, height int) []*boxlayout.Box { currentWindow := self.c.CurrentSideContext().GetWindowName() screenMode := self.c.State().GetRepoState().GetScreenMode() diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 2f143d162..c0448cacd 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -825,13 +825,7 @@ func (gui *Gui) startBackgroundRoutines() { } func (gui *Gui) getWindowDimensions(informationStr string, appStatus string) map[string]boxlayout.Dimensions { - windowArranger := NewWindowArranger( - gui.c, - gui.helpers.Window, - gui.helpers.Mode, - gui.helpers.AppStatus, - ) - return windowArranger.getWindowDimensions(informationStr, appStatus) + return gui.helpers.WindowArrangement.GetWindowDimensions(informationStr, appStatus) } func (gui *Gui) popContext() error { diff --git a/pkg/gui/layout.go b/pkg/gui/layout.go index ee8e127a1..c8a89d3cb 100644 --- a/pkg/gui/layout.go +++ b/pkg/gui/layout.go @@ -7,8 +7,6 @@ import ( "github.com/jesseduffield/lazygit/pkg/theme" ) -const SEARCH_PREFIX = "search: " - // layout is called for every screen re-render e.g. when the screen is resized func (gui *Gui) layout(g *gocui.Gui) error { if !gui.ViewsSetup { diff --git a/pkg/gui/views.go b/pkg/gui/views.go index 2bcb6f905..47a2e5093 100644 --- a/pkg/gui/views.go +++ b/pkg/gui/views.go @@ -3,6 +3,7 @@ package gui import ( "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/constants" "github.com/jesseduffield/lazygit/pkg/theme" ) @@ -92,7 +93,7 @@ func (gui *Gui) createAllViews() error { gui.Views.SearchPrefix.BgColor = gocui.ColorDefault gui.Views.SearchPrefix.FgColor = gocui.ColorGreen gui.Views.SearchPrefix.Frame = false - gui.c.SetViewContent(gui.Views.SearchPrefix, SEARCH_PREFIX) + gui.c.SetViewContent(gui.Views.SearchPrefix, constants.SEARCH_PREFIX) gui.Views.Stash.Title = gui.c.Tr.StashTitle