dcuinfo.go 5.49 KB
Newer Older
liming6's avatar
liming6 committed
1
2
3
package tui

import (
liming6's avatar
liming6 committed
4
	"fmt"
5
	"get-container/utils"
6
	"regexp"
liming6's avatar
liming6 committed
7
8
	"strconv"
	"strings"
liming6's avatar
liming6 committed
9

liming6's avatar
liming6 committed
10
	"github.com/charmbracelet/bubbles/progress"
liming6's avatar
liming6 committed
11
	tea "github.com/charmbracelet/bubbletea"
liming6's avatar
liming6 committed
12
	"github.com/charmbracelet/lipgloss"
13
	"github.com/muesli/termenv"
liming6's avatar
liming6 committed
14
15
16
)

type ModelDCUInfo struct {
17
18
19
20
	pro           progress.Model // 进度条
	proWidth      int            // 进度条宽度
	modMsg        *ModelMsg
	width, height int
liming6's avatar
liming6 committed
21
22
}

liming6's avatar
liming6 committed
23
24
25
26
27
28
const (
	TopLine    = `╞═══════════════════════════════╪══════════════════════╪══════════════════════╪`
	MiddleLine = `├───────────────────────────────┼──────────────────────┼──────────────────────┼`
	BottomLine = `╞═══════════════════════════════╧══════════════════════╧══════════════════════╪`

	OtherWidth       = 8
liming6's avatar
liming6 committed
29
30
	StaticWidth      = 79 // 固定表格的宽度
	ProgressMinWidth = 15 // 进度条最小宽度
liming6's avatar
liming6 committed
31
32
)

33
34
35
36
var (
	ReDCUName = regexp.MustCompile(`(?i)^[A-Z0-9-_]*`)
)

37
38
func NewModelDCUInfo(w, h int) *ModelDCUInfo {
	return &ModelDCUInfo{width: w, height: h}
liming6's avatar
liming6 committed
39
40
}

liming6's avatar
liming6 committed
41
func (m *ModelDCUInfo) Init() tea.Cmd {
42
	if m.width < StaticWidth+ProgressMinWidth+OtherWidth {
liming6's avatar
liming6 committed
43
44
45
		return tea.Quit
	}
	m.proWidth = ProgressMinWidth
46
47
	if m.width > StaticWidth+ProgressMinWidth+OtherWidth {
		m.proWidth = m.width - OtherWidth - StaticWidth
liming6's avatar
liming6 committed
48
	}
49
	m.pro = progress.New(progress.WithColorProfile(termenv.TrueColor), progress.WithGradient("#0000ffff", "#ff0000ff"), progress.WithWidth(m.proWidth))
liming6's avatar
liming6 committed
50
51
52
	return nil
}

liming6's avatar
liming6 committed
53
54
55
func (m *ModelDCUInfo) Update(inputMsg tea.Msg) (tea.Model, tea.Cmd) {
	switch msg := inputMsg.(type) {
	case *ModelMsg:
56
57
58
59
60
		m.modMsg = msg
		return m, nil
	case tea.WindowSizeMsg:
		m.height = msg.Height
		m.width = msg.Width
liming6's avatar
liming6 committed
61
62
		return m, nil
	}
liming6's avatar
liming6 committed
63
64
65
66
	return m, nil
}

