{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Brick.Panes
(
Pane
, PaneState
, InitConstraints
, initPaneState
, DrawConstraints
, drawPane
, EventConstraints
, EventType
, DispatchEvent
, focusable
, handlePaneEvent
, UpdateType
, updatePane
, focus1If
, HasFocus
, getFocus
, Focused(Focused)
, focused
, Panel
, basePanel
, addToPanel
, PaneFocus( Always, Never, WhenFocused, WhenFocusedModal
, WhenFocusedModalHandlingAllEvents
)
, onPane
, onBaseState
, panelDraw
, handleFocusAndPanelEvents
, focusRingUpdate
, isPanelModal
, enteredModal
, exitedModal
, PanelMode(Normal, Modal)
, PanelTransition
, PanelOps(..)
, PaneNumber
)
where
import Control.Applicative ( (<|>) )
import qualified Data.Foldable as F
import Data.Kind ( Constraint, Type )
import qualified Data.List as L
import Data.Maybe ( fromMaybe )
import Data.Sequence ( Seq, (><) )
import qualified Data.Sequence as Seq
import Data.Type.Equality
import Data.Void ( Void, absurd )
import GHC.TypeLits
import qualified Graphics.Vty as Vty
import Lens.Micro
#if !MIN_VERSION_base(4,16,0)
import Numeric.Natural ( Natural )
#endif
import Brick
import Brick.Focus
class Pane n appEv pane | pane -> n where
data PaneState pane appEv
type UpdateType pane
type InitConstraints pane initctxt :: Constraint
initPaneState :: (InitConstraints pane i) => i -> PaneState pane appEv
type DrawConstraints pane drwctxt n :: Constraint
drawPane :: (DrawConstraints pane drawcontext n, Eq n)
=> PaneState pane appEv -> drawcontext -> Maybe (Widget n)
type EventConstraints pane evctxt :: Constraint
type EventType pane n appEv
focusable :: (EventConstraints pane eventcontext, Eq n)
=> eventcontext -> PaneState pane appEv -> Seq.Seq n
handlePaneEvent :: (EventConstraints pane eventcontext, Eq n)
=> eventcontext
-> EventType pane n appEv
-> PaneState pane appEv
-> EventM n es (PaneState pane appEv)
updatePane :: UpdateType pane
-> PaneState pane appEv
-> PaneState pane appEv
type UpdateType pane = ()
type InitConstraints pane initctxt = ()
type DrawConstraints pane drwctxt n = ()
type EventConstraints pane evctxt = ()
type EventType pane n appev = Vty.Event
focusable eventcontext
_ PaneState pane appEv
_ = Seq n
forall a. Monoid a => a
mempty
handlePaneEvent eventcontext
_ EventType pane n appEv
_ = PaneState pane appEv -> EventM n es (PaneState pane appEv)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return
updatePane UpdateType pane
_ = PaneState pane appEv -> PaneState pane appEv
forall a. a -> a
id
focus1If :: n -> Bool -> Seq.Seq n
focus1If :: forall n. n -> Bool -> Seq n
focus1If n
n Bool
b = if Bool
b then n -> Seq n
forall a. a -> Seq a
Seq.singleton n
n else Seq n
forall a. Monoid a => a
mempty
class HasFocus b n | b -> n where
getFocus :: Lens' b (Focused n)
getFocus Focused n -> f (Focused n)
f b
x = b -> Focused n -> b
forall a b. a -> b -> a
const b
x (Focused n -> b) -> f (Focused n) -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Focused n -> f (Focused n)
f (Maybe n -> Focused n
forall n. Maybe n -> Focused n
Focused Maybe n
forall a. Maybe a
Nothing)
newtype Focused n = Focused { forall n. Focused n -> Maybe n
focused :: Maybe n
}
class DispatchEvent n appev pane evtype where
dispEv :: ( Pane n appev pane
, EventConstraints pane base
, Eq n
)
=> EventType pane n appev :~: evtype
-> base -> BrickEvent n appev -> PaneState pane appev
-> EventM n es (PaneState pane appev)
instance DispatchEvent n appev pane (BrickEvent n appev) where
dispEv :: forall base es.
(Pane n appev pane, EventConstraints pane base, Eq n) =>
(EventType pane n appev :~: BrickEvent n appev)
-> base
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
dispEv EventType pane n appev :~: BrickEvent n appev
Refl base
base BrickEvent n appev
ev PaneState pane appev
s = base
-> EventType pane n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall eventcontext es.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext
-> EventType pane n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall n appEv pane eventcontext es.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext
-> EventType pane n appEv
-> PaneState pane appEv
-> EventM n es (PaneState pane appEv)
handlePaneEvent base
base BrickEvent n appev
EventType pane n appev
ev PaneState pane appev
s
instance DispatchEvent n appev pane Vty.Event where
dispEv :: forall base es.
(Pane n appev pane, EventConstraints pane base, Eq n) =>
(EventType pane n appev :~: Event)
-> base
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
dispEv EventType pane n appev :~: Event
Refl base
base BrickEvent n appev
ev PaneState pane appev
s = case BrickEvent n appev
ev of
VtyEvent Event
vev -> base
-> EventType pane n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall eventcontext es.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext
-> EventType pane n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall n appEv pane eventcontext es.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext
-> EventType pane n appEv
-> PaneState pane appEv
-> EventM n es (PaneState pane appEv)
handlePaneEvent base
base Event
EventType pane n appev
vev PaneState pane appev
s
BrickEvent n appev
_ -> PaneState pane appev -> EventM n es (PaneState pane appev)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return PaneState pane appev
s
data Panel n appev state (panes :: [Type]) where
Panel :: state -> Panel n appev state '[]
PanelWith :: ( Pane n appev pane
, DrawConstraints pane (Panel n appev state panes) n
, EventConstraints pane (Panel n appev state panes)
, DispatchEvent n appev pane (EventType pane n appev)
)
=> PaneState pane appev -> PaneFocus n
-> Panel n appev state panes -> Panel n appev state (pane ': panes)
basePanel :: state -> Panel n appev state '[]
basePanel :: forall state n appev. state -> Panel n appev state '[]
basePanel = state -> Panel n appev state '[]
forall state n appev. state -> Panel n appev state '[]
Panel
addToPanel :: Pane n appev pane
=> InitConstraints pane (Panel n appev state panes)
=> DrawConstraints pane (Panel n appev state panes) n
=> EventConstraints pane (Panel n appev state panes)
=> DispatchEvent n appev pane (EventType pane n appev)
=> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane ': panes)
addToPanel :: forall n appev pane state (panes :: [*]).
(Pane n appev pane,
InitConstraints pane (Panel n appev state panes),
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneFocus n
-> Panel n appev state panes -> Panel n appev state (pane : panes)
addToPanel PaneFocus n
n Panel n appev state panes
pnl = PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith (Panel n appev state panes -> PaneState pane appev
forall i. InitConstraints pane i => i -> PaneState pane appev
forall n appEv pane i.
(Pane n appEv pane, InitConstraints pane i) =>
i -> PaneState pane appEv
initPaneState Panel n appev state panes
pnl) PaneFocus n
n Panel n appev state panes
pnl
data PaneFocus n =
Always
| Never
| WhenFocused
| WhenFocusedModal
| WhenFocusedModal' (FocusRing n)
| WhenFocusedModalHandlingAllEvents
| WhenFocusedModalHandlingAllEvents' (FocusRing n)
instance HasFocus appState n => HasFocus (Panel n appEv appState panes) n where
getFocus :: Lens' (Panel n appEv appState panes) (Focused n)
getFocus = (appState -> f appState)
-> Panel n appEv appState panes -> f (Panel n appEv appState panes)
forall n appev state (panes :: [*]) (f :: * -> *).
Functor f =>
(state -> f state)
-> Panel n appev state panes -> f (Panel n appev state panes)
onBaseState ((appState -> f appState)
-> Panel n appEv appState panes
-> f (Panel n appEv appState panes))
-> ((Focused n -> f (Focused n)) -> appState -> f appState)
-> (Focused n -> f (Focused n))
-> Panel n appEv appState panes
-> f (Panel n appEv appState panes)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Focused n -> f (Focused n)) -> appState -> f appState
forall b n. HasFocus b n => Lens' b (Focused n)
Lens' appState (Focused n)
getFocus
onBaseState :: Lens' (Panel n appev state panes) state
onBaseState :: forall n appev state (panes :: [*]) (f :: * -> *).
Functor f =>
(state -> f state)
-> Panel n appev state panes -> f (Panel n appev state panes)
onBaseState state -> f state
f (Panel state
s) = state -> Panel n appev state panes
state -> Panel n appev state '[]
forall state n appev. state -> Panel n appev state '[]
Panel (state -> Panel n appev state panes)
-> f state -> f (Panel n appev state panes)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> state -> f state
f state
s
onBaseState state -> f state
f (PanelWith PaneState pane appev
p PaneFocus n
n Panel n appev state panes
i) = PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
p PaneFocus n
n (Panel n appev state panes -> Panel n appev state panes)
-> f (Panel n appev state panes) -> f (Panel n appev state panes)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (state -> f state)
-> Panel n appev state panes -> f (Panel n appev state panes)
forall n appev state (panes :: [*]) (f :: * -> *).
Functor f =>
(state -> f state)
-> Panel n appev state panes -> f (Panel n appev state panes)
onBaseState state -> f state
f Panel n appev state panes
i
onPane :: forall pane n appev state panes .
PanelOps pane n appev panes state
=> Lens' (Panel n appev state panes) (PaneState pane appev)
onPane :: forall pane n appev state (panes :: [*]).
PanelOps pane n appev panes state =>
Lens' (Panel n appev state panes) (PaneState pane appev)
onPane = (Panel n appev state panes -> PaneState pane appev)
-> (Panel n appev state panes
-> PaneState pane appev -> Panel n appev state panes)
-> Lens
(Panel n appev state panes)
(Panel n appev state panes)
(PaneState pane appev)
(PaneState pane appev)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes -> PaneState pane appev
panelState @pane) (forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes
-> PaneState pane appev -> Panel n appev s panes
panelStateUpdate @pane)
class PanelOps pane n appev panes s | pane -> n where
handlePanelEvent :: (EventConstraints pane s, Eq n)
=> s -> pane -> Panel n appev s panes -> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
panelState :: Panel n appev s panes -> PaneState pane appev
panelStateUpdate :: Panel n appev s panes -> PaneState pane appev
-> Panel n appev s panes
paneNumber :: Panel n appev s panes -> PaneNumber
instance (Pane n appev pane) => PanelOps pane n appev (pane ': panes) s where
handlePanelEvent :: forall es.
(EventConstraints pane s, Eq n) =>
s
-> pane
-> Panel n appev s (pane : panes)
-> BrickEvent n appev
-> EventM n es (Panel n appev s (pane : panes))
handlePanelEvent s
s pane
_p (PanelWith PaneState pane appev
pd PaneFocus n
n Panel n appev s panes
r) BrickEvent n appev
ev =
(\PaneState pane appev
pd' -> PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd' PaneFocus n
n Panel n appev s panes
Panel n appev s panes
r) (PaneState pane appev -> Panel n appev s (pane : panes))
-> EventM n es (PaneState pane appev)
-> EventM n es (Panel n appev s (pane : panes))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (EventType pane n appev :~: EventType pane n appev)
-> s
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall base es.
(Pane n appev pane, EventConstraints pane base, Eq n) =>
(EventType pane n appev :~: EventType pane n appev)
-> base
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall n appev pane evtype base es.
(DispatchEvent n appev pane evtype, Pane n appev pane,
EventConstraints pane base, Eq n) =>
(EventType pane n appev :~: evtype)
-> base
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
dispEv EventType pane n appev :~: EventType pane n appev
forall {k} (a :: k). a :~: a
Refl s
s BrickEvent n appev
ev PaneState pane appev
PaneState pane appev
pd
panelState :: Panel n appev s (pane : panes) -> PaneState pane appev
panelState (PanelWith PaneState pane appev
pd PaneFocus n
_ Panel n appev s panes
_) = PaneState pane appev
PaneState pane appev
pd
panelStateUpdate :: Panel n appev s (pane : panes)
-> PaneState pane appev -> Panel n appev s (pane : panes)
panelStateUpdate (PanelWith PaneState pane appev
_pd PaneFocus n
n Panel n appev s panes
r) = \PaneState pane appev
pd' -> PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd' PaneFocus n
n Panel n appev s panes
Panel n appev s panes
r
paneNumber :: Panel n appev s (pane : panes) -> PaneNumber
paneNumber Panel n appev s (pane : panes)
_ = Natural -> PaneNumber
PaneNo Natural
0
instance {-# OVERLAPPABLE #-} (PanelOps pane n appev panes s) =>
PanelOps pane n appev (o ': panes) s where
handlePanelEvent :: forall es.
(EventConstraints pane s, Eq n) =>
s
-> pane
-> Panel n appev s (o : panes)
-> BrickEvent n appev
-> EventM n es (Panel n appev s (o : panes))
handlePanelEvent s
s pane
p (PanelWith PaneState pane appev
pd PaneFocus n
n Panel n appev s panes
r) BrickEvent n appev
ev =
PaneState o appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (o : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState o appev
PaneState pane appev
pd PaneFocus n
n (Panel n appev s panes -> Panel n appev s (o : panes))
-> EventM n es (Panel n appev s panes)
-> EventM n es (Panel n appev s (o : panes))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> s
-> pane
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
forall es.
(EventConstraints pane s, Eq n) =>
s
-> pane
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
forall pane n appev (panes :: [*]) s es.
(PanelOps pane n appev panes s, EventConstraints pane s, Eq n) =>
s
-> pane
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
handlePanelEvent s
s pane
p Panel n appev s panes
Panel n appev s panes
r BrickEvent n appev
ev
panelState :: Panel n appev s (o : panes) -> PaneState pane appev
panelState (PanelWith PaneState pane appev
_ PaneFocus n
_ Panel n appev s panes
r) = Panel n appev s panes -> PaneState pane appev
forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes -> PaneState pane appev
panelState Panel n appev s panes
r
panelStateUpdate :: Panel n appev s (o : panes)
-> PaneState pane appev -> Panel n appev s (o : panes)
panelStateUpdate (PanelWith PaneState pane appev
pd PaneFocus n
n Panel n appev s panes
r) =
\PaneState pane appev
pd' -> PaneState o appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (o : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState o appev
PaneState pane appev
pd PaneFocus n
n (Panel n appev s panes -> Panel n appev s (o : panes))
-> Panel n appev s panes -> Panel n appev s (o : panes)
forall a b. (a -> b) -> a -> b
$ Panel n appev s panes
-> PaneState pane appev -> Panel n appev s panes
forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes
-> PaneState pane appev -> Panel n appev s panes
panelStateUpdate Panel n appev s panes
Panel n appev s panes
r PaneState pane appev
pd'
paneNumber :: Panel n appev s (o : panes) -> PaneNumber
paneNumber (PanelWith PaneState pane appev
_ PaneFocus n
_ Panel n appev s panes
r) = PaneNumber -> PaneNumber
forall a. Enum a => a -> a
succ (PaneNumber -> PaneNumber) -> PaneNumber -> PaneNumber
forall a b. (a -> b) -> a -> b
$ forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes -> PaneNumber
paneNumber @pane Panel n appev s panes
r
instance ( TypeError
('Text "No " ':<>: 'ShowType pane ':<>: 'Text " in Panel"
':$$: 'Text "Add this pane to your Panel (or move it lower)"
':$$: 'Text "(Possibly driven by DrawConstraints)"
)
, Pane n appev pane
)
=> PanelOps pane n appev '[] s where
handlePanelEvent :: forall es.
(EventConstraints pane s, Eq n) =>
s
-> pane
-> Panel n appev s '[]
-> BrickEvent n appev
-> EventM n es (Panel n appev s '[])
handlePanelEvent = Void
-> s
-> pane
-> Panel n appev s '[]
-> BrickEvent n appev
-> EventM n es (Panel n appev s '[])
forall a. Void -> a
absurd (Void
forall a. HasCallStack => a
undefined :: Void)
panelState :: Panel n appev s '[] -> PaneState pane appev
panelState = Void -> Panel n appev s '[] -> PaneState pane appev
forall a. Void -> a
absurd (Void
forall a. HasCallStack => a
undefined :: Void)
panelStateUpdate :: Panel n appev s '[] -> PaneState pane appev -> Panel n appev s '[]
panelStateUpdate = Void
-> Panel n appev s '[]
-> PaneState pane appev
-> Panel n appev s '[]
forall a. Void -> a
absurd (Void
forall a. HasCallStack => a
undefined :: Void)
paneNumber :: Panel n appev s '[] -> PaneNumber
paneNumber = Void -> Panel n appev s '[] -> PaneNumber
forall a. Void -> a
absurd (Void
forall a. HasCallStack => a
undefined :: Void)
panelDraw :: forall pane n appev s panes .
( DrawConstraints pane (Panel n appev s panes) n
, PanelOps pane n appev panes s
, Pane n appev pane
, Eq n
)
=> Panel n appev s panes -> Maybe (Widget n)
panelDraw :: forall pane n appev s (panes :: [*]).
(DrawConstraints pane (Panel n appev s panes) n,
PanelOps pane n appev panes s, Pane n appev pane, Eq n) =>
Panel n appev s panes -> Maybe (Widget n)
panelDraw Panel n appev s panes
panel = PaneState pane appev -> Panel n appev s panes -> Maybe (Widget n)
forall drawcontext.
(DrawConstraints pane drawcontext n, Eq n) =>
PaneState pane appev -> drawcontext -> Maybe (Widget n)
forall n appEv pane drawcontext.
(Pane n appEv pane, DrawConstraints pane drawcontext n, Eq n) =>
PaneState pane appEv -> drawcontext -> Maybe (Widget n)
drawPane (forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes -> PaneState pane appev
panelState @pane Panel n appev s panes
panel) Panel n appev s panes
panel
handlePanelEvents :: Eq n
=> Panel n appev s panes
-> BrickEvent n appev
-> Focused n
-> EventM n es (Panel n appev s panes)
handlePanelEvents :: forall n appev s (panes :: [*]) es.
Eq n =>
Panel n appev s panes
-> BrickEvent n appev
-> Focused n
-> EventM n es (Panel n appev s panes)
handlePanelEvents Panel n appev s panes
panel BrickEvent n appev
ev (Focused Maybe n
focus) =
case Maybe n
focus of
Maybe n
Nothing -> Panel n appev s panes -> EventM n es (Panel n appev s panes)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return Panel n appev s panes
panel
Just n
fcs -> n
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
forall n appev s (panes :: [*]) es.
Eq n =>
n
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
go n
fcs Panel n appev s panes
panel BrickEvent n appev
ev
where
go :: Eq n
=> n -> Panel n appev s panes -> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
go :: forall n appev s (panes :: [*]) es.
Eq n =>
n
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
go n
_ p :: Panel n appev s panes
p@(Panel {}) BrickEvent n appev
_ = Panel n appev s panes -> EventM n es (Panel n appev s panes)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return Panel n appev s panes
p
go n
fcs (PanelWith PaneState pane appev
pd PaneFocus n
pf Panel n appev s panes
r) BrickEvent n appev
evnt =
let handleIt :: EventM n es (PaneState pane appev)
handleIt = (EventType pane n appev :~: EventType pane n appev)
-> Panel n appev s panes
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall base es.
(Pane n appev pane, EventConstraints pane base, Eq n) =>
(EventType pane n appev :~: EventType pane n appev)
-> base
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
forall n appev pane evtype base es.
(DispatchEvent n appev pane evtype, Pane n appev pane,
EventConstraints pane base, Eq n) =>
(EventType pane n appev :~: evtype)
-> base
-> BrickEvent n appev
-> PaneState pane appev
-> EventM n es (PaneState pane appev)
dispEv EventType pane n appev :~: EventType pane n appev
forall {k} (a :: k). a :~: a
Refl Panel n appev s panes
r BrickEvent n appev
evnt PaneState pane appev
pd
skipIt :: EventM n es (PaneState pane appev)
skipIt = PaneState pane appev -> EventM n es (PaneState pane appev)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return PaneState pane appev
pd
in do PaneState pane appev
pd' <- case PaneFocus n
pf of
PaneFocus n
Never -> EventM n es (PaneState pane appev)
skipIt
PaneFocus n
Always -> EventM n es (PaneState pane appev)
handleIt
PaneFocus n
WhenFocused -> if n
fcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
then EventM n es (PaneState pane appev)
handleIt
else EventM n es (PaneState pane appev)
skipIt
PaneFocus n
WhenFocusedModal -> if n
fcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
then EventM n es (PaneState pane appev)
handleIt
else EventM n es (PaneState pane appev)
skipIt
WhenFocusedModal' FocusRing n
_ -> if n
fcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
then EventM n es (PaneState pane appev)
handleIt
else EventM n es (PaneState pane appev)
skipIt
PaneFocus n
WhenFocusedModalHandlingAllEvents ->
if n
fcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
then EventM n es (PaneState pane appev)
handleIt
else EventM n es (PaneState pane appev)
skipIt
WhenFocusedModalHandlingAllEvents' FocusRing n
_ ->
if n
fcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
then EventM n es (PaneState pane appev)
handleIt
else EventM n es (PaneState pane appev)
skipIt
PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd' PaneFocus n
pf (Panel n appev s panes -> Panel n appev s panes)
-> EventM n es (Panel n appev s panes)
-> EventM n es (Panel n appev s panes)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> n
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
forall n appev s (panes :: [*]) es.
Eq n =>
n
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (Panel n appev s panes)
go n
fcs Panel n appev s panes
r BrickEvent n appev
evnt
handleFocusAndPanelEvents :: Eq n => Ord n
=> Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (PanelTransition, Panel n appev s panes)
handleFocusAndPanelEvents :: forall n appev s (panes :: [*]) es.
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> BrickEvent n appev
-> EventM n es (PanelTransition, Panel n appev s panes)
handleFocusAndPanelEvents Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel =
let fcs :: Maybe n
fcs = FocusRing n -> Maybe n
forall n. FocusRing n -> Maybe n
focusGetCurrent (Panel n appev s panes
panel Panel n appev s panes
-> Getting (FocusRing n) (Panel n appev s panes) (FocusRing n)
-> FocusRing n
forall s a. s -> Getting a s a -> a
^. Getting (FocusRing n) (Panel n appev s panes) (FocusRing n)
Lens' (Panel n appev s panes) (FocusRing n)
focusL)
doPanelEvHandling :: Bool
doPanelEvHandling = case Maybe n
fcs of
Maybe n
Nothing -> Bool
True
Just n
curFcs -> n -> Panel n appev s panes -> Bool
forall n appev s (panes :: [*]).
Eq n =>
n -> Panel n appev s panes -> Bool
chkEv n
curFcs Panel n appev s panes
panel
in \case
VtyEvent (Vty.EvKey (Vty.KChar Char
'\t') []) | Bool
doPanelEvHandling ->
(PanelTransition, Panel n appev s panes)
-> EventM n es (PanelTransition, Panel n appev s panes)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return (PanelTransition
forall a. Maybe a
Nothing, Panel n appev s panes
panel Panel n appev s panes
-> (Panel n appev s panes -> Panel n appev s panes)
-> Panel n appev s panes
forall a b. a -> (a -> b) -> b
& (FocusRing n -> Identity (FocusRing n))
-> Panel n appev s panes -> Identity (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL ((FocusRing n -> Identity (FocusRing n))
-> Panel n appev s panes -> Identity (Panel n appev s panes))
-> (FocusRing n -> FocusRing n)
-> Panel n appev s panes
-> Panel n appev s panes
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ FocusRing n -> FocusRing n
forall n. FocusRing n -> FocusRing n
focusNext)
VtyEvent (Vty.EvKey Key
Vty.KBackTab []) | Bool
doPanelEvHandling ->
(PanelTransition, Panel n appev s panes)
-> EventM n es (PanelTransition, Panel n appev s panes)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return (PanelTransition
forall a. Maybe a
Nothing, Panel n appev s panes
panel Panel n appev s panes
-> (Panel n appev s panes -> Panel n appev s panes)
-> Panel n appev s panes
forall a b. a -> (a -> b) -> b
& (FocusRing n -> Identity (FocusRing n))
-> Panel n appev s panes -> Identity (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL ((FocusRing n -> Identity (FocusRing n))
-> Panel n appev s panes -> Identity (Panel n appev s panes))
-> (FocusRing n -> FocusRing n)
-> Panel n appev s panes
-> Panel n appev s panes
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ FocusRing n -> FocusRing n
forall n. FocusRing n -> FocusRing n
focusPrev)
BrickEvent n appev
panelEv -> do
Panel n appev s panes
u <- Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> Panel n appev s panes
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> Panel n appev s panes
focusRingUpdate (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL (Panel n appev s panes -> Panel n appev s panes)
-> EventM n es (Panel n appev s panes)
-> EventM n es (Panel n appev s panes)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Panel n appev s panes
-> BrickEvent n appev
-> Focused n
-> EventM n es (Panel n appev s panes)
forall n appev s (panes :: [*]) es.
Eq n =>
Panel n appev s panes
-> BrickEvent n appev
-> Focused n
-> EventM n es (Panel n appev s panes)
handlePanelEvents Panel n appev s panes
panel BrickEvent n appev
panelEv (Maybe n -> Focused n
forall n. Maybe n -> Focused n
Focused Maybe n
fcs)
let fcs' :: Maybe n
fcs' = FocusRing n -> Maybe n
forall n. FocusRing n -> Maybe n
focusGetCurrent (Panel n appev s panes
u Panel n appev s panes
-> Getting (FocusRing n) (Panel n appev s panes) (FocusRing n)
-> FocusRing n
forall s a. s -> Getting a s a -> a
^. Getting (FocusRing n) (Panel n appev s panes) (FocusRing n)
Lens' (Panel n appev s panes) (FocusRing n)
focusL)
if Maybe n
fcs Maybe n -> Maybe n -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe n
fcs'
then (PanelTransition, Panel n appev s panes)
-> EventM n es (PanelTransition, Panel n appev s panes)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return (PanelTransition
forall a. Maybe a
Nothing, Panel n appev s panes
u)
else let m0 :: PanelMode
m0 = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
panelMode (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel
m1 :: PanelMode
m1 = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
panelMode (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
u
in (PanelTransition, Panel n appev s panes)
-> EventM n es (PanelTransition, Panel n appev s panes)
forall a. a -> EventM n es a
forall (m :: * -> *) a. Monad m => a -> m a
return ((PanelTransition, Panel n appev s panes)
-> EventM n es (PanelTransition, Panel n appev s panes))
-> (PanelTransition, Panel n appev s panes)
-> EventM n es (PanelTransition, Panel n appev s panes)
forall a b. (a -> b) -> a -> b
$ if PanelMode
m0 PanelMode -> PanelMode -> Bool
forall a. Eq a => a -> a -> Bool
== PanelMode
m1
then (PanelTransition
forall a. Maybe a
Nothing, Panel n appev s panes
u)
else ((PanelMode, PanelMode) -> PanelTransition
forall a. a -> Maybe a
Just (PanelMode
m0, PanelMode
m1), Panel n appev s panes
u)
where
chkEv :: Eq n => n -> Panel n appev s panes -> Bool
chkEv :: forall n appev s (panes :: [*]).
Eq n =>
n -> Panel n appev s panes -> Bool
chkEv n
curFcs = \case
Panel {} -> Bool
True
PanelWith PaneState pane appev
pd PaneFocus n
WhenFocusedModalHandlingAllEvents Panel n appev s panes
r ->
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ n
curFcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd) Bool -> Bool -> Bool
&& n -> Panel n appev s panes -> Bool
forall n appev s (panes :: [*]).
Eq n =>
n -> Panel n appev s panes -> Bool
chkEv n
curFcs Panel n appev s panes
r
PanelWith PaneState pane appev
pd (WhenFocusedModalHandlingAllEvents' FocusRing n
_) Panel n appev s panes
r ->
(Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ n
curFcs n -> Seq n -> Bool
forall a. Eq a => a -> Seq a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd) Bool -> Bool -> Bool
&& n -> Panel n appev s panes -> Bool
forall n appev s (panes :: [*]).
Eq n =>
n -> Panel n appev s panes -> Bool
chkEv n
curFcs Panel n appev s panes
r
PanelWith PaneState pane appev
_ PaneFocus n
_ Panel n appev s panes
r -> n -> Panel n appev s panes -> Bool
forall n appev s (panes :: [*]).
Eq n =>
n -> Panel n appev s panes -> Bool
chkEv n
curFcs Panel n appev s panes
r
panelMode :: Eq n
=> Ord n
=> Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
panelMode :: forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
panelMode Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel =
[n] -> Panel n appev s panes -> PanelMode
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s panes -> PanelMode
modalTgt ([n] -> [n]
forall a. Ord a => [a] -> [a]
L.sort ([n] -> [n]) -> [n] -> [n]
forall a b. (a -> b) -> a -> b
$ FocusRing n -> [n]
forall n. FocusRing n -> [n]
focusRingToList (Panel n appev s panes
panel Panel n appev s panes
-> Getting (FocusRing n) (Panel n appev s panes) (FocusRing n)
-> FocusRing n
forall s a. s -> Getting a s a -> a
^. Getting (FocusRing n) (Panel n appev s panes) (FocusRing n)
Lens' (Panel n appev s panes) (FocusRing n)
focusL)) Panel n appev s panes
panel
where
modalTgt :: Eq n
=> Ord n
=> [n] -> Panel n appev s panes -> PanelMode
modalTgt :: forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s panes -> PanelMode
modalTgt [n]
fcsRing = \case
Panel {} -> PanelMode
Normal
PanelWith PaneState pane appev
pd PaneFocus n
WhenFocusedModal Panel n appev s panes
r ->
[n] -> Panel n appev s panes -> Seq n -> PanelMode
forall n appev s (pnlpanes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s pnlpanes -> Seq n -> PanelMode
matchOrRecurse [n]
fcsRing Panel n appev s panes
r (Seq n -> PanelMode) -> Seq n -> PanelMode
forall a b. (a -> b) -> a -> b
$ Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
PanelWith PaneState pane appev
pd (WhenFocusedModal' FocusRing n
_) Panel n appev s panes
r ->
[n] -> Panel n appev s panes -> Seq n -> PanelMode
forall n appev s (pnlpanes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s pnlpanes -> Seq n -> PanelMode
matchOrRecurse [n]
fcsRing Panel n appev s panes
r (Seq n -> PanelMode) -> Seq n -> PanelMode
forall a b. (a -> b) -> a -> b
$ Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
PanelWith PaneState pane appev
pd PaneFocus n
WhenFocusedModalHandlingAllEvents Panel n appev s panes
r ->
[n] -> Panel n appev s panes -> Seq n -> PanelMode
forall n appev s (pnlpanes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s pnlpanes -> Seq n -> PanelMode
matchOrRecurse [n]
fcsRing Panel n appev s panes
r (Seq n -> PanelMode) -> Seq n -> PanelMode
forall a b. (a -> b) -> a -> b
$ Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
PanelWith PaneState pane appev
pd (WhenFocusedModalHandlingAllEvents' FocusRing n
_) Panel n appev s panes
r ->
[n] -> Panel n appev s panes -> Seq n -> PanelMode
forall n appev s (pnlpanes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s pnlpanes -> Seq n -> PanelMode
matchOrRecurse [n]
fcsRing Panel n appev s panes
r (Seq n -> PanelMode) -> Seq n -> PanelMode
forall a b. (a -> b) -> a -> b
$ Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
PanelWith PaneState pane appev
_ PaneFocus n
_ Panel n appev s panes
r -> case [n] -> Panel n appev s panes -> PanelMode
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s panes -> PanelMode
modalTgt [n]
fcsRing Panel n appev s panes
r of
PanelMode
Normal -> PanelMode
Normal
Modal PaneNumber
p -> PaneNumber -> PanelMode
Modal (PaneNumber -> PanelMode) -> PaneNumber -> PanelMode
forall a b. (a -> b) -> a -> b
$ PaneNumber -> PaneNumber
forall a. Enum a => a -> a
succ PaneNumber
p
matchOrRecurse :: Eq n => Ord n
=> [n] -> Panel n appev s pnlpanes -> Seq.Seq n -> PanelMode
matchOrRecurse :: forall n appev s (pnlpanes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s pnlpanes -> Seq n -> PanelMode
matchOrRecurse [n]
fcsRing Panel n appev s pnlpanes
r Seq n
f =
if [n]
fcsRing [n] -> [n] -> Bool
forall a. Eq a => a -> a -> Bool
== [n] -> [n]
forall a. Ord a => [a] -> [a]
L.sort (Seq n -> [n]
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList Seq n
f)
then PaneNumber -> PanelMode
Modal (Natural -> PaneNumber
PaneNo Natural
0)
else case [n] -> Panel n appev s pnlpanes -> PanelMode
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
[n] -> Panel n appev s panes -> PanelMode
modalTgt [n]
fcsRing Panel n appev s pnlpanes
r of
PanelMode
Normal -> PanelMode
Normal
Modal PaneNumber
p -> PaneNumber -> PanelMode
Modal (PaneNumber -> PanelMode) -> PaneNumber -> PanelMode
forall a b. (a -> b) -> a -> b
$ PaneNumber -> PaneNumber
forall a. Enum a => a -> a
succ PaneNumber
p
isPanelModal :: Eq n
=> Ord n
=> Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Bool
isPanelModal :: forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> Bool
isPanelModal Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel = PanelMode
Normal PanelMode -> PanelMode -> Bool
forall a. Eq a => a -> a -> Bool
/= Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> PanelMode
panelMode (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel
data PanelMode = Normal | Modal PaneNumber deriving (PanelMode -> PanelMode -> Bool
(PanelMode -> PanelMode -> Bool)
-> (PanelMode -> PanelMode -> Bool) -> Eq PanelMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PanelMode -> PanelMode -> Bool
== :: PanelMode -> PanelMode -> Bool
$c/= :: PanelMode -> PanelMode -> Bool
/= :: PanelMode -> PanelMode -> Bool
Eq)
newtype PaneNumber = PaneNo Natural deriving (PaneNumber -> PaneNumber -> Bool
(PaneNumber -> PaneNumber -> Bool)
-> (PaneNumber -> PaneNumber -> Bool) -> Eq PaneNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PaneNumber -> PaneNumber -> Bool
== :: PaneNumber -> PaneNumber -> Bool
$c/= :: PaneNumber -> PaneNumber -> Bool
/= :: PaneNumber -> PaneNumber -> Bool
Eq, Int -> PaneNumber
PaneNumber -> Int
PaneNumber -> [PaneNumber]
PaneNumber -> PaneNumber
PaneNumber -> PaneNumber -> [PaneNumber]
PaneNumber -> PaneNumber -> PaneNumber -> [PaneNumber]
(PaneNumber -> PaneNumber)
-> (PaneNumber -> PaneNumber)
-> (Int -> PaneNumber)
-> (PaneNumber -> Int)
-> (PaneNumber -> [PaneNumber])
-> (PaneNumber -> PaneNumber -> [PaneNumber])
-> (PaneNumber -> PaneNumber -> [PaneNumber])
-> (PaneNumber -> PaneNumber -> PaneNumber -> [PaneNumber])
-> Enum PaneNumber
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: PaneNumber -> PaneNumber
succ :: PaneNumber -> PaneNumber
$cpred :: PaneNumber -> PaneNumber
pred :: PaneNumber -> PaneNumber
$ctoEnum :: Int -> PaneNumber
toEnum :: Int -> PaneNumber
$cfromEnum :: PaneNumber -> Int
fromEnum :: PaneNumber -> Int
$cenumFrom :: PaneNumber -> [PaneNumber]
enumFrom :: PaneNumber -> [PaneNumber]
$cenumFromThen :: PaneNumber -> PaneNumber -> [PaneNumber]
enumFromThen :: PaneNumber -> PaneNumber -> [PaneNumber]
$cenumFromTo :: PaneNumber -> PaneNumber -> [PaneNumber]
enumFromTo :: PaneNumber -> PaneNumber -> [PaneNumber]
$cenumFromThenTo :: PaneNumber -> PaneNumber -> PaneNumber -> [PaneNumber]
enumFromThenTo :: PaneNumber -> PaneNumber -> PaneNumber -> [PaneNumber]
Enum)
type PanelTransition = Maybe (PanelMode, PanelMode)
enteredModal :: forall pane n appev state panes
. PanelOps pane n appev panes state
=> PanelTransition -> Panel n appev state panes -> Bool
enteredModal :: forall pane n appev state (panes :: [*]).
PanelOps pane n appev panes state =>
PanelTransition -> Panel n appev state panes -> Bool
enteredModal = \case
Just (PanelMode
_, Modal PaneNumber
pnum) -> (PaneNumber
pnum PaneNumber -> PaneNumber -> Bool
forall a. Eq a => a -> a -> Bool
==) (PaneNumber -> Bool)
-> (Panel n appev state panes -> PaneNumber)
-> Panel n appev state panes
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes -> PaneNumber
paneNumber @pane
PanelTransition
_ -> Bool -> Panel n appev state panes -> Bool
forall a b. a -> b -> a
const Bool
False
exitedModal :: forall pane n appev state panes
. PanelOps pane n appev panes state
=> PanelTransition -> Panel n appev state panes -> Bool
exitedModal :: forall pane n appev state (panes :: [*]).
PanelOps pane n appev panes state =>
PanelTransition -> Panel n appev state panes -> Bool
exitedModal = \case
Just (Modal PaneNumber
pnum, PanelMode
_) -> (PaneNumber
pnum PaneNumber -> PaneNumber -> Bool
forall a. Eq a => a -> a -> Bool
==) (PaneNumber -> Bool)
-> (Panel n appev state panes -> PaneNumber)
-> Panel n appev state panes
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall pane n appev (panes :: [*]) s.
PanelOps pane n appev panes s =>
Panel n appev s panes -> PaneNumber
paneNumber @pane
PanelTransition
_ -> Bool -> Panel n appev state panes -> Bool
forall a b. a -> b -> a
const Bool
False
focusRingUpdate :: (Eq n, Ord n)
=> Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> Panel n appev s panes
focusRingUpdate :: forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> Panel n appev s panes
focusRingUpdate Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel = let (Panel n appev s panes
p', [n]
r) = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> (Panel n appev s panes, [n])
forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> (Panel n appev s panes, [n])
focusableNames (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel
in Panel n appev s panes
p' Panel n appev s panes
-> (Panel n appev s panes -> Panel n appev s panes)
-> Panel n appev s panes
forall a b. a -> (a -> b) -> b
& (FocusRing n -> Identity (FocusRing n))
-> Panel n appev s panes -> Identity (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL ((FocusRing n -> Identity (FocusRing n))
-> Panel n appev s panes -> Identity (Panel n appev s panes))
-> (FocusRing n -> FocusRing n)
-> Panel n appev s panes
-> Panel n appev s panes
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ [n] -> FocusRing n -> FocusRing n
forall n. Eq n => [n] -> FocusRing n -> FocusRing n
updRing [n]
r
where
updRing :: Eq n => [n] -> FocusRing n -> FocusRing n
updRing :: forall n. Eq n => [n] -> FocusRing n -> FocusRing n
updRing [n]
nl FocusRing n
fcs =
case [n]
nl of
[] -> [n] -> FocusRing n
forall n. [n] -> FocusRing n
focusRing []
(n
n : [n]
_) ->
case FocusRing n -> Maybe n
forall n. FocusRing n -> Maybe n
focusGetCurrent FocusRing n
fcs of
Maybe n
Nothing ->
n -> FocusRing n -> FocusRing n
forall n. Eq n => n -> FocusRing n -> FocusRing n
focusSetCurrent n
n (FocusRing n -> FocusRing n) -> FocusRing n -> FocusRing n
forall a b. (a -> b) -> a -> b
$ [n] -> FocusRing n
forall n. [n] -> FocusRing n
focusRing [n]
nl
Just n
e ->
case ([n] -> Bool) -> [[n]] -> Maybe [n]
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
L.find ((n
e n -> n -> Bool
forall a. Eq a => a -> a -> Bool
==) (n -> Bool) -> ([n] -> n) -> [n] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [n] -> n
forall a. HasCallStack => [a] -> a
head) ([[n]] -> Maybe [n]) -> [[n]] -> Maybe [n]
forall a b. (a -> b) -> a -> b
$ [n] -> [[n]]
forall a. [a] -> [[a]]
rotations [n]
nl of
Just [n]
r ->
[n] -> FocusRing n
forall n. [n] -> FocusRing n
focusRing [n]
r
Maybe [n]
Nothing ->
n -> FocusRing n -> FocusRing n
forall n. Eq n => n -> FocusRing n -> FocusRing n
focusSetCurrent n
n (FocusRing n -> FocusRing n) -> FocusRing n -> FocusRing n
forall a b. (a -> b) -> a -> b
$ [n] -> FocusRing n
forall n. [n] -> FocusRing n
focusRing [n]
nl
focusableNames :: (Eq n, Ord n)
=> Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> (Panel n appev s panes, [n])
focusableNames :: forall n appev s (panes :: [*]).
(Eq n, Ord n) =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> (Panel n appev s panes, [n])
focusableNames Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel = ((Maybe [n], Panel n appev s panes), (Seq n, Seq n))
-> (Panel n appev s panes, [n])
forall {a} {a}.
Ord a =>
((Maybe [a], a), (Seq a, Seq a)) -> (a, [a])
finish (((Maybe [n], Panel n appev s panes), (Seq n, Seq n))
-> (Panel n appev s panes, [n]))
-> ((Maybe [n], Panel n appev s panes), (Seq n, Seq n))
-> (Panel n appev s panes, [n])
forall a b. (a -> b) -> a -> b
$ Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s panes
-> ((Maybe [n], Panel n appev s panes), (Seq n, Seq n))
forall n appev s (panes :: [*]) (rempanes :: [*]).
Eq n =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
subFocusable (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
panel Panel n appev s panes
panel
where
finish :: ((Maybe [a], a), (Seq a, Seq a)) -> (a, [a])
finish ((Maybe [a]
prvFcs, a
pnl), (Seq a
mdlFcs, Seq a
regFcs)) =
let reorder :: Seq a -> [a]
reorder = Seq a -> [a]
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
F.toList (Seq a -> [a]) -> (Seq a -> Seq a) -> Seq a -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Seq a -> Seq a
forall a. Ord a => Seq a -> Seq a
Seq.sort
fr :: [a]
fr = if Seq a -> Bool
forall a. Seq a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Seq a
mdlFcs
then [a] -> Maybe [a] -> [a]
forall a. a -> Maybe a -> a
fromMaybe (Seq a -> [a]
reorder Seq a
regFcs) Maybe [a]
prvFcs
else Seq a -> [a]
reorder Seq a
mdlFcs
in (a
pnl, [a]
fr)
subFocusable :: Eq n
=> Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes -> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
subFocusable :: forall n appev s (panes :: [*]) (rempanes :: [*]).
Eq n =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
subFocusable Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base = \case
i :: Panel n appev s rempanes
i@(Panel {}) -> ((Maybe [n]
forall a. Maybe a
Nothing, Panel n appev s rempanes
i), (Seq n
forall a. Monoid a => a
mempty, Seq n
forall a. Monoid a => a
mempty))
PanelWith PaneState pane appev
pd PaneFocus n
WhenFocused Panel n appev s panes
r ->
let ((Maybe [n], Panel n appev s panes)
i', (Seq n, Seq n)
ns) = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s panes
-> ((Maybe [n], Panel n appev s panes), (Seq n, Seq n))
forall n appev s (panes :: [*]) (rempanes :: [*]).
Eq n =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
subFocusable (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base Panel n appev s panes
r
ns' :: (Seq n, Seq n)
ns' = let pf :: Seq n
pf = Panel n appev s panes -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable Panel n appev s panes
r PaneState pane appev
pd
in ((Seq n, Seq n) -> Seq n
forall a b. (a, b) -> a
fst (Seq n, Seq n)
ns, Seq n
pf Seq n -> Seq n -> Seq n
forall a. Seq a -> Seq a -> Seq a
>< (Seq n, Seq n) -> Seq n
forall a b. (a, b) -> b
snd (Seq n, Seq n)
ns)
in (PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd PaneFocus n
forall n. PaneFocus n
WhenFocused (Panel n appev s panes -> Panel n appev s rempanes)
-> (Maybe [n], Panel n appev s panes)
-> (Maybe [n], Panel n appev s rempanes)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe [n], Panel n appev s panes)
i', (Seq n, Seq n)
ns')
PanelWith PaneState pane appev
pd PaneFocus n
WhenFocusedModal Panel n appev s panes
r ->
let (Maybe [n]
f', Maybe (FocusRing n)
pf', Panel n appev s panes
i', (Seq n, Seq n)
ns') = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> PaneState pane appev
-> Maybe (FocusRing n)
-> Panel n appev s panes
-> (Maybe [n], Maybe (FocusRing n), Panel n appev s panes,
(Seq n, Seq n))
forall fullpanel n appev s (panes :: [*]) rempanel
(rempanes :: [*]) pane.
(fullpanel ~ Panel n appev s panes,
rempanel ~ Panel n appev s rempanes,
EventConstraints pane rempanel, Pane n appev pane, Eq n) =>
Lens' fullpanel (FocusRing n)
-> fullpanel
-> PaneState pane appev
-> Maybe (FocusRing n)
-> rempanel
-> (Maybe [n], Maybe (FocusRing n), rempanel, (Seq n, Seq n))
goModal (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base PaneState pane appev
pd Maybe (FocusRing n)
forall a. Maybe a
Nothing Panel n appev s panes
r
pfNew :: PaneFocus n
pfNew = case Maybe (FocusRing n)
pf' of
Maybe (FocusRing n)
Nothing -> PaneFocus n
forall n. PaneFocus n
WhenFocusedModal
Just FocusRing n
x -> FocusRing n -> PaneFocus n
forall n. FocusRing n -> PaneFocus n
WhenFocusedModal' FocusRing n
x
in ((Maybe [n]
f', PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd PaneFocus n
pfNew Panel n appev s panes
i'), (Seq n, Seq n)
ns')
PanelWith PaneState pane appev
pd (WhenFocusedModal' FocusRing n
pf) Panel n appev s panes
r ->
let (Maybe [n]
f', Maybe (FocusRing n)
pf', Panel n appev s panes
i', (Seq n, Seq n)
ns') = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> PaneState pane appev
-> Maybe (FocusRing n)
-> Panel n appev s panes
-> (Maybe [n], Maybe (FocusRing n), Panel n appev s panes,
(Seq n, Seq n))
forall fullpanel n appev s (panes :: [*]) rempanel
(rempanes :: [*]) pane.
(fullpanel ~ Panel n appev s panes,
rempanel ~ Panel n appev s rempanes,
EventConstraints pane rempanel, Pane n appev pane, Eq n) =>
Lens' fullpanel (FocusRing n)
-> fullpanel
-> PaneState pane appev
-> Maybe (FocusRing n)
-> rempanel
-> (Maybe [n], Maybe (FocusRing n), rempanel, (Seq n, Seq n))
goModal (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base PaneState pane appev
pd (FocusRing n -> Maybe (FocusRing n)
forall a. a -> Maybe a
Just FocusRing n
pf) Panel n appev s panes
r
pfNew :: PaneFocus n
pfNew = case Maybe (FocusRing n)
pf' of
Maybe (FocusRing n)
Nothing -> PaneFocus n
forall n. PaneFocus n
WhenFocusedModal
Just FocusRing n
x -> FocusRing n -> PaneFocus n
forall n. FocusRing n -> PaneFocus n
WhenFocusedModal' FocusRing n
x
in ((Maybe [n]
f', PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd PaneFocus n
pfNew Panel n appev s panes
i'), (Seq n, Seq n)
ns')
PanelWith PaneState pane appev
pd PaneFocus n
WhenFocusedModalHandlingAllEvents Panel n appev s panes
r ->
let (Maybe [n]
f', Maybe (FocusRing n)
pf', Panel n appev s panes
i', (Seq n, Seq n)
ns') = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> PaneState pane appev
-> Maybe (FocusRing n)
-> Panel n appev s panes
-> (Maybe [n], Maybe (FocusRing n), Panel n appev s panes,
(Seq n, Seq n))
forall fullpanel n appev s (panes :: [*]) rempanel
(rempanes :: [*]) pane.
(fullpanel ~ Panel n appev s panes,
rempanel ~ Panel n appev s rempanes,
EventConstraints pane rempanel, Pane n appev pane, Eq n) =>
Lens' fullpanel (FocusRing n)
-> fullpanel
-> PaneState pane appev
-> Maybe (FocusRing n)
-> rempanel
-> (Maybe [n], Maybe (FocusRing n), rempanel, (Seq n, Seq n))
goModal (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base PaneState pane appev
pd Maybe (FocusRing n)
forall a. Maybe a
Nothing Panel n appev s panes
r
pfNew :: PaneFocus n
pfNew = case Maybe (FocusRing n)
pf' of
Maybe (FocusRing n)
Nothing -> PaneFocus n
forall n. PaneFocus n
WhenFocusedModalHandlingAllEvents
Just FocusRing n
x -> FocusRing n -> PaneFocus n
forall n. FocusRing n -> PaneFocus n
WhenFocusedModalHandlingAllEvents' FocusRing n
x
in ((Maybe [n]
f', PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd PaneFocus n
pfNew Panel n appev s panes
i'), (Seq n, Seq n)
ns')
PanelWith PaneState pane appev
pd (WhenFocusedModalHandlingAllEvents' FocusRing n
pf) Panel n appev s panes
r ->
let (Maybe [n]
f', Maybe (FocusRing n)
pf', Panel n appev s panes
i', (Seq n, Seq n)
ns') = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> PaneState pane appev
-> Maybe (FocusRing n)
-> Panel n appev s panes
-> (Maybe [n], Maybe (FocusRing n), Panel n appev s panes,
(Seq n, Seq n))
forall fullpanel n appev s (panes :: [*]) rempanel
(rempanes :: [*]) pane.
(fullpanel ~ Panel n appev s panes,
rempanel ~ Panel n appev s rempanes,
EventConstraints pane rempanel, Pane n appev pane, Eq n) =>
Lens' fullpanel (FocusRing n)
-> fullpanel
-> PaneState pane appev
-> Maybe (FocusRing n)
-> rempanel
-> (Maybe [n], Maybe (FocusRing n), rempanel, (Seq n, Seq n))
goModal (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base PaneState pane appev
pd (FocusRing n -> Maybe (FocusRing n)
forall a. a -> Maybe a
Just FocusRing n
pf) Panel n appev s panes
r
pfNew :: PaneFocus n
pfNew = case Maybe (FocusRing n)
pf' of
Maybe (FocusRing n)
Nothing -> PaneFocus n
forall n. PaneFocus n
WhenFocusedModalHandlingAllEvents
Just FocusRing n
x -> FocusRing n -> PaneFocus n
forall n. FocusRing n -> PaneFocus n
WhenFocusedModalHandlingAllEvents' FocusRing n
x
in ((Maybe [n]
f', PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
pd PaneFocus n
pfNew Panel n appev s panes
i'), (Seq n, Seq n)
ns')
PanelWith PaneState pane appev
x PaneFocus n
y Panel n appev s panes
r -> let ((Maybe [n], Panel n appev s panes)
i', (Seq n, Seq n)
ns) = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s panes
-> ((Maybe [n], Panel n appev s panes), (Seq n, Seq n))
forall n appev s (panes :: [*]) (rempanes :: [*]).
Eq n =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
subFocusable (FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' (Panel n appev s panes) (FocusRing n)
focusL Panel n appev s panes
base Panel n appev s panes
r
in (PaneState pane appev
-> PaneFocus n
-> Panel n appev s panes
-> Panel n appev s (pane : panes)
forall n appev pane state (panes :: [*]).
(Pane n appev pane,
DrawConstraints pane (Panel n appev state panes) n,
EventConstraints pane (Panel n appev state panes),
DispatchEvent n appev pane (EventType pane n appev)) =>
PaneState pane appev
-> PaneFocus n
-> Panel n appev state panes
-> Panel n appev state (pane : panes)
PanelWith PaneState pane appev
x PaneFocus n
y (Panel n appev s panes -> Panel n appev s rempanes)
-> (Maybe [n], Panel n appev s panes)
-> (Maybe [n], Panel n appev s rempanes)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe [n], Panel n appev s panes)
i', (Seq n, Seq n)
ns)
goModal :: fullpanel ~ Panel n appev s panes
=> rempanel ~ Panel n appev s rempanes
=> EventConstraints pane rempanel
=> Pane n appev pane
=> Eq n
=> Lens' fullpanel (FocusRing n)
-> fullpanel
-> PaneState pane appev
-> Maybe (FocusRing n)
-> rempanel
-> (Maybe [n], Maybe (FocusRing n), rempanel, (Seq n, Seq n))
goModal :: forall fullpanel n appev s (panes :: [*]) rempanel
(rempanes :: [*]) pane.
(fullpanel ~ Panel n appev s panes,
rempanel ~ Panel n appev s rempanes,
EventConstraints pane rempanel, Pane n appev pane, Eq n) =>
Lens' fullpanel (FocusRing n)
-> fullpanel
-> PaneState pane appev
-> Maybe (FocusRing n)
-> rempanel
-> (Maybe [n], Maybe (FocusRing n), rempanel, (Seq n, Seq n))
goModal Lens' fullpanel (FocusRing n)
focusL fullpanel
base PaneState pane appev
pd Maybe (FocusRing n)
pf rempanel
r =
let ((Maybe [n]
f, Panel n appev s rempanes
i'), (Seq n, Seq n)
ns) = Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
forall n appev s (panes :: [*]) (rempanes :: [*]).
Eq n =>
Lens' (Panel n appev s panes) (FocusRing n)
-> Panel n appev s panes
-> Panel n appev s rempanes
-> ((Maybe [n], Panel n appev s rempanes), (Seq n, Seq n))
subFocusable (FocusRing n -> f (FocusRing n)) -> fullpanel -> f fullpanel
(FocusRing n -> f (FocusRing n))
-> Panel n appev s panes -> f (Panel n appev s panes)
Lens' fullpanel (FocusRing n)
Lens' (Panel n appev s panes) (FocusRing n)
focusL fullpanel
Panel n appev s panes
base rempanel
Panel n appev s rempanes
r
fnms :: Seq n
fnms = rempanel -> PaneState pane appev -> Seq n
forall eventcontext.
(EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appev -> Seq n
forall n appEv pane eventcontext.
(Pane n appEv pane, EventConstraints pane eventcontext, Eq n) =>
eventcontext -> PaneState pane appEv -> Seq n
focusable rempanel
r PaneState pane appev
pd
fpred :: Bool
fpred = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Seq n -> Bool
forall a. Seq a -> Bool
Seq.null Seq n
fnms
ns' :: (Seq n, Seq n)
ns' = (Seq n
fnms Seq n -> Seq n -> Seq n
forall a. Seq a -> Seq a -> Seq a
>< (Seq n, Seq n) -> Seq n
forall a b. (a, b) -> a
fst (Seq n, Seq n)
ns, (Seq n, Seq n) -> Seq n
forall a b. (a, b) -> b
snd (Seq n, Seq n)
ns)
f' :: Maybe [n]
f' = if Bool
fpred then Maybe [n]
forall a. Maybe a
Nothing else Maybe [n]
f Maybe [n] -> Maybe [n] -> Maybe [n]
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (FocusRing n -> [n]
forall n. FocusRing n -> [n]
focusRingToList (FocusRing n -> [n]) -> Maybe (FocusRing n) -> Maybe [n]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (FocusRing n)
pf)
pf' :: Maybe (FocusRing n)
pf' = if Bool
fpred then Maybe (FocusRing n)
pf Maybe (FocusRing n) -> Maybe (FocusRing n) -> Maybe (FocusRing n)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> FocusRing n -> Maybe (FocusRing n)
forall a. a -> Maybe a
Just (fullpanel
basefullpanel
-> Getting (FocusRing n) fullpanel (FocusRing n) -> FocusRing n
forall s a. s -> Getting a s a -> a
^.Getting (FocusRing n) fullpanel (FocusRing n)
Lens' fullpanel (FocusRing n)
focusL) else Maybe (FocusRing n)
forall a. Maybe a
Nothing
in (Maybe [n]
f', Maybe (FocusRing n)
pf', rempanel
Panel n appev s rempanes
i', (Seq n, Seq n)
ns')
rotations :: [a] -> [ [a] ]
rotations :: forall a. [a] -> [[a]]
rotations [a]
l = (Int -> [a]) -> [Int] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
map Int -> [a]
rotateBy ([Int] -> [[a]]) -> [Int] -> [[a]]
forall a b. (a -> b) -> a -> b
$ [Int
0..[a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
where rotateBy :: Int -> [a]
rotateBy Int
n = ([a] -> [a] -> [a]) -> ([a], [a]) -> [a]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (([a] -> [a] -> [a]) -> [a] -> [a] -> [a]
forall a b c. (a -> b -> c) -> b -> a -> c
flip [a] -> [a] -> [a]
forall a. Semigroup a => a -> a -> a
(<>)) (([a], [a]) -> [a]) -> ([a], [a]) -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
L.splitAt Int
n [a]
l