Finish kilo chapter 4, text viewer
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good
All checks were successful
timw4mail/gilo/pipeline/head This commit looks good
This commit is contained in:
parent
a2bfb5f945
commit
bd9a07feed
@ -4,6 +4,7 @@ package editor
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
"timshome.page/gilo/terminal"
|
"timshome.page/gilo/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -21,6 +22,7 @@ func (e *editor) RefreshScreen() {
|
|||||||
|
|
||||||
e.drawRows(ab)
|
e.drawRows(ab)
|
||||||
e.drawStatusBar(ab)
|
e.drawStatusBar(ab)
|
||||||
|
e.drawMessageBar(ab)
|
||||||
|
|
||||||
ab.append(terminal.MoveCursor(e.renderX - e.offset.x, e.cursor.y - e.offset.y))
|
ab.append(terminal.MoveCursor(e.renderX - e.offset.x, e.cursor.y - e.offset.y))
|
||||||
|
|
||||||
@ -151,3 +153,13 @@ func (e *editor) drawStatusBar(ab *buffer) {
|
|||||||
|
|
||||||
ab.append(terminal.ResetColor)
|
ab.append(terminal.ResetColor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *editor) drawMessageBar(ab *buffer) {
|
||||||
|
ab.append("\r\n")
|
||||||
|
ab.append(terminal.ClearLine)
|
||||||
|
|
||||||
|
msg := truncateString(e.status.message, e.screen.Cols)
|
||||||
|
if len(msg) > 0 && time.Since(e.status.created).Seconds() < 5.0 {
|
||||||
|
ab.append(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package editor
|
package editor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
"timshome.page/gilo/terminal"
|
"timshome.page/gilo/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -13,29 +15,40 @@ type point struct {
|
|||||||
y int
|
y int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type statusMsg struct {
|
||||||
|
message string
|
||||||
|
created time.Time
|
||||||
|
}
|
||||||
|
|
||||||
type editor struct {
|
type editor struct {
|
||||||
screen *terminal.Screen
|
screen *terminal.Screen
|
||||||
cursor *point
|
cursor *point
|
||||||
offset *point
|
offset *point
|
||||||
document *document
|
document *document
|
||||||
|
status *statusMsg
|
||||||
renderX int
|
renderX int
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() *editor {
|
func New() *editor {
|
||||||
screen := terminal.Size()
|
screen := terminal.Size()
|
||||||
|
|
||||||
// Subtract rows for status bar and prompt
|
// Subtract rows for status bar and message bar/prompt
|
||||||
screen.Rows -= 1
|
screen.Rows -= 2
|
||||||
|
|
||||||
cursor := &point { 0, 0 }
|
cursor := &point { 0, 0 }
|
||||||
offset := &point { 0, 0 }
|
offset := &point { 0, 0 }
|
||||||
document := newDocument()
|
document := newDocument()
|
||||||
|
status := &statusMsg{
|
||||||
|
"",
|
||||||
|
time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
return &editor{
|
return &editor{
|
||||||
screen,
|
screen,
|
||||||
cursor,
|
cursor,
|
||||||
offset,
|
offset,
|
||||||
document,
|
document,
|
||||||
|
status,
|
||||||
0,
|
0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -44,6 +57,13 @@ func (e *editor) Open(filename string) {
|
|||||||
e.document.open(filename)
|
e.document.open(filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *editor) SetStatusMessage(template string, a ...interface{}) {
|
||||||
|
e.status = &statusMsg {
|
||||||
|
fmt.Sprintf(template, a...),
|
||||||
|
time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (e *editor) ProcessKeypress() bool {
|
func (e *editor) ProcessKeypress() bool {
|
||||||
var str string
|
var str string
|
||||||
|
|
||||||
@ -110,7 +130,7 @@ func (e *editor) moveCursor (key string) {
|
|||||||
e.cursor.y -= 1
|
e.cursor.y -= 1
|
||||||
}
|
}
|
||||||
case keyDown:
|
case keyDown:
|
||||||
if e.cursor.y < (e.document.rowCount() - 1) {
|
if e.cursor.y < e.document.rowCount() {
|
||||||
e.cursor.y += 1
|
e.cursor.y += 1
|
||||||
}
|
}
|
||||||
case keyPageUp:
|
case keyPageUp:
|
||||||
|
Loading…
Reference in New Issue
Block a user