brick-panes-1.0.0.0: samples/mywork/Panes/Projects.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Panes.Projects () where
import Brick
import Brick.Panes
import Brick.Widgets.Edit
import Brick.Widgets.List
import qualified Data.Sequence as Seq
import Data.Text ( Text )
import qualified Data.Text.Zipper as TZ
import qualified Data.Vector as V
import Lens.Micro
import Defs
instance Pane WName MyWorkEvent Projects where
data (PaneState Projects MyWorkEvent) = P { pL :: List WName Text
, pS :: Editor Text WName
}
type (InitConstraints Projects s) = ( HasProjects s )
type (DrawConstraints Projects s WName) = ( HasFocus s WName )
type (EventType Projects WName MyWorkEvent) = BrickEvent WName MyWorkEvent
initPaneState s = let prjs = projects $ snd $ getProjects s
pl = list WPList (V.fromList (name <$> prjs)) 1
ps = editor WPFilter (Just 1) ""
in P pl ps
drawPane ps gs =
let isFcsd = gs^.getFocus.to focused == Just WProjList
lst = renderList (const txt) isFcsd (pL ps)
srch = str "Search: " <+> renderEditor (txt . head) isFcsd (pS ps)
in Just $ vBox [ lst, fill ' ', srch ]
handlePaneEvent _ ev ps =
do ps1 <- case ev of
VtyEvent ev' -> do
r <- nestEventM' (pL ps) (handleListEvent ev')
return $ ps & pList .~ r
_ -> return ps
srch <- nestEventM' (ps ^. pSrch) (handleEditorEvent ev)
return $ ps1 & pSrch .~ srch
focusable _ _ = Seq.singleton WProjList
type (UpdateType Projects) = Projects
updatePane newprjs =
(pList %~ listReplace (V.fromList (name <$> projects newprjs)) (Just 0))
.
(pSrch . editContentsL %~ TZ.clearZipper)
pList :: Lens' (PaneState Projects MyWorkEvent) (List WName Text)
pList f ps = (\n -> ps { pL = n }) <$> f (pL ps)
pSrch :: Lens' (PaneState Projects MyWorkEvent) (Editor Text WName)
pSrch f ps = (\n -> ps { pS = n }) <$> f (pS ps)
instance HasSelection (PaneState Projects MyWorkEvent) where
selectedProject = fmap snd . listSelectedElement . pL