packages feed

yi-0.6.0: Yi/UI/TabBar.hs

module Yi.UI.TabBar where

import Data.Accessor
import qualified Data.List.PointedList.Circular as PL
import System.FilePath

import Yi.Buffer (shortIdentString)
import Yi.Window
import Yi.Editor (Editor(..)
                 ,commonNamePrefix
                 ,findBufferWith, tabsA)

-- | A TabDescr describes the properties of a UI tab independent of the particular GUI in use. 
data TabDescr = TabDescr
    {
        tabText :: String,
        tabInFocus :: Bool
    }

type TabBarDescr = PL.PointedList TabDescr

tabBarDescr :: Editor -> TabBarDescr
tabBarDescr editor = 
    let prefix = commonNamePrefix editor
        hintForTab tab = tabAbbrevTitle $ shortIdentString prefix $ findBufferWith (bufkey $ PL.focus tab) editor 
        tabDescr (tab,True) = TabDescr (hintForTab tab) True
        tabDescr (tab,False) = TabDescr (hintForTab tab) False
    in fmap tabDescr (PL.withFocus $ editor ^. tabsA)

-- FIXME: it seems that using splitDirectories can abstract the '/' handling away.
-- (Making it win32 friendly and simpler)
tabAbbrevTitle :: String -> String
tabAbbrevTitle title = if isValid title
                           then concatMap abbrev (splitPath title)
                           else title
  where abbrev "/" = "/"
        abbrev path | last path == '/' = head path : "/"
                    | otherwise        = path