hxournal-0.5: lib/Application/HXournal/Coroutine/Default.hs
module Application.HXournal.Coroutine.Default where
import Graphics.UI.Gtk hiding (get,set)
import Application.HXournal.Type.Event
import Application.HXournal.Type.Coroutine
import Application.HXournal.Type.Canvas
import Application.HXournal.Type.XournalState
import Application.HXournal.Type.Clipboard
import Application.HXournal.Draw
import Application.HXournal.Accessor
import Application.HXournal.Coroutine.Callback
import Application.HXournal.Coroutine.Draw
import Application.HXournal.Coroutine.Pen
import Application.HXournal.Coroutine.Eraser
import Application.HXournal.Coroutine.Highlighter
import Application.HXournal.Coroutine.Scroll
import Application.HXournal.Coroutine.Page
import Application.HXournal.Coroutine.Select
import Application.HXournal.Coroutine.File
import Application.HXournal.Coroutine.Mode
import Application.HXournal.Coroutine.Window
import Application.HXournal.ModelAction.Adjustment
import Application.HXournal.ModelAction.Page
import Application.HXournal.ModelAction.Window
import Application.HXournal.Type.Window
import Application.HXournal.Device
import Control.Monad.Coroutine
import Control.Monad.Coroutine.SuspensionFunctors
import qualified Control.Monad.State as St
import Control.Monad.Trans
import qualified Data.IntMap as M
import Data.Maybe
import Control.Category
import Data.Label
import Prelude hiding ((.), id)
import Data.IORef
import Graphics.Xournal.Type.Map
import Graphics.Xournal.Type.Select
guiProcess :: Iteratee MyEvent XournalStateIO ()
guiProcess = do
initialize
changePage (const 0)
xstate <- getSt
let cinfoMap = get canvasInfoMap xstate
assocs = M.toList cinfoMap
f (cid,cinfo) = do let canvas = get drawArea cinfo
(w',h') <- liftIO $ widgetGetSize canvas
defaultEventProcess (CanvasConfigure cid
(fromIntegral w')
(fromIntegral h'))
mapM_ f assocs
sequence_ (repeat dispatchMode)
initCoroutine :: DeviceList -> Window -> IO (TRef,SRef)
initCoroutine devlst window = do
let st0 = (emptyHXournalState :: HXournalState)
sref <- newIORef st0
tref <- newIORef (undefined :: SusAwait)
let st1 = set deviceList devlst
. set rootOfRootWindow window
. set callBack (bouncecallback tref sref) $ st0
initcvs <- initCanvasInfo st1 1
let initcmap = M.insert (get canvasId initcvs) initcvs M.empty
let startingXstate = set currentCanvas (get canvasId initcvs)
. set canvasInfoMap initcmap
. set frameState (Node 1)
$ st1
(r,st') <- St.runStateT (resume guiProcess) startingXstate
writeIORef sref st'
case r of
Left aw -> do
writeIORef tref aw
Right _ -> error "what?"
return (tref,sref)
initialize :: Iteratee MyEvent XournalStateIO ()
initialize = do ev <- await
liftIO $ putStrLn $ show ev
case ev of
Initialized -> return ()
_ -> initialize
dispatchMode :: Iteratee MyEvent XournalStateIO ()
dispatchMode = do
xojstate <- return . get xournalstate =<< lift St.get
case xojstate of
ViewAppendState _ -> viewAppendMode
SelectState _ -> selectMode
viewAppendMode :: Iteratee MyEvent XournalStateIO ()
viewAppendMode = do
r1 <- await
case r1 of
PenDown cid pcoord -> do
ptype <- getPenType
case ptype of
PenWork -> penStart cid pcoord
EraserWork -> eraserStart cid pcoord
HighlighterWork -> highlighterStart pcoord
_ -> return ()
_ -> defaultEventProcess r1
selectMode :: Iteratee MyEvent XournalStateIO ()
selectMode = do
r1 <- await
case r1 of
PenDown cid pcoord -> do
ptype <- return . get (selectType.selectInfo) =<< lift St.get
case ptype of
SelectRectangleWork -> selectRectStart cid pcoord
_ -> return ()
PenColorChanged c -> selectPenColorChanged c
PenWidthChanged w -> selectPenWidthChanged w
_ -> defaultEventProcess r1
defaultEventProcess :: MyEvent -> Iteratee MyEvent XournalStateIO ()
defaultEventProcess (UpdateCanvas cid) = invalidate cid
defaultEventProcess (Menu m) = menuEventProcess m
defaultEventProcess (HScrollBarMoved cid v) = do
xstate <- getSt
let cinfoMap = get canvasInfoMap xstate
maybeCvs = M.lookup cid cinfoMap
case maybeCvs of
Nothing -> return ()
Just cvsInfo -> do
let vm_orig = get (viewPortOrigin.viewInfo) cvsInfo
let cvsInfo' = set (viewPortOrigin.viewInfo) (v,snd vm_orig)
$ cvsInfo
xstate' = set currentCanvas cid
. updateCanvasInfo cvsInfo'
$ xstate
lift . St.put $ xstate'
invalidate cid
defaultEventProcess (VScrollBarMoved cid v) = do
xstate <- lift St.get
let cinfoMap = get canvasInfoMap xstate
cvsInfo = case M.lookup cid cinfoMap of
Nothing -> error "No such canvas in defaultEventProcess"
Just cvs -> cvs
let vm_orig = get (viewPortOrigin.viewInfo) cvsInfo
let cvsInfo' = set (viewPortOrigin.viewInfo) (fst vm_orig,v)
$ cvsInfo
xstate' = set currentCanvas cid
. updateCanvasInfo cvsInfo' $ xstate
lift . St.put $ xstate'
invalidate cid
defaultEventProcess (VScrollBarStart cid _v) = vscrollStart cid
defaultEventProcess (CanvasConfigure cid w' h') = do
xstate <- getSt
let cinfoMap = get canvasInfoMap xstate
case M.lookup cid cinfoMap of
Nothing -> return ()
Just cvsInfo -> do
let canvas = get drawArea cvsInfo
let page = getPage cvsInfo
(w,h) = get (pageDimension.viewInfo) cvsInfo
zmode = get (zoomMode.viewInfo) cvsInfo
cpg <- liftIO (getCanvasPageGeometry canvas page (0,0))
let factor = getRatioFromPageToCanvas cpg zmode
(hadj,vadj) = get adjustments cvsInfo
liftIO $ setAdjustments (hadj,vadj) (w,h) (0,0) (0,0)
(w'/factor,h'/factor)
invalidate cid
defaultEventProcess ToViewAppendMode = modeChange ToViewAppendMode
defaultEventProcess ToSelectMode = modeChange ToSelectMode
defaultEventProcess _ = return ()
menuEventProcess :: MenuEvent -> Iteratee MyEvent XournalStateIO ()
menuEventProcess MenuQuit = liftIO $ mainQuit
menuEventProcess MenuPreviousPage = changePage (\x->x-1)
menuEventProcess MenuNextPage = changePage (+1)
menuEventProcess MenuFirstPage = changePage (const 0)
menuEventProcess MenuLastPage = do
xstate <- getSt
let totalnumofpages = case get xournalstate xstate of
ViewAppendState xoj -> M.size . xbm_pages $ xoj
SelectState txoj -> M.size . tx_pages $ txoj
changePage (const (totalnumofpages-1))
menuEventProcess MenuNew = fileNew
menuEventProcess MenuOpen = fileOpen
menuEventProcess MenuSave = fileSave
menuEventProcess MenuSaveAs = fileSaveAs
menuEventProcess MenuCut = cutSelection
menuEventProcess MenuCopy = copySelection
menuEventProcess MenuPaste = pasteToSelection
menuEventProcess MenuDelete = deleteSelection
menuEventProcess MenuNormalSize = pageZoomChange Original
menuEventProcess MenuPageWidth = pageZoomChange FitWidth
menuEventProcess MenuPageHeight = pageZoomChange FitHeight
menuEventProcess MenuHSplit = eitherSplit SplitHorizontal
menuEventProcess MenuVSplit = eitherSplit SplitVertical
menuEventProcess MenuDelCanvas = deleteCanvas
menuEventProcess m = liftIO $ putStrLn $ "not implemented " ++ show m