Skip to content

Commit b4ba310

Browse files
prompt to save on quit
1 parent 9bc64ad commit b4ba310

File tree

4 files changed

+24
-13
lines changed

4 files changed

+24
-13
lines changed

potato_flow

src/Potato/Flow/Vty/Alert.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import Reflex.Vty
2525
-- UNTESTED
2626
popupAlert :: forall t m. (MonadWidget t m, HasPotato t m)
2727
=> Event t Text
28-
-> m (Dynamic t Bool) -- ^ (file to save to, popup state)
28+
-> m (Dynamic t Bool) -- ^ (popup state)
2929
popupAlert alertEv = do
3030
-- TODO style
3131
let

src/Potato/Flow/Vty/Main.hs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ mainPFWidgetWithBypass MainPFWidgetConfig {..} bypassEvent = mdo
276276

277277

278278
let
279-
performSaveEv = attach (current $ _goatWidget_DEBUG_goatState everythingW) $ leftmost [saveAsEv, clickSaveEv]
279+
performSaveEv = attach (current $ _goatWidget_DEBUG_goatState everythingW) $ leftmost [saveAsEv, clickSaveEv, _saveBeforeExitOutput_save]
280280
finishSaveEv <- performEvent $ ffor performSaveEv $ \(gs,fn) -> liftIO $ do
281281
let
282282
spf = owlPFState_to_sPotatoFlow . _owlPFWorkspace_pFState . _goatState_workspace $ gs
@@ -330,6 +330,7 @@ mainPFWidgetWithBypass MainPFWidgetConfig {..} bypassEvent = mdo
330330
, _goatWidgetConfig_canvasSize = _paramsWidget_canvasSizeEvent (_leftWidget_paramsW leftW)
331331
, _goatWidgetConfig_newFolder = _layerWidget_newFolderEv (_leftWidget_layersW leftW)
332332
, _goatWidgetConfig_setPotatoDefaultParameters = _paramsWidget_setDefaultParamsEvent (_leftWidget_paramsW leftW)
333+
, _goatWidgetConfig_markSaved = void performSaveEv
333334

334335
-- debugging stuff
335336
, _goatWidgetConfig_setDebugLabel = never
@@ -373,27 +374,31 @@ mainPFWidgetWithBypass MainPFWidgetConfig {..} bypassEvent = mdo
373374
return (kb, stuff)
374375

375376
let
377+
doesNeedSaveOnExitEv = tag (current $ _goatWidget_unsavedChanges everythingW) $ leftmost [_appKbCmd_quit, _menuButtonsWidget_quitEv . _leftWidget_menuButtonsW $ leftW]
376378
(clickSaveEv, nothingClickSaveEv) = fanMaybe $ tag (_potatoConfig_appCurrentOpenFile potatoConfig) $ leftmost [_menuButtonsWidget_saveEv . _leftWidget_menuButtonsW $ leftW, _appKbCmd_save]
377-
clickSaveAsEv = leftmost $ [_menuButtonsWidget_saveAsEv . _leftWidget_menuButtonsW $ leftW, nothingClickSaveEv]
379+
clickSaveAsEv = leftmost $ [_menuButtonsWidget_saveAsEv . _leftWidget_menuButtonsW $ leftW, nothingClickSaveEv, _saveBeforeExitOutput_saveAs]
378380

381+
-- TODO probably have some sort of PopupManager -__-
382+
-- 1 welcome popup
379383
--(_, popupStateDyn1) <- popupPaneSimple def (postBuildEv $> welcomeWidget)
380384
(_, popupStateDyn1) <- popupPaneSimple def (never $> welcomeWidget)
381385

382-
-- TODO correct initial state (tag potatoConfig)
386+
-- 2 save as popup
383387
(saveAsEv, popupStateDyn2) <- flip runPotatoReader potatoConfig $ popupSaveAsWindow $ SaveAsWindowConfig (tag (_potatoConfig_appCurrentDirectory potatoConfig) clickSaveAsEv)
384388

389+
-- 3 alert popup
385390
let
386-
alertEv = leftmost [fmapMaybe eitherMaybeLeft finishSaveEv]
387-
popupStateDyn3 <- flip runPotatoReader potatoConfig $ popupAlert alertEv
391+
saveFailAlertEv = fmapMaybe eitherMaybeLeft finishSaveEv
392+
popupStateDyn3 <- flip runPotatoReader potatoConfig $ popupAlert saveFailAlertEv
388393

394+
-- 4 unsaved changes on quit popup
395+
(SaveBeforeExitOutput {..}, popupStateDyn4) <- flip runPotatoReader potatoConfig $ popupSaveBeforeExit (SaveBeforeExitConfig (void $ ffilter id doesNeedSaveOnExitEv))
389396

390397
let
391398
-- TODO assert that we never have more than 1 popup open at once
392399
-- block input if any popup is currently open
393-
inputCapturedByPopupBeh = current . fmap getAny . mconcat . fmap (fmap Any) $ [popupStateDyn1, popupStateDyn2, popupStateDyn3]
394-
400+
inputCapturedByPopupBeh = current . fmap getAny . mconcat . fmap (fmap Any) $ [popupStateDyn1, popupStateDyn2, popupStateDyn3, popupStateDyn4]
395401

396402

397403
-- handle escape event
398-
-- TODO we want to prompt for save first, use popupSaveBeforeExit
399-
return $ leftmost [_appKbCmd_quit, _menuButtonsWidget_quitEv . _leftWidget_menuButtonsW $ leftW]
404+
return $ void $ ffilter not doesNeedSaveOnExitEv

src/Potato/Flow/Vty/SaveAsWindow.hs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,22 +78,28 @@ data SaveBeforeExitConfig t = SaveBeforeExitConfig {
7878
_saveBeforeExitConfig_exitWithChanges :: Event t ()
7979
}
8080
data SaveBeforeExitOutput t = SaveBeforeExitOutput {
81-
_saveBeforeExitOutput_save :: Event t ()
81+
_saveBeforeExitOutput_save :: Event t FP.FilePath
8282
, _saveBeforeExitOutput_saveAs :: Event t ()
8383
}
8484

85+
-- TODO somehow allow auto save on exit
8586
popupSaveBeforeExit :: forall t m. (MonadWidget t m, HasPotato t m)
8687
=> SaveBeforeExitConfig t
8788
-> m (SaveBeforeExitOutput t, Dynamic t Bool)
8889
popupSaveBeforeExit SaveBeforeExitConfig {..} = do
90+
mopenfilebeh <- fmap _potatoConfig_appCurrentOpenFile askPotato
91+
mopenfile <- sample mopenfilebeh
92+
8993
-- TODO style everything
9094
let
9195
popupSaveBeforeExitEv = ffor _saveBeforeExitConfig_exitWithChanges $ \f0 -> mdo
9296
boxTitle (constant def) "You have unsaved changes. Would you like to save?" $ do
9397
initManager_ $ col $ mdo
9498
(cancelEv, saveButtonEv, saveAsButtonEv) <- (tile . fixed) 3 $ row $ do
9599
cancelEv' <- (tile . stretch) 10 $ textButton def "cancel"
96-
saveEv' <- (tile . stretch) 10 $ textButton def "save"
100+
saveEv' <- case mopenfile of
101+
Nothing -> return never
102+
Just x -> (tile . stretch) 10 $ (const x <<$>> textButton def "save")
97103
saveAsEv' <- (tile . stretch) 10 $ textButton def "save as"
98104
return (cancelEv', saveEv', saveAsEv')
99105
return (cancelEv, align saveButtonEv saveAsButtonEv)

0 commit comments

Comments
 (0)