Skip to content
This repository has been archived by the owner on Mar 25, 2024. It is now read-only.

Commit

Permalink
Merge branch 'release/0.7.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
smallhadroncollider committed Jan 8, 2018
2 parents d6dbed2 + a13831b commit ca0c5dc
Show file tree
Hide file tree
Showing 18 changed files with 294 additions and 149 deletions.
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# EditorConfig - http://EditorConfig.org

# top-most EditorConfig file
root = true

[*]
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = false
indent_style = space
indent_size = 4
charset = utf-8
21 changes: 14 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,34 @@ To run on Linux you'll need to install [Stack](https://docs.haskellstack.org/en/

## Controls

- `a` add a task (`Enter`/`Esc` to stop)
- `o` add a task below
- `O` add a task above
- `e`/`i` edit a task (`Enter`/`Esc` to stop)
- `a`: add a task to bottom (`Enter`/`Esc` to stop)
- `o`: add a task below
- `O`: add a task above
- `e`/`i`/`A`: edit a task (`Enter`/`Esc` to stop)
- `C`: change task
- `j`: move down
- `k`: move up
- `h`: move left
- `h`: move left
- `l`: move right
- `G`: go to bottom of list
- `1`-`9`: select list
- `J`: shift task down
- `K`: shift task up
- `H`: shift task left
- `L`/`Space`: shift task right
- `H`: shift task left (current selection follows task)
- `L`: shift task right (current selection follows task)
- `Space`: shift task right (current selection stays put)
- `D`: delete task
- `u`: undo
- `N`: new list
- `E`: edit list title (`Enter`/`Esc` to stop)
- `X`: delete list
- `<`/`>`: move list left/right
- `q`: quit

### Tips

- If you're using a simple two-column "Todo" and "Done" then use the space bar to mark an item as complete while staying in the "Todo" list. If you're using a more complicated column setup then you will want to use `H`/`L` to move tasks between columns.

## Storage

Stores in a local `taskell.json` file:
Expand Down
9 changes: 6 additions & 3 deletions src/Data/Taskell/List.hs
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@ instance ToJSON List
empty :: String -> List
empty t = List {
title = t,
tasks = S.empty
tasks = S.empty
}

new :: List -> List
new = append blank

updateTitle :: List -> String -> List
updateTitle ls s = ls { title = s }

newAt :: Int -> List -> List
newAt i l = l { tasks = (a |> blank) >< b }
where (a, b) = splitAt i $ tasks l
Expand All @@ -39,7 +42,7 @@ append t l = l { tasks = tasks l |> t }

extract :: Int -> List -> Maybe (List, Task)
extract i l = do
(xs, x) <- S.extract i (tasks l)
(xs, x) <- S.extract i (tasks l)
return (l { tasks = xs }, x)

