This repository has been archived on 2024-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
adlin/login-app/windows.go

247 lines
5.6 KiB
Go

package main
import (
"strings"
"time"
gc "github.com/rthornton128/goncurses"
)
func login(stdscr *gc.Window, in chan gc.Key) (username , password string) {
gc.Cursor(1)
stdscr.Clear()
// Initialize the fields and Set field options
fields := make([]*gc.Field, 3)
fields[0], _ = gc.NewField(1, 24, 2, 15, 0, 0)
defer fields[0].Free()
fields[0].SetBackground(gc.ColorPair(5) | gc.A_UNDERLINE)
fields[0].SetOptionsOff(gc.FO_AUTOSKIP)
fields[1], _ = gc.NewField(1, 24, 4, 15, 0, 0)
defer fields[1].Free()
fields[1].SetBackground(gc.ColorPair(5) | gc.A_UNDERLINE)
fields[1].SetOptionsOff(gc.FO_PUBLIC)
fields[1].SetOptionsOff(gc.FO_AUTOSKIP)
fields[2], _ = gc.NewField(1, 11, 7, 18, 0, 0)
defer fields[2].Free()
fields[2].SetBuffer("< Connect >")
fields[2].SetBackground(gc.ColorPair(1))
fields[2].SetOptionsOff(gc.FO_EDIT)
fields[2].SetOptionsOff(gc.FO_AUTOSKIP)
// Create the form and post it
form, _ := gc.NewForm(fields)
defer form.Free()
// Create the window to be associated with the form
rows, cols := stdscr.MaxYX()
height, width := 14, 44
y, x := (rows-height)/2, (cols-width)/2
mainwin, _ := gc.NewWindow(height, width, y, x)
defer mainwin.Delete()
defer mainwin.Erase()
mainwin.Keypad(true)
// Set main window and sub window
form.SetWindow(mainwin)
form.SetSub(mainwin.Derived(8, 42, 3, 1))
// Print a border around the main window and print a title
mainwin.Box(0, 0)
y, x = mainwin.MaxYX()
title := "SRS ADLIN - Login"
mainwin.ColorOn(2)
mainwin.MovePrint(1, (x/2)-(len(title)/2), title)
mainwin.ColorOff(1)
mainwin.MoveAddChar(2, 0, gc.ACS_LTEE)
mainwin.HLine(2, 1, gc.ACS_HLINE, x-2)
mainwin.MoveAddChar(2, x-1, gc.ACS_RTEE)
stdscr.Refresh()
form.Post()
defer form.UnPost()
mainwin.MovePrint(5, 4, "Login:")
mainwin.MovePrint(7, 4, "Password:")
form.Driver(gc.REQ_FIRST_FIELD)
stdscr.Refresh()
mainwin.Refresh()
login:
for {
select {
case ch := <- in:
switch ch {
case gc.KEY_DOWN, gc.KEY_TAB:
form.Driver(gc.REQ_NEXT_FIELD)
form.Driver(gc.REQ_END_LINE)
case gc.KEY_UP:
form.Driver(gc.REQ_PREV_FIELD)
form.Driver(gc.REQ_END_LINE)
case gc.KEY_BACKSPACE:
form.Driver(gc.REQ_CLR_FIELD)
case gc.KEY_RETURN:
form.Driver(gc.REQ_NEXT_FIELD)
form.Driver(gc.REQ_END_LINE)
if len(strings.TrimSpace(fields[0].Buffer())) > 0 && len(strings.TrimSpace(fields[1].Buffer())) > 0 {
break login
}
default:
form.Driver(ch)
}
}
mainwin.Refresh()
}
username = strings.TrimSpace(fields[0].Buffer())
password = strings.TrimSpace(fields[1].Buffer())
return
}
func connection(stdscr *gc.Window, in chan gc.Key, validator chan error) (canContinue bool) {
gc.Cursor(0)
stdscr.Clear()
// Create the window to be associated with the form
rows, cols := stdscr.MaxYX()
height, width := 10, 60
y, x := (rows-height)/2, (cols-width)/2
mainwin, _ := gc.NewWindow(height, width, y, x)
defer mainwin.Delete()
mainwin.Keypad(true)
// Print a border around the main window and print a title
mainwin.Box(0, 0)
y, x = mainwin.MaxYX()
title := "SRS ADLIN - Login"
mainwin.ColorOn(2)
mainwin.MovePrint(1, (x/2)-(len(title)/2), title)
mainwin.ColorOff(2)
mainwin.MoveAddChar(2, 0, gc.ACS_LTEE)
mainwin.HLine(2, 1, gc.ACS_HLINE, x-2)
mainwin.MoveAddChar(2, x-1, gc.ACS_RTEE)
stdscr.Refresh()
mainwin.MovePrint(4, 4, " Please wait...")
mainwin.ColorOn(3)
mainwin.MovePrint(6, 2, "Connecting to login server...")
mainwin.ColorOff(3)
stdscr.Refresh()
mainwin.Refresh()
ticker := time.NewTicker(time.Millisecond * 150)
rotPos := 0
loginloop:
for {
select {
case ch := <- in:
if gc.Char(ch) == gc.Char('r') {
break loginloop
}
case e := <- validator:
if e == nil {
canContinue = true
break loginloop
} else {
mainwin.ColorOn(4)
mainwin.MovePrint(4, 2, e.Error())
mainwin.ColorOff(4)
ticker.Stop()
mainwin.MovePrint(6, 2, " Press any key to retry ")
mainwin.Refresh()
<- in
break loginloop
}
case <- ticker.C:
switch rotPos += 1; rotPos {
case 0,4:
mainwin.MovePrint(4, 4, "|")
case 1,5:
mainwin.MovePrint(4, 4, "/")
case 2,6:
mainwin.MovePrint(4, 4, "-")
case 3,7:
mainwin.MovePrint(4, 4, "\\")
default:
mainwin.MovePrint(4, 4, "|")
rotPos = 0
}
}
mainwin.Refresh()
}
ticker.Stop()
return
}
func okreboot(stdscr *gc.Window, login string) {
gc.Cursor(0)
stdscr.Clear()
// Create the window to be associated with the form
rows, cols := stdscr.MaxYX()
height, width := 14, 42
y, x := (rows-height)/2, (cols-width)/2
mainwin, _ := gc.NewWindow(height, width, y, x)
defer mainwin.Delete()
mainwin.Keypad(true)
// Print a border around the main window and print a title
mainwin.Box(0, 0)
y, x = mainwin.MaxYX()
title := "SRS ADLIN"
mainwin.ColorOn(2)
mainwin.MovePrint(1, (x/2)-(len(title)/2), title)
mainwin.ColorOff(2)
mainwin.MoveAddChar(2, 0, gc.ACS_LTEE)
mainwin.HLine(2, 1, gc.ACS_HLINE, x-2)
mainwin.MoveAddChar(2, x-1, gc.ACS_RTEE)
stdscr.Refresh()
mainwin.ColorOn(2)
mainwin.MovePrint(4, 2, "You are now successfully logged in as: ")
mainwin.ColorOff(2)
mainwin.ColorOn(3)
mainwin.MovePrint(5, (x/2)-(len(login)/2), login)
mainwin.ColorOff(3)
mainwin.MovePrint(8, 2, "Your computer will automatically")
mainwin.MovePrint(9, 2, "reboot in a few seconds...")
mainwin.MovePrint(11, 2, "|------------------------------------|")
stdscr.Refresh()
mainwin.Refresh()
ticker := time.NewTicker(time.Millisecond * 98)
pos := 0
rebootloop:
for {
select {
case <- ticker.C:
mainwin.MovePrint(11, 3 + pos, "*")
pos += 1
if pos > 36 {
break rebootloop
}
}
mainwin.Refresh()
}
ticker.Stop()
}