67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
|
|||
|
|
tea "github.com/charmbracelet/bubbletea"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// model 定义应用的状态
|
|||
|
|
type model struct {
|
|||
|
|
items []string // 列表数据
|
|||
|
|
selectedIdx int // 当前选中的索引
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Init 初始化模型,返回初始命令(这里不需要,返回 nil)
|
|||
|
|
func (m model) Init() tea.Cmd {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Update 处理用户输入和状态更新
|
|||
|
|
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||
|
|
switch msg := msg.(type) {
|
|||
|
|
// 处理键盘输入
|
|||
|
|
case tea.KeyMsg:
|
|||
|
|
switch msg.String() {
|
|||
|
|
// Tab 键:切换选中项(循环切换)
|
|||
|
|
case "tab":
|
|||
|
|
m.selectedIdx = (m.selectedIdx + 1) % len(m.items)
|
|||
|
|
// Ctrl+C 或 q 键:退出程序
|
|||
|
|
case "ctrl+c", "q":
|
|||
|
|
return m, tea.Quit
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return m, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// View 渲染界面
|
|||
|
|
func (m model) View() string {
|
|||
|
|
s := "网络接口列表(按 Tab 切换选择,按 q 退出)\n\n"
|
|||
|
|
|
|||
|
|
// 遍历列表项,渲染每一项
|
|||
|
|
for i, item := range m.items {
|
|||
|
|
// 标记当前选中的项
|
|||
|
|
if i == m.selectedIdx {
|
|||
|
|
s += fmt.Sprintf("→ %s (选中)\n", item)
|
|||
|
|
} else {
|
|||
|
|
s += fmt.Sprintf(" %s\n", item)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return s
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
// 初始化模型,设置列表数据
|
|||
|
|
initialModel := model{
|
|||
|
|
items: []string{"eth0", "eth1", "eth2", "eth3"},
|
|||
|
|
selectedIdx: 0, // 默认选中第一个项
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 启动 Bubble Tea 程序
|
|||
|
|
p := tea.NewProgram(initialModel)
|
|||
|
|
if _, err := p.Run(); err != nil {
|
|||
|
|
fmt.Printf("程序运行出错: %v\n", err)
|
|||
|
|
}
|
|||
|
|
}
|