module Vgrep.Widget.HorizontalSplit.Internal (
HSplit (..)
, Layout (..)
, Focus (..)
, leftWidget
, rightWidget
, layout
, currentWidget
, leftWidgetFocused
, rightWidgetFocused
, (%)
) where
import Control.Lens
import Data.Ratio ((%))
data HSplit s t = HSplit
{ _leftWidget :: s
, _rightWidget :: t
, _layout :: Layout
}
data Focus = FocusLeft | FocusRight deriving (Eq)
data Layout = LeftOnly | RightOnly | Split Focus Rational deriving (Eq)
makeLenses ''HSplit
currentWidget :: Lens' (HSplit s t) (Either s t)
currentWidget = lens getCurrentWidget setCurrentWidget
where
getCurrentWidget state = case view layout state of
LeftOnly -> Left (view leftWidget state)
Split FocusLeft _ -> Left (view leftWidget state)
RightOnly -> Right (view rightWidget state)
Split FocusRight _ -> Right (view rightWidget state)
setCurrentWidget state newWidget = case (view layout state, newWidget) of
(RightOnly, Left widgetL) -> set leftWidget widgetL state
(Split FocusLeft _, Left widgetL) -> set leftWidget widgetL state
(LeftOnly, Right widgetR) -> set rightWidget widgetR state
(Split FocusRight _, Right widgetR) -> set rightWidget widgetR state
(_, _ ) -> state
leftWidgetFocused :: Traversal' (HSplit s t) s
leftWidgetFocused = currentWidget . _Left
rightWidgetFocused :: Traversal' (HSplit s t) t
rightWidgetFocused = currentWidget . _Right