packages feed

lhae-0.0.2: src/Controller/Menu/File/Export/Diagram/Common.hs

module Controller.Menu.File.Export.Diagram.Common 
    (MakeGnuPlotFile,showPreview,plot,getNumericColumns)
    where

import Control.Monad (forM,when)
import Control.Monad.Trans (liftIO)
import Data.Either (partitionEithers)
import System.Exit (ExitCode(ExitSuccess,ExitFailure))
import qualified Graphics.UI.WXCore as WXC
import Controller (Controller,onGridModel,onGridView)
import Controller.Dialog (previewImage,warning)
import Constants (tmpFilePath,programName)
import qualified Util.Gnuplot as GP
import Model.CellExpression.Evaluator.Common (getNumList)
import Model.Grid (getColumnValues)
import View.Component.Grid (getColumnLabel)
import Util ((<.>))
import I18n (__)

type MakeGnuPlotFile = FilePath -> String
type MakeDataFile = Controller (Either String String)

getTmpImageFilePath,getTmpDataFilePath,getTmpGpFilePath :: Controller FilePath
getTmpImageFilePath = liftIO $ tmpFilePath $ programName ++ ".gnuplot.png"
getTmpDataFilePath = liftIO $ tmpFilePath $ programName ++ ".gnuplot.data"
getTmpGpFilePath = liftIO $ tmpFilePath $ programName ++ ".gnuplot"

showPreview :: MakeGnuPlotFile -> MakeDataFile -> Controller Bool
showPreview makeGpFile makeDataFile = do
  tmpImageFilePath <- getTmpImageFilePath
  success <- plot makeGpFile makeDataFile tmpImageFilePath
  when success $ do 
    bitmap <- liftIO $ WXC.imageCreateFromFile tmpImageFilePath
              >>= WXC.imageConvertToBitmap
    previewImage bitmap
  return success

plot :: MakeGnuPlotFile -> MakeDataFile -> FilePath -> Controller Bool
plot makeGpFile makeDataFile imageFilePath = do
  dataFilePath <- getTmpDataFilePath
  gpFilePath <- getTmpGpFilePath

  makeDataFileContentResult <- makeDataFile

  case makeDataFileContentResult of
    Left msg -> warning msg >> return False
    Right dataFileContent ->
        let dataFile = (dataFilePath,dataFileContent)
            gpFileContent = unlines
                            [ "set terminal png"
                            , "set output \"" ++ imageFilePath ++ "\""
                            , makeGpFile dataFilePath]
            gpFile = (gpFilePath,gpFileContent)
        in do
          result <- liftIO $ GP.run gpFile [dataFile]
                    
          case result of
            ExitSuccess -> return True
            ExitFailure _ -> 
                do warning $ concat [__ "Can not plot diagram",": ",show result]
                   return False

getNumericColumns :: [Int] -> Controller (Either [String] [(String,[Double])])
getNumericColumns cols = do
  result <- forM cols $ \i -> do
              tmp <- onGridModel $ (getNumList <.> getColumnValues i)
              label <- onGridView $ getColumnLabel i
              case tmp of 
                Left _ -> return $ Left label
                Right nums -> return $ Right (label,nums)

  case partitionEithers result of
    (x:xs,_) -> return $ Left (x:xs)
    ([],columns) -> return $ Right columns