hxournal-0.6.2: lib/Application/HXournal/Coroutine/Page.hs
module Application.HXournal.Coroutine.Page where
import Control.Applicative
import Control.Compose
import Application.HXournal.Type.Event
import Application.HXournal.Type.Coroutine
import Application.HXournal.Type.Canvas
import Application.HXournal.Type.XournalState
import Application.HXournal.Draw
import Application.HXournal.Accessor
import Application.HXournal.Coroutine.Draw
import Application.HXournal.Coroutine.Commit
import Application.HXournal.ModelAction.Adjustment
import Graphics.Xournal.Render.BBoxMapPDF
import Data.Xournal.Generic
import Data.Xournal.Select
import Graphics.UI.Gtk hiding (get,set)
import Application.HXournal.ModelAction.Page
import Control.Monad.Trans
import Control.Category
import Data.Label
import Prelude hiding ((.), id)
import Data.Xournal.Simple
import qualified Data.IntMap as IM
changePage :: (Int -> Int) -> MainCoroutine () -- Iteratee MyEvent XournalStateIO ()
changePage modifyfn = do
xstate <- getSt
let currCvsId = get currentCanvas xstate
currCvsInfo = getCanvasInfo currCvsId xstate
let xojst = get xournalstate $ xstate
case xojst of
ViewAppendState xoj -> do
let pgs = gpages xoj
totalnumofpages = IM.size pgs
oldpage = get currentPageNum currCvsInfo
lpage = case IM.lookup (totalnumofpages-1) pgs of
Nothing -> error "error in changePage"
Just p -> p
(xstate',xoj',_pages',_totalnumofpages',newpage) <-
if (modifyfn oldpage >= totalnumofpages)
then do
let npage = newSinglePageFromOld lpage
npages = IM.insert totalnumofpages npage pgs
newxoj = xoj { gpages = npages }
xstate' = set xournalstate (ViewAppendState newxoj) xstate
commit xstate'
return (xstate',newxoj,npages,totalnumofpages+1,totalnumofpages)
else if modifyfn oldpage < 0
then return (xstate,xoj,pgs,totalnumofpages,0)
else return (xstate,xoj,pgs,totalnumofpages,modifyfn oldpage)
let Dim w h = gdimension lpage
(hadj,vadj) = get adjustments currCvsInfo
liftIO $ do
adjustmentSetUpper hadj w
adjustmentSetUpper vadj h
adjustmentSetValue hadj 0
adjustmentSetValue vadj 0
let currCvsInfo' = setPage (ViewAppendState xoj') newpage currCvsInfo
xstate'' = updatePageAll (ViewAppendState xoj')
. updateCanvasInfo currCvsInfo'
$ xstate'
putSt xstate''
invalidate currCvsId
SelectState txoj -> do
let pgs = gselectAll txoj
totalnumofpages = IM.size pgs
oldpage = get currentPageNum currCvsInfo
lpage = case IM.lookup (totalnumofpages-1) pgs of
Nothing -> error "error in changePage"
Just p -> p
(xstate',txoj',_pages',_totalnumofpages',newpage) <-
if (modifyfn oldpage >= totalnumofpages)
then do
nlyr <- liftIO emptyTLayerBBoxBufLyBuf
let npage = set g_layers (Select . O . Just . singletonSZ $ nlyr) lpage
npages = IM.insert totalnumofpages npage pgs
newtxoj = txoj { gselectAll = npages }
xstate' = set xournalstate (SelectState newtxoj) xstate
commit xstate'
return (xstate',newtxoj,npages,totalnumofpages+1,totalnumofpages)
else if modifyfn oldpage < 0
then return (xstate,txoj,pgs,totalnumofpages,0)
else return (xstate,txoj,pgs,totalnumofpages,modifyfn oldpage)
let Dim w h = gdimension lpage
(hadj,vadj) = get adjustments currCvsInfo
liftIO $ do
adjustmentSetUpper hadj w
adjustmentSetUpper vadj h
adjustmentSetValue hadj 0
adjustmentSetValue vadj 0
let currCvsInfo' = setPage (SelectState txoj') newpage currCvsInfo
xstate'' = updatePageAll (SelectState txoj')
. updateCanvasInfo currCvsInfo'
$ xstate'
putSt xstate''
invalidate currCvsId
canvasZoomUpdate :: Maybe ZoomMode -> CanvasId -> MainCoroutine () -- Iteratee MyEvent XournalStateIO ()
canvasZoomUpdate mzmode cid = do
xstate <- getSt
let cinfoMap = get canvasInfoMap xstate
case IM.lookup cid cinfoMap of
Nothing -> do
liftIO $ putStrLn $ "canvasZoomUpdate : no cid = " ++ show cid
return ()
Just cvsInfo -> do
let zmode = maybe (get (zoomMode.viewInfo) cvsInfo) id mzmode
let canvas = get drawArea cvsInfo
let page = getPage cvsInfo
let Dim w h = gdimension page
cpg <- liftIO (getCanvasPageGeometry canvas page (0,0))
let (w',h') = canvas_size cpg
let (hadj,vadj) = get adjustments cvsInfo
s = 1.0 / getRatioFromPageToCanvas cpg zmode
liftIO $ setAdjustments (hadj,vadj) (w,h) (0,0) (0,0) (w'*s,h'*s)
let cvsInfo' = set (zoomMode.viewInfo) zmode
. set (viewPortOrigin.viewInfo) (0,0)
$ cvsInfo
xstate' = updateCanvasInfo cvsInfo' xstate
putSt xstate'
invalidate cid
pageZoomChange :: ZoomMode -> MainCoroutine () -- Iteratee MyEvent XournalStateIO ()
pageZoomChange zmode = do
xstate <- getSt
let currCvsId = get currentCanvas xstate
canvasZoomUpdate (Just zmode) currCvsId
newPageBefore :: MainCoroutine () -- Iteratee MyEvent XournalStateIO ()
newPageBefore = do
liftIO $ putStrLn "newPageBefore called"
xstate <- getSt
let xojstate = get xournalstate xstate
case xojstate of
ViewAppendState xoj -> do
liftIO $ putStrLn " In View "
let currCvsId = get currentCanvas xstate
mcurrCvsInfo = IM.lookup currCvsId (get canvasInfoMap xstate)
xoj' <- maybe (error $ "something wrong in newPageBefore")
(liftIO . newPageBeforeAction xoj)
$ (,) <$> pure currCvsId <*> mcurrCvsInfo
let xstate' = updatePageAll (ViewAppendState xoj')
. set xournalstate (ViewAppendState xoj')
$ xstate
commit xstate'
invalidate currCvsId
SelectState txoj -> liftIO $ putStrLn " In Select State, this is not implemented yet."