Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 50 additions & 38 deletions model.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,18 @@
toDelete []string
}

var (
titleStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("227")).Bold(true)
type scanCompleteMsg struct{}

var (
fileStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("255"))
selectedFileStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).Bold(true)
titleStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("227")).Bold(true)
deleteStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("196")).Bold(true)
confirmStyle = lipgloss.NewStyle().Border(lipgloss.RoundedBorder()).BorderForeground(lipgloss.Color("196")).Padding(1)
itemStyle = lipgloss.NewStyle().PaddingLeft(2)

Check failure on line 33 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

var itemStyle is unused (U1000)

Check failure on line 33 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

var `itemStyle` is unused (unused)
selectedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).Bold(true)

Check failure on line 34 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

var selectedStyle is unused (U1000)

Check failure on line 34 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

var `selectedStyle` is unused (unused)
errorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("196")).Bold(true)

helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240")).Italic(true)
helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240")).Italic(true)
)

func initialModel(resultsChan <-chan []string) model {
Expand Down Expand Up @@ -114,6 +115,10 @@

}

case scanCompleteMsg:
m.scanning = false
return m, nil

case []string:
m.scanning = false
m.groups = append(m.groups, msg)
Expand Down Expand Up @@ -166,47 +171,53 @@

if m.scanning {
b.WriteString("🔍 Scanning for duplicates...\n")
b.WriteString(helpStyle.Render("(Press q to quit)\n"))
return b.String()
}

if len(m.groups) == 0 {
} else if len(m.groups) == 0 {
b.WriteString("🎉 No duplicates found!\n")
return b.String()
}
} else {
current := m.groups[m.currentGroup]
b.WriteString(fmt.Sprintf(" Group %d/%d (%d files)\n",
m.currentGroup+1, len(m.groups), len(current)))

for i, file := range current {
var line strings.Builder
if _, selected := m.selected[m.currentGroup][i]; selected {
line.WriteString(selectedFileStyle.Render("◉ "))
} else {
line.WriteString("◌ ")
}

current := m.groups[m.currentGroup]
b.WriteString(fmt.Sprintf(" Group %d/%d (%d files)\n",
m.currentGroup+1, len(m.groups), len(current)))
if i == m.currentFile {
line.WriteString("➔ ")
} else {
line.WriteString(" ")
}

for i, file := range current {
var line strings.Builder
line.WriteString(fileStyle.Render(file))

if _, selected := m.selected[m.currentGroup][i]; selected {
line.WriteString(selectedFileStyle.Render("◉ "))
} else {
line.WriteString("◌ ")
}
if _, selected := m.selected[m.currentGroup][i]; selected {
line.WriteString(deleteStyle.Render(" (marked for deletion)"))
}

if i == m.currentFile {
line.WriteString("➔ ")
} else {
line.WriteString(" ")
b.WriteString(line.String() + "\n")
}
}

line.WriteString(selectedFileStyle.Render(file))

if _, selected := m.selected[m.currentGroup][i]; selected {
line.WriteString(deleteStyle.Render(" (marked for deletion)"))
helpText := ""
if !m.showConfirm {
if m.scanning {
helpText = helpStyle.Render("(Press q to quit)")
} else if len(m.groups) > 0 {
helpText = helpStyle.Render(
"↑/↓: Navigate files • ←/→: Switch groups • Space: Select • d: Delete selected • q: Quit",
)
} else {
helpText = helpStyle.Render("(Press q to quit)")
}

b.WriteString(line.String() + "\n")
}

help := helpStyle.Render(
"↑/↓: Navigate files • ←/→: Switch groups • Space: Select • d: Delete selected • q: Quit",
)
b.WriteString("\n" + help)
if helpText != "" {
b.WriteString("\n\n" + helpText)
}

return b.String()
}
Expand Down Expand Up @@ -251,18 +262,19 @@

func waitForResults(results <-chan []string) tea.Cmd {
return func() tea.Msg {
if group, ok := <-results; ok {
return group
group, ok := <-results
if !ok {
return scanCompleteMsg{}
}
return nil
return group
}
}

type updateMsg struct {

Check failure on line 273 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

type updateMsg is unused (U1000)

Check failure on line 273 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

type `updateMsg` is unused (unused)
deleted []string
}

func renderItems(items []string, current int, selected map[int]struct{}) string {

Check failure on line 277 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

func renderItems is unused (U1000)

Check failure on line 277 in model.go

View workflow job for this annotation

GitHub Actions / build-and-test

func `renderItems` is unused (unused)
var b strings.Builder
for _, item := range items {
prefix := " "
Expand Down