packages feed

brick-tabular-list-2.0.0.0: src/Brick/Widgets/TabularList/Internal/Common.hs

module Brick.Widgets.TabularList.Internal.Common (
  AvailHeight(..)
, visibleRowIdx
, sz
) where

import Brick.Widgets.TabularList.Types
-- base
import Data.Maybe (fromMaybe, catMaybes)
import Data.Foldable (toList)
-- Third party libraries
import Lens.Micro
import Data.Sequence (Seq)
-- Brick
import Brick.Widgets.List
import Brick.Types
import Brick.Widgets.Core

-- | Height available for 'GenericList'
newtype AvailHeight = AvlH Int deriving (Show, Eq)

-- | Return visible rows and their row indexes.
--
-- The visible rows are rows that are visible when the current row is either at the top or the bottom.
visibleRowIdx :: GenericList n Seq e -> AvailHeight -> ([e], [Index])
visibleRowIdx l (AvlH h) = let
  idx = fromMaybe 0 (l^.listSelectedL)
  numPerHeight = case h `divMod` (l^.listItemHeightL) of
    (nph, 0) -> nph
    (nph, _) -> nph + 1
  -- If the current row is at the bottom, the start should be visible.
  start = max 0 $ idx - numPerHeight + 1
  -- If the current row is at the top, the row at start + length - 1 should be visible.
  length = numPerHeight * 2
  rows = toList $ slice start length $ l^.listElementsL
  in (rows, [Ix start..])

-- | It is a shortened version of 'setAvailableSize'.
sz :: (Int, Int) -> Widget n -> Widget n
sz (w, h) = if w <= 0 then const emptyWidget else setAvailableSize (w, h)