From f71cee3ffaed90a27e9c98243809a8c86968bb00 Mon Sep 17 00:00:00 2001 From: depsterr Date: Tue, 14 Sep 2021 18:24:05 +0200 Subject: [PATCH] did even more work on UI! --- src/Misc.hs | 1 + src/UI.hs | 20 +++++++++++++++----- src/Widgets.hs | 29 +++++++++++++++++++---------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/Misc.hs b/src/Misc.hs index 90c9e75..1e72a34 100644 --- a/src/Misc.hs +++ b/src/Misc.hs @@ -1,5 +1,6 @@ module Misc where +infixl 3 !? (!?) :: [a] -> Int -> Maybe a [] !? i = Nothing (x:xs) !? 0 = Just x diff --git a/src/UI.hs b/src/UI.hs index 2a2dd6f..9b50e8c 100644 --- a/src/UI.hs +++ b/src/UI.hs @@ -40,13 +40,13 @@ runApp :: IO AppS runApp = defaultMain app initialState startEvent :: AppS -> EventM Ident AppS -startEvent (AppS m c e p l d err) = do +startEvent s = do -- todo move unwrapping our response structure into a function response <- liftIO getMovies - case response of - (Left msg) -> pure (AppS m c e p l d (Just (T.unpack msg))) - (Right listing) -> do - pure (AppS m c e p (Just listing) (movies listing !? c) err) + pure $ case response of + (Left msg) -> s & appError .~ Just (T.unpack msg) + (Right listing) -> s & appListing .~ Just listing + & appDetails .~ (movies listing !? s ^. appCursor) draw :: AppS -> [Widget Ident] draw s = pure $ case s ^. appMode of @@ -73,9 +73,19 @@ eventHandler s (VtyEvent (EvKey k _)) = do Search -> undefined Browse -> case k of (KChar 'q') -> halt s + (KEsc) -> halt s + (KChar 'j') -> continue (scroll Down s) (KChar 'k') -> continue (scroll Up s) + (KDown) -> continue (scroll Down s) + (KUp) -> continue (scroll Up s) + (KChar ' ') -> continue (s & appExpanded %~ not) + (KEnter) -> continue (s & appExpanded %~ not) + + (KChar '/') -> continue (s & appMode .~ Search) + (KChar 's') -> continue (s & appMode .~ Search) + _ -> continue s eventHandler s _ = continue s diff --git a/src/Widgets.hs b/src/Widgets.hs index dd38b42..1668fcc 100644 --- a/src/Widgets.hs +++ b/src/Widgets.hs @@ -1,8 +1,11 @@ +{-# LANGUAGE OverloadedStrings #-} + module Widgets where import Brick import Brick.Main import Brick.Widgets.Center +import Brick.Widgets.Table import Brick.AttrMap (attrMap) import Graphics.Vty (defAttr) import Graphics.Vty.Input.Events @@ -15,28 +18,34 @@ import Request import Misc import AppTypes +select :: Widget Ident -> Widget Ident +select = (withAttr (attrName "selected")) + widgetCons :: JSONMovie -> (Widget Ident, Int, AppS) -> (Widget Ident, Int, AppS) widgetCons m (w, i, s) = - if s ^. appCursor == i - then embed . visible . select $ + embed $ if s ^. appCursor == i + then select . visible $ if s ^. appExpanded - then expandedWidget s m i - else movieWidget s m i - else embed (movieWidget s m i) + then expandedWidget s m + else movieWidget s m + else movieWidget s m where embed x = (w <=> x, i+1, s) - select = (withAttr (attrName "selected")) movieWidgets :: AppS -> JSONListMovies -> Widget Ident movieWidgets s m = let (items, _, _) = foldr widgetCons (emptyWidget, 0, s) (movies m) in items -movieWidget :: AppS -> JSONMovie -> Int -> Widget Ident -movieWidget s m i = txt (movie_title m) <+> padLeft Max (str (show (movie_year m))) +movieWidget :: AppS -> JSONMovie -> Widget Ident +movieWidget s m = txt (movie_title m) <+> padLeft Max (str (show (movie_year m))) -expandedWidget :: AppS -> JSONMovie -> Int -> Widget Ident -expandedWidget s m i = movieWidget s m i <=> txtWrap (movie_summary m) +expandedWidget :: AppS -> JSONMovie -> Widget Ident +expandedWidget s m = movieWidget s m + <=> (padRight (Pad 3) (str "Rating") <+> str (show (movie_rating m))) + <=> (padRight (Pad 1) (str "Language") <+> txt (movie_language m)) + <=> (padRight (Pad 3) (str "Genres") <+> txt (T.intercalate ", " (movie_genres m))) + <=> (padRight (Pad 2) (str "Summary") <+> txtWrap (movie_summary m)) searchWidget :: AppS -> Widget Ident searchWidget = undefined