packages feed

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

module Application.HXournal.Coroutine.Window where

import Application.HXournal.Type.Event
import Application.HXournal.Type.Canvas
import Application.HXournal.Type.Window
import Application.HXournal.Type.XournalState
import Application.HXournal.Type.Coroutine
import Control.Monad.Trans
import Application.HXournal.ModelAction.Window
import Application.HXournal.Accessor
import Control.Category
import Data.Label
import Prelude hiding ((.),id)
import Graphics.UI.Gtk hiding (get,set)
import qualified Data.IntMap as M

eitherSplit :: SplitType -> Iteratee MyEvent XournalStateIO ()
eitherSplit stype = do
    xstate <- getSt
    let cmap = get canvasInfoMap xstate
        currcid = get currentCanvas xstate
        newcid = newCanvasId cmap 
        fstate = get frameState xstate
        -- xojstate = get xournalstate xstate
        enewfstate = splitWindow currcid (newcid,stype) fstate 
    case enewfstate of 
      Left _ -> return ()
      Right fstate' -> do 
        let oldcinfo = case M.lookup currcid cmap of
                         Nothing -> error "noway! in eitherSplit " 
                         Just c -> c 
        liftIO $ removePanes fstate 
        cinfo <- liftIO $ initCanvasInfo xstate newcid 
        let cinfo' = set viewInfo (get viewInfo oldcinfo)
                     . set currentPageNum (get currentPageNum oldcinfo)
                     . set currentPage (get currentPage oldcinfo)
                     $ cinfo
        let cmap' = M.insert newcid cinfo' cmap
        liftIO $ putStrLn $ "in window " ++ show (M.keys cmap')
        let rtwin = get rootWindow xstate
            rtcntr = get rootContainer xstate 
            xstate' = set canvasInfoMap cmap'
                      . set frameState fstate'
                      $ xstate
        putSt xstate'
        liftIO $ containerRemove rtcntr rtwin

        (win,fstate'') <- liftIO $ constructFrame fstate' cmap'         
        let xstate'' = set frameState fstate'' 
                       . set rootWindow win $ xstate'
        putSt xstate''
        liftIO $ boxPackEnd rtcntr win PackGrow 0 
        liftIO $ widgetShowAll rtcntr 


deleteCanvas :: Iteratee MyEvent XournalStateIO ()
deleteCanvas = do 
    liftIO $ putStrLn "deleteCanvas"  
    xstate <- getSt
    let cmap = get canvasInfoMap xstate
        currcid = get currentCanvas xstate
        fstate = get frameState xstate
        -- xojstate = get xournalstate xstate
        enewfstate = removeWindow currcid fstate 
    case enewfstate of 
      Left _ -> return ()
      Right Nothing -> return ()
      Right (Just fstate') -> do 
        let oldcinfo = case M.lookup currcid cmap of
                         Nothing -> error "noway! in deleteCanvas " 
                         Just c -> c 
        liftIO $ removePanes fstate 

        let cmap' = M.delete currcid cmap
            newcurrcid = maximum (M.keys cmap')
        xstate' <- changeCurrentCanvasId newcurrcid 
        liftIO $ putStrLn $ "in window " ++ show (M.keys cmap')
        let rtwin = get rootWindow xstate'
            rtcntr = get rootContainer xstate' 
            xstate'' = set canvasInfoMap cmap'
                       . set frameState fstate'
                       $ xstate'
        putSt xstate''
        liftIO $ containerRemove rtcntr rtwin

        (win,fstate'') <- liftIO $ constructFrame fstate' cmap'         
        let xstate''' = set frameState fstate'' 
                        . set rootWindow win $ xstate''
        putSt xstate'''
        liftIO $ boxPackEnd rtcntr win PackGrow 0 
        liftIO $ widgetShowAll rtcntr 

        liftIO $ widgetDestroy (get scrolledWindow oldcinfo)
        liftIO $ widgetDestroy (get drawArea oldcinfo)