packages feed

INblobs-0.1.1: src/State.hs

module State
    ( State
    , State.empty
    , ToolWindow(..)

    , getDocument
    , getDragging,          setDragging
    , getCanvas,            setCanvas
    , getLHSCanvas,         setLHSCanvas
    , getRHSCanvas,         setRHSCanvas
    , getPalettePanel,      setPalettePanel
    , getNetworkFrame,      setNetworkFrame
    , getPageSetupDialog,   setPageSetupDialog
    , getDisplayOptions,    setDisplayOptions
    , changeDisplayOptions
    , getCurrentShape,      setCurrentShape
    , getActiveCanvas,      setActiveCanvas
    , getActiveRule,        setActiveRule
    , getTree,              setTree
    , getShape1,            setShape1
    , getShape2,            setShape2
    , getOkButton,          setOkButton
    , getReduceButton,      setReduceButton
    , getContinueReduction,    setContinueReduction

    , stopReduction
    , disableReduce
    ) where

import Document
import Math
import qualified PersistentDocument as PD
import DisplayOptions

import Graphics.UI.WX
import Graphics.UI.WXCore hiding (Document, ToolWindow)

 

type State g n e = Var (StateRecord g n e)

data StateRecord g n e = St
    { stDocument        :: PD.PersistentDocument (Document g n e)
    , stDragging        :: Maybe (Bool, DoublePoint) -- ^ (really moved?, offset from center of node)
    , stNetworkFrame    :: Frame ()
    , stCanvas          :: ScrolledWindow ()
    , stLHSCanvas       :: ScrolledWindow ()
    , stRHSCanvas       :: ScrolledWindow ()
    , stPalettePanel    :: Panel ()
    , stPageSetupDialog :: PageSetupDialog ()
    , stDisplayOptions  :: DisplayOptions
    , stShape           :: String       -- ^ the name of the shape in the palette
    , stActiveCanvas    :: ActiveCanvas -- ^ which canvas is active
    , stActiveRule      :: RuleName     -- ^ a interaction rule's name 
    , stTree            :: TreeCtrl ()  -- ^ the treeCtrl that lists the rules
    , stShape1          :: Maybe String -- ^ a shape name
    , stShape2          :: Maybe String -- ^ a shape name
    , stOkButton        :: Button ()    
    , stReduceButton    :: Button ()    
    , stContinueReduct  :: Bool         -- ^ reduction process should continue or stop    
    }

data ToolWindow = TW
    { twRepaint :: IO ()
    , twFrame   :: Frame ()
    }

empty :: IO (State g n e)
empty =
  do{ dummy <- PD.dummy

    ; varCreate (St
        { stDocument        = dummy
        , stNetworkFrame    = error "State.empty: network frame has not been set"
        , stDragging        = Nothing
        , stCanvas          = error "State.empty: canvas has not been set"
        , stLHSCanvas       = error "State.empty: canvasLHS has not been set"
        , stRHSCanvas       = error "State.empty: canvasRHS has not been set"
        , stPalettePanel    = error "State.empty: panel has not been set"
        , stPageSetupDialog = error "State.empty: page setup dialog has not been set"
        , stDisplayOptions  = DisplayOptions.standard
        , stShape           = "circle"
        , stActiveCanvas    = Net
        , stShape1          = Nothing
        , stShape2          = Nothing
        , stOkButton        = error "State.empty: Ok button has not been set"   
        , stReduceButton    = error "State.empty: Reduce button has not been set"
        , stContinueReduct  = True
        })
    }

-- Getters

getDocument :: State g n e -> IO (PD.PersistentDocument (Document g n e))
getDocument = getFromState stDocument

getDragging :: State g n e -> IO (Maybe (Bool, DoublePoint))
getDragging = getFromState stDragging

getNetworkFrame :: State g n e -> IO (Frame ())
getNetworkFrame = getFromState stNetworkFrame

getCanvas :: State g n e -> IO (ScrolledWindow ())
getCanvas = getFromState stCanvas

getLHSCanvas :: State g n e -> IO (ScrolledWindow ())
getLHSCanvas = getFromState stLHSCanvas

getRHSCanvas :: State g n e -> IO (ScrolledWindow ())
getRHSCanvas = getFromState stRHSCanvas

getPalettePanel :: State g n e -> IO (Panel ())
getPalettePanel = getFromState stPalettePanel

getPageSetupDialog :: State g n e -> IO (PageSetupDialog ())
getPageSetupDialog = getFromState stPageSetupDialog

getDisplayOptions :: State g n e -> IO DisplayOptions
getDisplayOptions = getFromState stDisplayOptions

getCurrentShape :: State g n e -> IO String
getCurrentShape = getFromState stShape

getActiveCanvas :: State g n e -> IO ActiveCanvas
getActiveCanvas = getFromState stActiveCanvas

getActiveRule :: State g n e -> IO RuleName
getActiveRule = getFromState stActiveRule