func (m *ModelDCUInfo) View() string {
67
68
69
	if m.modMsg == nil {
		return ""
	}
liming6's avatar
liming6 committed
70
	lineWidth := 0
71
72
73
74
75
	qmap, qlock := m.modMsg.DCUInfo.GetQuitInfo()
	smap, slock := m.modMsg.DCUInfo.GetSlowInfo()
	defer slock.Unlock()
	defer qlock.Unlock()
	conTime := 0
liming6's avatar
liming6 committed
76
	strBuilder := strings.Builder{}
77
78
79
80
81
82
83
84
85
86
87
	infos := make([]string, 0)
	for i := range 128 {
		qinfo, haveq := qmap[i]
		sinfo, haves := smap[i]
		if !(haveq || haves) {
			conTime++
			if conTime > 8 {
				break
			}
			continue
		}
liming6's avatar
liming6 committed
88
89
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte(' ')
90
		strBuilder.WriteString(FormatStr(strconv.Itoa(qinfo.Id), 4, lipgloss.Left))
liming6's avatar
liming6 committed
91
		strBuilder.WriteByte(' ')
92
		strBuilder.WriteString(FormatStr(ReDCUName.FindString(qinfo.Name), 8, lipgloss.Left))
liming6's avatar
liming6 committed
93
		strBuilder.WriteByte(' ')
94
		strBuilder.WriteString(FormatStr(qinfo.PerformanceLevel, 15, lipgloss.Right))
liming6's avatar
liming6 committed
95
96
97
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte(' ')
98
		strBuilder.WriteString(FormatStr(qinfo.BusId, 13, lipgloss.Left))
liming6's avatar
liming6 committed
99
100
101
102
103
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(FormatStr("Off", 6, lipgloss.Right))
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte(' ')
104
		if sinfo.Mig.Load() {
liming6's avatar
liming6 committed
105
106
107
108
109
			strBuilder.WriteString(FormatStr("On", 16, lipgloss.Left))
		} else {
			strBuilder.WriteString(FormatStr("Off", 16, lipgloss.Left))
		}
		strBuilder.WriteByte(' ')
110
		if sinfo.Ecc.Load() {
liming6's avatar
liming6 committed
111
112
113
114
115
116
117
			strBuilder.WriteString(FormatStr("On", 3, lipgloss.Right))
		} else {
			strBuilder.WriteString(FormatStr("Off", 3, lipgloss.Right))
		}
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteString(" DCU: ")
118
		strBuilder.WriteString(m.pro.ViewAs(float64(qinfo.DCUUTil / 100)))
liming6's avatar
liming6 committed
119
120
121
122
123
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte('\n')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte(' ')
124
		strBuilder.WriteString(FormatStr(qinfo.Fan, 4, lipgloss.Left))
liming6's avatar
liming6 committed
125
		strBuilder.WriteByte(' ')
126
		strBuilder.WriteString(FormatStr(fmt.Sprintf("%.1fC", qinfo.Temp), 6, lipgloss.Left))
liming6's avatar
liming6 committed
127
128
		strBuilder.WriteByte(' ')
		// 18
129
		strBuilder.WriteString(FormatStr(fmt.Sprintf("%.1fW / %.1fW", qinfo.PwrAvg, qinfo.PwrCap), 17, lipgloss.Right))
liming6's avatar
liming6 committed
130
131
132
133
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte(' ')
		// 20
134
		strBuilder.WriteString(FormatStr(fmt.Sprintf("%dMiB / %dMiB", qinfo.MemUsed/uint64(utils.MiB), qinfo.MemTotal/uint64(utils.MiB)), 20, lipgloss.Right))
liming6's avatar
liming6 committed
135
136
137
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteByte(' ')
138
		strBuilder.WriteString(FormatStr(fmt.Sprintf("%.1f%%", qinfo.DCUUTil), 6, lipgloss.Left))
liming6's avatar
liming6 committed
139
		strBuilder.WriteByte(' ')
140
		strBuilder.WriteString(FormatStr(sinfo.PwrMode.Load().(string), 13, lipgloss.Right))
liming6's avatar
liming6 committed
141
142
143
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
		strBuilder.WriteString(" Mem: ")
144
		strBuilder.WriteString(m.pro.ViewAs(float64(qinfo.MemUsed) / float64(qinfo.MemTotal)))
liming6's avatar
liming6 committed
145
146
		strBuilder.WriteByte(' ')
		strBuilder.WriteString(myBorder.Left)
147
		infos = append(infos, strBuilder.String())
liming6's avatar
liming6 committed
148
149
150
151
152
		strBuilder.Reset()
	}
	if len(infos) > 0 {
		lineWidth = lipgloss.Width(infos[0])
	}
liming6's avatar
liming6 committed
153
	subLen := lineWidth - StaticWidth - 1
liming6's avatar
liming6 committed
154
155
156
157
158
159
160
	if subLen <= 0 {
		subLen = 0
	}
	top := TopLine + strings.Repeat("═", subLen) + "╕\n"
	middle := "\n" + MiddleLine + strings.Repeat("─", subLen) + "┤\n"
	bottom := "\n" + BottomLine + strings.Repeat("═", subLen) + "╡\n"
	return top + strings.Join(infos, middle) + bottom
liming6's avatar
liming6 committed
161
}