mirror of
https://github.com/VladimirMarkelov/clui.git
synced 2025-05-03 22:17:14 +08:00
add scroll draw method to canvas
This commit is contained in:
parent
f17984c4d8
commit
c599674c3a
52
canvas.go
52
canvas.go
@ -274,3 +274,55 @@ if you want to hide the caret. Used by controls like EditField
|
|||||||
func (fb *FrameBuffer) SetCursorPos(x, y int) {
|
func (fb *FrameBuffer) SetCursorPos(x, y int) {
|
||||||
term.SetCursor(x, y)
|
term.SetCursor(x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
DrawScroll paints a scroll bar inside FrameBuffer.
|
||||||
|
x, y - start position.
|
||||||
|
w, h - width and height (if h equals 1 then horizontal scroll is drawn
|
||||||
|
and vertical otherwise).
|
||||||
|
pos - thumb position.
|
||||||
|
fgScroll, bgScroll - scroll bar main attributes.
|
||||||
|
fgThumb, bgThumb - thumb colors.
|
||||||
|
scrollChars - rune set(by default, in case of is is empty string, the
|
||||||
|
rune set equals "░■▲▼")
|
||||||
|
*/
|
||||||
|
func (fb *FrameBuffer) DrawScroll(x, y, w, h, pos int, fgScroll, bgScroll, fgThumb, bgThumb term.Attribute, scrollChars string) {
|
||||||
|
if w < 1 || h < 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if scrollChars == "" {
|
||||||
|
scrollChars = "░■▲▼"
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := []rune(scrollChars)
|
||||||
|
chLine, chCursor, chUp, chDown := parts[0], parts[1], parts[2], parts[3]
|
||||||
|
|
||||||
|
if h == 1 {
|
||||||
|
fb.PutChar(x, y, chUp, fgScroll, bgScroll)
|
||||||
|
fb.PutChar(x+w-1, y, chDown, fgScroll, bgScroll)
|
||||||
|
|
||||||
|
if w > 2 {
|
||||||
|
for xx := 1; xx < w-1; xx++ {
|
||||||
|
fb.PutChar(x+xx, y, chLine, fgScroll, bgScroll)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pos != -1 {
|
||||||
|
fb.PutChar(x+pos, y, chCursor, fgThumb, bgThumb)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fb.PutChar(x, y, chUp, fgScroll, bgScroll)
|
||||||
|
fb.PutChar(x, y+h-1, chDown, fgScroll, bgScroll)
|
||||||
|
|
||||||
|
if h > 2 {
|
||||||
|
for yy := 1; yy < h-1; yy++ {
|
||||||
|
fb.PutChar(x, y+yy, chLine, fgScroll, bgScroll)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pos != -1 {
|
||||||
|
fb.PutChar(x, y+pos, chCursor, fgThumb, bgThumb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
12
interface.go
12
interface.go
@ -49,6 +49,18 @@ type Canvas interface {
|
|||||||
FillRect(x int, y int, width int, height int, symbol term.Cell)
|
FillRect(x int, y int, width int, height int, symbol term.Cell)
|
||||||
// DrawFrame paints a frame inside Canvas with optional border rune set(by default, in case of border is empty string, the rune set equals "─│┌┐└┘" - single border). The inner area of frame is not filled - in other words it is transparent
|
// DrawFrame paints a frame inside Canvas with optional border rune set(by default, in case of border is empty string, the rune set equals "─│┌┐└┘" - single border). The inner area of frame is not filled - in other words it is transparent
|
||||||
DrawFrame(x int, y int, width int, height int, fg term.Attribute, bg term.Attribute, border string)
|
DrawFrame(x int, y int, width int, height int, fg term.Attribute, bg term.Attribute, border string)
|
||||||
|
/*
|
||||||
|
DrawScroll paints a scroll bar inside FrameBuffer.
|
||||||
|
x, y - start position.
|
||||||
|
w, h - width and height (if h equals 1 then horizontal scroll is drawn
|
||||||
|
and vertical otherwise).
|
||||||
|
pos - thumb position.
|
||||||
|
fgScroll, bgScroll - scroll bar main attributes.
|
||||||
|
fgThumb, bgThumb - thumb colors.
|
||||||
|
scrollChars - rune set(by default, in case of is is empty string, the
|
||||||
|
rune set equals "░■▲▼")
|
||||||
|
*/
|
||||||
|
DrawScroll(x, y, w, h, pos int, fgScroll, bgScroll, fgThumb, bgThumb term.Attribute, scrollChars string)
|
||||||
// SetCursorPos sets text caret position. Used by controls like EditField
|
// SetCursorPos sets text caret position. Used by controls like EditField
|
||||||
SetCursorPos(x int, y int)
|
SetCursorPos(x int, y int)
|
||||||
}
|
}
|
||||||
|
38
listbox.go
38
listbox.go
@ -68,36 +68,24 @@ func NewListBox(view View, parent Control, width, height int, scale int) *ListBo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *ListBox) redrawScroll(canvas Canvas, tm Theme) {
|
func (l *ListBox) redrawScroll(canvas Canvas, tm Theme) {
|
||||||
parts := []rune(tm.SysObject(ObjScrollBar))
|
|
||||||
|
|
||||||
chLine, chCursor, chUp, chDown := parts[0], parts[1], parts[2], parts[3]
|
|
||||||
|
|
||||||
fg, bg := RealColor(tm, l.fg, ColorScrollText), RealColor(tm, l.bg, ColorScrollBack)
|
fg, bg := RealColor(tm, l.fg, ColorScrollText), RealColor(tm, l.bg, ColorScrollBack)
|
||||||
fgThumb, bgThumb := RealColor(tm, l.fg, ColorThumbText), RealColor(tm, l.bg, ColorThumbBack)
|
fgThumb, bgThumb := RealColor(tm, l.fg, ColorThumbText), RealColor(tm, l.bg, ColorThumbBack)
|
||||||
|
|
||||||
canvas.PutSymbol(l.x+l.width-1, l.y, term.Cell{Ch: chUp, Fg: fg, Bg: bg})
|
pos := -1
|
||||||
canvas.PutSymbol(l.x+l.width-1, l.y+l.height-1, term.Cell{Ch: chDown, Fg: fg, Bg: bg})
|
if l.currSelection != -1 {
|
||||||
|
if len(l.items) > 1 {
|
||||||
if l.height > 2 {
|
ydiff := int(float32(l.currSelection) / float32(len(l.items)-1.0) * float32(l.height-3))
|
||||||
for yy := 1; yy < l.height-1; yy++ {
|
l.buttonPos = ydiff + 1
|
||||||
canvas.PutSymbol(l.x+l.width-1, l.y+yy, term.Cell{Ch: chLine, Fg: fg, Bg: bg})
|
if l.height == 3 {
|
||||||
|
pos = 1
|
||||||
|
} else {
|
||||||
|
pos = l.buttonPos
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pos = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
canvas.DrawScroll(l.x+l.width-1, l.y, 1, l.height, pos, fg, bg, fgThumb, bgThumb, tm.SysObject(ObjScrollBar))
|
||||||
if l.currSelection == -1 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if l.height == 3 || l.currSelection <= 0 {
|
|
||||||
canvas.PutSymbol(l.x+l.width-1, l.y+1, term.Cell{Ch: chCursor, Fg: fgThumb, Bg: bgThumb})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// if l.pressY == -1 {
|
|
||||||
ydiff := int(float32(l.currSelection) / float32(len(l.items)-1.0) * float32(l.height-3))
|
|
||||||
l.buttonPos = ydiff + 1
|
|
||||||
// }
|
|
||||||
canvas.PutSymbol(l.x+l.width-1, l.y+l.buttonPos, term.Cell{Ch: chCursor, Fg: fgThumb, Bg: bgThumb})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *ListBox) redrawItems(canvas Canvas, tm Theme) {
|
func (l *ListBox) redrawItems(canvas Canvas, tm Theme) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user