From 6c17d883537039ef6dad982a4ce3daade56479c7 Mon Sep 17 00:00:00 2001 From: Jonathan Lamothe Date: Tue, 3 Sep 2019 15:50:34 -0400 Subject: [PATCH] generate report --- src/Mtlstats/Config.hs | 2 +- src/Mtlstats/Events.hs | 4 +- src/Mtlstats/Report.hs | 90 ++++++++++++++++++++++++++++++++++++++++++ src/Mtlstats/UI.hs | 8 +++- 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 src/Mtlstats/Report.hs diff --git a/src/Mtlstats/Config.hs b/src/Mtlstats/Config.hs index e9600be..e02aacc 100644 --- a/src/Mtlstats/Config.hs +++ b/src/Mtlstats/Config.hs @@ -19,7 +19,7 @@ along with this program. If not, see . -} -module Mtlstats.Config (myTeam) where +module Mtlstats.Config where -- | The name of the team whose stats we're tracking myTeam :: String diff --git a/src/Mtlstats/Events.hs b/src/Mtlstats/Events.hs index d7d031d..0b1bdc7 100644 --- a/src/Mtlstats/Events.hs +++ b/src/Mtlstats/Events.hs @@ -71,7 +71,9 @@ handleEvent e = gets (view progMode) >>= \case >>= modify . (progMode.gameStateL.overtimeFlag .~) modify updateGameStats return True - | otherwise -> undefined + | otherwise -> do + modify $ progMode .~ MainMenu + return True overtimePrompt :: C.Event -> Action (Maybe Bool) overtimePrompt (C.EventCharacter c) = case toUpper c of diff --git a/src/Mtlstats/Report.hs b/src/Mtlstats/Report.hs new file mode 100644 index 0000000..cf93da5 --- /dev/null +++ b/src/Mtlstats/Report.hs @@ -0,0 +1,90 @@ +{- | + +mtlstats +Copyright (C) 2019 Rhéal Lamothe + + +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 . + +-} + +module Mtlstats.Report (report) where + +import Data.Maybe (fromMaybe) +import Lens.Micro ((^.)) + +import Mtlstats.Config +import Mtlstats.Format +import Mtlstats.Types + +-- | Generates the report +report + :: Int + -- ^ The number of columns for the report + -> ProgState + -- ^ The program state + -> String +report width s = unlines $ fromMaybe [] $ do + let + db = s^.database + gs = s^.progMode.gameStateL + gNum = db^.dbGames + hTeam = homeTeam gs + aTeam = awayTeam gs + hStats = db^.dbHomeGameStats + aStats = db^.dbAwayGameStats + tStats = addGameStats hStats aStats + hScore <- gs^.homeScore + aScore <- gs^.awayScore + month <- month <$> gs^.gameMonth + day <- padNum 2 <$> gs^.gameDay + year <- show <$> gs^.gameYear + let date = month ++ " " ++ day ++ " " ++ year + Just + [ overlay + ("GAME NUMBER " ++ padNum 2 gNum) + (centre width + $ aTeam ++ " " ++ show aScore ++ " AT " + ++ hTeam ++ " " ++ show hScore) + , date + , centre width "STANDINGS" + , "" + , centre width + $ left 11 myTeam + ++ right 2 "G" + ++ right 4 "W" + ++ right 4 "L" + ++ right 4 "OT" + ++ right 4 "P" + , centre width + $ left 11 "HOME" + ++ showStats hStats + , centre width + $ left 11 "ROAD" + ++ showStats aStats + , centre width + $ replicate 11 ' ' + ++ replicate (2 + 4 * 4) '-' + , centre width + $ left 11 "TOTALS" + ++ showStats tStats + ] + +showStats :: GameStats -> String +showStats gs + = right 2 (show $ gmsGames gs) + ++ right 4 (show $ gs^.gmsWins) + ++ right 4 (show $ gs^.gmsLosses) + ++ right 4 (show $ gs^.gmsOvertime) + ++ right 4 (show $ gmsPoints gs) diff --git a/src/Mtlstats/UI.hs b/src/Mtlstats/UI.hs index 1b1977e..0bffbcd 100644 --- a/src/Mtlstats/UI.hs +++ b/src/Mtlstats/UI.hs @@ -28,6 +28,7 @@ import qualified UI.NCurses as C import Mtlstats.Format import Mtlstats.Menu import Mtlstats.Prompt +import Mtlstats.Report import Mtlstats.Types -- | Drawing function @@ -49,7 +50,7 @@ draw s = do | null $ gs^.homeScore -> header s >> drawPrompt homeScorePrompt s | null $ gs^.awayScore -> header s >> drawPrompt awayScorePrompt s | null $ gs^.overtimeFlag -> header s >> overtimePrompt - | otherwise -> undefined + | otherwise -> showReport s C.render void $ C.setCursorMode cm @@ -61,3 +62,8 @@ overtimePrompt :: C.Update C.CursorMode overtimePrompt = do C.drawString "Did the game go into overtime? (Y/N)" return C.CursorInvisible + +showReport :: ProgState -> C.Update C.CursorMode +showReport s = do + C.drawString $ report 72 s + return C.CursorInvisible