mirror of
https://github.com/anotherhadi/spilltea.git
synced 2026-05-20 01:32:33 +02:00
e8e64eff12
Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
95 lines
2.1 KiB
Go
95 lines
2.1 KiB
Go
package diff
|
|
|
|
import (
|
|
"strings"
|
|
|
|
tea "charm.land/bubbletea/v2"
|
|
"charm.land/lipgloss/v2"
|
|
"github.com/anotherhadi/spilltea/internal/icons"
|
|
"github.com/anotherhadi/spilltea/internal/style"
|
|
)
|
|
|
|
func (m Model) View() tea.View {
|
|
if m.width == 0 {
|
|
return tea.NewView("Loading...")
|
|
}
|
|
|
|
statusH := strings.Count(m.renderStatusBar(), "\n") + 1
|
|
panelH := m.height - statusH
|
|
|
|
content := lipgloss.JoinVertical(lipgloss.Left,
|
|
m.renderPanels(panelH),
|
|
m.renderStatusBar(),
|
|
)
|
|
return tea.NewView(content)
|
|
}
|
|
|
|
func (m *Model) renderPanels(panelH int) string {
|
|
s := style.S
|
|
|
|
leftW := m.width / 2
|
|
rightW := m.width - leftW
|
|
|
|
leftTitle := icons.I.Diff + "First"
|
|
if m.left.label != "" {
|
|
leftTitle = icons.I.Diff + "First: " + m.left.label
|
|
}
|
|
rightTitle := icons.I.Diff + "Second"
|
|
if m.right.label != "" {
|
|
rightTitle = icons.I.Diff + "Second: " + m.right.label
|
|
}
|
|
|
|
leftBorder := s.Panel
|
|
rightBorder := s.Panel
|
|
switch m.focus {
|
|
case bothSlots:
|
|
leftBorder = s.PanelFocused
|
|
rightBorder = s.PanelFocused
|
|
case leftSlot:
|
|
leftBorder = s.PanelFocused
|
|
case rightSlot:
|
|
rightBorder = s.PanelFocused
|
|
}
|
|
|
|
left := style.RenderWithTitle(leftBorder, leftTitle, m.leftViewport.View(), leftW, panelH)
|
|
right := style.RenderWithTitle(rightBorder, rightTitle, m.rightViewport.View(), rightW, panelH)
|
|
|
|
return lipgloss.JoinHorizontal(lipgloss.Top, left, right)
|
|
}
|
|
|
|
func (m *Model) renderStatusBar() string {
|
|
return lipgloss.NewStyle().Padding(0, 1).Render(m.help.View(diffKeyMap{width: m.width}))
|
|
}
|
|
|
|
func renderLeftLines(lines []diffLine) string {
|
|
s := style.S
|
|
var sb strings.Builder
|
|
for _, l := range lines {
|
|
switch l.kind {
|
|
case lineRemoved:
|
|
sb.WriteString(style.Paint(s.Error, "- ") + l.text + "\n")
|
|
case lineAdded:
|
|
sb.WriteString("\n")
|
|
default:
|
|
sb.WriteString(" " + l.text + "\n")
|
|
}
|
|
}
|
|
return sb.String()
|
|
}
|
|
|
|
func renderRightLines(lines []diffLine) string {
|
|
s := style.S
|
|
var sb strings.Builder
|
|
for _, l := range lines {
|
|
switch l.kind {
|
|
case lineAdded:
|
|
sb.WriteString(style.Paint(s.Success, "+ ") + l.text + "\n")
|
|
case lineRemoved:
|
|
sb.WriteString("\n")
|
|
default:
|
|
sb.WriteString(" " + l.text + "\n")
|
|
}
|
|
}
|
|
return sb.String()
|
|
}
|