2023-08-15 09:27:44 +08:00
|
|
|
//go:build ignore
|
2020-08-26 07:20:58 +08:00
|
|
|
// +build ignore
|
|
|
|
|
2016-05-24 04:13:23 +08:00
|
|
|
// Copyright 2016 The Tcell Authors
|
2015-11-02 06:44:23 +08:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the license at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
|
2020-08-26 07:20:58 +08:00
|
|
|
"github.com/gdamore/tcell/v2"
|
|
|
|
"github.com/gdamore/tcell/v2/views"
|
2015-11-02 06:44:23 +08:00
|
|
|
)
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
var app = &views.Application{}
|
|
|
|
var window = &mainWindow{}
|
|
|
|
|
2015-11-02 06:44:23 +08:00
|
|
|
type model struct {
|
|
|
|
x int
|
|
|
|
y int
|
|
|
|
endx int
|
|
|
|
endy int
|
|
|
|
hide bool
|
|
|
|
enab bool
|
|
|
|
loc string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) GetBounds() (int, int) {
|
|
|
|
return m.endx, m.endy
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) MoveCursor(offx, offy int) {
|
|
|
|
m.x += offx
|
|
|
|
m.y += offy
|
|
|
|
m.limitCursor()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) limitCursor() {
|
|
|
|
if m.x < 0 {
|
|
|
|
m.x = 0
|
|
|
|
}
|
|
|
|
if m.x > m.endx-1 {
|
|
|
|
m.x = m.endx - 1
|
|
|
|
}
|
|
|
|
if m.y < 0 {
|
|
|
|
m.y = 0
|
|
|
|
}
|
|
|
|
if m.y > m.endy-1 {
|
|
|
|
m.y = m.endy - 1
|
|
|
|
}
|
|
|
|
m.loc = fmt.Sprintf("Cursor is %d,%d", m.x, m.y)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) GetCursor() (int, int, bool, bool) {
|
|
|
|
return m.x, m.y, m.enab, !m.hide
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) SetCursor(x int, y int) {
|
|
|
|
m.x = x
|
|
|
|
m.y = y
|
|
|
|
|
|
|
|
m.limitCursor()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *model) GetCell(x, y int) (rune, tcell.Style, []rune, int) {
|
|
|
|
dig := []rune{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
|
|
|
|
var ch rune
|
|
|
|
style := tcell.StyleDefault
|
|
|
|
if x >= 60 || y >= 15 {
|
|
|
|
return ch, style, nil, 1
|
|
|
|
}
|
|
|
|
colors := []tcell.Color{
|
|
|
|
tcell.ColorWhite,
|
|
|
|
tcell.ColorGreen,
|
|
|
|
tcell.ColorMaroon,
|
|
|
|
tcell.ColorNavy,
|
|
|
|
tcell.ColorOlive,
|
|
|
|
}
|
|
|
|
if y == 0 && x < len(m.loc) {
|
|
|
|
style = style.
|
|
|
|
Foreground(tcell.ColorWhite).
|
|
|
|
Background(tcell.ColorLime)
|
|
|
|
ch = rune(m.loc[x])
|
|
|
|
} else {
|
|
|
|
ch = dig[(x)%len(dig)]
|
|
|
|
style = style.
|
|
|
|
Foreground(colors[(y)%len(colors)]).
|
|
|
|
Background(tcell.ColorBlack)
|
|
|
|
}
|
|
|
|
return ch, style, nil, 1
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
type mainWindow struct {
|
2015-11-02 06:44:23 +08:00
|
|
|
main *views.CellView
|
|
|
|
keybar *views.SimpleStyledText
|
2016-05-24 05:55:11 +08:00
|
|
|
status *views.SimpleStyledTextBar
|
2015-11-02 06:44:23 +08:00
|
|
|
model *model
|
|
|
|
|
|
|
|
views.Panel
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
func (a *mainWindow) HandleEvent(ev tcell.Event) bool {
|
2015-11-02 06:44:23 +08:00
|
|
|
|
|
|
|
switch ev := ev.(type) {
|
|
|
|
case *tcell.EventKey:
|
|
|
|
switch ev.Key() {
|
|
|
|
case tcell.KeyCtrlL:
|
2015-11-05 03:24:00 +08:00
|
|
|
app.Refresh()
|
2015-11-02 06:44:23 +08:00
|
|
|
return true
|
|
|
|
case tcell.KeyRune:
|
|
|
|
switch ev.Rune() {
|
|
|
|
case 'Q', 'q':
|
2015-11-05 03:24:00 +08:00
|
|
|
app.Quit()
|
2015-11-02 06:44:23 +08:00
|
|
|
return true
|
|
|
|
case 'S', 's':
|
|
|
|
a.model.hide = false
|
|
|
|
a.updateKeys()
|
|
|
|
return true
|
|
|
|
case 'H', 'h':
|
|
|
|
a.model.hide = true
|
|
|
|
a.updateKeys()
|
|
|
|
return true
|
|
|
|
case 'E', 'e':
|
|
|
|
a.model.enab = true
|
|
|
|
a.updateKeys()
|
|
|
|
return true
|
|
|
|
case 'D', 'd':
|
|
|
|
a.model.enab = false
|
|
|
|
a.updateKeys()
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return a.Panel.HandleEvent(ev)
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
func (a *mainWindow) Draw() {
|
2016-05-24 05:55:11 +08:00
|
|
|
a.status.SetLeft(a.model.loc)
|
2015-11-02 06:44:23 +08:00
|
|
|
a.Panel.Draw()
|
|
|
|
}
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
func (a *mainWindow) updateKeys() {
|
2015-11-02 06:44:23 +08:00
|
|
|
m := a.model
|
|
|
|
w := "[%AQ%N] Quit"
|
|
|
|
if !m.enab {
|
|
|
|
w += " [%AE%N] Enable cursor"
|
|
|
|
} else {
|
|
|
|
w += " [%AD%N] Disable cursor"
|
|
|
|
if !m.hide {
|
|
|
|
w += " [%AH%N] Hide cursor"
|
|
|
|
} else {
|
|
|
|
w += " [%AS%N] Show cursor"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
a.keybar.SetMarkup(w)
|
2015-11-05 03:24:00 +08:00
|
|
|
app.Update()
|
2015-11-02 06:44:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
window.model = &model{endx: 60, endy: 15}
|
2015-11-02 06:44:23 +08:00
|
|
|
|
|
|
|
title := views.NewTextBar()
|
|
|
|
title.SetStyle(tcell.StyleDefault.
|
|
|
|
Background(tcell.ColorTeal).
|
|
|
|
Foreground(tcell.ColorWhite))
|
|
|
|
title.SetCenter("CellView Test", tcell.StyleDefault)
|
|
|
|
title.SetRight("Example v1.0", tcell.StyleDefault)
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
window.keybar = views.NewSimpleStyledText()
|
2016-05-24 04:13:23 +08:00
|
|
|
window.keybar.RegisterStyle('N', tcell.StyleDefault.
|
2015-11-02 06:44:23 +08:00
|
|
|
Background(tcell.ColorSilver).
|
|
|
|
Foreground(tcell.ColorBlack))
|
2016-05-24 04:13:23 +08:00
|
|
|
window.keybar.RegisterStyle('A', tcell.StyleDefault.
|
2015-11-02 06:44:23 +08:00
|
|
|
Background(tcell.ColorSilver).
|
|
|
|
Foreground(tcell.ColorRed))
|
|
|
|
|
2016-05-24 05:55:11 +08:00
|
|
|
window.status = views.NewSimpleStyledTextBar()
|
|
|
|
window.status.SetStyle(tcell.StyleDefault.
|
|
|
|
Background(tcell.ColorBlue).
|
|
|
|
Foreground(tcell.ColorYellow))
|
|
|
|
window.status.RegisterLeftStyle('N', tcell.StyleDefault.
|
2015-11-02 06:44:23 +08:00
|
|
|
Background(tcell.ColorYellow).
|
|
|
|
Foreground(tcell.ColorBlack))
|
2016-05-24 05:55:11 +08:00
|
|
|
|
|
|
|
window.status.SetLeft("My status is here.")
|
|
|
|
window.status.SetRight("%UCellView%N demo!")
|
|
|
|
window.status.SetCenter("Cen%ST%Ner")
|
2015-11-02 06:44:23 +08:00
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
window.main = views.NewCellView()
|
|
|
|
window.main.SetModel(window.model)
|
|
|
|
window.main.SetStyle(tcell.StyleDefault.
|
2015-11-02 06:44:23 +08:00
|
|
|
Background(tcell.ColorBlack))
|
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
window.SetMenu(window.keybar)
|
|
|
|
window.SetTitle(title)
|
|
|
|
window.SetContent(window.main)
|
|
|
|
window.SetStatus(window.status)
|
|
|
|
|
|
|
|
window.updateKeys()
|
2015-11-02 06:44:23 +08:00
|
|
|
|
2015-11-05 03:24:00 +08:00
|
|
|
app.SetStyle(tcell.StyleDefault.
|
2015-11-02 06:44:23 +08:00
|
|
|
Foreground(tcell.ColorWhite).
|
|
|
|
Background(tcell.ColorBlack))
|
2015-11-05 03:24:00 +08:00
|
|
|
app.SetRootWidget(window)
|
|
|
|
if e := app.Run(); e != nil {
|
|
|
|
fmt.Fprintln(os.Stderr, e.Error())
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2015-11-02 06:44:23 +08:00
|
|
|
}
|