glirc-2.18: src/Client/View/UrlSelection.hs
{-|
Module : Client.View.UrlSelection
Description : URL selection module
Copyright : (c) Eric Mertens, 2016
License : ISC
Maintainer : emertens@gmail.com
This module provides a list of the URLs found in the current message
window in order to assist in selecting one to open with @/url@
-}
module Client.View.UrlSelection
( urlSelectionView
) where
import Client.State
import Client.State.Window
import Client.Image.Message
import Client.State.Focus
import Control.Lens
import Data.Text (Text)
import Graphics.Vty.Image
import Text.Read (readMaybe)
-- | Generate the lines used for the view when typing @/url@
urlSelectionView ::
Focus {- ^ window to search -} ->
String {- ^ argument to command -} ->
ClientState {- ^ client state -} ->
[Image] {- ^ image lines -}
urlSelectionView focus arg st =
zipWith (draw selected) [1..] (toListOf urled st)
where
urled = clientWindows . ix focus
. winMessages . each
. wlText . folding urlMatches
selected
| all (==' ') arg = 1
| Just i <- readMaybe arg = i
| otherwise = 0 -- won't match
-- | Render one line of the url list
draw ::
Int {- ^ selected index -} ->
Int {- ^ url index -} ->
Text {- ^ url text -} ->
Image {- ^ rendered line -}
draw selected i url = string attr (shows i ". ") <|>
text' attr (cleanText url)
where
attr | selected == i = withStyle defAttr reverseVideo
| otherwise = defAttr