packages feed

macbeth-lib-0.0.12: src/Macbeth/Wx/GamesList.hs

module Macbeth.Wx.GamesList (
  wxGamesList
) where

import Macbeth.Fics.Api.Game
import Macbeth.Fics.FicsMessage
import Macbeth.Wx.Utils

import Graphics.UI.WX hiding (refresh)
import Graphics.UI.WXCore
import System.IO

data GamesOpts = GamesOpts { refresh :: MenuItem ()
                           , showRated :: MenuItem ()
                           , showUnrated :: MenuItem ()
                           }

wxGamesList :: Panel () -> Handle -> IO (ListCtrl (), FicsMessage -> IO ())
wxGamesList glp h = do
  gl  <- listCtrl glp [ columns :=
      [ ("#", AlignLeft, -1)
      , ("Player 1", AlignLeft, -1)
      , ("Rating", AlignLeft, -1)
      , ("Player 2", AlignLeft, -1)
      , ("Rating", AlignLeft, -1)
      , ("Game type", AlignLeft, -1)
      ]]
  listCtrlSetColumnWidths gl 100

  glCtxMenu <- menuPane []
  gamesOpts <- getGamesOpts glCtxMenu
  set (refresh gamesOpts) [on command := hPutStrLn h "4 games"]
  return (gl, handler gamesOpts gl glCtxMenu h)


handler :: GamesOpts -> ListCtrl () -> Menu () -> Handle -> FicsMessage -> IO ()
handler gamesOpts gl glCtxMenu h cmd = case cmd of
  Games games -> do
    filterGamesList gl gamesOpts games
    set (showRated gamesOpts) [on command := filterGamesList gl gamesOpts games]
    set (showUnrated gamesOpts) [on command := filterGamesList gl gamesOpts games]
    set gl [on listEvent := onGamesListEvent gl h]

    listItemRightClickEvent gl (\evt -> do
      pt <- listEventGetPoint evt
      menuPopup glCtxMenu pt gl)
  _ -> return ()


onGamesListEvent :: ListCtrl() -> Handle -> EventList -> IO ()
onGamesListEvent gl h evt = case evt of
  ListItemActivated idx -> listCtrlGetItemText gl idx >>= hPutStrLn h . ("4 observe " ++)
  _ -> return ()


filterGamesList :: ListCtrl () -> GamesOpts -> [Game] -> IO ()
filterGamesList gl opts games = do
  showRated' <- get (showRated opts) checked
  showUnrated' <- get (showUnrated opts) checked
  set gl [items := [ toList g | g <- games
                   , (isRated (settings g) == showRated') ||
                     (isRated (settings g) == not showUnrated')
                   , not $ isPrivate $ settings g]]


getGamesOpts :: Menu () -> IO GamesOpts
getGamesOpts ctxMenu = GamesOpts
  <$> menuItem ctxMenu [ text := "Refresh" ]
  <*> menuItem ctxMenu [ text := "Show rated games", checkable := True, checked := True]
  <*> menuItem ctxMenu [ text := "Show unrated games", checkable := True, checked := True]


toList :: Game -> [String]
toList g = [show $ Macbeth.Fics.Api.Game.id g, nameW g, show $ ratingW g, nameB g, show $ ratingB g, show $ gameType $ settings g]