hxournal-0.6.5: lib/Application/HXournal/Accessor.hs
{-# LANGUAGE TypeOperators, GADTs, ScopedTypeVariables #-}
-----------------------------------------------------------------------------
-- |
-- Module : Application.HXournal.Accessor
-- Copyright : (c) 2011, 2012 Ian-Woo Kim
--
-- License : BSD3
-- Maintainer : Ian-Woo Kim <ianwookim@gmail.com>
-- Stability : experimental
-- Portability : GHC
--
-----------------------------------------------------------------------------
module Application.HXournal.Accessor where
import Application.HXournal.Type
import Control.Applicative
import Control.Monad
import qualified Control.Monad.State as St
import Control.Monad.Trans
import Control.Category
import qualified Data.IntMap as M
import Data.Label
import Prelude hiding ((.),id)
import Graphics.UI.Gtk hiding (get,set)
import qualified Graphics.UI.Gtk as Gtk (set)
import Data.Xournal.BBox
import Data.Xournal.Generic
import Application.HXournal.ModelAction.Layer
import Application.HXournal.Type.Alias
import Application.HXournal.Type.PageArrangement
import Application.HXournal.View.Coordinate
-- | get HXournalState
getSt :: MainCoroutine HXournalState
getSt = lift St.get
-- | put HXournalState
putSt :: HXournalState -> MainCoroutine ()
putSt = lift . St.put
-- | update state
updateXState :: (HXournalState -> MainCoroutine HXournalState) -> MainCoroutine ()
updateXState action = putSt =<< action =<< getSt
-- |
getPenType :: MainCoroutine PenType
getPenType = get (penType.penInfo) <$> lift (St.get)
-- |
getCurrentPageCurr :: MainCoroutine (Page EditMode)
getCurrentPageCurr = do
xstate <- getSt
let xojstate = get xournalstate xstate
cinfobox = get currentCanvasInfo xstate
case cinfobox of
CanvasInfoBox cinfo -> return (getCurrentPageFromXojState cinfo xojstate)
-- |
getCurrentPageCvsId :: CanvasId -> MainCoroutine (Page EditMode)
getCurrentPageCvsId cid = do
xstate <- getSt
let xojstate = get xournalstate xstate
cinfobox = getCanvasInfo cid xstate
case cinfobox of
CanvasInfoBox cinfo -> return (getCurrentPageFromXojState cinfo xojstate)
-- |
getCurrentPageEitherFromXojState :: (ViewMode a) =>
CanvasInfo a -> XournalState
-> Either (Page EditMode) (Page SelectMode)
getCurrentPageEitherFromXojState cinfo xojstate =
let cpn = get currentPageNum cinfo
page = getCurrentPageFromXojState cinfo xojstate
in case xojstate of
ViewAppendState _xoj -> Left page
SelectState txoj ->
case get g_selectSelected txoj of
Nothing -> Left page
Just (n,tpage) -> if cpn == n
then Right tpage
else Left page
-- |
getAllStrokeBBoxInCurrentPage :: MainCoroutine [StrokeBBox]
getAllStrokeBBoxInCurrentPage = do
page <- getCurrentPageCurr
return [s| l <- gToList (get g_layers page), s <- get g_bstrokes l ]
-- |
getAllStrokeBBoxInCurrentLayer :: MainCoroutine [StrokeBBox]
getAllStrokeBBoxInCurrentLayer = do
page <- getCurrentPageCurr
let (mcurrlayer, _currpage) = getCurrentLayerOrSet page
currlayer = maybe (error "getAllStrokeBBoxInCurrentLayer") id mcurrlayer
return (get g_bstrokes currlayer)
otherCanvas :: HXournalState -> [Int]
otherCanvas = M.keys . getCanvasInfoMap
-- |
changeCurrentCanvasId :: CanvasId -> MainCoroutine HXournalState
changeCurrentCanvasId cid = do
xstate1 <- getSt
maybe (return xstate1)
(\xst -> do putSt xst
return xst)
(setCurrentCanvasId cid xstate1)
xst <- getSt
let cinfo = get currentCanvasInfo xst
ui = get gtkUIManager xst
reflectUI ui cinfo
return xst
-- | reflect UI for current canvas info
reflectUI :: UIManager -> CanvasInfoBox -> MainCoroutine ()
reflectUI ui cinfobox = do
xstate <- getSt
let mconnid = get pageModeSignal xstate
liftIO $ maybe (return ()) signalBlock mconnid
agr <- liftIO $ uiManagerGetActionGroups ui
Just ra1 <- liftIO $ actionGroupGetAction (head agr) "ONEPAGEA"
-- let wra1 = castToRadioAction ra1
selectBoxAction (fsingle ra1) (fcont ra1) cinfobox
liftIO $ maybe (return ()) signalUnblock mconnid
return ()
where fsingle ra1 _cinfo = do
let wra1 = castToRadioAction ra1
liftIO $ Gtk.set wra1 [radioActionCurrentValue := 1 ]
fcont ra1 _cinfo = do
-- let wra1 = castToRadioAction ra1
-- liftIO $ wra1 `on` radioActionChanged $ const (putStrLn "hellowworld2" >> return ())
liftIO $ Gtk.set (castToRadioAction ra1) [radioActionCurrentValue := 0 ]
-- |
printViewPortBBox :: CanvasId -> MainCoroutine ()
printViewPortBBox cid = do
cvsInfo <- return . getCanvasInfo cid =<< getSt
liftIO $ putStrLn $ show (unboxGet (viewPortBBox.pageArrangement.viewInfo) cvsInfo)
-- |
printViewPortBBoxAll :: MainCoroutine ()
printViewPortBBoxAll = do
xstate <- getSt
let cmap = getCanvasInfoMap xstate
cids = M.keys cmap
mapM_ printViewPortBBox cids
-- |
printViewPortBBoxCurr :: MainCoroutine ()
printViewPortBBoxCurr = do
cvsInfo <- return . get currentCanvasInfo =<< getSt
liftIO $ putStrLn $ show (unboxGet (viewPortBBox.pageArrangement.viewInfo) cvsInfo)
-- |
printModes :: CanvasId -> MainCoroutine ()
printModes cid = do
cvsInfo <- return . getCanvasInfo cid =<< getSt
liftIO $ printCanvasMode cid cvsInfo
{- let zmode = unboxGet (zoomMode.viewInfo) cvsInfo
f :: PageArrangement a -> String
f (SingleArrangement _ _ _) = "SingleArrangement"
f (ContinuousSingleArrangement _ _ _ _) = "ContinuousSingleArrangement"
g :: CanvasInfo a -> String
g cinfo = f . get (pageArrangement.viewInfo) $ cinfo
arrmode :: String
arrmode = boxAction g cvsInfo
incid = unboxGet canvasId cvsInfo
liftIO $ putStrLn $ show (cid,incid,zmode,arrmode) -}
printCanvasMode :: CanvasId -> CanvasInfoBox -> IO ()
printCanvasMode cid cvsInfo = do
let zmode = unboxGet (zoomMode.viewInfo) cvsInfo
f :: PageArrangement a -> String
f (SingleArrangement _ _ _) = "SingleArrangement"
f (ContinuousSingleArrangement _ _ _ _) = "ContinuousSingleArrangement"
g :: CanvasInfo a -> String
g cinfo = f . get (pageArrangement.viewInfo) $ cinfo
arrmode :: String
arrmode = boxAction g cvsInfo
incid = unboxGet canvasId cvsInfo
putStrLn $ show (cid,incid,zmode,arrmode)
printModesAll :: MainCoroutine ()
printModesAll = do
xstate <- getSt
let cmap = getCanvasInfoMap xstate
cids = M.keys cmap
mapM_ printModes cids
-- |
{-
unboxGetPage :: CanvasInfoBox -> (Page EditMode)
unboxGetPage = either id (gcast :: Page SelectMode -> Page EditMode) . unboxGet currentPage
-}
-- |
getCanvasGeometryCvsId :: CanvasId -> HXournalState -> IO CanvasGeometry
getCanvasGeometryCvsId cid xstate = do
let cinfobox = getCanvasInfo cid xstate
cpn = PageNum . unboxGet currentPageNum $ cinfobox
canvas = unboxGet drawArea cinfobox
-- xojstate = get xournalstate xstate
fsingle :: (ViewMode a) => CanvasInfo a -> IO CanvasGeometry
fsingle = flip (makeCanvasGeometry cpn) canvas
. get (pageArrangement.viewInfo)
boxAction fsingle cinfobox
-- |
getCanvasGeometry :: HXournalState -> IO CanvasGeometry
getCanvasGeometry xstate = do
let cinfobox = get currentCanvasInfo xstate
cpn = PageNum . unboxGet currentPageNum $ cinfobox
canvas = unboxGet drawArea cinfobox
-- xojstate = get xournalstate xstate
fsingle :: (ViewMode a) => CanvasInfo a -> IO CanvasGeometry
fsingle = flip (makeCanvasGeometry cpn) canvas
. get (pageArrangement.viewInfo)
boxAction fsingle cinfobox
{-
getCanvasGeometry :: CanvasInfo SinglePage -> MainCoroutine CanvasPageGeometry
getCanvasGeometry cinfo = do
let canvas = get drawArea cinfo
page = getPage cinfo
(x0,y0) = bbox_upperleft . unViewPortBBox . get (viewPortBBox.pageArrangement.viewInfo) $ cinfo
liftIO (getCanvasPageGeometry canvas page (x0,y0))
-}