tart 0.1 → 0.1.1
raw patch · 12 files changed
+76/−45 lines, 12 files
Files
- CHANGELOG.md +9/−3
- README.md +2/−3
- programs/App.hs +13/−10
- programs/Events.hs +1/−1
- programs/Events/AskForSaveFilename.hs +11/−8
- programs/Events/AskToSave.hs +1/−1
- programs/Events/Main.hs +1/−0
- programs/State.hs +18/−6
- programs/Types.hs +1/−1
- programs/UI.hs +1/−1
- programs/UI/AskForSaveFilename.hs +17/−10
- tart.cabal +1/−1
CHANGELOG.md view
@@ -1,5 +1,11 @@-# Revision history for tart -## 0.1 -- YYYY-mm-dd+0.1.1+----- -* First version. Released on an unsuspecting world.+ * Added a new saving UI and keybinding to trigger it (C-s). Previously+ the only opportunity to save was on quitting.++0.1+---++* First version.
README.md view
@@ -1,8 +1,6 @@ tart - terminal art program =========================== -**NOTE: This is unreleased software and is under heavy development. Use at your own risk.**- ``` _____ _ ____ _____ _ (_ _)/ \ | (_ _)| |@@ -92,7 +90,8 @@ - `C-l`: toggle visibility of layer list General:-- `q`: quit+- `q`: quit (and optionally save)+- `C-s`: save - `u`: undo - `r`: redo - OS paste: paste text into canvas
programs/App.hs view
@@ -107,16 +107,19 @@ application = App { appDraw = drawUI , appChooseCursor = \s locs ->- if | CanvasSizePrompt `elem` s^.modes -> do- cur <- focusGetCurrent (s^.canvasSizeFocus)- showCursorNamed cur locs- | AskToSave `elem` s^.modes ->- showCursorNamed AskToSaveFilenameEdit locs- | TextEntry `elem` s^.modes ->- showCursorNamed TextEntryCursor locs- | RenameLayer `elem` s^.modes ->- showCursorNamed LayerNameEditor locs- | otherwise -> Nothing+ let isSaving = any isSavingMode+ isSavingMode (AskForSaveFilename _) = True+ isSavingMode _ = False+ in if | CanvasSizePrompt `elem` s^.modes -> do+ cur <- focusGetCurrent (s^.canvasSizeFocus)+ showCursorNamed cur locs+ | isSaving (s^.modes) ->+ showCursorNamed AskToSaveFilenameEdit locs+ | TextEntry `elem` s^.modes ->+ showCursorNamed TextEntryCursor locs+ | RenameLayer `elem` s^.modes ->+ showCursorNamed LayerNameEditor locs+ | otherwise -> Nothing , appHandleEvent = handleEvent , appStartEvent = \s -> do vty <- getVtyHandle
programs/Events.hs view
@@ -58,7 +58,7 @@ CharacterSelect -> handleCharacterSelectEvent st ev CanvasSizePrompt -> handleCanvasSizePromptEvent st ev AskToSave -> handleAskToSaveEvent st ev- AskForSaveFilename -> handleAskForSaveFilenameEvent st ev+ AskForSaveFilename q -> handleAskForSaveFilenameEvent q st ev TextEntry -> handleTextEntryEvent st ev BoxStyleSelect -> handleBoxStyleSelectEvent st ev StyleSelect -> handleStyleSelectEvent st ev
programs/Events/AskForSaveFilename.hs view
@@ -13,16 +13,19 @@ import Types import State -handleAskForSaveFilenameEvent :: AppState -> BrickEvent Name e -> EventM Name (Next AppState)-handleAskForSaveFilenameEvent s (VtyEvent (V.EvKey V.KEsc [])) =- halt s-handleAskForSaveFilenameEvent s (VtyEvent (V.EvKey V.KEnter [])) = do+handleAskForSaveFilenameEvent :: Bool -> AppState -> BrickEvent Name e -> EventM Name (Next AppState)+handleAskForSaveFilenameEvent isQuitting s (VtyEvent (V.EvKey V.KEsc [])) =+ if isQuitting then halt s else continue $ popMode s+handleAskForSaveFilenameEvent isQuitting s (VtyEvent (V.EvKey V.KEnter [])) = do let [fn] = getEditContents (s^.askToSaveFilenameEdit) if T.null fn- then halt s- else quit False $ s & canvasPath .~ Just (T.unpack fn)-handleAskForSaveFilenameEvent s (VtyEvent e) =+ then if isQuitting then halt s else continue $ popMode s+ else let s' = s & canvasPath .~ Just (T.unpack fn)+ in if isQuitting+ then quit False s'+ else continue =<< (popMode <$> saveAndContinue s')+handleAskForSaveFilenameEvent _ s (VtyEvent e) = continue =<< handleEventLensed s askToSaveFilenameEdit handleEditorEvent e-handleAskForSaveFilenameEvent s _ =+handleAskForSaveFilenameEvent _ s _ = continue s
programs/Events/AskToSave.hs view
@@ -16,6 +16,6 @@ handleAskToSaveEvent s (VtyEvent (V.EvKey (V.KChar 'n') [])) = halt s handleAskToSaveEvent s (VtyEvent (V.EvKey (V.KChar 'y') [])) =- continue $ askForSaveFilename s+ continue $ askForSaveFilename True s handleAskToSaveEvent s _ = continue s
programs/Events/Main.hs view
@@ -79,6 +79,7 @@ (V.EvKey (V.KChar 'd') []) -> return $ canvasMoveRight s (V.EvKey (V.KChar 'y') []) -> return $ beginStyleSelect s (V.EvKey (V.KChar 'v') []) -> return $ beginCanvasSizePrompt s+ (V.EvKey (V.KChar 's') [V.MCtrl]) -> return $ askForSaveFilename False s (V.EvKey (V.KChar 'r') [V.MCtrl]) -> return $ beginLayerRename s (V.EvKey (V.KChar 'x') [V.MCtrl]) -> return $ deleteSelectedLayer s (V.EvKey (V.KChar 'n') [V.MCtrl]) -> return $ selectNextLayer s
programs/State.hs view
@@ -59,6 +59,7 @@ , moveCurrentLayerUp , cancelDragging , toggleLayerList+ , saveAndContinue , canvasMoveDown , canvasMoveUp@@ -368,12 +369,23 @@ if ask then continue $ askToSave s else do- let ls = snd <$> (sortOn fst $ M.toList $ s^.layers)- liftIO $ writeCanvasFiles p ls (s^.layerOrder)- (_layerName <$> snd <$> (sortOn fst $ M.toList $ s^.layerInfo))+ liftIO $ saveToDisk s p halt s False -> halt s +saveToDisk :: AppState -> FilePath -> IO ()+saveToDisk s p = do+ let ls = snd <$> (sortOn fst $ M.toList $ s^.layers)+ writeCanvasFiles p ls (s^.layerOrder)+ (_layerName <$> snd <$> (sortOn fst $ M.toList $ s^.layerInfo))++saveAndContinue :: AppState -> EventM Name AppState+saveAndContinue s = do+ case s^.canvasPath of+ Nothing -> return ()+ Just p -> liftIO $ saveToDisk s p+ return $ s & canvasDirty .~ False+ writeCanvasFiles :: FilePath -> [Canvas] -> [Int] -> [String] -> IO () writeCanvasFiles path cs order names = do let tf = TartFile cs names order@@ -385,9 +397,9 @@ askToSave s = pushMode AskToSave s -askForSaveFilename :: AppState -> AppState-askForSaveFilename s =- pushMode AskForSaveFilename $+askForSaveFilename :: Bool -> AppState -> AppState+askForSaveFilename shouldQuit s =+ pushMode (AskForSaveFilename shouldQuit) $ s & askToSaveFilenameEdit .~ applyEdit gotoEOL (editor AskToSaveFilenameEdit (Just 1) $ T.pack $ maybe "" id $ s^.canvasPath)
programs/Types.hs view
@@ -103,7 +103,7 @@ | BoxStyleSelect | CanvasSizePrompt | AskToSave- | AskForSaveFilename+ | AskForSaveFilename Bool | TextEntry | RenameLayer deriving (Eq, Show)
programs/UI.hs view
@@ -33,7 +33,7 @@ CharacterSelect -> drawCharacterSelectUI s CanvasSizePrompt -> drawCanvasSizePromptUI s AskToSave -> drawAskToSaveUI s- AskForSaveFilename -> drawAskForSaveFilenameUI s+ AskForSaveFilename q -> drawAskForSaveFilenameUI q s TextEntry -> drawTextEntryUI s BoxStyleSelect -> drawBoxStyleSelectUI s StyleSelect -> drawStyleSelectUI s
programs/UI/AskForSaveFilename.hs view
@@ -14,22 +14,29 @@ import Types import Theme -drawAskForSaveFilenameUI :: AppState -> [Widget Name]-drawAskForSaveFilenameUI s = [drawPromptWindow s]+drawAskForSaveFilenameUI :: Bool -> AppState -> [Widget Name]+drawAskForSaveFilenameUI isQuitting s = [drawPromptWindow isQuitting s] -drawPromptWindow :: AppState -> Widget Name-drawPromptWindow s =+drawPromptWindow :: Bool -> AppState -> Widget Name+drawPromptWindow isQuitting s = centerLayer $ borderWithLabel (str "Save") $ hLimit 60 $ padLeftRight 2 $ padTopBottom 1 body where- help = hBox [ str "("- , withDefAttr keybindingAttr $ str "Enter"- , str " to save and quit, "- , withDefAttr keybindingAttr $ str "Esc"- , str " to quit without saving)"- ]+ help = if isQuitting+ then hBox [ str "("+ , withDefAttr keybindingAttr $ str "Enter"+ , str " to save and quit, "+ , withDefAttr keybindingAttr $ str "Esc"+ , str " to quit without saving)"+ ]+ else hBox [ str "("+ , withDefAttr keybindingAttr $ str "Enter"+ , str " to save, "+ , withDefAttr keybindingAttr $ str "Esc"+ , str " to cancel)"+ ] body = (hCenter $ str "Save changes to:") <=> (hCenter help) <=> padTopBottom 1 fn
tart.cabal view
@@ -1,5 +1,5 @@ name: tart-version: 0.1+version: 0.1.1 synopsis: Terminal Art description: A program to make ASCII art license: BSD3