gim: give terminal.LineStyle Perp and Arrow fields
This commit is contained in:
parent
97be10b03e
commit
efa7319555
20
gim/line.go
20
gim/line.go
@ -5,22 +5,6 @@ import (
|
|||||||
"github.com/mediocregopher/ginger/gim/terminal"
|
"github.com/mediocregopher/ginger/gim/terminal"
|
||||||
)
|
)
|
||||||
|
|
||||||
var edgeSegments = map[geo.XY]rune{
|
|
||||||
geo.Up: '┴',
|
|
||||||
geo.Down: '┬',
|
|
||||||
geo.Left: '┤',
|
|
||||||
geo.Right: '├',
|
|
||||||
}
|
|
||||||
|
|
||||||
// actual unicode arrows were fucking up my terminal, and they didn't even
|
|
||||||
// connect properly with the line segments anyway
|
|
||||||
var arrows = map[geo.XY]rune{
|
|
||||||
geo.Up: '^',
|
|
||||||
geo.Down: 'v',
|
|
||||||
geo.Left: '<',
|
|
||||||
geo.Right: '>',
|
|
||||||
}
|
|
||||||
|
|
||||||
type line struct {
|
type line struct {
|
||||||
from, to *box
|
from, to *box
|
||||||
fromI, toI int
|
fromI, toI int
|
||||||
@ -71,9 +55,9 @@ func (l line) draw(buf *terminal.Buffer, flowDir, secFlowDir geo.XY) {
|
|||||||
var r rune
|
var r rune
|
||||||
switch {
|
switch {
|
||||||
case i == 0:
|
case i == 0:
|
||||||
r = edgeSegments[flowDir]
|
r = terminal.SingleLine.Perpendicular(flowDir)
|
||||||
case i == len(pts)-1:
|
case i == len(pts)-1:
|
||||||
r = arrows[flowDir]
|
r = terminal.SingleLine.Arrow(flowDir)
|
||||||
default:
|
default:
|
||||||
prev, next := pts[i-1], pts[i+1]
|
prev, next := pts[i-1], pts[i+1]
|
||||||
r = terminal.SingleLine.Segment(prev.Sub(pt), next.Sub(pt))
|
r = terminal.SingleLine.Segment(prev.Sub(pt), next.Sub(pt))
|
||||||
|
@ -15,14 +15,29 @@ var SingleLine = LineStyle{
|
|||||||
TopRight: '┐',
|
TopRight: '┐',
|
||||||
BottomLeft: '└',
|
BottomLeft: '└',
|
||||||
BottomRight: '┘',
|
BottomRight: '┘',
|
||||||
|
PerpUp: '┴',
|
||||||
|
PerpDown: '┬',
|
||||||
|
PerpLeft: '┤',
|
||||||
|
PerpRight: '├',
|
||||||
|
ArrowUp: '^',
|
||||||
|
ArrowDown: 'v',
|
||||||
|
ArrowLeft: '<',
|
||||||
|
ArrowRight: '>',
|
||||||
}
|
}
|
||||||
|
|
||||||
// LineStyle defines a set of characters to use together when drawing lines and
|
// LineStyle defines a set of characters to use together when drawing lines and
|
||||||
// corners.
|
// corners.
|
||||||
type LineStyle struct {
|
type LineStyle struct {
|
||||||
Horiz, Vert rune
|
Horiz, Vert rune
|
||||||
|
|
||||||
// Corner characters, identified as corners of a rectangle
|
// Corner characters, identified as corners of a rectangle
|
||||||
TopLeft, TopRight, BottomLeft, BottomRight rune
|
TopLeft, TopRight, BottomLeft, BottomRight rune
|
||||||
|
|
||||||
|
// Characters for a straight segment a perpendicular attached
|
||||||
|
PerpUp, PerpDown, PerpLeft, PerpRight rune
|
||||||
|
|
||||||
|
// Characters for pointing arrows
|
||||||
|
ArrowUp, ArrowDown, ArrowLeft, ArrowRight rune
|
||||||
}
|
}
|
||||||
|
|
||||||
// Segment takes two different directions (i.e. geo.Up/Down/Left/Right) and
|
// Segment takes two different directions (i.e. geo.Up/Down/Left/Right) and
|
||||||
@ -57,6 +72,40 @@ func (ls LineStyle) Segment(a, b geo.XY) rune {
|
|||||||
panic(fmt.Sprintf("invalid LineStyle.Segment directions: %v, %v", a, b))
|
panic(fmt.Sprintf("invalid LineStyle.Segment directions: %v, %v", a, b))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Perpendicular returns the line character for a perpendicular segment
|
||||||
|
// traveling in the given direction.
|
||||||
|
func (ls LineStyle) Perpendicular(dir geo.XY) rune {
|
||||||
|
switch dir {
|
||||||
|
case geo.Up:
|
||||||
|
return ls.PerpUp
|
||||||
|
case geo.Down:
|
||||||
|
return ls.PerpDown
|
||||||
|
case geo.Left:
|
||||||
|
return ls.PerpLeft
|
||||||
|
case geo.Right:
|
||||||
|
return ls.PerpRight
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("invalid LineStyle.Perpendicular direction: %v", dir))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Arrow returns the arrow character for an arrow pointing in the given
|
||||||
|
// direction.
|
||||||
|
func (ls LineStyle) Arrow(dir geo.XY) rune {
|
||||||
|
switch dir {
|
||||||
|
case geo.Up:
|
||||||
|
return ls.ArrowUp
|
||||||
|
case geo.Down:
|
||||||
|
return ls.ArrowDown
|
||||||
|
case geo.Left:
|
||||||
|
return ls.ArrowLeft
|
||||||
|
case geo.Right:
|
||||||
|
return ls.ArrowRight
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("invalid LineStyle.Arrow direction: %v", dir))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DrawRect draws the given Rect to the Buffer with the given LineStyle. The
|
// DrawRect draws the given Rect to the Buffer with the given LineStyle. The
|
||||||
// Rect's TopLeft field is used for its position.
|
// Rect's TopLeft field is used for its position.
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user