package dialogs
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.brettb.xyz/goinv/client/internal/ui/style"
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type ErrorDialog struct {
|
|
*tview.Box
|
|
logger *zap.Logger
|
|
modal *tview.Modal
|
|
title string
|
|
message string
|
|
display bool
|
|
}
|
|
|
|
func NewErrorDialog(logger *zap.Logger) *ErrorDialog {
|
|
bgColor := style.ErrorDialogBgColor
|
|
dialog := ErrorDialog{
|
|
Box: tview.NewBox(),
|
|
logger: logger,
|
|
modal: tview.NewModal().SetBackgroundColor(bgColor).AddButtons([]string{"OK"}),
|
|
display: false,
|
|
}
|
|
|
|
dialog.modal.SetButtonBackgroundColor(style.ErrorDialogButtonBgColor)
|
|
|
|
dialog.modal.SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
dialog.Hide()
|
|
})
|
|
|
|
return &dialog
|
|
}
|
|
|
|
func (e *ErrorDialog) Display() {
|
|
e.display = true
|
|
}
|
|
|
|
func (e *ErrorDialog) Hide() {
|
|
e.SetText("")
|
|
e.title = ""
|
|
e.message = ""
|
|
e.display = false
|
|
}
|
|
|
|
func (e *ErrorDialog) IsDisplay() bool {
|
|
return e.display
|
|
}
|
|
|
|
func (e *ErrorDialog) SetText(message string) {
|
|
e.message = message
|
|
}
|
|
|
|
func (e *ErrorDialog) SetTitle(title string) {
|
|
e.title = title
|
|
}
|
|
|
|
func (e *ErrorDialog) HasFocus() bool {
|
|
return e.modal.HasFocus()
|
|
}
|
|
|
|
func (e *ErrorDialog) Focus(delegate func(tview.Primitive)) {
|
|
delegate(e.modal)
|
|
}
|
|
|
|
func (e *ErrorDialog) InputHandler() func(*tcell.EventKey, func(tview.Primitive)) {
|
|
return e.WrapInputHandler(func(event *tcell.EventKey, setFocus func(tview.Primitive)) {
|
|
e.logger.Sugar().Debugf("error dialog event %v received", event)
|
|
if modalHandler := e.modal.InputHandler(); modalHandler != nil {
|
|
modalHandler(event, setFocus)
|
|
|
|
return
|
|
}
|
|
})
|
|
}
|
|
|
|
func (e *ErrorDialog) SetRect(x, y, width, height int) {
|
|
e.Box.SetRect(x, y, width, height)
|
|
}
|
|
|
|
func (e *ErrorDialog) Draw(screen tcell.Screen) {
|
|
hFgColor := style.FgColor
|
|
headerColor := style.GetColorHex(hFgColor)
|
|
|
|
var errorMessage string
|
|
|
|
if e.title != "" {
|
|
errorMessage = fmt.Sprintf("[%s::b]%s[-::-]\n", headerColor, e.title)
|
|
}
|
|
|
|
errorMessage += e.message
|
|
e.modal.SetText(errorMessage)
|
|
e.modal.Draw(screen)
|
|
}
|
|
|
|
func (e *ErrorDialog) SetDoneFunc(handler func()) *ErrorDialog {
|
|
e.modal.SetDoneFunc(func(buttonIndex int, buttonLabel string) {
|
|
handler()
|
|
})
|
|
|
|
return e
|
|
}
|