update :: Int -> (Task -> Task) -> List -> Maybe List
Expand All @@ -50,7 +53,7 @@ update i fn l = do
move :: Int -> Int -> List -> Maybe List
move from dir l = do
ts' <- S.shiftBy from dir (tasks l)
return $ l { tasks = ts' }
return $ l { tasks = ts' }

deleteTask :: Int -> List -> List
deleteTask i l = l { tasks = deleteAt i (tasks l) }
Expand Down
17 changes: 9 additions & 8 deletions src/Data/Taskell/Seq.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,24 @@ extract i xs = do
let a = deleteAt i xs
return (a, c)

splitOn :: Int -> Seq a -> Maybe (Split a)
splitOn :: Int -> Seq a -> Maybe (Split a)
splitOn i xs = do
let (a, b) = splitAt i xs
current <- b !? 0
let b' = drop 1 b
return (a, current, b')
return (a, current, b')

update :: Int -> Seq a -> a -> Seq a
update i xs x = insertAt i x $ deleteAt i xs

updateFn :: Int -> (a -> a) -> Seq a -> Maybe (Seq a)
updateFn i fn xs = do
updateFn i fn xs = do
(a, c, b) <- splitOn i xs
return ((a |> fn c) >< b)
return ((a |> fn c) >< b)

shiftBy :: Int -> Int -> Seq a -> Maybe (Seq a)
shiftBy from dir xs = do
current <- xs !? from
let r = deleteAt from xs
return $ insertAt (from + dir) current r
shiftBy from dir xs | from == 0 && dir < 0 = Nothing
| otherwise = do
current <- xs !? from
let r = deleteAt from xs
return $ insertAt (from + dir) current r
3 changes: 3 additions & 0 deletions src/Data/Taskell/Task.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ instance FromJSON Task
blank :: Task
blank = Task { description = "" }

clear :: Task -> Task
clear _ = blank

append :: Char -> Task -> Task
append c t = t { description = description t ++ [c] }

Expand Down
13 changes: 5 additions & 8 deletions src/Flow/Actions.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,20 @@ import Flow.State (State, Stateful, Mode(..), mode, setSize)
import Data.Maybe (fromMaybe)

import qualified Flow.Actions.Normal as Normal
import qualified Flow.Actions.Insert as Insert
import qualified Flow.Actions.CreateList as CreateList
import qualified Flow.Actions.Edit as Edit

-- takes an event and returns a Maybe State
event' :: Event -> Stateful
event' :: Event -> Stateful

-- always handle resize, no matter the mode
event' (EvResize w h) s = setSize w h s

-- for other events pass through to relevant modules
event' e s = case mode s of
Insert -> Insert.event e s
Normal -> Normal.event e s
CreateList _ -> CreateList.event e s
Edit _ -> Edit.event e s
_ -> return s


-- returns new state if successful
-- returns new state if successful
event :: Event -> State -> State
event e s = fromMaybe s $ event' e s
event e s = fromMaybe s $ event' e s
11 changes: 0 additions & 11 deletions src/Flow/Actions/CreateList.hs

This file was deleted.

19 changes: 19 additions & 0 deletions src/Flow/Actions/Edit.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module Flow.Actions.Edit (event) where

import Graphics.Vty.Input.Events (Event)
import Flow.State (Stateful, Mode(..), EditMode(..), mode)

import qualified Flow.Actions.Edit.CreateTask as CreateTask
import qualified Flow.Actions.Edit.EditTask as EditTask
import qualified Flow.Actions.Edit.CreateList as CreateList
import qualified Flow.Actions.Edit.EditList as EditList

event :: Event -> Stateful

-- for other events pass through to relevant modules
event e s = case mode s of
Edit CreateTask -> CreateTask.event e s
Edit EditTask -> EditTask.event e s
Edit EditList -> EditList.event e s
Edit (CreateList _) -> CreateList.event e s
_ -> return s
11 changes: 11 additions & 0 deletions src/Flow/Actions/Edit/CreateList.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module Flow.Actions.Edit.CreateList (event) where

import Graphics.Vty.Input.Events
import Flow.State (Stateful, write, createListFinish, normalMode, createListBS, createListChar)

event :: Event -> Stateful
event (EvKey KEnter _) = (write =<<) . createListFinish
event (EvKey KEsc _) = normalMode
event (EvKey KBS _) = createListBS
event (EvKey (KChar char) _) = createListChar char
event _ = return
11 changes: 11 additions & 0 deletions src/Flow/Actions/Edit/CreateTask.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module Flow.Actions.Edit.CreateTask (event) where

import Graphics.Vty.Input.Events
import Flow.State (Stateful, write, below, store, normalMode, insertBS, insertCurrent)

event :: Event -> Stateful
event (EvKey KEnter _) = (write =<<) . (below =<<) . store
event (EvKey KEsc _) = (write =<<) . normalMode
event (EvKey KBS _) = insertBS
event (EvKey (KChar char) _) = insertCurrent char
event _ = return
11 changes: 11 additions & 0 deletions src/Flow/Actions/Edit/EditList.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module Flow.Actions.Edit.EditList (event) where

import Graphics.Vty.Input.Events
import Flow.State (Stateful, write, normalMode, editListBS, editListChar)

event :: Event -> Stateful
event (EvKey KEnter _) = (write =<<) . normalMode
event (EvKey KEsc _) = (write =<<) . normalMode
event (EvKey KBS _) = editListBS
event (EvKey (KChar char) _) = editListChar char
event _ = return
11 changes: 11 additions & 0 deletions src/Flow/Actions/Edit/EditTask.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module Flow.Actions.Edit.EditTask (event) where

import Graphics.Vty.Input.Events
import Flow.State (Stateful, write, normalMode, insertBS, insertCurrent)

event :: Event -> Stateful
event (EvKey KEnter _) = (write =<<) . normalMode
event (EvKey KEsc _) = (write =<<) . normalMode
event (EvKey KBS _) = insertBS
event (EvKey (KChar char) _) = insertCurrent char
event _ = return
11 changes: 0 additions & 11 deletions src/Flow/Actions/Insert.hs

This file was deleted.

19 changes: 11 additions & 8 deletions src/Flow/Actions/Normal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,24 @@ import Graphics.Vty.Input.Events
import Data.Char (isDigit)
import Flow.State

-- Normal
-- Normal
event :: Event -> Stateful

-- quit
event (EvKey (KChar 'q') _) = quit

-- add/edit
event (EvKey (KChar 'e') _) = (startInsert =<<) . store
event (EvKey (KChar 'i') _) = (startInsert =<<) . store
event (EvKey (KChar 'a') _) = (startInsert =<<) . (newItem =<<) . store
event (EvKey (KChar 'O') _) = (startInsert =<<) . (above =<<) . store
event (EvKey (KChar 'o') _) = (startInsert =<<) . (below =<<) . store
event (EvKey (KChar 'e') _) = (startEdit =<<) . store
event (EvKey (KChar 'A') _) = (startEdit =<<) . store
event (EvKey (KChar 'i') _) = (startEdit =<<) . store
event (EvKey (KChar 'C') _) = (startEdit =<<) . (clearItem =<<) . store
event (EvKey (KChar 'a') _) = (startCreate =<<) . (newItem =<<) . store
event (EvKey (KChar 'O') _) = (startCreate =<<) . (above =<<) . store
event (EvKey (KChar 'o') _) = (startCreate =<<) . (below =<<) . store

-- add list
event (EvKey (KChar 'N') _) = (createListStart =<<) . store
event (EvKey (KChar 'E') _) = (editListStart =<<) . store
event (EvKey (KChar 'X') _) = (write =<<) . (deleteCurrentList =<<) . store

-- navigation
Expand All @@ -31,8 +34,8 @@ event (EvKey (KChar 'G') _) = bottom
-- moving items
event (EvKey (KChar 'K') _) = (write =<<) . (up =<<) . store
event (EvKey (KChar 'J') _) = (write =<<) . (down =<<) . store
event (EvKey (KChar 'H') _) = (write =<<) . (moveLeft =<<) . store
event (EvKey (KChar 'L') _) = (write =<<) . (moveRight =<<) . store
event (EvKey (KChar 'H') _) = (write =<<) . (bottom =<<) . (left =<<) . (moveLeft =<<) . store
event (EvKey (KChar 'L') _) = (write =<<) . (bottom =<<) . (right =<<) . (moveRight =<<) . store
event (EvKey (KChar ' ') _) = (write =<<) . (moveRight =<<) . store

-- removing items
Expand Down
Loading

0 comments on commit ca0c5dc

Please sign in to comment.