func drawBox(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, r rune) { if y2 < y1 { y1, y2 = y2, y1 } if x2 < x1 { x1, x2 = x2, x1 } for col := x1; col <= x2; col++ { s.SetCell(col, y1, style, tcell.RuneHLine) s.SetCell(col, y2, style, tcell.RuneHLine) } for row := y1 + 1; row < y2; row++ { s.SetCell(x1, row, style, tcell.RuneVLine) s.SetCell(x2, row, style, tcell.RuneVLine) } if y1 != y2 && x1 != x2 { // Only add corners if we need to s.SetCell(x1, y1, style, tcell.RuneULCorner) s.SetCell(x2, y1, style, tcell.RuneURCorner) s.SetCell(x1, y2, style, tcell.RuneLLCorner) s.SetCell(x2, y2, style, tcell.RuneLRCorner) } for row := y1 + 1; row < y2; row++ { for col := x1 + 1; col < x2; col++ { s.SetCell(col, row, style, r) } } }
func makebox(s tcell.Screen) { w, h := s.Size() if w == 0 || h == 0 { return } glyphs := []rune{'@', '#', '&', '*', '=', '%', 'Z', 'A'} lx := rand.Int() % w ly := rand.Int() % h lw := rand.Int() % (w - lx) lh := rand.Int() % (h - ly) st := tcell.StyleDefault gl := ' ' if s.Colors() > 256 { rgb := tcell.NewHexColor(int32(rand.Int() & 0xffffff)) st = st.Background(rgb) } else if s.Colors() > 1 { st = st.Background(tcell.Color(rand.Int() % s.Colors())) } else { st = st.Reverse(rand.Int()%2 == 0) gl = glyphs[rand.Int()%len(glyphs)] } for row := 0; row < lh; row++ { for col := 0; col < lw; col++ { s.SetCell(lx+col, ly+row, st, gl) } } s.Show() }
func Puts(s tcell.Screen, style tcell.Style, x, y int, str string) { i := 0 var deferred []rune dwidth := 0 for _, r := range str { switch runewidth.RuneWidth(r) { case 0: if len(deferred) == 0 { deferred = append(deferred, ' ') dwidth = 1 } case 1: if len(deferred) != 0 { s.SetCell(x+i, y, style, deferred...) i += dwidth } deferred = deferred[0:0] dwidth = 1 case 2: if len(deferred) != 0 { s.SetCell(x+i, y, style, deferred...) i += dwidth } deferred = deferred[0:0] dwidth = 2 } deferred = append(deferred, r) } if len(deferred) != 0 { s.SetCell(x+i, y, style, deferred...) i += dwidth } }
func emitStr(s tcell.Screen, x, y int, style tcell.Style, str string) { for _, c := range str { s.SetCell(x, y, style, c) x++ } }