@@ -64,6 +64,10 @@ module Reflex.Vty.Widget
64 , doubleBoxStyle
64 , doubleBoxStyle
69import Control.Applicative (liftA2)
73import Control.Applicative (liftA2)
@@ -72,6 +76,9 @@ import Control.Monad.Fix (MonadFix)
72import Control.Monad.Trans (lift)
76import Control.Monad.Trans (lift)
73import Control.Monad.Trans.Reader (ReaderT, runReaderT, asks, ask)
77import Control.Monad.Trans.Reader (ReaderT, runReaderT, asks, ask)
74import Data.Default (Default(..))
78import Data.Default (Default(..))
79+import Data.Monoid (Sum(..))
81+import qualified Data.Set as Set
75import Data.Text (Text)
82import Data.Text (Text)
76import qualified Data.Text as T
83import qualified Data.Text as T
77import qualified Data.Text.Zipper as TZ
84import qualified Data.Text.Zipper as TZ
@@ -364,6 +371,26 @@ data MouseUp = MouseUp
365 deriving (Eq, Ord, Show)
372 deriving (Eq, Ord, Show)
374+type KeyCombo = (V.Key, [V.Modifier])
376+key :: (Monad m, Reflex t) => V.Key -> VtyWidget t m (Event t KeyCombo)
377+key = keyCombos . Set.singleton . (,[])
379+keys :: (Monad m, Reflex t) => [V.Key] -> VtyWidget t m (Event t KeyCombo)
380+keys = keyCombos . Set.fromList . fmap (,[])
383+ :: (Reflex t, Monad m)
385+ -> VtyWidget t m (Event t KeyCombo)
388+ return $ fforMaybe i $ \case
389+ V.EvKey k m -> if Set.member (k, m) ks
367-- | A plain split of the available space into vertically stacked panes.
394-- | A plain split of the available space into vertically stacked panes.
368-- No visual separator is built in here.
395-- No visual separator is built in here.
369splitV :: (Reflex t, Monad m)
396splitV :: (Reflex t, Monad m)
@@ -577,33 +604,37 @@ data Direction = Direction_Column
577 | Direction_Row
604 | Direction_Row
578 deriving (Show, Read, Eq, Ord)
605 deriving (Show, Read, Eq, Ord)
580−newtype StackWidget t m a = StackWidget { unStackWidget :: Direction -> VtyWidget t m (Dynamic t Int, a) }
607+newtype StackWidget t m a = StackWidget { unStackWidget :: ReaderT Direction (DynamicWriterT t (Sum Int) (VtyWidget t m)) a }
581− deriving (Functor)
608+ deriving (Functor, MonadSample t, MonadHold t, MonadFix, NotReady t)
583instance (Reflex t, MonadFix m) => Applicative (StackWidget t m) where
610instance (Reflex t, MonadFix m) => Applicative (StackWidget t m) where
584 pure = return
611 pure = return
585 (<*>) = ap
612 (<*>) = ap
587−instance (MonadFix m, Reflex t) => Monad (StackWidget t m) where
588− w >>= g = StackWidget $ \dir -> do
589− (sz, r) <- runStackWidget dir 0 w
590− (sz', r') <- runStackWidget dir sz (g r)
591− return (sz + sz', r')
592− return x = StackWidget $ \_ -> return (0, x)
594runStackWidget
614runStackWidget
595 :: (Reflex t, MonadFix m)
615 :: (Reflex t, MonadFix m)
596 => Direction
616 => Direction
597 -> Dynamic t Int
617 -> Dynamic t Int
598 -> StackWidget t m a
618 -> StackWidget t m a
599− -> VtyWidget t m (Dynamic t Int, a)
619+ -> VtyWidget t m (Dynamic t (Sum Int), a)
600runStackWidget dir offset x = do
620runStackWidget dir offset x = do
601 mkRegion <- case dir of
621 mkRegion <- case dir of
602 Direction_Column -> (\w sz -> DynRegion 0 offset w sz) <$> displayWidth
622 Direction_Column -> (\w sz -> DynRegion 0 offset w sz) <$> displayWidth
603 Direction_Row -> (\h sz -> DynRegion offset 0 sz h) <$> displayHeight
623 Direction_Row -> (\h sz -> DynRegion offset 0 sz h) <$> displayHeight
604− rec (h, a) <- pane (mkRegion h) (pure True) $ unStackWidget x dir
624+ rec (a, h) <- pane (mkRegion h') (pure True) $ runDynamicWriterT $ runReaderT (unStackWidget x) dir
625+ let h' = getSum <$> h
605 return (h, a)
626 return (h, a)
628+instance (MonadFix m, Reflex t) => Monad (StackWidget t m) where
629+ w >>= g = StackWidget $ do
631+ (sz, r) <- lift $ lift $ runStackWidget dir 0 w
633+ (sz', r') <- lift $ lift $ runStackWidget dir (getSum <$> sz) (g r)
636+ return x = StackWidget $ return x
608 :: (Reflex t, MonadFix m)
639 :: (Reflex t, MonadFix m)
609 => Direction
640 => Direction
@@ -628,4 +659,6 @@ sized
628 => Dynamic t Int
659 => Dynamic t Int
629 -> VtyWidget t m a
660 -> VtyWidget t m a
630 -> StackWidget t m a
661 -> StackWidget t m a
631−sized sz w = StackWidget $ \_ -> (sz,) <$> w
662+sized sz w = StackWidget $ do
663+ tellDyn $ Sum <$> sz