fix: replace huge logo form with compact centered modal for new download screen
This commit is contained in:
parent
832ed6f81f
commit
1bb7d1e909
1 changed files with 66 additions and 88 deletions
170
ui/ui.go
170
ui/ui.go
|
|
@ -1346,120 +1346,98 @@ func (m model) viewSettings() string {
|
|||
}
|
||||
|
||||
func (m model) viewNewDownload() string {
|
||||
w := m.width
|
||||
if w < 80 {
|
||||
w = 80
|
||||
}
|
||||
|
||||
header := m.renderLogo()
|
||||
|
||||
// Форма
|
||||
labels := []string{" Торрент-файл ", " Папка загрузки", " TG Токен "}
|
||||
icons := []string{" ", " ", " "}
|
||||
var formRows []string
|
||||
for i := range m.inputs {
|
||||
labelStyle := lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color(ColorSubdued)).
|
||||
Width(18)
|
||||
if i == m.focusedInput {
|
||||
labelStyle = labelStyle.Foreground(lipgloss.Color(ColorCyan)).Bold(true)
|
||||
}
|
||||
|
||||
indicator := " "
|
||||
if i == m.focusedInput {
|
||||
indicator = lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("▶ ")
|
||||
}
|
||||
|
||||
label := indicator + labelStyle.Render(icons[i]+labels[i])
|
||||
|
||||
// Кнопка «Обзор» только для поля торрент-файла
|
||||
var browseHint string
|
||||
if i == 0 {
|
||||
browseHint = " " + lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color(ColorPink)).
|
||||
// ── Заголовок модалки ──
|
||||
title := lipgloss.NewStyle().
|
||||
Bold(true).
|
||||
Render("[F] Открыть проводник")
|
||||
}
|
||||
Foreground(lipgloss.Color(ColorCyan)).
|
||||
Render("⚡ НОВЫЙ ТОРРЕНТ")
|
||||
|
||||
inputView := m.inputs[i].View()
|
||||
inputBoxStyle := lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
Padding(0, 1).
|
||||
Width(66)
|
||||
subtitle := lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color(ColorSubdued)).
|
||||
Render("Укажите файл или вставьте magnet-ссылку")
|
||||
|
||||
// ── Поля ввода ──
|
||||
labelNames := []string{"Торрент-файл", "Папка загрузки"}
|
||||
inputW := 60
|
||||
|
||||
var fieldRows []string
|
||||
for i := 0; i < 2; i++ {
|
||||
// метка
|
||||
labelSt := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorSubdued))
|
||||
if i == m.focusedInput {
|
||||
inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorCyan))
|
||||
} else {
|
||||
inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorBorder))
|
||||
labelSt = labelSt.Foreground(lipgloss.Color(ColorCyan)).Bold(true)
|
||||
}
|
||||
cursor := " "
|
||||
if i == m.focusedInput {
|
||||
cursor = lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("▶ ")
|
||||
}
|
||||
labelLine := cursor + labelSt.Render(labelNames[i])
|
||||
|
||||
// browse hint рядом с меткой
|
||||
if i == 0 {
|
||||
hint := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render(" [F] выбрать файл")
|
||||
labelLine = lipgloss.JoinHorizontal(lipgloss.Center, labelLine, hint)
|
||||
}
|
||||
|
||||
formRows = append(formRows, lipgloss.JoinVertical(lipgloss.Left,
|
||||
lipgloss.JoinHorizontal(lipgloss.Center, label, browseHint),
|
||||
inputBoxStyle.Render(inputView),
|
||||
))
|
||||
// поле ввода
|
||||
m.inputs[i].Width = inputW
|
||||
borderColor := ColorBorder
|
||||
if i == m.focusedInput {
|
||||
borderColor = ColorCyan
|
||||
}
|
||||
inputBox := lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(lipgloss.Color(borderColor)).
|
||||
Padding(0, 1).
|
||||
Width(inputW + 2).
|
||||
Render(m.inputs[i].View())
|
||||
|
||||
fieldRows = append(fieldRows, labelLine, inputBox, "")
|
||||
}
|
||||
|
||||
formInner := lipgloss.JoinVertical(lipgloss.Left,
|
||||
formRows[0],
|
||||
"",
|
||||
formRows[1],
|
||||
)
|
||||
|
||||
boxWidth := 85
|
||||
centeredFormInner := lipgloss.PlaceHorizontal(boxWidth, lipgloss.Center, formInner)
|
||||
boxContent := lipgloss.NewStyle().Padding(2, 0).Render(centeredFormInner)
|
||||
|
||||
formBox := lipgloss.NewStyle().
|
||||
Border(lipgloss.ThickBorder()).
|
||||
BorderForeground(lipgloss.Color(ColorBorder)).
|
||||
MarginTop(1).
|
||||
Width(boxWidth).
|
||||
Render(boxContent)
|
||||
|
||||
// Кнопка
|
||||
btnStyle := lipgloss.NewStyle().
|
||||
// ── Кнопка ──
|
||||
btn := lipgloss.NewStyle().
|
||||
Background(lipgloss.Color(ColorCyan)).
|
||||
Foreground(lipgloss.Color("#0b1017")).
|
||||
Bold(true).
|
||||
Padding(0, 4).
|
||||
MarginTop(1)
|
||||
btn := btnStyle.Render("▶ НАЧАТЬ СКАЧИВАНИЕ [ Enter ]")
|
||||
Padding(0, 3).
|
||||
Render("▶ НАЧАТЬ [ Enter ]")
|
||||
|
||||
// Ошибка
|
||||
errBlock := ""
|
||||
// ── Ошибка ──
|
||||
errLine := ""
|
||||
if m.validationErr != "" {
|
||||
errBlock = "\n" + lipgloss.NewStyle().
|
||||
errLine = lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color(ColorRed)).
|
||||
Bold(true).
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(lipgloss.Color(ColorRed)).
|
||||
Padding(0, 2).
|
||||
Render("✗ "+m.validationErr)
|
||||
Render("✗ " + m.validationErr)
|
||||
}
|
||||
|
||||
// Подсказки
|
||||
help := lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color(ColorSubdued)).
|
||||
MarginTop(1).
|
||||
Render(fmt.Sprintf(
|
||||
"%s Tab — сменить поле %s F — выбрать файл %s Enter — начать %s Q — выйти %s ? — дополнительно",
|
||||
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("●"),
|
||||
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorCyan)).Render("●"),
|
||||
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorCyan)).Render("●"),
|
||||
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorRed)).Render("●"),
|
||||
lipgloss.NewStyle().Foreground(lipgloss.Color("#bd93f9")).Render("●"),
|
||||
))
|
||||
|
||||
body := lipgloss.JoinVertical(lipgloss.Left,
|
||||
header,
|
||||
formBox,
|
||||
errBlock,
|
||||
btn,
|
||||
help,
|
||||
// ── Всё вместе в рамку ──
|
||||
innerParts := []string{
|
||||
title,
|
||||
subtitle,
|
||||
"",
|
||||
}
|
||||
innerParts = append(innerParts, fieldRows...)
|
||||
innerParts = append(innerParts, btn)
|
||||
if errLine != "" {
|
||||
innerParts = append(innerParts, "", errLine)
|
||||
}
|
||||
innerParts = append(innerParts, "")
|
||||
innerParts = append(innerParts,
|
||||
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorSubdued)).
|
||||
Render("Tab — поле F — файл Enter — старт Esc — назад Q — выйти"),
|
||||
)
|
||||
|
||||
return lipgloss.NewStyle().
|
||||
Padding(2, 4).
|
||||
Render(body)
|
||||
inner := lipgloss.JoinVertical(lipgloss.Left, innerParts...)
|
||||
|
||||
modal := lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(lipgloss.Color(ColorCyan)).
|
||||
Padding(1, 3).
|
||||
Render(inner)
|
||||
|
||||
return lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center, modal)
|
||||
}
|
||||
|
||||
// ── Экран загрузки ────────────────────────────────────────────────────────────
|
||||
|
|
|
|||
Loading…
Reference in a new issue