packages feed

tart 0.1 → 0.1.1

raw patch · 12 files changed

+76/−45 lines, 12 files

Files

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