1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-12-12 11:15:00 +02:00
lazygit/pkg/gui/context/merge_conflicts_context.go
2023-04-30 13:19:53 +10:00

111 lines
2.6 KiB
Go

package context
import (
"math"
"github.com/jesseduffield/lazygit/pkg/gui/mergeconflicts"
"github.com/jesseduffield/lazygit/pkg/gui/types"
"github.com/sasha-s/go-deadlock"
)
type MergeConflictsContext struct {
types.Context
viewModel *ConflictsViewModel
c *ContextCommon
mutex *deadlock.Mutex
}
type ConflictsViewModel struct {
state *mergeconflicts.State
// userVerticalScrolling tells us if the user has started scrolling through the file themselves
// in which case we won't auto-scroll to a conflict.
userVerticalScrolling bool
}
func NewMergeConflictsContext(
c *ContextCommon,
) *MergeConflictsContext {
viewModel := &ConflictsViewModel{
state: mergeconflicts.NewState(),
userVerticalScrolling: false,
}
return &MergeConflictsContext{
viewModel: viewModel,
mutex: &deadlock.Mutex{},
Context: NewSimpleContext(
NewBaseContext(NewBaseContextOpts{
Kind: types.MAIN_CONTEXT,
View: c.Views().MergeConflicts,
WindowName: "main",
Key: MERGE_CONFLICTS_CONTEXT_KEY,
Focusable: true,
HighlightOnFocus: true,
}),
),
c: c,
}
}
func (self *MergeConflictsContext) GetState() *mergeconflicts.State {
return self.viewModel.state
}
func (self *MergeConflictsContext) SetState(state *mergeconflicts.State) {
self.viewModel.state = state
}
func (self *MergeConflictsContext) GetMutex() *deadlock.Mutex {
return self.mutex
}
func (self *MergeConflictsContext) SetUserScrolling(isScrolling bool) {
self.viewModel.userVerticalScrolling = isScrolling
}
func (self *MergeConflictsContext) IsUserScrolling() bool {
return self.viewModel.userVerticalScrolling
}
func (self *MergeConflictsContext) RenderAndFocus(isFocused bool) error {
self.setContent(isFocused)
self.FocusSelection()
self.c.Render()
return nil
}
func (self *MergeConflictsContext) Render(isFocused bool) error {
self.setContent(isFocused)
self.c.Render()
return nil
}
func (self *MergeConflictsContext) GetContentToRender(isFocused bool) string {
if self.GetState() == nil {
return ""
}
return mergeconflicts.ColoredConflictFile(self.GetState(), isFocused)
}
func (self *MergeConflictsContext) setContent(isFocused bool) {
self.GetView().SetContent(self.GetContentToRender(isFocused))
}
func (self *MergeConflictsContext) FocusSelection() {
if !self.IsUserScrolling() {
_ = self.GetView().SetOriginY(self.GetOriginY())
}
}
func (self *MergeConflictsContext) GetOriginY() int {
view := self.GetView()
conflictMiddle := self.GetState().GetConflictMiddle()
return int(math.Max(0, float64(conflictMiddle-(view.Height()/2))))
}