packages feed

ghcup-0.2.1.0: lib-tui/GHCup/Brick/Widgets/ToolInfo.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# OPTIONS_GHC -Wno-unused-record-wildcards #-}
{-# OPTIONS_GHC -Wno-unused-matches #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ViewPatterns #-}

module GHCup.Brick.Widgets.ToolInfo where

import GHCup.Brick.Widgets.Navigation ( BrickInternalState )
import GHCup.Prelude                  ( decUTF8Safe )
import GHCup.Types                    ( KeyBindings (..) )
import GHCup.Types.Optics

import qualified GHCup.Brick.Common as Common

import Brick
    ( Padding (Max), Widget (..), (<+>), (<=>) )
import Brick.Widgets.Center           ( center )
import Data.Maybe                     ( fromMaybe )
import Optics                         ( to, (%), (^.) )
import Prelude                        hiding ( appendFile )
import Text.PrettyPrint.HughesPJClass ( prettyShow )
import URI.ByteString                 ( serializeURIRef' )

import qualified Brick
import qualified Brick.Widgets.List as L
import qualified Data.Text          as T


mkTextBox :: [Widget Common.Name] -> Widget Common.Name
mkTextBox = Brick.hLimitPercent 70 . Brick.vBox . fmap (Brick.padRight Brick.Max)

draw :: BrickInternalState -> KeyBindings -> Widget Common.Name
draw (L.listSelectedElement -> (Just (_, (tool, (Just td, _))))) (KeyBindings {..}) =
  Common.frontwardLayer (T.pack (prettyShow tool) <> " details")
      $ Brick.vBox [
        center $ Brick.hLimitPercent 70 $
         (Brick.vBox . fmap (Brick.padRight (Brick.Pad 2))) [
            Brick.hBox [
              Brick.txt "Description: "
            ],
            Brick.hBox [
              Brick.txt "Homepage: "
            ],
            Brick.hBox [
              Brick.txt "Repository: "
            ],
            Brick.hBox [
              Brick.txt "Author: "
            ],
            Brick.hBox [
              Brick.txt "Maintainer: "
            ],
            Brick.hBox [
              Brick.txt "Contact: "
            ],
            Brick.hBox [
              Brick.txt "License: "
            ]
          ]
          <+>
         (Brick.vBox . fmap (Brick.padRight Brick.Max)) [
            Brick.hBox [
              Brick.txt (td ^. toolDescription)
            ],
            Brick.hBox [
              td ^. toolHomepage % to maybeURI
            ],
            Brick.hBox [
              td ^. toolRepository % to maybeURI
            ],
            Brick.hBox [
              Brick.txt (td ^. toolAuthor % to maybeString)
            ],
            Brick.hBox [
              Brick.txt (td ^. toolMaintainer % to maybeString)
            ],
            Brick.hBox [
              Brick.txt (td ^. toolContact % to maybeString)
            ],
            Brick.hBox [
              Brick.txt (td ^. toolLicense % to maybeString)
            ]
          ]
        ]
      <=> Brick.hBox [Brick.txt "Press " <+> Common.keyToWidget bQuit <+> Brick.txt " to return to Navigation"]
 where
  maybeString = T.pack . fromMaybe "-- Not specified --"
  maybeURI = maybe (Brick.txt "-- Not specified --")
               (\url -> let link = decUTF8Safe . serializeURIRef' $ url
                         in Brick.hyperlink link . Brick.txt $ link
               )
draw _ (KeyBindings {..}) =
  Common.frontwardLayer "Tool details"
      $ Brick.vBox [
        center $
         mkTextBox [
            Brick.hBox [
              Brick.txt "No details available"
            ]
          ]
        ] <=>
    Brick.hBox [Brick.txt "Press " <+> Common.keyToWidget bQuit <+> Brick.txt " to return to Navigation"]