module Rasa.Ext.Views.Internal.Actions where
import Rasa.Ext
import qualified Rasa.Ext.Views.Internal.Views as V
import Rasa.Ext.Views.Internal.BiTree
import Control.Lens
import Control.Monad
import Data.Maybe
import Data.List
views :: Action ()
views = void $ onBufAdded addSplit
rotate :: Action ()
rotate = V.windows._Just %= V.rotate
focusViewLeft :: Action ()
focusViewLeft = V.windows._Just %= V.focusViewLeft
focusViewRight :: Action ()
focusViewRight = V.windows._Just %= V.focusViewRight
focusViewAbove :: Action ()
focusViewAbove = V.windows._Just %= V.focusViewAbove
focusViewBelow :: Action ()
focusViewBelow = V.windows._Just %= V.focusViewBelow
closeInactive :: Action ()
closeInactive = V.windows %= (>>= V.closeBy (not . view V.active))
hSplit :: Action ()
hSplit = V.windows._Just %= V.hSplit
vSplit :: Action ()
vSplit = V.windows._Just %= V.vSplit
addSplit :: BufRef -> Action ()
addSplit bRef = do
mWin <- use V.windows
case mWin of
Nothing -> V.windows ?= Leaf (V.View True bRef 0)
Just win -> V.windows ?= V.addSplit V.Vert bRef win
nextBuf :: Action ()
nextBuf = do
mWin <- use V.windows
forM_ mWin $ \w -> V.windows._Just <~ traverse next w
where
next vw
| vw ^. V.active = do
newBufRef <- nextBufRef (vw ^. V.bufRef)
return (vw & V.bufRef .~ newBufRef)
| otherwise = return vw
prevBuf :: Action ()
prevBuf = do
mWin <- use V.windows
forM_ mWin $ \w -> V.windows._Just <~ traverse prev w
where
prev vw
| vw ^. V.active = do
newBufRef <- prevBufRef (vw ^. V.bufRef)
return (vw & V.bufRef .~ newBufRef)
| otherwise = return vw
focusedBufs :: Action [BufRef]
focusedBufs = use $ V.windows._Just.to activeBufRefs.to nub
where activeBufRefs = toListOf $ traverse . filtered (view V.active) . V.bufRef
focusDo :: BufAction a -> Action [a]
focusDo bufAct = do
bufRefs <- focusedBufs
catMaybes <$> mapM (`bufDo` bufAct) bufRefs
focusDo_ :: BufAction a -> Action ()
focusDo_ = void . focusDo
getBufferViews :: Action (Maybe (BiTree V.Split (V.View, Buffer)))
getBufferViews = do
mWin <- use V.windows
case mWin of
Nothing -> return Nothing
Just win -> sequence <$> mapM collect win
where
collect vw = do
buf <- getBuffer (vw^. V.bufRef)
return $ (,) vw <$> buf
scrollBy :: Int -> Action ()
scrollBy amt = V.windows._Just %= V.scrollBy amt