49 lines
1.7 KiB
Haskell
49 lines
1.7 KiB
Haskell
module Dodge.SelectionList where
|
|
|
|
import Color
|
|
import Regex
|
|
import Dodge.Data.Universe
|
|
import LensHelp
|
|
import Data.Maybe
|
|
--import Data.IntMap.Strict (IntMap)
|
|
|
|
getAvailableListLines :: ListDisplayParams -> Configuration -> Int
|
|
getAvailableListLines ldps cfig = floor ((dToBot - vgap) / itmHeight)
|
|
where
|
|
vgap = ldps ^. ldpVerticalGap
|
|
itmHeight = 10 * ldps ^. ldpScale + vgap
|
|
dToBot = cfig ^. windowY - (ldps ^. ldpPosY + dFromScreenBot)
|
|
dFromScreenBot = 5 -- fromMaybe 0 $ sl ^? slSizeRestriction . ssrType . ssrFromScreenBottom
|
|
|
|
getShownItems :: SelectionList a -> [SelectionItem a]
|
|
getShownItems sl = case sl ^. slRegexList of
|
|
[] -> sl ^. slItems
|
|
xs -> fmap fst xs
|
|
|
|
makeRegexList :: SelectionList a -> [(SelectionItem a, Maybe Int)]
|
|
makeRegexList sl = case sl ^. slRegex of
|
|
"" | not (sl ^. slRegexInput) -> []
|
|
str -> (SelectionInfo
|
|
{ _siPictures = ["FILTER: "++str]
|
|
, _siHeight = 1
|
|
, _siIsSelectable = False
|
|
--, _siWidth = length $ "FILTER: "++str
|
|
, _siColor = white
|
|
, _siOffX = 0
|
|
}, Nothing) : filter (doregex str) (zip (_slItems sl) $ fmap Just [0..])
|
|
where
|
|
doregex str = regexList str . _siPictures . fst
|
|
|
|
setShownItems :: SelectionList a -> SelectionList a
|
|
setShownItems sl = sl & slRegexList .~ makeRegexList sl
|
|
|
|
moveSelectionListSelection :: Int -> SelectionList a -> SelectionList a
|
|
moveSelectionListSelection yi sl = sl & slSelPos %~ f
|
|
where
|
|
f x | maxsel == 0 = Nothing
|
|
| isNothing x = Just 0
|
|
| otherwise = fmap ((`mod` maxsel) . subtract yi) x
|
|
maxsel = case _slRegex sl of
|
|
"" -> length (_slItems sl)
|
|
_ -> length (_slRegexList sl)
|