termbox-util/termbox_alertmodal.go

221 lines
6.0 KiB
Go

package termboxUtil
import (
"github.com/nsf/termbox-go"
)
// AlertModal is a modal with yes/no (or similar) buttons
type AlertModal struct {
id string
title string
text string
x, y, width, height int
showHelp bool
cursor int
bg, fg termbox.Attribute
activeFg, activeBg termbox.Attribute
isDone bool
accepted bool
value string
isVisible bool
bordered bool
tabSkip bool
active bool
}
// CreateAlertModal Creates a confirmation modal with the specified attributes
func CreateAlertModal(title string, x, y, width, height int, fg, bg termbox.Attribute) *AlertModal {
i := AlertModal{title: title, x: x, y: y, width: width, height: height, fg: fg, bg: bg, bordered: true}
i.activeFg, i.activeBg = fg, bg
if i.title == "" {
i.title = "Alert!"
}
i.showHelp = true
return &i
}
func (i *AlertModal) SetActiveFgColor(fg termbox.Attribute) { i.activeFg = fg }
func (i *AlertModal) SetActiveBgColor(bg termbox.Attribute) { i.activeBg = bg }
func (i *AlertModal) SetActive(a bool) { i.active = a }
func (i *AlertModal) IsActive() bool { return i.active }
// GetID returns this control's ID
func (i *AlertModal) GetID() string { return i.id }
// SetID sets this control's ID
func (i *AlertModal) SetID(newID string) {
i.id = newID
}
// GetTitle returns the current title of the modal
func (i *AlertModal) GetTitle() string { return i.title }
// SetTitle sets the current title of the modal to s
func (i *AlertModal) SetTitle(s string) {
i.title = s
}
// GetText returns the current text of the modal
func (i *AlertModal) GetText() string { return i.text }
// SetText sets the text of the modal to s
func (i *AlertModal) SetText(s string) {
i.text = s
}
// GetX returns the current x coordinate of the control
func (i *AlertModal) GetX() int { return i.x }
// SetX sets the current x coordinate of the control to x
func (i *AlertModal) SetX(x int) {
i.x = x
}
// GetY returns the current y coordinate of the control
func (i *AlertModal) GetY() int { return i.y }
// SetY sets the current y coordinate of the control to y
func (i *AlertModal) SetY(y int) {
i.y = y
}
// GetWidth returns the current width of the control
func (i *AlertModal) GetWidth() int { return i.width }
// SetWidth sets the current control width to width
func (i *AlertModal) SetWidth(width int) {
i.width = width
}
// GetHeight returns the current height of the control
func (i *AlertModal) GetHeight() int { return i.height }
// SetHeight set the height of the control to height
func (i *AlertModal) SetHeight(height int) {
i.height = height
}
// GetFgColor returns the foreground color
func (i *AlertModal) GetFgColor() termbox.Attribute { return i.fg }
// SetFgColor sets the foreground color
func (i *AlertModal) SetFgColor(fg termbox.Attribute) {
i.fg = fg
}
// GetBgColor returns the background color
func (i *AlertModal) GetBgColor() termbox.Attribute { return i.bg }
// SetBgColor sets the current background color
func (i *AlertModal) SetBgColor(bg termbox.Attribute) {
i.bg = bg
}
// IsBordered returns whether this control is bordered or not
func (i *AlertModal) IsBordered() bool {
return i.bordered
}
// SetBordered sets whether we render a border around the frame
func (i *AlertModal) SetBordered(b bool) {
i.bordered = b
}
// IsTabSkipped returns whether this control has it's tabskip flag set
func (i *AlertModal) IsTabSkipped() bool {
return i.tabSkip
}
// SetTabSkip sets the tabskip flag for this control
func (i *AlertModal) SetTabSkip(b bool) {
i.tabSkip = b
}
// HelpIsShown returns true or false if the help is displayed
func (i *AlertModal) HelpIsShown() bool { return i.showHelp }
// ShowHelp sets whether or not to display the help text
func (i *AlertModal) ShowHelp(b bool) {
i.showHelp = b
}
// GetBackground returns the current background color
func (i *AlertModal) GetBackground() termbox.Attribute { return i.bg }
// SetBackground sets the background color to bg
func (i *AlertModal) SetBackground(bg termbox.Attribute) {
i.bg = bg
}
// GetForeground returns the current foreground color
func (i *AlertModal) GetForeground() termbox.Attribute { return i.fg }
// SetForeground sets the current foreground color to fg
func (i *AlertModal) SetForeground(fg termbox.Attribute) {
i.fg = fg
}
// IsDone returns whether the user has answered the modal
func (i *AlertModal) IsDone() bool { return i.isDone }
// SetDone sets whether the modal has completed it's purpose
func (i *AlertModal) SetDone(b bool) {
i.isDone = b
}
// Show sets the visibility flag of the modal to true
func (i *AlertModal) Show() {
i.isVisible = true
}
// Hide sets the visibility flag of the modal to false
func (i *AlertModal) Hide() {
i.isVisible = false
}
// IsAccepted returns whether the user accepted the modal
func (i *AlertModal) IsAccepted() bool { return i.accepted }
// Clear clears all of the non-positional parameters of the modal
func (i *AlertModal) Clear() {
i.title = ""
i.text = ""
i.accepted = false
i.isDone = false
}
// HandleEvent handles the termbox event and returns whether it was consumed
func (i *AlertModal) HandleEvent(event termbox.Event) bool {
if event.Key == termbox.KeyEnter {
i.isDone = true
return true
}
return false
}
// Draw draws the modal
func (i *AlertModal) Draw() {
// First blank out the area we'll be putting the modal
FillWithChar(' ', i.x, i.y, i.x+i.width, i.y+i.height, i.fg, i.bg)
// Now draw the border
DrawBorder(i.x, i.y, i.x+i.width, i.y+i.height, i.fg, i.bg)
nextY := i.y + 1
// The title
if i.title != "" {
DrawStringAtPoint(i.title, i.x+1, nextY, i.fg, i.bg)
nextY++
FillWithChar('-', i.x+1, nextY, i.x+i.width-1, nextY, i.fg, i.bg)
nextY++
}
if i.text != "" {
DrawStringAtPoint(i.text, i.x+1, nextY, i.fg, i.bg)
}
nextY += 2
if i.showHelp {
helpString := "Press Enter to Continue"
helpX := (i.x + i.width) - len(helpString) - 1
DrawStringAtPoint(helpString, helpX, nextY, i.fg, i.bg)
}
}