diff options
author | Mark Wales <mark@smallhadroncollider.com> | 2021-08-06 11:00:41 +0100 |
---|---|---|
committer | Mark Wales <mark@smallhadroncollider.com> | 2021-08-06 11:00:41 +0100 |
commit | fb7feee61a4538869b76060651cf5c3bc2fcf3fd (patch) | |
tree | 2e3871e208f992f90da0fd74f09c89132c2098c0 | |
parent | 438c933b4e457b5870e68aa472cdac919c58f9bb (diff) | |
parent | 08a73b32ecb58eb9f75bc76d8a9c00940a1926ad (diff) |
Merge branch 'release/1.11.2'1.11.2
-rwxr-xr-x | docs/_config.yml | 2 | ||||
-rw-r--r-- | package.yaml | 2 | ||||
-rw-r--r-- | src/Taskell/Data/Utility.hs | 6 | ||||
-rw-r--r-- | src/Taskell/Events/Actions.hs | 2 | ||||
-rw-r--r-- | src/Taskell/Events/Actions/Modal.hs | 2 | ||||
-rw-r--r-- | src/Taskell/Events/Actions/Modal/Help.hs | 23 | ||||
-rw-r--r-- | src/Taskell/Events/State.hs | 4 | ||||
-rw-r--r-- | src/Taskell/Events/State/Modal/Help.hs | 12 | ||||
-rw-r--r-- | src/Taskell/Events/State/Types/Mode.hs | 7 | ||||
-rw-r--r-- | src/Taskell/UI/Draw/Main/StatusBar.hs | 2 | ||||
-rw-r--r-- | src/Taskell/UI/Draw/Modal.hs | 10 | ||||
-rw-r--r-- | src/Taskell/UI/Draw/Modal/Help.hs | 20 |
12 files changed, 66 insertions, 26 deletions
diff --git a/docs/_config.yml b/docs/_config.yml index c289484..0617140 100755 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -3,7 +3,7 @@ title: taskell tagline: Command-line Kanban board/task management baseurl: "" locale: "en" -version: 1.11.1 +version: 1.11.2 destination: _site/public exclude: [deployment, Capfile, log, Gemfile, Gemfile.lock] diff --git a/package.yaml b/package.yaml index 05074c9..b0b839a 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: taskell -version: '1.11.1' +version: '1.11.2' category: Command Line Tools author: Mark Wales maintainer: mark@smallhadroncollider.com diff --git a/src/Taskell/Data/Utility.hs b/src/Taskell/Data/Utility.hs new file mode 100644 index 0000000..d36f435 --- /dev/null +++ b/src/Taskell/Data/Utility.hs @@ -0,0 +1,6 @@ +module Taskell.Data.Utility where + +updateLast :: (a -> a) -> [a] -> [a] +updateLast _ [] = [] +updateLast f [k] = [f k] +updateLast f (y : ys) = y : updateLast f ys
\ No newline at end of file diff --git a/src/Taskell/Events/Actions.hs b/src/Taskell/Events/Actions.hs index b58381a..f8056f5 100644 --- a/src/Taskell/Events/Actions.hs +++ b/src/Taskell/Events/Actions.hs @@ -43,7 +43,7 @@ event actions e state = do Normal -> lookup e $ normal actions Modal (Detail _ DetailNormal) -> lookup e $ detail actions Modal Due {} -> lookup e $ due actions - Modal Help -> lookup e $ help actions + Modal (Help _) -> lookup e $ help actions _ -> Nothing fromMaybe state $ case mEv of diff --git a/src/Taskell/Events/Actions/Modal.hs b/src/Taskell/Events/Actions/Modal.hs index 20224fc..816f9c1 100644 --- a/src/Taskell/Events/Actions/Modal.hs +++ b/src/Taskell/Events/Actions/Modal.hs @@ -18,7 +18,7 @@ import qualified Taskell.Events.Actions.Modal.MoveTo as MoveTo event :: Event -> Stateful event e s = case s ^. mode of - Modal Help -> Help.event e s + Modal Help {} -> Help.event e s Modal Detail {} -> Detail.event e s Modal MoveTo -> MoveTo.event e s Modal Due {} -> Due.event e s diff --git a/src/Taskell/Events/Actions/Modal/Help.hs b/src/Taskell/Events/Actions/Modal/Help.hs index 84fb5a5..b77bca5 100644 --- a/src/Taskell/Events/Actions/Modal/Help.hs +++ b/src/Taskell/Events/Actions/Modal/Help.hs @@ -1,20 +1,27 @@ {-# LANGUAGE OverloadedLists #-} module Taskell.Events.Actions.Modal.Help - ( event - , events - ) where + ( event, + events, + ) +where import ClassyPrelude import Graphics.Vty.Input.Events import Taskell.Events.Actions.Types as A (ActionType (..)) import Taskell.Events.State -import Taskell.Events.State.Types (Stateful) -import Taskell.IO.Keyboard.Types (Actions) +import Taskell.Events.State.Modal.Help (moveHelpMenuDown, moveHelpMenuUp) +import Taskell.Events.State.Types (Stateful) +import Taskell.IO.Keyboard.Types (Actions) events :: Actions -events = [(A.Quit, quit)] +events = + [ (A.Quit, quit), + (A.MoveUp, moveHelpMenuUp), + (A.Next, moveHelpMenuUp), + (A.MoveDown, moveHelpMenuDown), + (A.Previous, moveHelpMenuDown) + ] event :: Event -> Stateful -event (EvKey _ _) = normalMode -event _ = pure +event _ = normalMode diff --git a/src/Taskell/Events/State.hs b/src/Taskell/Events/State.hs index 115a511..3475177 100644 --- a/src/Taskell/Events/State.hs +++ b/src/Taskell/Events/State.hs @@ -78,7 +78,7 @@ import Taskell.Types import qualified Taskell.Events.State.History as History (redo, store, undo) import Taskell.Events.State.Types import Taskell.Events.State.Types.Mode (InsertMode (..), InsertType (..), ModalType (..), - Mode (..)) + Mode (..), HelpScrollPosition(..)) import Taskell.UI.Draw.Field (Field, blankField, getText, textToField) type InternalStateful = State -> State @@ -405,7 +405,7 @@ appendSearch genField state = do -- help showHelp :: Stateful -showHelp = pure . (mode .~ Modal Help) +showHelp = pure . (mode .~ Modal (Help Top)) showMoveTo :: Stateful showMoveTo state = const (state & mode .~ Modal MoveTo) <$> getCurrentTask state diff --git a/src/Taskell/Events/State/Modal/Help.hs b/src/Taskell/Events/State/Modal/Help.hs new file mode 100644 index 0000000..5a382d6 --- /dev/null +++ b/src/Taskell/Events/State/Modal/Help.hs @@ -0,0 +1,12 @@ +module Taskell.Events.State.Modal.Help where + +import ClassyPrelude +import Control.Lens ((.~)) +import Taskell.Events.State.Types (Stateful, mode) +import Taskell.Events.State.Types.Mode (HelpScrollPosition (..), ModalType (Help), Mode (Modal)) + +moveHelpMenuUp :: Stateful +moveHelpMenuUp = pure . (mode .~ Modal (Help Bottom)) + +moveHelpMenuDown :: Stateful +moveHelpMenuDown = pure . (mode .~ Modal (Help Top)) diff --git a/src/Taskell/Events/State/Types/Mode.hs b/src/Taskell/Events/State/Types/Mode.hs index 7fedf10..5d64fd2 100644 --- a/src/Taskell/Events/State/Types/Mode.hs +++ b/src/Taskell/Events/State/Types/Mode.hs @@ -17,8 +17,13 @@ data DetailItem | DetailDate deriving (Eq, Show) +data HelpScrollPosition + = Top + | Bottom + deriving (Eq, Show) + data ModalType - = Help + = Help HelpScrollPosition | MoveTo | Due (Seq (Pointer, Task)) Int diff --git a/src/Taskell/UI/Draw/Main/StatusBar.hs b/src/Taskell/UI/Draw/Main/StatusBar.hs index fa10aed..2cab2bc 100644 --- a/src/Taskell/UI/Draw/Main/StatusBar.hs +++ b/src/Taskell/UI/Draw/Main/StatusBar.hs @@ -40,7 +40,7 @@ modeToText fld md = do Nothing -> "NORMAL" Just _ -> "NORMAL + SEARCH" Insert {} -> "INSERT" - Modal Help -> "HELP" + Modal (Help _) -> "HELP" Modal MoveTo -> "MOVE" Modal Detail {} -> "DETAIL" Modal Due {} -> "DUE" diff --git a/src/Taskell/UI/Draw/Modal.hs b/src/Taskell/UI/Draw/Modal.hs index aa08a95..ae29170 100644 --- a/src/Taskell/UI/Draw/Modal.hs +++ b/src/Taskell/UI/Draw/Modal.hs @@ -37,8 +37,8 @@ renderModal :: DSWidget renderModal = do md <- (^. mode) <$> asks dsState case md of - Modal Help -> surround =<< help - Modal Detail {} -> surround =<< detail - Modal MoveTo -> surround =<< moveTo - Modal (Due tasks selected) -> surround =<< due tasks selected - _ -> pure emptyWidget + Modal (Help s) -> surround =<< help s + Modal Detail {} -> surround =<< detail + Modal MoveTo -> surround =<< moveTo + Modal (Due tasks selected) -> surround =<< due tasks selected + _ -> pure emptyWidget diff --git a/src/Taskell/UI/Draw/Modal/Help.hs b/src/Taskell/UI/Draw/Modal/Help.hs index ee3a490..635631b 100644 --- a/src/Taskell/UI/Draw/Modal/Help.hs +++ b/src/Taskell/UI/Draw/Modal/Help.hs @@ -8,12 +8,13 @@ import Brick import Data.Text as T (justifyRight) import Taskell.Events.Actions.Types as A (ActionType (..)) -import Taskell.IO.Keyboard.Types (bindingsToText) -import Taskell.IO.Keyboard.Types (Bindings) +import Taskell.IO.Keyboard.Types (Bindings, bindingsToText) import Taskell.UI.Draw.Field (textField) import Taskell.UI.Draw.Types (DrawState (dsBindings), ModalWidget, TWidget) import Taskell.UI.Theme (taskCurrentAttr) +import qualified Taskell.Events.State.Types.Mode as M +import Taskell.Data.Utility (updateLast) descriptions :: [([ActionType], Text)] descriptions = @@ -61,10 +62,19 @@ line m (l, r) = left <+> right left = padRight (Pad 2) . withAttr taskCurrentAttr . txt $ justifyRight m ' ' l right = textField r -help :: ModalWidget -help = do +help :: M.HelpScrollPosition -> ModalWidget +help s = do bindings <- asks dsBindings let ls = format <$> generate bindings let m = foldl' max 0 $ length . fst <$> ls - let w = vBox $ line m <$> ls + let w = vBox $ applyScroll s $ line m <$> ls pure ("Controls", w) + +applyScroll :: M.HelpScrollPosition -> [TWidget] -> [TWidget] +applyScroll _ [] = [] +applyScroll sp (x:xs) = + case sp of + M.Top -> + visible x : xs + M.Bottom -> + updateLast visible xs |