Signed-off-by: Hadi <112569860+anotherhadi@users.noreply.github.com>
This commit is contained in:
Hadi
2026-05-12 19:12:29 +02:00
commit e8e64eff12
101 changed files with 10081 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
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()
}