hxournal-0.5: lib/Application/HXournal/ModelAction/Page.hs
module Application.HXournal.ModelAction.Page where
import Application.HXournal.Type.XournalState
import Application.HXournal.Type.Canvas
import Text.Xournal.Type
import Graphics.Xournal.Type.Map
import Graphics.Xournal.Type.Select
import Control.Category
import Data.Label
import Prelude hiding ((.),id)
import qualified Data.IntMap as M
updatePageAll :: XournalState
-> HXournalState
-> HXournalState
updatePageAll xst xstate = let cmap = get canvasInfoMap xstate
cmap' = fmap (updatePage xst) cmap
in set canvasInfoMap cmap' xstate
getPageFromXojBBoxMap :: Int -> XournalBBoxMap -> PageBBoxMap
getPageFromXojBBoxMap pagenum xojbbox =
case M.lookup pagenum (xbm_pages xojbbox) of
Nothing -> error "something wrong in updatePage"
Just p -> p
updatePage :: XournalState -> CanvasInfo -> CanvasInfo
updatePage (ViewAppendState xojbbox) cinfo =
let pagenum = get currentPageNum cinfo
pg = getPageFromXojBBoxMap pagenum xojbbox
Dim w h = pageDim pg
in set currentPageNum pagenum
. set (pageDimension.viewInfo) (w,h)
. set currentPage (Left pg)
$ cinfo
updatePage (SelectState txoj) cinfo =
let pagenum = get currentPageNum cinfo
mspage = tx_selectpage txoj
pageFromArg = case M.lookup pagenum (tx_pages txoj) of
Nothing -> error "no such page in updatePage"
Just p -> p
(newpage,Dim w h) =
case mspage of
Nothing -> (Left pageFromArg, pageDim pageFromArg)
Just (spagenum,page) ->
if spagenum == pagenum
then (Right page, tp_dim page)
else (Left pageFromArg, pageDim pageFromArg)
in set currentPageNum pagenum
. set (pageDimension.viewInfo) (w,h)
. set currentPage newpage
$ cinfo
setPage :: XournalState -> Int -> CanvasInfo -> CanvasInfo
setPage (ViewAppendState xojbbox) pagenum cinfo =
let pg = getPageFromXojBBoxMap pagenum xojbbox
Dim w h = pageDim pg
in set currentPageNum pagenum
. set (viewPortOrigin.viewInfo) (0,0)
. set (pageDimension.viewInfo) (w,h)
. set currentPage (Left pg)
$ cinfo
setPage (SelectState txoj) pagenum cinfo =
let mspage = tx_selectpage txoj
pageFromArg = case M.lookup pagenum (tx_pages txoj) of
Nothing -> error "no such page in setPage"
Just p -> p
(newpage,Dim w h) =
case mspage of
Nothing -> (Left pageFromArg, pageDim pageFromArg)
Just (spagenum,page) ->
if spagenum == pagenum
then (Right page, tp_dim page)
else (Left pageFromArg, pageDim pageFromArg)
in set currentPageNum pagenum
. set (viewPortOrigin.viewInfo) (0,0)
. set (pageDimension.viewInfo) (w,h)
. set currentPage newpage
$ cinfo
getPage :: CanvasInfo -> PageBBoxMap
getPage cinfo = case get currentPage cinfo of
Right tpgs -> pageBBoxMapFromTempPageSelect tpgs
Left pg -> pg