@@ -19,17 +19,45 @@ import qualified Data.Text as T
1919import qualified Data.Text.Zipper as TZ
2020import qualified Graphics.Vty as V
2121import Reflex
22+import Reflex.Network
2223import Reflex.Class.Switchable
2324import Reflex.NotReady.Class
2425import Reflex.Vty
2526
27+data Example = Example_TextEditor
28+ | Example_Todo
29+ deriving (Show, Read, Eq, Ord, Enum, Bounded)
30+
2631main :: IO ()
2732main = mainWidget $ do
2833 inp <- input
34+ size <- displaySize
2935 tellShutdown . fforMaybe inp $ \case
3036 V.EvKey (V.KChar 'c') [V.MCtrl] -> Just ()
3137 _ -> Nothing
38+ let buttons = do
39+ text $ pure "Select an example. Ctrl+c to quit."
40+ let region1 = ffor size $ \(w,h) ->
41+ Region (w `div` 6) (h `div` 6) (w `div` 6) (h `div` 6)
42+ region2 = ffor size $ \(w,h) ->
43+ Region (2 * w `div` 6) (h `div` 6) (w `div` 6) (h `div` 6)
44+ todo' <- pane region1 (pure True) $ button "Todo List"
45+ editor <- pane region2 (pure True) $ button "Text Editor"
46+ return $ leftmost
47+ [ Example_TextEditor <$ editor
48+ , Example_Todo <$ todo'
49+ ]
50+ rec out <- networkHold buttons $ ffor (switch $ current out) $ \case
51+ Example_TextEditor -> testBoxes >> return never
52+ Example_Todo -> taskList >> return never
53+ return ()
54+
55+taskList
56+ :: (Reflex t, MonadHold t m, MonadFix m, Adjustable t m, NotReady t m, PostBuild t m)
57+ => VtyWidget t m ()
58+taskList = do
3259 let btn = button $ pure "Add another task"
60+ inp <- input
3361 rec let todos' = todos [Todo "First" True, Todo "Second" False, Todo "Third" False] $ leftmost
3462 [ () <$ e
3563 , fforMaybe inp $ \case
@@ -41,7 +69,7 @@ main = mainWidget $ do
4169 return ()
4270
4371testBoxes :: (Reflex t, MonadHold t m, MonadFix m) => VtyWidget t m ()
44−testBoxes = do
72+testBoxes = do
4573 size <- displaySize
4674 let region1 = fmap (\(w,h) -> Region (w `div` 6) (h `div` 6) (w `div` 2) (h `div` 2)) size
4775 region2 = fmap (\(w,h) -> Region (w `div` 4) (h `div` 4) (2 * (w `div` 3)) (2*(h `div` 3))) size