hob-0.0.1.0: src/lib/Hob/Command/SaveCurrentTab.hs
module Hob.Command.SaveCurrentTab (
NewFileNameChooser,
saveCurrentEditorTab,
saveCurrentEditorTabHandler) where
import Control.Monad.Reader
import Graphics.UI.Gtk
import Graphics.UI.Gtk.SourceView (SourceView)
import Hob.Context
import Hob.Context.FileContext
import Hob.Context.UiContext
import Hob.Control
import Hob.Ui.Editor
type NewFileNameChooser = IO (Maybe FilePath)
saveCurrentEditorTab :: CommandHandler
saveCurrentEditorTab = CommandHandler Nothing (do
ctx <- ask
saveCurrentEditorTabHandler $ fileChooser ctx)
where
fileChooser :: Context -> IO (Maybe FilePath)
fileChooser ctx = do
dialog <- fileChooserDialogNew Nothing (Just $ mainWindow.uiContext $ ctx) FileChooserActionSave [("Cancel", ResponseCancel), ("Save", ResponseOk)]
resp <- dialogRun dialog
file <- if resp == ResponseOk then fileChooserGetFilename dialog else return Nothing
widgetDestroy dialog
return file
saveCurrentEditorTabHandler :: NewFileNameChooser -> App()
saveCurrentEditorTabHandler newFileNameChooser = do
ctx <- ask
maybeEditor <- liftIO $ getActiveEditor ctx
maybeDo (saveInContext newFileNameChooser) maybeEditor
saveInContext :: NewFileNameChooser -> SourceView -> App ()
saveInContext newFileNameChooser editor = do
ctx <- ask
liftIO $ saveEditor ctx
where fileWriter ctx = contextFileWriter . fileContext $ ctx
saveEditor ctx = do
path <- getEditorFilePath editor
case path of
Just filePath -> saveEditorContents ctx filePath
Nothing -> askForFile $ saveAsNewFile ctx
askForFile onSuccess = newFileNameChooser >>= maybe (return()) onSuccess
saveAsNewFile ctx filePath = do
saveEditorContents ctx filePath
setEditorFilePath editor $ Just filePath
updateEditorTitle editor
saveEditorContents ctx filePath = do
textBuf <- textViewGetBuffer editor
text <- get textBuf textBufferText
fileWriter ctx filePath text
textBuf `set` [textBufferModified := False]
return ()