packages feed

xournal-render-0.2.0.0: src/Graphics/Xournal/Type/Select.hs

module Graphics.Xournal.Type.Select where

import Text.Xournal.Type
import Graphics.Xournal.Type
import Graphics.Xournal.Type.Map

import qualified Data.IntMap as M

-- type WholeOrPart a b = Either a (AlterList a b)

data XournalSelect = 
  XournalSelect 
  { pages :: Either (M.IntMap PageBBoxMap) (AlterList [PageBBox] [PageSelect])
  }

data PageSelect = 
  PageSelect 
  { dimension :: Dimension
  , background :: Background
  , layers :: Either (M.IntMap LayerBBox) (AlterList [LayerBBox] [LayerSelect]) 
  } 

data TempXournalSelect = 
  TempXournalSelect 
  { tx_pages :: M.IntMap PageBBoxMap 
  , tx_selectpage :: Maybe (Int, TempPageSelect)
  }

data TempPageSelect = 
  TempPageSelect 
  { tp_dim :: Dimension 
  , tp_bkg :: Background
  , tp_firstlayer :: LayerSelect
  , tp_otherlayer :: [LayerBBox] 
  }

data LayerSelect = 
  LayerSelect { strokes :: Either [StrokeBBox] (AlterList [StrokeBBox] Hitted)
              } 

xournalSelectFromXournalBBoxMap :: XournalBBoxMap -> XournalSelect 
xournalSelectFromXournalBBoxMap xoj = 
  XournalSelect { pages = Left (xbm_pages xoj) } 
  
tempXournalSelectFromXournalBBoxMap :: XournalBBoxMap -> TempXournalSelect 
tempXournalSelectFromXournalBBoxMap xoj = 
  TempXournalSelect { tx_pages = xbm_pages xoj 
                    , tx_selectpage = Nothing } 

tempPageSelectFromPageBBoxMap :: PageBBoxMap -> TempPageSelect 
tempPageSelectFromPageBBoxMap pbox = 
   TempPageSelect { tp_dim = pageDim pbox
                  , tp_bkg = pageBkg pbox
                  , tp_firstlayer = LayerSelect . Left . layerStrokes 
                                    . head . pageLayers $ pbox
                  , tp_otherlayer = tail (pageLayers pbox)
                  }


pageBBoxMapFromTempPageSelect :: TempPageSelect -> PageBBoxMap
pageBBoxMapFromTempPageSelect (TempPageSelect dim bkg flayer olayers)
  = PageBBoxMap dim bkg lmap 
  where l = layerBBoxFromLayerSelect flayer 
        lmap = M.fromList $ zip [0..] (l:olayers)


layerBBoxFromLayerSelect :: LayerSelect -> LayerBBox 
layerBBoxFromLayerSelect layer = 
  let newstrs = case strokes layer of
                  Left strs -> strs                
                  Right alstrs -> concat $ interleave id unHitted $ alstrs
  in  LayerBBox newstrs 
      
pageBBoxMapFromPageSelect :: PageSelect -> PageBBoxMap
pageBBoxMapFromPageSelect page = 
  let newlyrs = case layers page of  
                  Left ls -> ls   
                  Right allyrs -> 
                    let layerlst = concat 
                                   . interleave id 
                                                (map layerBBoxFromLayerSelect) 
                                   $ allyrs 
                    in  M.fromList $ zip [0..] layerlst 
  in  PageBBoxMap { pbm_dim = dimension page  
                  , pbm_bkg = background page
                  , pbm_layers = newlyrs }
      
xournalBBoxMapFromXournalSelect :: XournalSelect -> XournalBBoxMap
xournalBBoxMapFromXournalSelect xoj = 
  let newpgs = case pages xoj of 
                 Left ps -> ps 
                 Right alpgs -> 
                   let pglst = concat 
                               . interleave (map mkPageBBoxMapFromPageBBox) 
                                            (map pageBBoxMapFromPageSelect) 
                               $ alpgs
                   in  M.fromList $ zip [0..] pglst 
  in  XournalBBoxMap newpgs

------------------