hxournal-0.5: lib/Application/HXournal/ModelAction/Window.hs
module Application.HXournal.ModelAction.Window where
import Application.HXournal.Type.Canvas
import Application.HXournal.Type.Event
import Application.HXournal.Type.Window
import Application.HXournal.Type.XournalState
import Application.HXournal.Device
import Graphics.UI.Gtk hiding (get,set)
import qualified Graphics.UI.Gtk as Gtk (set)
import Control.Monad.Trans
import Control.Category
import Data.Label
import Prelude hiding ((.),id)
import qualified Data.IntMap as M
import System.FilePath
setTitleFromFileName :: HXournalState -> IO ()
setTitleFromFileName xstate = do
case get currFileName xstate of
Nothing -> Gtk.set (get rootOfRootWindow xstate)
[ windowTitle := "untitled" ]
Just filename -> Gtk.set (get rootOfRootWindow xstate)
[ windowTitle := takeFileName filename]
newCanvasId :: CanvasInfoMap -> CanvasId
newCanvasId cmap =
let cids = M.keys cmap
in (maximum cids) + 1
initCanvasInfo :: HXournalState -> CanvasId -> IO CanvasInfo
initCanvasInfo xstate cid = do
let callback = get callBack xstate
dev = get deviceList xstate
canvas <- drawingAreaNew
scrwin <- scrolledWindowNew Nothing Nothing
containerAdd scrwin canvas
hadj <- adjustmentNew 0 0 500 100 200 200
vadj <- adjustmentNew 0 0 500 100 200 200
scrolledWindowSetHAdjustment scrwin hadj
scrolledWindowSetVAdjustment scrwin vadj
scrolledWindowSetPolicy scrwin PolicyAutomatic PolicyAutomatic
canvas `on` sizeRequest $ return (Requisition 480 400)
canvas `on` buttonPressEvent $ tryEvent $ do
p <- getPointer dev
liftIO (callback (PenDown cid p))
canvas `on` configureEvent $ tryEvent $ do
(w,h) <- eventSize
liftIO $ callback -- bouncecallback tref sref
(CanvasConfigure cid (fromIntegral w) (fromIntegral h))
canvas `on` buttonReleaseEvent $ tryEvent $ do
p <- getPointer dev
liftIO (callback (PenUp cid p))
canvas `on` exposeEvent $ tryEvent $ do
liftIO $ callback (UpdateCanvas cid)
{-
canvas `on` enterNotifyEvent $ tryEvent $ do
win <- liftIO $ widgetGetDrawWindow canvas
liftIO $ drawWindowSetCursor win (Just cursorDot)
return ()
-}
widgetAddEvents canvas [PointerMotionMask,Button1MotionMask]
widgetSetExtensionEvents canvas [ExtensionEventsAll]
afterValueChanged hadj $ do
v <- adjustmentGetValue hadj
callback (HScrollBarMoved cid v)
afterValueChanged vadj $ do
v <- adjustmentGetValue vadj
callback (VScrollBarMoved cid v)
Just vscrbar <- scrolledWindowGetVScrollbar scrwin
vscrbar `on` buttonPressEvent $ do
v <- liftIO $ adjustmentGetValue vadj
liftIO (callback (VScrollBarStart cid v))
return False
vscrbar `on` buttonReleaseEvent $ do
v <- liftIO $ adjustmentGetValue vadj
liftIO (callback (VScrollBarEnd cid v))
return False
return $ CanvasInfo cid canvas scrwin (error "no viewInfo") 0 (error "No page") hadj vadj
constructFrame :: WindowConfig -> CanvasInfoMap -> IO (Widget,WindowConfig)
constructFrame (Node cid) cmap = do
case (M.lookup cid cmap) of
Nothing -> error $ "no such cid = " ++ show cid ++ " in constructFrame"
Just cinfo -> return (castToWidget . get scrolledWindow $ cinfo, Node cid)
constructFrame (HSplit hpane wconf1 wconf2) cmap = do
(win1,wconf1') <- constructFrame wconf1 cmap
(win2,wconf2') <- constructFrame wconf2 cmap
hpane' <- case hpane of
Nothing -> hPanedNew
Just h -> return h
panedPack1 hpane' win1 True False
panedPack2 hpane' win2 True False
widgetShowAll hpane'
return (castToWidget hpane', HSplit (Just hpane') wconf1' wconf2')
constructFrame (VSplit vpane wconf1 wconf2) cmap = do
(win1,wconf1') <- constructFrame wconf1 cmap
(win2,wconf2') <- constructFrame wconf2 cmap
vpane' <- case vpane of
Nothing -> vPanedNew
Just v -> return v
panedPack1 vpane' win1 True False
panedPack2 vpane' win2 True False
widgetShowAll vpane'
return (castToWidget vpane', VSplit (Just vpane') wconf1' wconf2')
removePanes :: WindowConfig -> IO WindowConfig
removePanes n@(Node _) = return n
removePanes (HSplit hpane wconf1 wconf2) = do
case hpane of
Just h -> do
panedGetChild1 h >>= \x -> case x of
Just c1 -> containerRemove h c1
Nothing -> return ()
panedGetChild2 h >>= \x -> case x of
Just c2 -> containerRemove h c2
Nothing -> return ()
widgetDestroy h
Nothing -> return ()
wconf1' <- removePanes wconf1
wconf2' <- removePanes wconf2
return (HSplit Nothing wconf1' wconf2')
removePanes (VSplit vpane wconf1 wconf2) = do
case vpane of
Just v -> do
panedGetChild1 v >>= \x -> case x of
Just c1 -> containerRemove v c1
Nothing -> return ()
panedGetChild2 v >>= \x -> case x of
Just c2 -> containerRemove v c2
Nothing -> return ()
widgetDestroy v
Nothing -> return ()
wconf1' <- removePanes wconf1
wconf2' <- removePanes wconf2
return (VSplit Nothing wconf1' wconf2')