@ -1,6 +1,8 @@
package main
import (
"sort"
"strings"
"time"
"code.rocketnine.space/tslocum/cview"
@ -15,7 +17,8 @@ const (
var (
app * cview . Application
uiGrid * cview . Grid
lobby * cview . List
userList * cview . List
userListGrid * cview . Grid
board * Board
actionBuffer * cview . TextView
gameBuffer * cview . TextView
@ -29,6 +32,7 @@ var (
chatMode int
viewScreen int
screenX int
)
const (
@ -78,15 +82,80 @@ func logIn(c *Client) {
go c . connect ( )
}
func setScreen ( screen int ) {
func setScreen ( c * Client , screen int ) {
viewScreen = screen
if viewScreen == ScreenLobby {
updateUserList ( c )
board . SetVisible ( false )
lobby . SetVisible ( true )
userListGrid . SetVisible ( true )
} else {
lobby . SetVisible ( false )
userListGrid . SetVisible ( false )
board . SetVisible ( true )
}
buildLayout ( c )
}
func updateUserList ( c * Client ) {
var infos [ ] * WhoInfo
for _ , whoInfo := range c . who {
infos = append ( infos , whoInfo )
}
sort . Slice ( infos , func ( i , j int ) bool {
if ( infos [ i ] . opponent == "" ) != ( infos [ j ] . opponent == "" ) {
return infos [ i ] . opponent == ""
}
if ( infos [ i ] . watching == "" ) != ( infos [ j ] . watching == "" ) {
return infos [ i ] . watching == ""
}
if infos [ i ] . ready != infos [ j ] . ready {
return infos [ i ] . ready
}
if infos [ i ] . rating != infos [ j ] . rating {
return infos [ i ] . rating < infos [ j ] . rating
}
return strings . ToLower ( infos [ i ] . username ) < strings . ToLower ( infos [ j ] . username )
} )
userList . Clear ( )
for _ , whoInfo := range infos {
userList . AddItem ( whoInfo . listItem )
}
}
func buildLayout ( c * Client ) {
uiGrid . Clear ( )
var currentScreen cview . Primitive
if viewScreen == ScreenLobby {
currentScreen = userListGrid
} else {
currentScreen = board
}
// Single column on smaller screens
if screenX < 156 {
uiGrid . SetRows ( 16 , 1 , - 1 , 1 , - 1 , 1 )
uiGrid . AddItem ( currentScreen , 0 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( cview . NewBox ( ) , 1 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( gameBuffer , 2 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( cview . NewBox ( ) , 3 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( statusBuffer , 4 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( inputField , 5 , 0 , 1 , 1 , 0 , 0 , true )
return
}
uiGrid . SetRows ( 16 , 1 , - 1 , 1 )
uiGrid . SetColumns ( - 1 , 1 , - 1 )
uiGrid . AddItem ( currentScreen , 0 , 0 , 1 , 3 , 0 , 0 , false )
uiGrid . AddItem ( cview . NewBox ( ) , 1 , 0 , 1 , 3 , 0 , 0 , false )
uiGrid . AddItem ( gameBuffer , 2 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( cview . NewBox ( ) , 2 , 1 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( statusBuffer , 2 , 2 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( inputField , 3 , 0 , 1 , 3 , 0 , 0 , true )
}
func RunApp ( c * Client ) error {
@ -194,6 +263,22 @@ func RunApp(c *Client) error {
return event
}
if viewScreen == ScreenLobby {
switch event . Key ( ) {
case tcell . KeyUp :
// Transform user list
}
}
if event . Key ( ) == tcell . KeyESC {
newScreen := ScreenLobby
if viewScreen == ScreenLobby {
newScreen = ScreenGame
}
setScreen ( c , newScreen )
return nil
}
if event . Key ( ) == tcell . KeyTab {
if chatMode == ChatModeShout {
chatMode = ChatModeKibitz
@ -225,52 +310,48 @@ func RunApp(c *Client) error {
statusWriter = & bufferWriter { Buffer : statusBuffer }
gameWriter = & bufferWriter { Buffer : gameBuffer }
lobby = cview . NewList ( )
lobby . AddItem ( cview . NewListItem ( "test" ) )
userList = cview . NewList ( )
userList . ShowSecondaryText ( false )
userList . SetHighlightFullLine ( true )
userList . AddContextItem ( "Invite" , 'i' , func ( index int ) {
buildLayout := func ( screenX int , screenY int ) {
box := cview . NewBox ( )
} )
userList . AddContextItem ( "Watch" , 'w' , func ( index int ) {
uiGrid = cview . NewGrid ( )
} )
userList . AddContextItem ( "Message" , 'm' , func ( index int ) {
// TODO refactor
defer func ( ) {
if c . username != "" && c . password != "" {
app . SetRoot ( uiGrid , true )
app . SetFocus ( inputField )
}
} ( )
} )
userList . SetSelectedFunc ( func ( i int , item * cview . ListItem ) {
lf ( "%d" , i )
} )
var currentScreen cview . Primitive
if viewScreen == ScreenLobby {
currentScreen = lobby
} else {
currentScreen = board
}
userListHeader := cview . NewTextView ( )
userListHeader . SetText ( "[yellow::b]Player Rating Experience Status[-:-:-]" )
userListHeader . SetDynamicColors ( true )
// Single column on smaller screens
if screenX < 156 {
uiGrid . SetRows ( 17 , - 1 , 1 , - 1 , 1 )
uiGrid . AddItem ( currentScreen , 0 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( gameBuffer , 1 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( box , 2 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( statusBuffer , 3 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( inputField , 4 , 0 , 1 , 1 , 0 , 0 , true )
return
}
userListGrid = cview . NewGrid ( )
userListGrid . SetRows ( 1 , - 1 )
userListGrid . AddItem ( userListHeader , 0 , 0 , 1 , 1 , 0 , 0 , false )
userListGrid . AddItem ( userList , 1 , 0 , 1 , 1 , 0 , 0 , true )
uiGrid . SetRows ( 17 , - 1 , 1 )
uiGrid . SetColumns ( - 1 , 1 , - 1 )
uiGrid . AddItem ( currentScreen , 0 , 0 , 1 , 3 , 0 , 0 , false )
uiGrid . AddItem ( gameBuffer , 1 , 0 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( statusBuffer , 1 , 2 , 1 , 1 , 0 , 0 , false )
uiGrid . AddItem ( inputField , 2 , 0 , 1 , 3 , 0 , 0 , true )
}
uiGrid = cview . NewGrid ( )
app . SetAfterResizeFunc ( func ( width int , height int ) {
screenX = width
buildLayout ( c )
} )
buildLayout ( 200 , 200 ) // Initial build, resize is called later
app . SetAfterResizeFunc ( buildLayout )
// TODO refactor
buildLayout ( c )
defer func ( ) {
if c . username != "" && c . password != "" {
app . SetRoot ( uiGrid , true )
app . SetFocus ( inputField )
}
} ( )
setScreen ( ScreenGame )
setScreen ( c , ScreenGame )
lg ( "+---------------------------------------------------+" )
lg ( "| |" )