packages feed

lhae-0.0.3: src/Config.hs

module Config (Config,load,save,initI18n
              ,getLastHandledPathForDialogs,setLastHandledPath
              ,csvImportParameters              
              ,imageExportParameters,barChartExportParameters
              ,boxPlotExportParameters
              )
    where

import System.Directory (createDirectoryIfMissing,doesFileExist)
import System.FilePath (takeDirectory)
import Data.Maybe (fromMaybe)
import qualified I18n
import Util.Sexp (Sexp(..),parseFile,prettyPrint)
import Util.Sexpable (Sexpable(..),PSE,recordToSexp,recordFromSexp)
import qualified Controller.Menu.File.Export.ImageParameters as EImage
import qualified Controller.Menu.File.Export.Diagram.BarChartParameters as EBarChart
import qualified Controller.Menu.File.Export.Diagram.BoxPlotParameters as EBoxPlot
import qualified Controller.Menu.File.Import.CsvParameters as ICsv

data Config = Config { lastHandledPath :: Maybe FilePath
                     , locale :: String
                     , csvImportParameters :: ICsv.Parameters
                     , imageExportParameters :: EImage.Parameters
                     , barChartExportParameters :: EBarChart.Parameters
                     , boxPlotExportParameters :: EBoxPlot.Parameters
                     }

defaultConfig :: Config
defaultConfig = Config Nothing "" ICsv.defaultParams 
                EImage.defaultParams EBarChart.defaultParams
                EBoxPlot.defaultParams

instance Sexpable Config where
    toSexp = recordToSexp
             [ ("lastHandledPath", toSexp . lastHandledPath)
             , ("locale", toSexp . locale)
             , ("csvImportParameters", toSexp . csvImportParameters)
             , ("imageExportParameters", toSexp . imageExportParameters)
             , ("barChartExportParameters", toSexp . barChartExportParameters)
             , ("boxPlotExportParameters", toSexp . boxPlotExportParameters)
             ]
    fromSexp = recordFromSexp setOption defaultConfig

setOption :: Config -> Sexp -> PSE Config
setOption config sexp =
    case sexp of
      List [Atom "lastHandledPath",path] -> do
                option <- fromSexp path
                return $ config {lastHandledPath = option}
      List [Atom "locale",locale] -> do
                option <- fromSexp locale
                return $ config {locale = option}
      List [Atom "csvImportParameters",params] -> do
                option <- fromSexp params
                return $ config {csvImportParameters = option}
      List [Atom "imageExportParameters",params] -> do
                option <- fromSexp params
                return $ config {imageExportParameters = option}
      List [Atom "barChartExportParameters",params] -> do
                option <- fromSexp params
                return $ config {barChartExportParameters = option}
      List [Atom "boxPlotExportParameters",params] -> do
                option <- fromSexp params
                return $ config {boxPlotExportParameters = option}
      _ -> return config

load :: FilePath -> IO (Either String Config)
load filePath = do
  fileExist <- doesFileExist filePath
  if fileExist
   then do 
     result <- parseFile filePath
     let invalidConfig msg = return $ Left $ "Invalid config file: " ++ msg
     case result of
       Left error -> invalidConfig error
       Right sexp -> case fromSexp sexp of
                       Left error -> invalidConfig $ show error
                       Right config -> return $ Right config
   else return $ Right defaultConfig

save :: FilePath -> Config -> IO ()
save filePath config = do
  createDirectoryIfMissing False $ takeDirectory filePath
  writeFile filePath $ prettyPrint $ toSexp config

initI18n :: Config -> IO ()
initI18n = I18n.initI18n . locale

getLastHandledPathForDialogs :: Config -> FilePath
getLastHandledPathForDialogs  = (fromMaybe "") . lastHandledPath

setLastHandledPath :: FilePath -> Config -> Config
setLastHandledPath filePath config = 
    config {lastHandledPath = Just filePath}