~ghost08/tcell-term

bbd6a57515dac6e76a95532acd6591fcfb1d0d19 — Tim Culverhouse 1 year, 3 months ago 4deff54
example: replace main example and remove _simple

Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
2 files changed, 75 insertions(+), 225 deletions(-)

M example/example.go
D example_simple/simple.go
M example/example.go => example/example.go +75 -142
@@ 1,3 1,4 @@
//go:build ignore
// +build ignore

package main


@@ 7,181 8,113 @@ import (
	"fmt"
	"io"
	"log"
	"math/rand"
	"os"
	"os/exec"
	"time"

	tcellterm "git.sr.ht/~ghost08/tcell-term"
	"github.com/gdamore/tcell/v2"
	"github.com/gdamore/tcell/v2/views"
)

var red = int32(rand.Int() % 256)
var grn = int32(rand.Int() % 256)
var blu = int32(rand.Int() % 256)
var inc = int32(8) // rate of color change
var redi = int32(inc)
var grni = int32(inc)
var blui = int32(inc)
var term *tcellterm.Terminal

func makebox(s tcell.Screen) {
	s.Clear()
	w, h := s.Size()

	if w == 0 || h == 0 {
		return
	}

	glyphs := []rune{'@', '#', '&', '*', '=', '%', 'Z', 'A'}

	lh := h / 2
	lw := w / 2
	lx := w / 4
	ly := h / 4
	st := tcell.StyleDefault
	gl := ' '

	if s.Colors() == 0 {
		st = st.Reverse(rand.Int()%2 == 0)
		gl = glyphs[rand.Int()%len(glyphs)]
	} else {
type model struct {
	term      *tcellterm.Terminal
	s         tcell.Screen
	termView  views.View
	title     *views.TextBar
	titleView views.View
}

		red += redi
		if (red >= 256) || (red < 0) {
			redi = -redi
			red += redi
func (m *model) HandleEvent(ev tcell.Event) bool {
	switch ev := ev.(type) {
	case *tcell.EventKey:
		switch ev.Key() {
		case tcell.KeyCtrlC:
			m.s.Clear()
			m.s.Fini()
			return true
		}
		grn += grni
		if (grn >= 256) || (grn < 0) {
			grni = -grni
			grn += grni
		if m.term != nil {
			return m.term.HandleEvent(ev)
		}
		blu += blui
		if (blu >= 256) || (blu < 0) {
			blui = -blui
			blu += blui

	case *tcell.EventResize:
		if m.term != nil {
			m.termView.Resize(0, 2, -1, -1)
			m.term.Resize()
		}
		st = st.Background(tcell.NewRGBColor(red, grn, blu))
	}
	if term == nil {
		for row := 0; row < lh; row++ {
			for col := 0; col < lw; col++ {
				s.SetCell(lx+col, ly+row, st, gl)
			}
		m.titleView.Resize(0, 0, -1, 2)
		m.title.Resize()
		m.s.Sync()
		return true
	case *views.EventWidgetContent:
		m.term.Draw()
		m.title.Draw()

		vis, x, y, style := m.term.GetCursor()
		if vis {
			m.s.ShowCursor(x, y+2)
			m.s.SetCursorStyle(style)
		} else {
			m.s.HideCursor()
		}
	} else {
		term.Draw(s, uint16(lx), uint16(ly))
		m.s.Show()
		return true
	}
	s.Show()
}

func flipcoin() bool {
	if rand.Int()&1 == 0 {
		return false
	}
	return true
	return false
}

func main() {
	var err error
	f, _ := os.Create("meh.log")
	defer f.Close()
	logbuf := bytes.NewBuffer(nil)
	log.SetOutput(io.MultiWriter(f, logbuf))
	log.SetFlags(log.LstdFlags | log.Lshortfile)

	rand.Seed(time.Now().UnixNano())
	tcell.SetEncodingFallback(tcell.EncodingFallbackASCII)
	s, e := tcell.NewScreen()
	if e != nil {
		fmt.Fprintf(os.Stderr, "%v\n", e)
	m := &model{}
	m.s, err = tcell.NewScreen()
	if err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err)
		os.Exit(1)
	}
	if e = s.Init(); e != nil {
		fmt.Fprintf(os.Stderr, "%v\n", e)
	if err = m.s.Init(); err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err)
		os.Exit(1)
	}

	s.SetStyle(tcell.StyleDefault.
		Foreground(tcell.ColorWhite).
		Background(tcell.ColorBlack))
	s.Clear()
	m.title = views.NewTextBar()
	m.title.SetCenter(
		"Welcome to tcell-term",
		tcell.StyleDefault.Foreground(tcell.ColorBlue).
			Bold(true).
			Underline(true),
	)

	m.titleView = views.NewViewPort(m.s, 0, 0, -1, 2)
	m.title.Watch(m)
	m.title.SetView(m.titleView)

	quit := make(chan struct{})
	redraw := make(chan struct{})
	m.termView = views.NewViewPort(m.s, 0, 2, -1, -1)
	m.term = tcellterm.New()
	m.term.Watch(m)
	m.term.SetView(m.termView)

	cmd := exec.Command(os.Getenv("SHELL"))
	go func() {
		for {
			ev := s.PollEvent()
			switch ev := ev.(type) {
			case *tcell.EventKey:
				switch ev.Key() {
				case tcell.KeyEscape:
					if term == nil {
						close(quit)
						return
					}
				case tcell.KeyEnter:
					if term == nil {
						term = tcellterm.New()
						cmd := exec.Command("less", "/etc/hosts")
						go func() {
							w, h := s.Size()
							lh := h / 2
							lw := w / 2
							if err := term.Run(cmd, redraw, uint16(lw), uint16(lh)); err != nil {
								log.Println(err)
							}
							s.HideCursor()
							term = nil
						}()
						continue
					}
				}
				if term != nil {
					term.Event(ev)
				}
			case *tcell.EventResize:
				if term != nil {
					w, h := s.Size()
					lh := h / 2
					lw := w / 2
					term.Resize(lw, lh)
				}
				s.Sync()
			}
		if err := m.term.Run(cmd); err != nil {
			log.Println(err)
		}
		m.s.Clear()
		m.s.Fini()
		os.Stdout.Write(logbuf.Bytes())
		return
	}()

	cnt := 0
loop:
	for {
		select {
		case <-quit:
			break loop
		case <-time.After(time.Millisecond * 50):
		case <-redraw:
		}
		makebox(s)
		cnt++
		if cnt%(256/int(inc)) == 0 {
			if flipcoin() {
				redi = -redi
			}
			if flipcoin() {
				grni = -grni
			}
			if flipcoin() {
				blui = -blui
			}
		// s.Show()
		ev := m.s.PollEvent()
		if ev == nil {
			break
		}
		m.HandleEvent(ev)
	}

	s.Fini()
	os.Stdout.Write(logbuf.Bytes())
}

func colorToString(c tcell.Color) string {
	r, g, b := c.RGB()
	return fmt.Sprintf("%02x%02x%02x", r, g, b)
}

D example_simple/simple.go => example_simple/simple.go +0 -83
@@ 1,83 0,0 @@
//go:build ignore
// +build ignore

package main

import (
	"bytes"
	"fmt"
	"io"
	"log"
	"os"
	"os/exec"

	tcellterm "git.sr.ht/~ghost08/tcell-term"
	"github.com/gdamore/tcell/v2"
)

func main() {
	f, _ := os.Create("meh.log")
	defer f.Close()
	logbuf := bytes.NewBuffer(nil)
	log.SetOutput(io.MultiWriter(f, logbuf))
	log.SetFlags(log.LstdFlags | log.Lshortfile)

	s, err := tcell.NewScreen()
	if err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err)
		os.Exit(1)
	}
	if err = s.Init(); err != nil {
		fmt.Fprintf(os.Stderr, "%v\n", err)
		os.Exit(1)
	}

	s.Clear()

	quit := make(chan struct{})
	var term *tcellterm.Terminal
	term = tcellterm.New(s, nil)

	cmd := exec.Command("zsh")
	go func() {
		if err := term.Run(cmd); err != nil {
			log.Println(err)
		}
		close(quit)
		s.Fini()
		os.Stdout.Write(logbuf.Bytes())
		os.Exit(0)
	}()
	for {
		ev := s.PollEvent()
		switch ev := ev.(type) {
		case *tcell.EventKey:
			switch ev.Key() {
			case tcell.KeyCtrlC:
				close(quit)
				s.Fini()
				os.Stdout.Write(logbuf.Bytes())
				return
			}
			if term != nil {
				term.HandleEvent(ev)
			}
		case *tcell.EventResize:
			if term != nil {
				term.Resize()
			}
			s.Sync()
		case *tcellterm.RedrawEvent:
			term.Draw()
			vis, x, y, style := term.GetCursor()
			if vis {
				s.ShowCursor(x, y)
				s.SetCursorStyle(style)
			} else {
				s.HideCursor()
			}
			s.Show()
		}

	}
}