module Manatee.Action.Tabbar where
import Data.List (find)
import Data.Map (filterWithKey)
import Data.Sequence (Seq)
import Manatee.Core.Types
import Manatee.Types
import Manatee.Toolkit.General.Map
import Manatee.Toolkit.General.Seq
import qualified Data.Foldable as F
import qualified Data.Sequence as Seq
import qualified Data.Map as M
tabbarSwapTab :: PageModeName -> Int -> Int -> Tabbar -> Tabbar
tabbarSwapTab modeName currentIndex targetIndex (Tabbar tabbar) =
Tabbar $ M.mapWithKey
(\ (_, pageModeName) tabs ->
if pageModeName == modeName
then swap currentIndex targetIndex tabs
else tabs
) tabbar
tabbarRemoveTab :: PageModeName -> Int -> Tabbar -> Tabbar
tabbarRemoveTab modeName index (Tabbar tabbar) =
Tabbar $ M.mapWithKey
(\ (_, pageModeName) tabs ->
if pageModeName == modeName
then deleteAt index tabs
else tabs
) tabbar
tabbarAddTab :: WindowId -> PageModeName -> Tab -> Tabbar -> Tabbar
tabbarAddTab windowId modeName newTab (Tabbar tabbar) = Tabbar newTabbar
where matchTab = findMinMatch tabbar (\(winId, _) _ -> winId == windowId)
sequence = case matchTab of
Nothing -> Seq.singleton newTab
Just (_, seq) -> replaceOrAdd (\x -> tabPageId x == tabPageId newTab) newTab seq
newTabbar = M.insert (windowId, modeName) sequence tabbar
tabbarRemoveTabs :: WindowId -> Tabbar -> Tabbar
tabbarRemoveTabs windowId (Tabbar tabbar) = Tabbar newTabbar
where newTabbar = filterWithKey (\(winId, _) _ -> winId /= windowId) tabbar
tabbarGetTab :: PagePlugId -> Tabbar -> Maybe Tab
tabbarGetTab plugId (Tabbar tabbar) =
find (\ tab -> tabPlugId tab == plugId) allTabs
where allTabList = map snd $ M.toList tabbar
allTabs = concatMap F.toList allTabList
tabbarGetTabInfo :: Tabbar -> WindowId -> Maybe (PageModeName, Seq Tab)
tabbarGetTabInfo (Tabbar tabbar) windowId = info
where matchTab = findMinMatch tabbar (\ (wId, _) _ -> wId == windowId)
info = case matchTab of
Nothing -> Nothing
Just ((_, name), tabs) -> Just (name, tabs)
tabbarGetPageModeName :: Tabbar -> WindowId -> Maybe PageModeName
tabbarGetPageModeName tabbar windowId =
maybe Nothing (Just . fst) (tabbarGetTabInfo tabbar windowId)
tabbarGetTabSeq :: Tabbar -> WindowId -> Maybe (Seq Tab)
tabbarGetTabSeq tabbar windowId =
maybe Nothing (Just . snd) (tabbarGetTabInfo tabbar windowId)
tabbarGetTabList :: WindowId -> Tabbar -> [Tab]
tabbarGetTabList windowId tabbar =
maybe [] F.toList (tabbarGetTabSeq tabbar windowId)