mtlstats/src/Mtlstats/Control.hs

157 lines
4.6 KiB
Haskell
Raw Normal View History

2019-09-04 22:56:24 -04:00
{- |
mtlstats
Copyright (C) 2019 Rhéal Lamothe
<rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
-}
module Mtlstats.Control (dispatch) where
import Control.Monad (join, when)
import Control.Monad.Extra (ifM)
2019-09-13 23:54:36 -04:00
import Control.Monad.Trans.State (gets, modify)
2019-09-04 22:56:24 -04:00
import Data.Char (toUpper)
2019-10-09 22:15:40 -04:00
import Data.Maybe (fromJust, fromMaybe, isJust)
2019-10-11 23:13:00 -04:00
import Lens.Micro ((^.), (.~), (%~))
2019-09-13 23:54:36 -04:00
import Lens.Micro.Extras (view)
2019-09-04 22:56:24 -04:00
import qualified UI.NCurses as C
import Mtlstats.Actions
2019-10-31 04:14:52 -04:00
import Mtlstats.Control.EditPlayer
import Mtlstats.Control.NewGame
2019-09-04 22:56:24 -04:00
import Mtlstats.Format
2019-09-07 00:27:18 -04:00
import Mtlstats.Handlers
2019-09-04 22:56:24 -04:00
import Mtlstats.Menu
import Mtlstats.Prompt
import Mtlstats.Report
import Mtlstats.Types
2019-10-01 00:58:15 -04:00
import Mtlstats.Util
2019-09-04 22:56:24 -04:00
-- | Reads the program state and returs the apropriate controller to
-- run
dispatch :: ProgState -> Controller
dispatch s = case s^.progMode of
2019-09-07 00:27:18 -04:00
MainMenu -> mainMenuC
NewSeason -> newSeasonC
NewGame _ -> newGameC s
2019-09-09 13:04:39 -04:00
CreatePlayer cps
2019-09-09 22:57:36 -04:00
| null $ cps^.cpsNumber -> getPlayerNumC
| null $ cps^.cpsName -> getPlayerNameC
| null $ cps^.cpsPosition -> getPlayerPosC
| otherwise -> confirmCreatePlayerC
CreateGoalie cgs
| null $ cgs^.cgsNumber -> getGoalieNumC
| null $ cgs^.cgsName -> getGoalieNameC
| otherwise -> confirmCreateGoalieC
2019-11-01 03:49:41 -04:00
EditPlayer eps -> editPlayerC eps
2019-09-07 00:27:18 -04:00
mainMenuC :: Controller
mainMenuC = Controller
{ drawController = const $ drawMenu mainMenu
, handleController = menuHandler mainMenu
}
newSeasonC :: Controller
newSeasonC = Controller
{ drawController = const $ drawMenu newSeasonMenu
, handleController = \e -> do
menuHandler newSeasonMenu e
return True
}
2019-09-09 13:04:39 -04:00
getPlayerNumC :: Controller
getPlayerNumC = Controller
{ drawController = drawPrompt playerNumPrompt
, handleController = \e -> do
promptHandler playerNumPrompt e
return True
}
2019-09-09 22:50:44 -04:00
getPlayerNameC :: Controller
getPlayerNameC = Controller
{ drawController = drawPrompt playerNamePrompt
, handleController = \e -> do
promptHandler playerNamePrompt e
return True
}
2019-09-09 22:57:36 -04:00
getPlayerPosC :: Controller
getPlayerPosC = Controller
{ drawController = drawPrompt playerPosPrompt
, handleController = \e -> do
promptHandler playerPosPrompt e
return True
}
confirmCreatePlayerC :: Controller
confirmCreatePlayerC = Controller
{ drawController = \s -> do
let cps = s^.progMode.createPlayerStateL
C.drawString $ " Player number: " ++ show (fromJust $ cps^.cpsNumber) ++ "\n"
C.drawString $ " Player name: " ++ cps^.cpsName ++ "\n"
C.drawString $ "Player position: " ++ cps^.cpsPosition ++ "\n\n"
C.drawString "Create player: are you sure? (Y/N)"
return C.CursorInvisible
, handleController = \e -> do
case ynHandler e of
Just True -> do
modify addPlayer
join $ gets $ view $ progMode.createPlayerStateL.cpsSuccessCallback
Just False ->
join $ gets $ view $ progMode.createPlayerStateL.cpsFailureCallback
Nothing -> return ()
return True
}
2019-09-26 01:23:34 -04:00
getGoalieNumC :: Controller
2019-10-24 15:53:24 -04:00
getGoalieNumC = Controller
{ drawController = drawPrompt goalieNumPrompt
, handleController = \e -> do
promptHandler goalieNumPrompt e
return True
}
getGoalieNameC :: Controller
2019-10-25 00:45:39 -04:00
getGoalieNameC = Controller
{ drawController = drawPrompt goalieNamePrompt
, handleController = \e -> do
promptHandler goalieNamePrompt e
return True
}
confirmCreateGoalieC :: Controller
2019-10-25 01:07:04 -04:00
confirmCreateGoalieC = Controller
{ drawController = \s -> do
let cgs = s^.progMode.createGoalieStateL
C.drawString $ unlines
[ "Goalie number: " ++ show (fromJust $ cgs^.cgsNumber)
, " Goalie name: " ++ cgs^.cgsName
, ""
, "Create goalie: are you sure? (Y/N)"
]
return C.CursorInvisible
, handleController = \e -> do
case ynHandler e of
Just True -> do
modify addGoalie
join $ gets (^.progMode.createGoalieStateL.cgsSuccessCallback)
Just False ->
join $ gets (^.progMode.createGoalieStateL.cgsFailureCallback)
Nothing -> return ()
return True
}