1{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE LambdaCase #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE RankNTypes #-}
6{-# LANGUAGE ScopedTypeVariables #-}
7{-# OPTIONS_GHC -threaded #-}
10import Control.Monad.Fix
11import Control.Monad.IO.Class
12import Control.Monad.Trans.Reader
14import qualified Graphics.Vty as V
19guest :: forall t m. VtyApp t m
21 dr0@(w, h) <- displaySize
22 dr <- holdDyn dr0 $ fforMaybe (e :: Event t VtyEvent) $ \case
23 V.EvResize w h -> Just (w, h)
25 let region = fmap (\(w,h) -> Region 0 0 w h) dr
26 region1 = fmap (\(w,h) -> Region (w `div` 5) (h `div` 5) (w `div` 2) (h `div` 2)) dr
27 region2 = fmap (\(w,h) -> Region (w `div` 4) (h `div` 4) (2 * (w `div` 3)) (2*(h `div` 3))) dr
28 debugRegion = fmap (\(w, _) -> Region 0 0 w 3) dr
29 events <- holdDyn "" $ show <$> e
30 let debugOut = ffor (zipDyn events debugRegion) $ \(ev, r) ->
31 box r $ \(w, _) -> wrapString w mempty ev
33 let shutdown = fforMaybe e $ \case
34 V.EvKey V.KEsc _ -> Just ()
36 output = fmap V.picForLayers $
37 current $ ffor ((,,) <$> region1 <*> region2 <*> debugOut) $ \(r1, r2, d) ->
38 let b1 = box r1 (\(w, _) -> wrapString w mempty $ take 500 $ cycle ('\n' : ['a'..'z']))
39 b2 = box r2 (\(w, _) -> wrapString w mempty $ take 500 $ cycle ('\n' : ['a'..'z']))
42 { _vtyResult_picture = output
43 , _vtyResult_shutdown = shutdown
51 tellShutdown . fforMaybe inp $ \case
52 V.EvKey V.KEsc _ -> Just ()
59testBoxes :: (Reflex t, MonadHold t m, MonadFix m) => VtyWidget t m ()
62 let region1 = fmap (\(w,h) -> Region (w `div` 6) (h `div` 6) (w `div` 2) (h `div` 2)) size
63 region2 = fmap (\(w,h) -> Region (w `div` 4) (h `div` 4) (2 * (w `div` 3)) (2*(h `div` 3))) size
64 pane region1 (constDyn False) . box $ debugInput
65 pane region2 (constDyn True) . box $
66 splitV (pure $ fractionSz 0.5) (pure (True, True)) (box debugInput) (box dragTest)
69debugInput :: (Reflex t, MonadHold t m) => VtyWidget t m ()
71 lastEvent <- hold "No event yet" . fmap show =<< input
74dragTest :: (Reflex t, MonadHold t m, MonadFix m) => VtyWidget t m ()
76 lastEvent <- hold "No event yet" . fmap show =<< drag V.BLeft
79testStringBox :: (Reflex t, Monad m) => VtyWidget t m ()
81 string . pure . take 500 $ cycle ('\n' : ['a'..'z'])
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list