packages feed

vimus-0.2.0: src/Vimus/Ruler.hs

{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
module Vimus.Ruler where

import           Text.Printf (printf)

import           Vimus.WindowLayout
import           Vimus.Render
import           Vimus.Widget.Type

type PositionIndicator = Maybe (Int, Int)

data Ruler = Ruler String PositionIndicator Visible
  deriving (Eq, Show)

-- | A vim-like "visible" indicator.
data Visible = All | Top | Bot | Percent Int
  deriving Eq

instance Show Visible where
  show v = case v of
    All       -> "All"
    Top       -> "Top"
    Bot       -> "Bot"
    Percent n -> printf "%2d%%" n

-- | Calculate a vim-like "visible" indicator.
visible :: Int -> Int -> Int -> Visible
visible size viewSize pos
  | topVisible && botVisible = All
  | topVisible               = Top
  | botVisible               = Bot
  | otherwise                = Percent $ (pos * 100) `div` (size - viewSize)
  where
    topVisible = pos == 0
    botVisible = size <= pos + viewSize

-- | Render ruler.
drawRuler :: Ruler -> Render ()
drawRuler (Ruler text positionIndicator visibleIndicator) = do
  WindowSize _ sizeX <- getWindowSize
  let addstr_end str = addstr 0 x str
        where x = max 0 (sizeX - length str)
  addstr 0 0 text
  addstr_end $ maybe "" (uncurry $ printf "%6d/%-6d        ") positionIndicator ++ show visibleIndicator
  chgat 0 [] RulerColor