hxournal-0.6.2: lib/Application/HXournal/Coroutine/Eraser.hs
module Application.HXournal.Coroutine.Eraser where
import Graphics.UI.Gtk hiding (get,set,disconnect)
import Application.HXournal.Type.Event
import Application.HXournal.Type.Coroutine
import Application.HXournal.Type.Canvas
import Application.HXournal.Type.XournalState
import Application.HXournal.Device
import Application.HXournal.Draw
import Application.HXournal.Coroutine.EventConnect
import Application.HXournal.Coroutine.Draw
import Application.HXournal.Coroutine.Commit
import Application.HXournal.Accessor
import Application.HXournal.ModelAction.Page
import Application.HXournal.ModelAction.Eraser
import Application.HXournal.ModelAction.Layer
import Data.Xournal.Generic
import Data.Xournal.BBox
import Graphics.Xournal.Render.HitTest
import Graphics.Xournal.Render.BBox
import Graphics.Xournal.Render.BBoxMapPDF
import Control.Monad.Coroutine.SuspensionFunctors
import Control.Monad.Trans
import qualified Control.Monad.State as St
import Control.Category
import Data.Label
import qualified Data.IntMap as IM
import Prelude hiding ((.), id)
-- for test
import Control.Compose
import Data.Xournal.Select
import qualified Data.Sequence as Seq
eraserStart :: CanvasId
-> PointerCoord
-> MainCoroutine () -- Iteratee MyEvent XournalStateIO ()
eraserStart cid pcoord = do
xstate <- changeCurrentCanvasId cid
let cvsInfo = getCanvasInfo cid xstate
zmode = get (zoomMode.viewInfo) cvsInfo
geometry <- getCanvasGeometry cvsInfo
let (x,y) = device2pageCoord geometry zmode pcoord
connidup <- connectPenUp cvsInfo
connidmove <- connectPenMove cvsInfo
strs <- getAllStrokeBBoxInCurrentLayer
eraserProcess cid geometry connidup connidmove strs (x,y)
eraserProcess :: CanvasId
-> CanvasPageGeometry
-> ConnectId DrawingArea -> ConnectId DrawingArea
-> [StrokeBBox]
-> (Double,Double)
-> MainCoroutine () -- Iteratee MyEvent XournalStateIO ()
eraserProcess cid cpg connidmove connidup strs (x0,y0) = do
r <- await
xstate <- getSt
let cvsInfo = getCanvasInfo cid xstate
case r of
PenMove _cid' pcoord -> do
let zmode = get (zoomMode.viewInfo) cvsInfo
(x,y) = device2pageCoord cpg zmode pcoord
line = ((x0,y0),(x,y))
hittestbbox = mkHitTestBBox line strs
(hitteststroke,hitState) =
St.runState (hitTestStrokes line hittestbbox) False
if hitState
then do
let currxoj = unView . get xournalstate $ xstate
pgnum = get currentPageNum cvsInfo
(mcurrlayer, currpage) = getCurrentLayerOrSet . getPage $ cvsInfo
currlayer = maybe (error "eraserProcess") id mcurrlayer
-- for test
-- let Select (O (Just ll)) = get g_layers currpage
-- SZ (_,(x1,x2)) = ll
-- liftIO$ print (Seq.length x1, Seq.length x2)
let (newstrokes,maybebbox1) = St.runState (eraseHitted hitteststroke) Nothing
maybebbox = fmap (flip inflate 2.0) maybebbox1
newlayerbbox <- liftIO . updateLayerBuf maybebbox . set g_bstrokes newstrokes $ currlayer
let newpagebbox = adjustCurrentLayer newlayerbbox currpage
newxojbbox = currxoj { gpages= IM.adjust (const newpagebbox) pgnum (gpages currxoj) }
newxojstate = ViewAppendState newxojbbox
commit . set xournalstate newxojstate
. updatePageAll newxojstate $ xstate
invalidateWithBufInBBox maybebbox cid
newstrs <- getAllStrokeBBoxInCurrentLayer
eraserProcess cid cpg connidup connidmove newstrs (x,y)
else eraserProcess cid cpg connidmove connidup strs (x,y)
PenUp _cid' _pcoord -> do
disconnect connidmove
disconnect connidup
invalidateAll
_ -> return ()