module Rasa.Ext.Views.Internal.Actions
( rotate
, closeInactive
, focusViewLeft
, focusViewRight
, focusViewAbove
, focusViewBelow
, hSplit
, vSplit
, addSplit
, nextBuf
, prevBuf
, focusDo
, focusDo_
, focusedBufs
, isFocused
, scrollBy
) 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
rotate :: App ()
rotate = V.overWindows V.rotate
focusViewLeft :: App ()
focusViewLeft = V.overWindows V.focusViewLeft
focusViewRight :: App ()
focusViewRight = V.overWindows V.focusViewRight
focusViewAbove :: App ()
focusViewAbove = V.overWindows V.focusViewAbove
focusViewBelow :: App ()
focusViewBelow = V.overWindows V.focusViewBelow
closeInactive :: App ()
closeInactive = do
mWindows <- V.getViews
V.setViews $ mWindows >>= V.closeBy (not . view V.active)
hSplit :: App ()
hSplit = V.overWindows V.hSplit
vSplit :: App ()
vSplit = V.overWindows V.vSplit
addSplit :: BufAdded -> App ()
addSplit (BufAdded bRef) = do
mWin <- V.getViews
case mWin of
Nothing -> V.setViews . Just $ Leaf (V.View True (V.BufView bRef) 0)
Just win -> V.setViews . Just $ V.addSplit V.Vert (V.BufView bRef) win
nextBuf :: App ()
nextBuf = V.traverseViews next
where
next vw
| vw ^. V.active = do
newViewable <- getNextBufRef (vw^. V.viewable)
return (vw & V.viewable .~ newViewable)
| otherwise = return vw
getNextBufRef (V.BufView br) = V.BufView <$> nextBufRef br
getNextBufRef v = return v
prevBuf :: App ()
prevBuf = V.traverseViews prev
where
prev vw
| vw ^. V.active = do
newViewable <- getPrevBufRef (vw^. V.viewable)
return (vw & V.viewable .~ newViewable)
| otherwise = return vw
getPrevBufRef (V.BufView br) = V.BufView <$> prevBufRef br
getPrevBufRef v = return v
focusedBufs :: App [BufRef]
focusedBufs = do
mWindows <- V.getViews
case mWindows of
Nothing -> return []
Just win -> return . nub . activeBufRefs $ win
where activeBufRefs = toListOf $ traverse . filtered (view V.active) . V.viewable . V._BufViewRef
isFocused :: BufAction Bool
isFocused = do
inFocus <- liftApp focusedBufs
br <- getBufRef
return $ br `elem` inFocus
focusDo :: BufAction a -> App [a]
focusDo bufAct = do
bufRefs <- focusedBufs
catMaybes <$> mapM (`bufDo` bufAct) bufRefs
focusDo_ :: BufAction a -> App ()
focusDo_ = void . focusDo
scrollBy :: Int -> App ()
scrollBy amt = V.overWindows $ V.scrollBy amt