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)
|
||
}
|
||
}
|