packages feed

glirc-2.41: src/Client/View/WindowSwitch.hs

{-# Language OverloadedStrings #-}
{-|
Module      : Client.View.WindowSwitch
Description : Line renderers for window switcher
Copyright   : (c) TheDaemoness, 2024
License     : ISC
Maintainer  : emertens@gmail.com

This module renders lines used in the preview for /c
-}
module Client.View.WindowSwitch ( windowSwitchImages ) where

import           Client.Image.Focus (windowLabel)
import           Client.Image.PackedImage
import           Client.State
import           Client.State.Focus
import           Client.State.Window (winMention)
import           Control.Lens
import qualified Data.Map.Strict as Map
import           Data.List
import           Data.List.Split
import           Graphics.Vty (defAttr)

-- | Render the lines used by the @/c@ command.
windowSwitchImages ::
  String      {- ^ filter       -} ->
  Int         {- ^ window width -} ->
  ClientState {- ^ client state -} ->
  [Image']
windowSwitchImages arg w st = reverse [mconcat (intersperse gap row) | row <- chunksOf columns paddedNames]
  where
    paddedNames = map (resizeImage maxWidth) nameImages
    nameImages = map (windowLabel st) windowList
    maxWidth   = maximum (map imageWidth nameImages)
    columns    = max 1 ((w+1) `quot` (maxWidth+2))
    gap = string defAttr "  "
    windowList = sortBy activity . filter filterByFocus . Map.toAscList $ view clientWindows st
      where
        filterByFocus (focus,_) = isPrefixOfFocus arg focus
        activity (_,wa) (_,wb) = compare (view winMention wa) (view winMention wb)