mirror of
https://github.com/bcicen/ctop.git
synced 2024-08-30 18:23:19 +00:00
restructure compact widgets
This commit is contained in:
parent
3172f141f9
commit
52a3e61b92
@ -21,17 +21,30 @@ func NewCompactGrid() *CompactGrid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cg *CompactGrid) Align() {
|
func (cg *CompactGrid) Align() {
|
||||||
// Update y recursively
|
// update header y pos
|
||||||
cg.header.SetY(cg.Y)
|
if cg.header.Y != cg.Y {
|
||||||
|
cg.header.SetY(cg.Y)
|
||||||
|
}
|
||||||
|
|
||||||
|
// update row y pos recursively
|
||||||
y := cg.Y + 1
|
y := cg.Y + 1
|
||||||
for _, r := range cg.Rows {
|
for _, r := range cg.Rows {
|
||||||
r.SetY(y)
|
if r.Y != y {
|
||||||
|
r.SetY(y)
|
||||||
|
}
|
||||||
y += r.Height
|
y += r.Height
|
||||||
}
|
}
|
||||||
// Update width recursively
|
|
||||||
cg.header.SetWidth(cg.Width)
|
// update header width
|
||||||
|
if cg.header.Width != cg.Width {
|
||||||
|
cg.header.SetWidth(cg.Width)
|
||||||
|
}
|
||||||
|
|
||||||
|
// update row width recursively
|
||||||
for _, r := range cg.Rows {
|
for _, r := range cg.Rows {
|
||||||
r.SetWidth(cg.Width)
|
if r.Width != cg.Width {
|
||||||
|
r.SetWidth(cg.Width)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,28 +5,26 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type CompactHeader struct {
|
type CompactHeader struct {
|
||||||
pars []*ui.Par
|
|
||||||
X, Y int
|
X, Y int
|
||||||
Width int
|
Width int
|
||||||
Height int
|
Height int
|
||||||
|
pars []*ui.Par
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCompactHeader() *CompactHeader {
|
func NewCompactHeader() *CompactHeader {
|
||||||
fields := []string{"", "NAME", "CID", "CPU", "MEM", "NET RX/TX"}
|
fields := []string{"", "NAME", "CID", "CPU", "MEM", "NET RX/TX"}
|
||||||
header := &CompactHeader{}
|
header := &CompactHeader{}
|
||||||
for _, f := range fields {
|
for _, f := range fields {
|
||||||
header.pars = append(header.pars, slimHeaderPar(f))
|
header.pars = append(header.pars, headerPar(f))
|
||||||
}
|
}
|
||||||
return header
|
return header
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CompactHeader) SetWidth(w int) {
|
func (c *CompactHeader) SetWidth(w int) {
|
||||||
if w == c.Width {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
x := 1
|
x := 1
|
||||||
autoWidth := calcWidth(w, 5)
|
autoWidth := calcWidth(w, 5)
|
||||||
for n, col := range c.pars {
|
for n, col := range c.pars {
|
||||||
|
// set status column to static width
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
col.SetX(x)
|
col.SetX(x)
|
||||||
col.SetWidth(statusWidth)
|
col.SetWidth(statusWidth)
|
||||||
@ -41,9 +39,6 @@ func (c *CompactHeader) SetWidth(w int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *CompactHeader) SetY(y int) {
|
func (c *CompactHeader) SetY(y int) {
|
||||||
if y == c.Y {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, p := range c.pars {
|
for _, p := range c.pars {
|
||||||
p.SetY(y)
|
p.SetY(y)
|
||||||
}
|
}
|
||||||
@ -57,3 +52,12 @@ func (c *CompactHeader) Buffer() ui.Buffer {
|
|||||||
}
|
}
|
||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func headerPar(s string) *ui.Par {
|
||||||
|
p := ui.NewPar(s)
|
||||||
|
p.Y = 2
|
||||||
|
p.Height = 2
|
||||||
|
p.Width = 20
|
||||||
|
p.Border = false
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
package compact
|
package compact
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/bcicen/ctop/cwidgets"
|
|
||||||
"github.com/bcicen/ctop/logging"
|
"github.com/bcicen/ctop/logging"
|
||||||
"github.com/bcicen/ctop/metrics"
|
"github.com/bcicen/ctop/metrics"
|
||||||
ui "github.com/gizak/termui"
|
ui "github.com/gizak/termui"
|
||||||
@ -12,10 +8,6 @@ import (
|
|||||||
|
|
||||||
var log = logging.Init()
|
var log = logging.Init()
|
||||||
|
|
||||||
const (
|
|
||||||
colSpacing = 1
|
|
||||||
)
|
|
||||||
|
|
||||||
type Compact struct {
|
type Compact struct {
|
||||||
Status *Status
|
Status *Status
|
||||||
Name *TextCol
|
Name *TextCol
|
||||||
@ -66,21 +58,7 @@ func (row *Compact) Reset() {
|
|||||||
row.Net.Reset()
|
row.Net.Reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (row *Compact) all() []ui.GridBufferer {
|
|
||||||
return []ui.GridBufferer{
|
|
||||||
row.Status,
|
|
||||||
row.Name,
|
|
||||||
row.Cid,
|
|
||||||
row.Cpu,
|
|
||||||
row.Memory,
|
|
||||||
row.Net,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (row *Compact) SetY(y int) {
|
func (row *Compact) SetY(y int) {
|
||||||
if y == row.Y {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, col := range row.all() {
|
for _, col := range row.all() {
|
||||||
col.SetY(y)
|
col.SetY(y)
|
||||||
}
|
}
|
||||||
@ -88,12 +66,10 @@ func (row *Compact) SetY(y int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (row *Compact) SetWidth(width int) {
|
func (row *Compact) SetWidth(width int) {
|
||||||
if row.Width == width {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
x := 1
|
x := 1
|
||||||
autoWidth := calcWidth(width, 5)
|
autoWidth := calcWidth(width, 5)
|
||||||
for n, col := range row.all() {
|
for n, col := range row.all() {
|
||||||
|
// set status column to static width
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
col.SetX(x)
|
col.SetX(x)
|
||||||
col.SetWidth(statusWidth)
|
col.SetWidth(statusWidth)
|
||||||
@ -120,28 +96,13 @@ func (row *Compact) Buffer() ui.Buffer {
|
|||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
|
|
||||||
func (row *Compact) SetNet(rx int64, tx int64) {
|
func (row *Compact) all() []ui.GridBufferer {
|
||||||
label := fmt.Sprintf("%s / %s", cwidgets.ByteFormat(rx), cwidgets.ByteFormat(tx))
|
return []ui.GridBufferer{
|
||||||
row.Net.Set(label)
|
row.Status,
|
||||||
}
|
row.Name,
|
||||||
|
row.Cid,
|
||||||
func (row *Compact) SetCPU(val int) {
|
row.Cpu,
|
||||||
row.Cpu.BarColor = colorScale(val)
|
row.Memory,
|
||||||
row.Cpu.Label = fmt.Sprintf("%s%%", strconv.Itoa(val))
|
row.Net,
|
||||||
if val < 5 {
|
|
||||||
val = 5
|
|
||||||
row.Cpu.BarColor = ui.ColorBlack
|
|
||||||
}
|
}
|
||||||
row.Cpu.Percent = val
|
|
||||||
}
|
|
||||||
|
|
||||||
func (row *Compact) SetMem(val int64, limit int64, percent int) {
|
|
||||||
row.Memory.Label = fmt.Sprintf("%s / %s", cwidgets.ByteFormat(val), cwidgets.ByteFormat(limit))
|
|
||||||
if percent < 5 {
|
|
||||||
percent = 5
|
|
||||||
row.Memory.BarColor = ui.ColorBlack
|
|
||||||
} else {
|
|
||||||
row.Memory.BarColor = ui.ColorGreen
|
|
||||||
}
|
|
||||||
row.Memory.Percent = percent
|
|
||||||
}
|
}
|
||||||
|
35
cwidgets/compact/setters.go
Normal file
35
cwidgets/compact/setters.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package compact
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/bcicen/ctop/cwidgets"
|
||||||
|
ui "github.com/gizak/termui"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (row *Compact) SetNet(rx int64, tx int64) {
|
||||||
|
label := fmt.Sprintf("%s / %s", cwidgets.ByteFormat(rx), cwidgets.ByteFormat(tx))
|
||||||
|
row.Net.Set(label)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (row *Compact) SetCPU(val int) {
|
||||||
|
row.Cpu.BarColor = colorScale(val)
|
||||||
|
row.Cpu.Label = fmt.Sprintf("%s%%", strconv.Itoa(val))
|
||||||
|
if val < 5 {
|
||||||
|
val = 5
|
||||||
|
row.Cpu.BarColor = ui.ColorBlack
|
||||||
|
}
|
||||||
|
row.Cpu.Percent = val
|
||||||
|
}
|
||||||
|
|
||||||
|
func (row *Compact) SetMem(val int64, limit int64, percent int) {
|
||||||
|
row.Memory.Label = fmt.Sprintf("%s / %s", cwidgets.ByteFormat(val), cwidgets.ByteFormat(limit))
|
||||||
|
if percent < 5 {
|
||||||
|
percent = 5
|
||||||
|
row.Memory.BarColor = ui.ColorBlack
|
||||||
|
} else {
|
||||||
|
row.Memory.BarColor = ui.ColorGreen
|
||||||
|
}
|
||||||
|
row.Memory.Percent = percent
|
||||||
|
}
|
44
cwidgets/compact/status.go
Normal file
44
cwidgets/compact/status.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package compact
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
ui "github.com/gizak/termui"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
mark = string('\u25C9')
|
||||||
|
vBar = string('\u25AE')
|
||||||
|
statusWidth = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
// Status indicator
|
||||||
|
type Status struct {
|
||||||
|
*ui.Par
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewStatus() *Status {
|
||||||
|
p := ui.NewPar(mark)
|
||||||
|
p.Border = false
|
||||||
|
p.Height = 1
|
||||||
|
p.Width = statusWidth
|
||||||
|
return &Status{p}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Status) Set(val string) {
|
||||||
|
// defaults
|
||||||
|
text := mark
|
||||||
|
color := ui.ColorDefault
|
||||||
|
|
||||||
|
switch val {
|
||||||
|
case "running":
|
||||||
|
color = ui.ColorGreen
|
||||||
|
case "exited":
|
||||||
|
color = ui.ColorRed
|
||||||
|
case "paused":
|
||||||
|
text = fmt.Sprintf("%s%s", vBar, vBar)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Text = text
|
||||||
|
s.TextFgColor = color
|
||||||
|
}
|
@ -1,17 +1,9 @@
|
|||||||
package compact
|
package compact
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
ui "github.com/gizak/termui"
|
ui "github.com/gizak/termui"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
mark = string('\u25C9')
|
|
||||||
vBar = string('\u25AE')
|
|
||||||
statusWidth = 3
|
|
||||||
)
|
|
||||||
|
|
||||||
type TextCol struct {
|
type TextCol struct {
|
||||||
*ui.Par
|
*ui.Par
|
||||||
}
|
}
|
||||||
@ -41,33 +33,3 @@ func (w *TextCol) Reset() {
|
|||||||
func (w *TextCol) Set(s string) {
|
func (w *TextCol) Set(s string) {
|
||||||
w.Text = s
|
w.Text = s
|
||||||
}
|
}
|
||||||
|
|
||||||
type Status struct {
|
|
||||||
*ui.Par
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewStatus() *Status {
|
|
||||||
p := ui.NewPar(mark)
|
|
||||||
p.Border = false
|
|
||||||
p.Height = 1
|
|
||||||
p.Width = statusWidth
|
|
||||||
return &Status{p}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Status) Set(val string) {
|
|
||||||
// defaults
|
|
||||||
text := mark
|
|
||||||
color := ui.ColorDefault
|
|
||||||
|
|
||||||
switch val {
|
|
||||||
case "running":
|
|
||||||
color = ui.ColorGreen
|
|
||||||
case "exited":
|
|
||||||
color = ui.ColorRed
|
|
||||||
case "paused":
|
|
||||||
text = fmt.Sprintf("%s%s", vBar, vBar)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.Text = text
|
|
||||||
s.TextFgColor = color
|
|
||||||
}
|
|
||||||
|
@ -7,21 +7,14 @@ import (
|
|||||||
ui "github.com/gizak/termui"
|
ui "github.com/gizak/termui"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const colSpacing = 1
|
||||||
|
|
||||||
// Calculate per-column width, given total width and number of items
|
// Calculate per-column width, given total width and number of items
|
||||||
func calcWidth(width, items int) int {
|
func calcWidth(width, items int) int {
|
||||||
spacing := colSpacing * items
|
spacing := colSpacing * items
|
||||||
return (width - statusWidth - spacing) / items
|
return (width - statusWidth - spacing) / items
|
||||||
}
|
}
|
||||||
|
|
||||||
func slimHeaderPar(s string) *ui.Par {
|
|
||||||
p := ui.NewPar(s)
|
|
||||||
p.Y = 2
|
|
||||||
p.Height = 2
|
|
||||||
p.Width = 20
|
|
||||||
p.Border = false
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
func centerParText(p *ui.Par) {
|
func centerParText(p *ui.Par) {
|
||||||
var text string
|
var text string
|
||||||
var padding string
|
var padding string
|
||||||
|
Loading…
Reference in New Issue
Block a user