hob-0.0.1.0: src/lib/Hob/Command/NewTab.hs
module Hob.Command.NewTab (
launchNewFileEditor,
editNewFile,
editNewFileCommandHandler,
NewFileEditorLauncher) where
import Control.Monad.Reader
import Data.Maybe (mapMaybe)
import Data.Text (pack)
import Graphics.UI.Gtk
import Hob.Context
import Hob.Context.FileContext
import Hob.Context.UiContext
import Hob.Control
import Hob.Ui.Editor
type NewFileEditorLauncher = FilePath -> IO ()
editNewFileCommandHandler :: CommandHandler
editNewFileCommandHandler = CommandHandler Nothing editNewFile
launchNewFileEditor :: Context -> Notebook -> NewFileEditorLauncher
launchNewFileEditor ctx targetNotebook filePath = do
let fileLoader = contextFileLoader . fileContext $ ctx
currentEditors <- mapM getEditorFromNotebookTab <=< containerGetChildren $ targetNotebook
editorsForFile <- filterM (\(_, ed) -> isEditorFileMatching ed ) $ numberedJusts currentEditors
case alreadyLoadedPage editorsForFile of
Just nr -> notebookSetCurrentPage targetNotebook nr
Nothing -> maybeDo launchEditor =<< fileLoader filePath
where launchEditor text = deferredRunner ctx $ newEditorForText targetNotebook (Just filePath) text
isEditorFileMatching editor = do
f <- getEditorFilePath editor
return $ maybe False (filePath ==) f
alreadyLoadedPage [(nr, _)] = Just nr
alreadyLoadedPage _ = Nothing
editNewFile :: App()
editNewFile = do
ctx <- ask
let tabbed = mainNotebook.uiContext $ ctx
newEditorForText tabbed Nothing $ pack ""
liftTupledMaybe :: (a, Maybe b) -> Maybe (a, b)
liftTupledMaybe (x, Just y) = Just (x, y)
liftTupledMaybe (_, Nothing) = Nothing
numberedJusts :: [Maybe a] -> [(Int, a)]
numberedJusts a = mapMaybe liftTupledMaybe $ zip [0..] a