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}