module Graphics.UI.Frame.Panes (
PaneMonad(..)
, IDEPane(..)
, Pane(..)
, RecoverablePane(..)
, PaneDirection(..)
, PanePathElement(..)
, PanePath
, PaneLayout(..)
, PaneName
, Connection(..)
, Connections
, StandardPath
, FrameState(..)
, signalDisconnectAll
) where
import Graphics.UI.Gtk hiding (get)
import System.Glib.GObject
import System.Glib.Signals
import Data.Maybe
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Typeable
import Control.Monad.Trans
import Graphics.UI.Editor.Basics
(Connection(..), Connection, Connections)
type PanePath = [PanePathElement]
data PanePathElement = SplitP PaneDirection | GroupP String
deriving (Eq,Show,Read)
data PaneDirection = TopP | BottomP | LeftP | RightP
deriving (Eq,Show,Read)
data PaneLayout = HorizontalP PaneLayout PaneLayout Int
| VerticalP PaneLayout PaneLayout Int
| TerminalP {
paneGroups :: Map String PaneLayout
, paneTabs :: Maybe PaneDirection
, currentPage :: Int
, detachedId :: Maybe String
, detachedSize :: Maybe (Int, Int) }
deriving (Eq,Show,Read)
class (Typeable alpha, PaneMonad delta) => Pane alpha delta | alpha -> delta where
getTopWidget :: alpha -> Widget
paneId :: alpha -> String
primPaneName :: alpha -> String
paneName :: alpha -> PaneName
paneName b = if getAddedIndex b == 0
then primPaneName b
else primPaneName b ++ "(" ++ show (getAddedIndex b) ++ ")"
getAddedIndex :: alpha -> Int
getAddedIndex _ = 0
class (Pane alpha delta, Typeable beta, Show beta, Read beta) => RecoverablePane alpha beta delta | beta -> alpha, alpha -> beta where
saveState :: alpha -> delta (Maybe beta)
recoverState :: PanePath -> beta -> delta (Maybe alpha)
builder :: PanePath -> Notebook -> Window -> delta (Maybe alpha,Connections)
makeActive :: alpha -> delta ()
makeActive pane = activateThisPane pane []
closePane :: alpha -> delta Bool
closePane = closeThisPane
getPane :: delta (Maybe alpha)
getPane = getThisPane
forceGetPane :: Either PanePath String -> delta alpha
forceGetPane pp = do mbPane <- getOrBuildPane pp
case mbPane of
Nothing -> error "Can't get pane "
Just p -> return p
getOrBuildPane :: Either PanePath String -> delta (Maybe alpha)
getOrBuildPane = getOrBuildThisPane
displayPane :: alpha -> Bool -> delta ()
displayPane = displayThisPane
getAndDisplayPane :: Either PanePath String -> Bool -> delta (Maybe alpha)
getAndDisplayPane pps b = do
mbP <- getOrBuildThisPane pps
case mbP of
Nothing -> return Nothing
Just p -> do
displayPane p b
return (Just p)
buildPane :: PanePath ->
Notebook ->
(PanePath -> Notebook -> Window -> delta (Maybe alpha,Connections)) ->
delta (Maybe alpha)
buildPane = buildThisPane
class MonadIO delta => PaneMonad delta where
setFrameState :: FrameState delta -> delta ()
getFrameState :: delta (FrameState delta)
runInIO :: forall alpha beta. (beta -> delta alpha) -> delta (beta -> IO alpha)
panePathForGroup:: String -> delta PanePath
getThisPane :: forall alpha beta . RecoverablePane alpha beta delta => delta (Maybe alpha)
displayThisPane :: forall alpha beta . RecoverablePane alpha beta delta => alpha -> Bool -> delta ()
getOrBuildThisPane
:: forall alpha beta . RecoverablePane alpha beta delta => Either PanePath String -> delta (Maybe alpha)
buildThisPane :: forall alpha beta . RecoverablePane alpha beta delta =>
PanePath ->
Notebook ->
(PanePath -> Notebook -> Window -> delta (Maybe alpha,Connections)) ->
delta (Maybe alpha)
activateThisPane :: forall alpha beta . RecoverablePane alpha beta delta => alpha -> Connections -> delta ()
closeThisPane :: forall alpha beta . RecoverablePane alpha beta delta => alpha -> delta Bool
type PaneName = String
data IDEPane delta = forall alpha beta. (RecoverablePane alpha beta delta) => PaneC alpha
instance Eq (IDEPane delta) where
(==) (PaneC x) (PaneC y) = paneName x == paneName y
instance Ord (IDEPane delta) where
(<=) (PaneC x) (PaneC y) = paneName x <= paneName y
instance Show (IDEPane delta) where
show (PaneC x) = "Pane " ++ paneName x
type StandardPath = PanePath
data FrameState delta = FrameState {
windows :: [Window]
, uiManager :: UIManager
, panes :: Map PaneName (IDEPane delta)
, paneMap :: (Map PaneName (PanePath, Connections))
, activePane :: Maybe (PaneName, Connections)
, panePathFromNB :: ! (Map Notebook PanePath)
, layout :: PaneLayout}
deriving Show
instance Show Window where
show _ = "a Window"
instance Show UIManager where
show _ = "a UIManager"
instance Show Connection where
show _ = "a Connection"
instance Show Notebook where
show _ = "a Notebook"
signalDisconnectAll :: Connections -> IO ()
signalDisconnectAll = mapM_ (\ (ConnectC s) -> signalDisconnect s)
#ifdef MIN_VERSION_gtk
#if MIN_VERSION_gtk(0,10,1)
#else
instance Eq Notebook
where (==) a b = let (GObject pa, GObject pb) = (toGObject a, toGObject b)
in pa == pb
instance Ord Notebook
where (<=) a b = let (GObject pa, GObject pb) = (toGObject a, toGObject b)
in pa <= pb
instance Eq Window
where (==) a b = let (GObject pa, GObject pb) = (toGObject a, toGObject b)
in pa == pb
instance Eq Widget
where (==) a b = let (GObject pa, GObject pb) = (toGObject a, toGObject b)
in pa == pb
#endif
#endif