packages feed

hxournal-0.5: lib/Application/HXournal/Coroutine/Scroll.hs

module Application.HXournal.Coroutine.Scroll where

import Application.HXournal.Type.Event 
import Application.HXournal.Type.Coroutine
import Application.HXournal.Type.Canvas
import Application.HXournal.Type.XournalState
import Application.HXournal.Coroutine.Draw
import qualified Data.IntMap as IM
import Control.Monad.Trans
import qualified Control.Monad.State as St
import Control.Monad.Coroutine.SuspensionFunctors
import Control.Category
import Data.Label
import Prelude hiding ((.), id)

vscrollStart :: CanvasId -> Iteratee MyEvent XournalStateIO () 
vscrollStart cid = vscrollMove cid 
        
vscrollMove :: CanvasId -> Iteratee MyEvent XournalStateIO () 
vscrollMove cid = do    
  ev <- await 
  case ev of
    VScrollBarMoved _cid' v -> do 
      xstate <- lift St.get 
      let cinfoMap = get canvasInfoMap xstate
          maybeCvs = IM.lookup cid cinfoMap 
      case maybeCvs of 
        Nothing -> return ()
        Just cvsInfo -> do 
          let vm_orig = get (viewPortOrigin.viewInfo) cvsInfo
          let cvsInfo' = set (viewPortOrigin.viewInfo) (fst vm_orig,v)
                         $ cvsInfo 
              cinfoMap' = IM.adjust (const cvsInfo') cid cinfoMap  
              xstate' = set canvasInfoMap cinfoMap' 
                        . set currentCanvas cid
                        $ xstate
          lift . St.put $ xstate'
          invalidateBBoxOnly cid
          vscrollMove cid 
    VScrollBarEnd cid' _v -> do 
      invalidate cid' 
      return ()
    _ -> return ()