mirror of
https://github.com/Yvee1/hascard.git
synced 2024-11-22 12:51:58 +03:00
Add centered wrapped text widget
This commit is contained in:
parent
bd2eedd52f
commit
641432b570
@ -2,6 +2,15 @@ module Main where
|
||||
|
||||
import Lib (runBrickFlashcards)
|
||||
import System.Environment (getArgs)
|
||||
import BrickHelpers
|
||||
import Brick
|
||||
import Brick.Widgets.Center
|
||||
|
||||
main :: IO ()
|
||||
main = runBrickFlashcards
|
||||
|
||||
-- test :: Widget ()
|
||||
-- test = hCenter $ myStrWrap "Heey, this is a very long string of text, well maybe not that long... but pretty long in any case."
|
||||
|
||||
-- main :: IO ()
|
||||
-- main = simpleMain test
|
@ -20,3 +20,33 @@ Part of the eye that turns _light_ into _electrical neural impulses_.
|
||||
---
|
||||
# Choroid
|
||||
The choroid seperates from sclera and becomes the _ciliary body_, and then the _iris_.
|
||||
|
||||
---
|
||||
# LGN
|
||||
_lateral geniculate nuclei_
|
||||
|
||||
---
|
||||
# LGN 6 layers
|
||||
2 layers receive signals from _M_-ganglion cells.
|
||||
4 layers receive signals from _P_-ganglion cells.
|
||||
between is a thin layers that receives signals from _K_-ganglion cells.
|
||||
|
||||
---
|
||||
# Color vision: types of cones
|
||||
Three different types of cones, for different wavelengths.
|
||||
S (short) corresponds roughly to the colour _blue_.
|
||||
M (medium) corresponds roughly to the colour _green_.
|
||||
L (long) corresponds roughly to the colour _red_.
|
||||
|
||||
---
|
||||
# Color vision: color channels
|
||||
Achromatic channel = M + L
|
||||
Blue-yellow channel = M + L - S
|
||||
Red-green channel = L + S - M
|
||||
|
||||
---
|
||||
# The visual system
|
||||
The visual system consists of two parts:
|
||||
- An optical system that produces an image on the retina.
|
||||
- An image-processing system. This spends most of its resources on the fovea.
|
||||
---
|
@ -21,7 +21,7 @@ description: Please see the README on GitHub at <https://github.com/Yvee
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
- brick
|
||||
- brick >= 0.52
|
||||
- word-wrap
|
||||
- vty
|
||||
- microlens-platform
|
||||
@ -31,6 +31,7 @@ dependencies:
|
||||
- text
|
||||
- vector
|
||||
- filepath
|
||||
- microlens
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
16
src/BrickHelpers.hs
Normal file
16
src/BrickHelpers.hs
Normal file
@ -0,0 +1,16 @@
|
||||
module BrickHelpers where
|
||||
import Text.Wrap
|
||||
import Brick
|
||||
import Brick.Widgets.Center
|
||||
import Data.Text (pack)
|
||||
import Lens.Micro
|
||||
|
||||
-- hCenteredStrWrap :: String -> Widget ()
|
||||
-- hCenteredStrWrap = myStrWrap'
|
||||
|
||||
hCenteredStrWrap :: String -> Widget n
|
||||
hCenteredStrWrap p = Widget Greedy Fixed $ do
|
||||
c <- getContext
|
||||
let w = c^.availWidthL
|
||||
let result = vBox $ map (hCenter . txt) $ wrapTextToLines defaultWrapSettings w (pack p)
|
||||
render result
|
@ -3,10 +3,13 @@
|
||||
module CardUI (runCardUI) where
|
||||
|
||||
import Brick
|
||||
import BrickHelpers
|
||||
import Lens.Micro.Platform
|
||||
import Parser
|
||||
import Types
|
||||
import Data.Char (isSeparator)
|
||||
import Data.Map.Strict (Map)
|
||||
import Text.Wrap (WrapSettings(..))
|
||||
import qualified Data.Map.Strict as M
|
||||
import qualified Brick.Widgets.Border as B
|
||||
import qualified Brick.Widgets.Border.Style as BS
|
||||
@ -69,11 +72,11 @@ drawProgress s = C.hCenter $ str (show (s^.index + 1) ++ "/" ++ show (s^.nCards)
|
||||
drawHeader :: String -> Widget Name
|
||||
drawHeader title = withAttr titleAttr $
|
||||
padLeftRight 1 $
|
||||
C.hCenter (strWrap title)
|
||||
hCenteredStrWrap title
|
||||
|
||||
drawDescr :: String -> Widget Name
|
||||
drawDescr descr = padLeftRight 1 $
|
||||
strWrap descr
|
||||
strWrapWith (WrapSettings {preserveIndentation=False, breakLongWords=True}) descr
|
||||
|
||||
listMultipleChoice :: CorrectOption -> [IncorrectOption] -> [String]
|
||||
listMultipleChoice c = reverse . listMultipleChoice' [] 0 c
|
||||
@ -102,10 +105,14 @@ applyWhen predicate action = if predicate then action else id
|
||||
applyUnless :: Bool -> (a -> a) -> a -> a
|
||||
applyUnless p = applyWhen (not p)
|
||||
|
||||
drawDef :: State -> String -> Widget Name
|
||||
drawDef s def = case s ^. cardState of
|
||||
DefinitionState {_flipped=f} -> applyUnless f (withAttr hiddenAttr) $ drawDescr def
|
||||
drawHintedDef :: State -> String -> Widget Name
|
||||
drawHintedDef s def = case s ^. cardState of
|
||||
DefinitionState {_flipped=f} -> if f then drawDescr def else drawDescr [if isSeparator char || char == '\n' then char else '_' | char <- def]
|
||||
_ -> error "impossible: "
|
||||
|
||||
drawDef:: State -> String -> Widget Name
|
||||
drawDef s def = case s ^. cardState of
|
||||
DefinitionState {_flipped=f} -> if f then drawDescr def else drawDescr [if char == '\n' then char else ' ' | char <- def]
|
||||
_ -> error "impossible: "
|
||||
|
||||
drawOptions :: State -> [String] -> Widget Name
|
||||
@ -144,6 +151,9 @@ handleEvent :: State -> BrickEvent Name Event -> EventM Name (Next State)
|
||||
handleEvent s (VtyEvent ev) = case ev of
|
||||
V.EvKey V.KEsc [] -> halt s
|
||||
V.EvKey (V.KChar 'c') [V.MCtrl] -> halt s
|
||||
V.EvKey V.KRight [] -> next s
|
||||
V.EvKey V.KLeft [] -> previous s
|
||||
-- V.EvKey (V.KChar ' ') [] -> next s
|
||||
ev -> case s ^. cardState of
|
||||
MultipleChoiceState {_selected = i, _nChoices = nChoices} ->
|
||||
case ev of
|
||||
@ -209,9 +219,6 @@ handleEvent s (VtyEvent ev) = case ev of
|
||||
backspace xs = init xs
|
||||
_ -> continue s
|
||||
handleEvent s _ = continue s
|
||||
-- handleEvent s (VtyEvent (V.EvKey V.KRight [])) = next s
|
||||
-- handleEvent s (VtyEvent (V.EvKey (V.KChar ' ') [])) = next s
|
||||
-- handleEvent s (VtyEvent (V.EvKey V.KLeft [])) = previous s
|
||||
|
||||
titleAttr :: AttrName
|
||||
titleAttr = attrName "title"
|
||||
|
@ -29,13 +29,6 @@ title = withAttr titleAttr $
|
||||
str "┬ ┬┌─┐┌─┐┌─┐┌─┐┬─┐┌┬┐" <=>
|
||||
str "├─┤├─┤└─┐│ ├─┤├┬┘ ││" <=>
|
||||
str "┴ ┴┴ ┴└─┘└─┘┴ ┴┴└──┴┘"
|
||||
-- str " _ _" <=>
|
||||
-- str "| | | |"<=>
|
||||
-- str "| |__ __ _ ___ ___ __ _ _ __ __| |"<=>
|
||||
-- str "| '_ \\ / _` / __|/ __/ _` | '__/ _` |"<=>
|
||||
-- str "| | | | (_| \\__ \\ (_| (_| | | | (_| |"<=>
|
||||
-- str "|_| |_|\\__,_|___/\\___\\__,_|_| \\__,_|"
|
||||
|
||||
|
||||
drawUI :: State -> [Widget Name]
|
||||
drawUI s =
|
||||
|
@ -17,7 +17,7 @@
|
||||
#
|
||||
# resolver: ./custom-snapshot.yaml
|
||||
# resolver: https://example.com/snapshots/2018-01-01.yaml
|
||||
resolver: lts-14.20
|
||||
resolver: lts-16.2
|
||||
|
||||
# User packages to be built.
|
||||
# Various formats can be used as shown in the example below.
|
||||
@ -34,7 +34,7 @@ packages:
|
||||
# These entries can reference officially published versions as well as
|
||||
# forks / in-progress versions pinned to a git hash. For example:
|
||||
#
|
||||
# extra-deps:
|
||||
extra-deps:
|
||||
# - acme-missiles-0.3
|
||||
# - git: https://github.com/commercialhaskell/stack.git
|
||||
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||
|
@ -6,7 +6,7 @@
|
||||
packages: []
|
||||
snapshots:
|
||||
- completed:
|
||||
size: 524154
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/14/20.yaml
|
||||
sha256: 2f5099f69ddb6abfe64400fe1e6a604e8e628f55e6837211cd70a81eb0a8fa4d
|
||||
original: lts-14.20
|
||||
size: 531674
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/16/2.yaml
|
||||
sha256: 4b08fb9338ca297de7ade8318f4be1216f14dff8c0426c001fb7886ee88cb84a
|
||||
original: lts-16.2
|
||||
|
Loading…
Reference in New Issue
Block a user