login-app: use tcell/tview to make the form and add cinematic
This commit is contained in:
parent
1d8146d8ad
commit
4ce6f09a8d
8 changed files with 520 additions and 332 deletions
|
|
@ -1,85 +1,36 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
ui "github.com/VladimirMarkelov/clui"
|
||||
term "github.com/nsf/termbox-go"
|
||||
"fmt"
|
||||
|
||||
"github.com/rivo/tview"
|
||||
)
|
||||
|
||||
type ErrMsgDialog struct {
|
||||
View *ui.Window
|
||||
func CreateErrMsgDialog(app *tview.Application, err error) {
|
||||
textView := tview.NewTextView().
|
||||
SetDynamicColors(true).
|
||||
SetRegions(true).
|
||||
SetChangedFunc(func() {
|
||||
app.Draw()
|
||||
})
|
||||
|
||||
result int
|
||||
beforeClose func()
|
||||
onClose func()
|
||||
}
|
||||
|
||||
func CreateErrMsgDialog(title string, err error) *ErrMsgDialog {
|
||||
dlg := new(ErrMsgDialog)
|
||||
|
||||
sWidth, sHeight := ui.ScreenSize()
|
||||
wWidth, wHeight := 60, 10
|
||||
dlg.View = ui.AddWindow(sWidth/2-wWidth/2, sHeight/2-wHeight/2, wWidth, wHeight, title)
|
||||
ui.WindowManager().BeginUpdate()
|
||||
defer ui.WindowManager().EndUpdate()
|
||||
|
||||
dlg.View.SetModal(true)
|
||||
dlg.View.SetSizable(false)
|
||||
dlg.View.SetTitleButtons(ui.ButtonDefault)
|
||||
dlg.View.SetPack(ui.Vertical)
|
||||
|
||||
textfrm := ui.CreateFrame(dlg.View, 1, 1, ui.BorderNone, ui.Fixed)
|
||||
textfrm.SetPaddings(1, 1)
|
||||
textfrm.SetPack(ui.Vertical)
|
||||
textfrm.SetGaps(2, 1)
|
||||
|
||||
lbl := ui.CreateLabel(textfrm, ui.AutoSize, ui.AutoSize, "An error occurs:", ui.Fixed)
|
||||
lbl.SetTextColor(ui.ColorRedBold)
|
||||
|
||||
tv := ui.CreateTextView(textfrm, ui.AutoSize, 4, ui.Fixed)
|
||||
tv.SetWordWrap(true)
|
||||
tv.SetText([]string{err.Error()})
|
||||
tv.SetTextColor(ui.ColorWhite)
|
||||
tv.SetBackColor(ui.ColorBlack)
|
||||
|
||||
ui.CreateLabel(textfrm, ui.AutoSize, ui.AutoSize, "Please try again.", ui.Fixed)
|
||||
|
||||
btnOk := ui.CreateButton(textfrm, 20, 4, "Ok", 1)
|
||||
|
||||
btnOk.OnClick(func(ev ui.Event) {
|
||||
if dlg.beforeClose != nil {
|
||||
dlg.beforeClose()
|
||||
}
|
||||
|
||||
ui.WindowManager().DestroyWindow(dlg.View)
|
||||
ui.WindowManager().BeginUpdate()
|
||||
|
||||
closeFunc := dlg.onClose
|
||||
ui.WindowManager().EndUpdate()
|
||||
if closeFunc != nil {
|
||||
closeFunc()
|
||||
}
|
||||
})
|
||||
|
||||
dlg.View.OnKeyDown(func(ev ui.Event, data interface{}) bool {
|
||||
if ev.Key == term.KeyEnter {
|
||||
if dlg.beforeClose != nil {
|
||||
dlg.beforeClose()
|
||||
}
|
||||
|
||||
ui.WindowManager().DestroyWindow(dlg.View)
|
||||
ui.WindowManager().BeginUpdate()
|
||||
|
||||
closeFunc := dlg.onClose
|
||||
ui.WindowManager().EndUpdate()
|
||||
if closeFunc != nil {
|
||||
closeFunc()
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}, nil)
|
||||
|
||||
ui.ActivateControl(dlg.View, btnOk)
|
||||
|
||||
return dlg
|
||||
form := tview.NewForm().
|
||||
AddButton("Authenticate me", func() {
|
||||
askLogin(app)
|
||||
})
|
||||
|
||||
flex := tview.NewFlex().
|
||||
AddItem(nil, 0, 1, false).
|
||||
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
|
||||
AddItem(textView, 12, 1, false).
|
||||
AddItem(form, 1, 1, false), 37, 1, false).
|
||||
AddItem(nil, 0, 1, false)
|
||||
|
||||
flex.SetBorder(true).
|
||||
SetTitle(" SRS Adlin - Login ")
|
||||
|
||||
fmt.Fprintf(textView, "\nAn error occurs:\n\n[red]%s\n\n[yellow]Press Enter to retry", err.Error())
|
||||
|
||||
app.SetRoot(modal(flex, 42, 15), true)
|
||||
app.SetFocus(form)
|
||||
}
|
||||
|
|
|
|||
Reference in a new issue