hxournal-0.6.1: lib/Application/HXournal/ModelAction/File.hs
{-# LANGUAGE OverloadedStrings, CPP #-}
module Application.HXournal.ModelAction.File where
import Application.HXournal.Type.XournalState
import Application.HXournal.Type.Canvas
import Application.HXournal.ModelAction.Page
import qualified Text.Xournal.Parse as P
import qualified Data.IntMap as M
import Control.Monad
import Control.Category
import Data.Label
import Prelude hiding ((.),id)
import Data.Xournal.Map
import Data.Xournal.Simple
import Data.Xournal.Generic
import Graphics.Xournal.Render.Generic
import Graphics.Xournal.Render.BBoxMapPDF
import Graphics.Xournal.Render.PDFBackground
import Graphics.UI.Gtk hiding (get,set)
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C
#ifdef POPPLER
import qualified Graphics.UI.Gtk.Poppler.Document as Poppler
import qualified Graphics.UI.Gtk.Poppler.Page as PopplerPage
#endif
-- | get file content from xournal file and update xournal state
getFileContent :: Maybe FilePath
-> HXournalState
-> IO HXournalState
getFileContent (Just fname) xstate = do
xojcontent <- P.read_xournal fname
nxstate <- constructNewHXournalStateFromXournal xojcontent xstate
return $ set currFileName (Just fname) nxstate
getFileContent Nothing xstate = do
newxoj <- mkTXournalBBoxMapPDFBufFromNoBuf <=< mkTXournalBBoxMapPDF
$ defaultXournal
let newxojstate = ViewAppendState newxoj
xstate' = set currFileName Nothing
. set xournalstate newxojstate
$ xstate
cmap = get canvasInfoMap xstate'
let Dim w h = page_dim . (!! 0) . xoj_pages $ defaultXournal
ciupdt = setPage newxojstate 0
. set viewInfo (ViewInfo OnePage Original (0,0) (w,h))
. set currentPageNum 0
cmap' = M.map ciupdt cmap
return (set canvasInfoMap cmap' xstate')
constructNewHXournalStateFromXournal :: Xournal -> HXournalState -> IO HXournalState
constructNewHXournalStateFromXournal xoj xstate = do
let currcid = get currentCanvas xstate
cmap = get canvasInfoMap xstate
xoj <- mkTXournalBBoxMapPDFBufFromNoBuf <=< mkTXournalBBoxMapPDF $ xoj
let Dim width height = case M.lookup 0 (gpages xoj) of
Nothing -> error "no first page in getFileContent"
Just p -> gdimension p
startingxojstate = ViewAppendState xoj
let changefunc c =
setPage startingxojstate 0
. set viewInfo (ViewInfo OnePage Original (0,0) (width,height))
. set currentPageNum 0
$ c
cmap' = fmap changefunc cmap
return $ set xournalstate startingxojstate
. set canvasInfoMap cmap'
. set currentCanvas currcid
$ xstate
makeNewXojWithPDF :: FilePath -> IO (Maybe Xournal)
makeNewXojWithPDF fp = do
#ifdef POPPLER
let fname = C.pack fp
mdoc <- popplerGetDocFromFile fname
case mdoc of
Nothing -> do
putStrLn $ "no such file " ++ fp
return Nothing
Just doc -> do
n <- Poppler.documentGetNPages doc
pg <- Poppler.documentGetPage doc 0
(w,h) <- PopplerPage.pageGetSize pg
let dim = Dim w h
xoj = set s_title fname
. set s_pages (map (createPage dim fname) [1..n])
$ emptyXournal
putStrLn $ "total num of pages " ++ show n
putStrLn $ "size = " ++ show (w,h)
return (Just xoj)
#else
error "makeNewXojWithPDF should not be used without poppler lib"
#endif
createPage :: Dimension -> B.ByteString -> Int -> Page
createPage dim fn n
| n == 1 = let bkg = BackgroundPdf "pdf" (Just "absolute") (Just fn ) n
in Page dim bkg [emptyLayer]
| otherwise = let bkg = BackgroundPdf "pdf" Nothing Nothing n
in Page dim bkg [emptyLayer]
toggleSave :: UIManager -> Bool -> IO ()
toggleSave ui b = do
agr <- uiManagerGetActionGroups ui >>= \x ->
case x of
[] -> error "No action group?"
y:_ -> return y
Just savea <- actionGroupGetAction agr "SAVEA"
actionSetSensitive savea b