183 lines
4.5 KiB
Go
183 lines
4.5 KiB
Go
package infobar
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/sjzar/chatlog/internal/ui/style"
|
|
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
)
|
|
|
|
const (
|
|
Title = "infobar"
|
|
)
|
|
|
|
// InfoBarViewHeight info bar height.
|
|
const (
|
|
InfoBarViewHeight = 6
|
|
accountRow = 0
|
|
pidRow = 1
|
|
statusRow = 2
|
|
dataUsageRow = 3
|
|
workUsageRow = 4
|
|
httpServerRow = 5
|
|
|
|
// 列索引
|
|
labelCol1 = 0 // 第一列标签
|
|
valueCol1 = 1 // 第一列值
|
|
labelCol2 = 2 // 第二列标签
|
|
valueCol2 = 3 // 第二列值
|
|
totalCols = 4
|
|
)
|
|
|
|
// InfoBar implements the info bar primitive.
|
|
type InfoBar struct {
|
|
*tview.Box
|
|
title string
|
|
table *tview.Table
|
|
}
|
|
|
|
// NewInfoBar returns info bar view.
|
|
func New() *InfoBar {
|
|
table := tview.NewTable()
|
|
headerColor := style.InfoBarItemFgColor
|
|
|
|
// Account 和 Version 行
|
|
table.SetCell(
|
|
accountRow,
|
|
labelCol1,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Account:")),
|
|
)
|
|
table.SetCell(accountRow, valueCol1, tview.NewTableCell(""))
|
|
|
|
table.SetCell(
|
|
accountRow,
|
|
labelCol2,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Version:")),
|
|
)
|
|
table.SetCell(accountRow, valueCol2, tview.NewTableCell(""))
|
|
|
|
// PID 和 ExePath 行
|
|
table.SetCell(
|
|
pidRow,
|
|
labelCol1,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "PID:")),
|
|
)
|
|
table.SetCell(pidRow, valueCol1, tview.NewTableCell(""))
|
|
|
|
table.SetCell(
|
|
pidRow,
|
|
labelCol2,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "ExePath:")),
|
|
)
|
|
table.SetCell(pidRow, valueCol2, tview.NewTableCell(""))
|
|
|
|
// Status 和 Key 行
|
|
table.SetCell(
|
|
statusRow,
|
|
labelCol1,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Status:")),
|
|
)
|
|
table.SetCell(statusRow, valueCol1, tview.NewTableCell(""))
|
|
|
|
table.SetCell(
|
|
statusRow,
|
|
labelCol2,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Data Key:")),
|
|
)
|
|
table.SetCell(statusRow, valueCol2, tview.NewTableCell(""))
|
|
|
|
// Data Usage 和 Data Dir 行
|
|
table.SetCell(
|
|
dataUsageRow,
|
|
labelCol1,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Data Usage:")),
|
|
)
|
|
table.SetCell(dataUsageRow, valueCol1, tview.NewTableCell(""))
|
|
|
|
table.SetCell(
|
|
dataUsageRow,
|
|
labelCol2,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Data Dir:")),
|
|
)
|
|
table.SetCell(dataUsageRow, valueCol2, tview.NewTableCell(""))
|
|
|
|
// Work Usage 和 Work Dir 行
|
|
table.SetCell(
|
|
workUsageRow,
|
|
labelCol1,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Work Usage:")),
|
|
)
|
|
table.SetCell(workUsageRow, valueCol1, tview.NewTableCell(""))
|
|
|
|
table.SetCell(
|
|
workUsageRow,
|
|
labelCol2,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "Work Dir:")),
|
|
)
|
|
table.SetCell(workUsageRow, valueCol2, tview.NewTableCell(""))
|
|
|
|
// HTTP Server 行
|
|
table.SetCell(
|
|
httpServerRow,
|
|
labelCol1,
|
|
tview.NewTableCell(fmt.Sprintf(" [%s::]%s", headerColor, "HTTP Server:")),
|
|
)
|
|
table.SetCell(httpServerRow, valueCol1, tview.NewTableCell(""))
|
|
|
|
// infobar
|
|
infoBar := &InfoBar{
|
|
Box: tview.NewBox(),
|
|
title: Title,
|
|
table: table,
|
|
}
|
|
|
|
return infoBar
|
|
}
|
|
|
|
func (info *InfoBar) UpdateAccount(account string) {
|
|
info.table.GetCell(accountRow, valueCol1).SetText(account)
|
|
}
|
|
|
|
func (info *InfoBar) UpdateBasicInfo(pid int, version string, exePath string) {
|
|
info.table.GetCell(pidRow, valueCol1).SetText(fmt.Sprintf("%d", pid))
|
|
info.table.GetCell(pidRow, valueCol2).SetText(exePath)
|
|
info.table.GetCell(accountRow, valueCol2).SetText(version)
|
|
}
|
|
|
|
func (info *InfoBar) UpdateStatus(status string) {
|
|
info.table.GetCell(statusRow, valueCol1).SetText(status)
|
|
}
|
|
|
|
func (info *InfoBar) UpdateDataKey(key string) {
|
|
info.table.GetCell(statusRow, valueCol2).SetText(key)
|
|
}
|
|
|
|
func (info *InfoBar) UpdateDataUsageDir(dataUsage string, dataDir string) {
|
|
info.table.GetCell(dataUsageRow, valueCol1).SetText(dataUsage)
|
|
info.table.GetCell(dataUsageRow, valueCol2).SetText(dataDir)
|
|
}
|
|
|
|
func (info *InfoBar) UpdateWorkUsageDir(workUsage string, workDir string) {
|
|
info.table.GetCell(workUsageRow, valueCol1).SetText(workUsage)
|
|
info.table.GetCell(workUsageRow, valueCol2).SetText(workDir)
|
|
}
|
|
|
|
// UpdateHTTPServer updates HTTP Server value.
|
|
func (info *InfoBar) UpdateHTTPServer(server string) {
|
|
info.table.GetCell(httpServerRow, valueCol1).SetText(server)
|
|
}
|
|
|
|
// Draw draws this primitive onto the screen.
|
|
func (info *InfoBar) Draw(screen tcell.Screen) {
|
|
info.Box.DrawForSubclass(screen, info)
|
|
info.Box.SetBorder(false)
|
|
|
|
x, y, width, height := info.GetInnerRect()
|
|
|
|
info.table.SetRect(x, y, width, height)
|
|
info.table.SetBorder(false)
|
|
info.table.Draw(screen)
|
|
}
|