-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathui.go
103 lines (85 loc) · 3.13 KB
/
ui.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package sdmanager
import (
"fmt"
"io"
"strings"
"github.com/charmbracelet/bubbles/list"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
// Константы для стилей UI
const (
ListHeight = 14
)
// Стили для UI
var (
TitleStyle = lipgloss.NewStyle().MarginLeft(2).Bold(true)
ItemStyle = lipgloss.NewStyle().PaddingLeft(4)
SelectedItemStyle = lipgloss.NewStyle().PaddingLeft(2).Foreground(lipgloss.Color("170"))
PaginationStyle = list.DefaultStyles().PaginationStyle.PaddingLeft(4)
HelpStyle = list.DefaultStyles().HelpStyle.PaddingLeft(4).PaddingBottom(1)
QuitTextStyle = lipgloss.NewStyle().Margin(1, 0, 2, 4)
InfoStyle = lipgloss.NewStyle().PaddingLeft(2).Foreground(lipgloss.Color("86"))
ErrorStyle = lipgloss.NewStyle().PaddingLeft(2).Foreground(lipgloss.Color("196"))
ViewportStyle = lipgloss.NewStyle().BorderStyle(lipgloss.RoundedBorder()).Padding(1).BorderForeground(lipgloss.Color("62"))
)
// Делегат для отображения пунктов меню
type ItemDelegate struct{}
func (d ItemDelegate) Height() int { return 1 }
func (d ItemDelegate) Spacing() int { return 0 }
func (d ItemDelegate) Update(_ tea.Msg, _ *list.Model) tea.Cmd { return nil }
func (d ItemDelegate) Render(w io.Writer, m list.Model, index int, listItem list.Item) {
i, ok := listItem.(MenuItem)
if !ok {
return
}
str := i.Title
fn := ItemStyle.Render
if index == m.Index() {
fn = func(s ...string) string {
return SelectedItemStyle.Render("> " + strings.Join(s, " "))
}
}
fmt.Fprint(w, fn(str))
}
// Функция для форматирования сообщений об ошибках
func FormatError(err string) string {
return ErrorStyle.Render("Ошибка: " + err)
}
// Функция для форматирования информационных сообщений
func FormatInfo(info string) string {
return InfoStyle.Render(info)
}
// Отобразить список опций с выбором
func RenderOptionsList(options []Option, currentOption int) string {
var sb strings.Builder
for i, opt := range options {
checkbox := "[ ]"
if opt.Selected {
checkbox = "[x]"
}
line := fmt.Sprintf("%s %s", checkbox, opt.Name)
if i == currentOption {
sb.WriteString(SelectedItemStyle.Render("> "+line) + "\n")
} else {
sb.WriteString(" " + line + "\n")
}
}
sb.WriteString("\nИспользуйте стрелки ↑/↓ для навигации, пробел для выбора, Enter для подтверждения\n")
return sb.String()
}
// Отобразить выбранные опции
func RenderSelectedOptions(actions UserActions) string {
var sb strings.Builder
sb.WriteString("Выбранные опции:\n")
if actions.ReloadDaemon {
sb.WriteString("✓ Перезагрузить systemd daemon\n")
}
if actions.EnableService {
sb.WriteString("✓ Активировать (enable) сервис\n")
}
if actions.StartService {
sb.WriteString("✓ Запустить (start) сервис\n")
}
return sb.String()
}