getTree :: State g n e -> IO (TreeCtrl () )
getTree = getFromState stTree

getShape1 :: State g n e -> IO (Maybe String )
getShape1 = getFromState stShape1

getShape2 :: State g n e -> IO (Maybe String )
getShape2 = getFromState stShape2

getOkButton :: State g n e -> IO (Button () )
getOkButton = getFromState stOkButton

getReduceButton :: State g n e -> IO (Button () )
getReduceButton = getFromState stReduceButton

getContinueReduction :: State g n e -> IO Bool
getContinueReduction = getFromState stContinueReduct


-- Setters

setDragging :: Maybe (Bool, DoublePoint)  -> State g n e -> IO ()
setDragging theDragging stateRef =
    varUpdate_ stateRef (\state -> state { stDragging = theDragging })

setNetworkFrame :: Frame () -> State g n e -> IO ()
setNetworkFrame networkFrame stateRef =
    varUpdate_ stateRef (\state -> state { stNetworkFrame = networkFrame })

setCanvas :: ScrolledWindow () -> State g n e -> IO ()
setCanvas canvas stateRef =
    varUpdate_ stateRef (\state -> state { stCanvas = canvas })

setLHSCanvas :: ScrolledWindow () -> State g n e -> IO ()
setLHSCanvas canvas stateRef =
    varUpdate_ stateRef (\state -> state { stLHSCanvas = canvas })

setRHSCanvas :: ScrolledWindow () -> State g n e -> IO ()
setRHSCanvas canvas stateRef =
    varUpdate_ stateRef (\state -> state { stRHSCanvas = canvas })

setPalettePanel :: Panel () -> State g n e -> IO ()
setPalettePanel panel stateRef =
    varUpdate_ stateRef (\state -> state { stPalettePanel = panel })

setPageSetupDialog :: PageSetupDialog () -> State g n e -> IO ()
setPageSetupDialog thePageSetupDialog stateRef =
    varUpdate_ stateRef (\state -> state { stPageSetupDialog = thePageSetupDialog })

setDisplayOptions :: DisplayOptions -> State g n e -> IO ()
setDisplayOptions dp stateRef =
    varUpdate_ stateRef (\state -> state { stDisplayOptions = dp })

changeDisplayOptions :: (DisplayOptions->DisplayOptions) -> State g n e -> IO ()
changeDisplayOptions dpf stateRef =
    varUpdate_ stateRef
        (\state -> state { stDisplayOptions = dpf (stDisplayOptions state) })

setCurrentShape :: String -> State g n e -> IO ()
setCurrentShape shapeName stateRef =
    varUpdate_ stateRef (\state -> state { stShape = shapeName })

setActiveCanvas :: ActiveCanvas -> State g n e -> IO ()
setActiveCanvas activeCanvas stateRef =
 do rule <- getActiveRule stateRef
    let activeCanvas' = case activeCanvas of
                           Net                 -> Net
                           LHS str | null str  -> LHS rule
                                   | otherwise -> LHS str
                           RHS str | null str  -> RHS rule
                                   | otherwise -> RHS str
    varUpdate_ stateRef (\state -> state { stActiveCanvas = activeCanvas' })

setActiveRule :: RuleName -> State g n e -> IO ()
setActiveRule activeRule stateRef =
    varUpdate_ stateRef (\state -> state { stActiveRule = activeRule })

setTree :: TreeCtrl () -> State g n e -> IO ()
setTree tree stateRef =
    varUpdate_ stateRef (\state -> state { stTree = tree })

setShape1 :: Maybe String -> State g n e -> IO ()
setShape1 shape1 stateRef =
    varUpdate_ stateRef (\state -> state { stShape1 = shape1 })

setShape2 :: Maybe String -> State g n e -> IO ()
setShape2 shape2 stateRef =
    varUpdate_ stateRef (\state -> state { stShape2 = shape2 })

setOkButton :: Button () -> State g n e -> IO ()
setOkButton okButton stateRef =
    varUpdate_ stateRef (\state -> state { stOkButton = okButton })

setReduceButton :: Button () -> State g n e -> IO ()
setReduceButton reduceButton stateRef =
    varUpdate_ stateRef (\state -> state { stReduceButton = reduceButton })

setContinueReduction :: Bool -> State g n e -> IO ()
setContinueReduction continue stateRef =
    varUpdate_ stateRef (\state -> state { stContinueReduct = continue })
--

disableReduce :: State g n e -> IO ()
disableReduce state = return ()
--  do button <- getReduceButton state
--     set button [enabled := False]

stopReduction :: State g n e  -> IO ()
stopReduction = setContinueReduction False

-- Utility functions

getFromState :: (StateRecord g n e -> a) -> State g n e -> IO a
getFromState selector stateRef = do
    state <- varGet stateRef
    return (selector state)

varUpdate_ :: Var a -> (a -> a) -> IO ()
varUpdate_ var fun = do { varUpdate var fun; return () }