summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wales <mark@smallhadroncollider.com>2021-08-06 11:00:41 +0100
committerMark Wales <mark@smallhadroncollider.com>2021-08-06 11:00:41 +0100
commitfb7feee61a4538869b76060651cf5c3bc2fcf3fd (patch)
tree2e3871e208f992f90da0fd74f09c89132c2098c0
parent438c933b4e457b5870e68aa472cdac919c58f9bb (diff)
parent08a73b32ecb58eb9f75bc76d8a9c00940a1926ad (diff)
Merge branch 'release/1.11.2'1.11.2
-rwxr-xr-xdocs/_config.yml2
-rw-r--r--package.yaml2
-rw-r--r--src/Taskell/Data/Utility.hs6
-rw-r--r--src/Taskell/Events/Actions.hs2
-rw-r--r--src/Taskell/Events/Actions/Modal.hs2
-rw-r--r--src/Taskell/Events/Actions/Modal/Help.hs23
-rw-r--r--src/Taskell/Events/State.hs4
-rw-r--r--src/Taskell/Events/State/Modal/Help.hs12
-rw-r--r--src/Taskell/Events/State/Types/Mode.hs7
-rw-r--r--src/Taskell/UI/Draw/Main/StatusBar.hs2
-rw-r--r--src/Taskell/UI/Draw/Modal.hs10
-rw-r--r--src/Taskell/UI/Draw/Modal/Help.hs20
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