2019-03-05 07:05:43 +00:00
|
|
|
package cui
|
|
|
|
|
|
|
|
import (
|
2019-04-28 19:46:47 +00:00
|
|
|
"bufio"
|
2019-03-05 07:05:43 +00:00
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2019-04-28 19:46:47 +00:00
|
|
|
"strings"
|
2019-03-05 07:05:43 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var shapes = map[string]string{
|
2019-04-28 19:46:47 +00:00
|
|
|
"wall": "╵",
|
|
|
|
"ceiling": "╴",
|
|
|
|
"tl": "┌",
|
|
|
|
"tr": "┐",
|
|
|
|
"bl": "└",
|
|
|
|
"br": "┘",
|
|
|
|
"awall": "║",
|
2019-04-11 05:29:10 +00:00
|
|
|
"aceiling": "═",
|
2019-04-28 19:46:47 +00:00
|
|
|
"atl": "╔",
|
|
|
|
"atr": "╗",
|
|
|
|
"abl": "╚",
|
|
|
|
"abr": "╝",
|
2019-03-05 07:05:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func drawShape(shape string) {
|
|
|
|
if val, ok := shapes[shape]; ok {
|
|
|
|
fmt.Printf("%s", val)
|
|
|
|
} else {
|
|
|
|
fmt.Print("x")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func moveThenDrawShape(r, c int, s string) {
|
|
|
|
MoveCursorTo(r, c)
|
|
|
|
drawShape(s)
|
|
|
|
}
|
|
|
|
|
|
|
|
func MoveCursorTo(row, col int) {
|
|
|
|
fmt.Printf("\033[%d;%dH", row, col)
|
|
|
|
}
|
|
|
|
|
|
|
|
func moveCursorToward(dir string, amount int) {
|
|
|
|
directions := map[string]string{
|
2019-04-28 19:46:47 +00:00
|
|
|
"up": "A",
|
|
|
|
"down": "B",
|
|
|
|
"left": "D",
|
2019-03-05 07:05:43 +00:00
|
|
|
"right": "C",
|
|
|
|
}
|
|
|
|
|
|
|
|
if val, ok := directions[dir]; ok {
|
|
|
|
fmt.Printf("\033[%d%s", amount, val)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func Exit() {
|
|
|
|
moveCursorToward("down", 500)
|
|
|
|
moveCursorToward("right", 500)
|
|
|
|
SetLineMode()
|
2019-05-01 00:18:28 +00:00
|
|
|
|
2019-03-05 07:05:43 +00:00
|
|
|
fmt.Print("\n")
|
|
|
|
fmt.Print("\033[?25h")
|
2019-05-04 03:58:55 +00:00
|
|
|
HandleAlternateScreen("rmcup")
|
2019-03-05 07:05:43 +00:00
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Clear(dir string) {
|
|
|
|
directions := map[string]string{
|
2019-04-28 19:46:47 +00:00
|
|
|
"up": "\033[1J",
|
|
|
|
"down": "\033[0J",
|
|
|
|
"left": "\033[1K",
|
|
|
|
"right": "\033[0K",
|
|
|
|
"line": "\033[2K",
|
2019-03-05 07:05:43 +00:00
|
|
|
"screen": "\033[2J",
|
|
|
|
}
|
|
|
|
|
|
|
|
if val, ok := directions[dir]; ok {
|
|
|
|
fmt.Print(val)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-05-01 00:18:28 +00:00
|
|
|
func wrapLines(s []string, length int) []string {
|
2019-03-05 07:05:43 +00:00
|
|
|
out := []string{}
|
|
|
|
for _, ln := range s {
|
|
|
|
if len(ln) <= length {
|
|
|
|
out = append(out, ln)
|
|
|
|
} else {
|
|
|
|
words := strings.Split(ln, " ")
|
|
|
|
var subout bytes.Buffer
|
|
|
|
for i, wd := range words {
|
|
|
|
sublen := subout.Len()
|
2019-04-28 19:46:47 +00:00
|
|
|
if sublen+len(wd)+1 <= length {
|
2019-03-05 07:05:43 +00:00
|
|
|
if sublen > 0 {
|
|
|
|
subout.WriteString(" ")
|
|
|
|
}
|
2019-04-28 19:46:47 +00:00
|
|
|
subout.WriteString(wd)
|
|
|
|
if i == len(words)-1 {
|
2019-03-05 07:05:43 +00:00
|
|
|
out = append(out, subout.String())
|
|
|
|
}
|
|
|
|
} else {
|
2019-04-28 19:46:47 +00:00
|
|
|
out = append(out, subout.String())
|
|
|
|
subout.Reset()
|
|
|
|
subout.WriteString(wd)
|
|
|
|
if i == len(words)-1 {
|
2019-03-05 07:05:43 +00:00
|
|
|
out = append(out, subout.String())
|
|
|
|
subout.Reset()
|
2019-04-28 19:46:47 +00:00
|
|
|
}
|
2019-03-05 07:05:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return out
|
|
|
|
}
|
|
|
|
|
|
|
|
func Getch() rune {
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
char, _, err := reader.ReadRune()
|
|
|
|
if err != nil {
|
|
|
|
return '@'
|
|
|
|
}
|
|
|
|
return char
|
|
|
|
}
|
|
|
|
|
2019-05-01 00:18:28 +00:00
|
|
|
func GetLine() (string, error) {
|
2019-03-05 07:05:43 +00:00
|
|
|
SetLineMode()
|
2019-05-01 00:18:28 +00:00
|
|
|
|
2019-03-05 07:05:43 +00:00
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
fmt.Print(": ")
|
2019-05-01 00:18:28 +00:00
|
|
|
text, err := reader.ReadString('\n')
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
2019-03-05 07:05:43 +00:00
|
|
|
SetCharMode()
|
2019-05-01 00:18:28 +00:00
|
|
|
return text[:len(text)-1], nil
|
2019-03-05 07:05:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func SetCharMode() {
|
2019-03-19 03:11:02 +00:00
|
|
|
cmd := exec.Command("stty", "cbreak", "-echo")
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stdout = os.Stdout
|
2019-05-01 00:18:28 +00:00
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
2019-05-01 22:25:45 +00:00
|
|
|
panic(err)
|
2019-05-01 00:18:28 +00:00
|
|
|
}
|
|
|
|
|
2019-03-05 07:05:43 +00:00
|
|
|
fmt.Print("\033[?25l")
|
|
|
|
}
|
|
|
|
|
|
|
|
func SetLineMode() {
|
2019-03-19 03:11:02 +00:00
|
|
|
cmd := exec.Command("stty", "-cbreak", "echo")
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stdout = os.Stdout
|
2019-05-01 22:25:45 +00:00
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2019-03-05 07:05:43 +00:00
|
|
|
}
|
2019-05-04 03:58:55 +00:00
|
|
|
|
|
|
|
func HandleAlternateScreen(opt string) {
|
|
|
|
cmd := exec.Command("tput", opt)
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stdout = os.Stdout
|
2019-05-06 22:33:18 +00:00
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2019-05-04 03:58:55 +00:00
|
|
|
}
|