1
1
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:
Yvee1 2020-07-09 13:07:51 +02:00
parent bd2eedd52f
commit 641432b570
8 changed files with 79 additions and 23 deletions

View File

@ -2,6 +2,15 @@ module Main where
import Lib (runBrickFlashcards) import Lib (runBrickFlashcards)
import System.Environment (getArgs) import System.Environment (getArgs)
import BrickHelpers
import Brick
import Brick.Widgets.Center
main :: IO () main :: IO ()
main = runBrickFlashcards 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

View File

@ -20,3 +20,33 @@ Part of the eye that turns _light_ into _electrical neural impulses_.
--- ---
# Choroid # Choroid
The choroid seperates from sclera and becomes the _ciliary body_, and then the _iris_. 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.
---

View File

@ -21,7 +21,7 @@ description: Please see the README on GitHub at <https://github.com/Yvee
dependencies: dependencies:
- base >= 4.7 && < 5 - base >= 4.7 && < 5
- brick - brick >= 0.52
- word-wrap - word-wrap
- vty - vty
- microlens-platform - microlens-platform
@ -31,6 +31,7 @@ dependencies:
- text - text
- vector - vector
- filepath - filepath
- microlens
library: library:
source-dirs: src source-dirs: src

16
src/BrickHelpers.hs Normal file
View 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

View File

@ -3,10 +3,13 @@
module CardUI (runCardUI) where module CardUI (runCardUI) where
import Brick import Brick
import BrickHelpers
import Lens.Micro.Platform import Lens.Micro.Platform
import Parser import Parser
import Types import Types
import Data.Char (isSeparator)
import Data.Map.Strict (Map) import Data.Map.Strict (Map)
import Text.Wrap (WrapSettings(..))
import qualified Data.Map.Strict as M import qualified Data.Map.Strict as M
import qualified Brick.Widgets.Border as B import qualified Brick.Widgets.Border as B
import qualified Brick.Widgets.Border.Style as BS 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 :: String -> Widget Name
drawHeader title = withAttr titleAttr $ drawHeader title = withAttr titleAttr $
padLeftRight 1 $ padLeftRight 1 $
C.hCenter (strWrap title) hCenteredStrWrap title
drawDescr :: String -> Widget Name drawDescr :: String -> Widget Name
drawDescr descr = padLeftRight 1 $ drawDescr descr = padLeftRight 1 $
strWrap descr strWrapWith (WrapSettings {preserveIndentation=False, breakLongWords=True}) descr
listMultipleChoice :: CorrectOption -> [IncorrectOption] -> [String] listMultipleChoice :: CorrectOption -> [IncorrectOption] -> [String]
listMultipleChoice c = reverse . listMultipleChoice' [] 0 c 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 :: Bool -> (a -> a) -> a -> a
applyUnless p = applyWhen (not p) applyUnless p = applyWhen (not p)
drawDef :: State -> String -> Widget Name 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 drawDef s def = case s ^. cardState of
DefinitionState {_flipped=f} -> applyUnless f (withAttr hiddenAttr) $ drawDescr def DefinitionState {_flipped=f} -> if f then drawDescr def else drawDescr [if char == '\n' then char else ' ' | char <- def]
_ -> error "impossible: " _ -> error "impossible: "
drawOptions :: State -> [String] -> Widget Name 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 handleEvent s (VtyEvent ev) = case ev of
V.EvKey V.KEsc [] -> halt s V.EvKey V.KEsc [] -> halt s
V.EvKey (V.KChar 'c') [V.MCtrl] -> 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 ev -> case s ^. cardState of
MultipleChoiceState {_selected = i, _nChoices = nChoices} -> MultipleChoiceState {_selected = i, _nChoices = nChoices} ->
case ev of case ev of
@ -209,9 +219,6 @@ handleEvent s (VtyEvent ev) = case ev of
backspace xs = init xs backspace xs = init xs
_ -> continue s _ -> continue s
handleEvent s _ = 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
titleAttr = attrName "title" titleAttr = attrName "title"

View File

@ -29,13 +29,6 @@ title = withAttr titleAttr $
str "┬ ┬┌─┐┌─┐┌─┐┌─┐┬─┐┌┬┐" <=> str "┬ ┬┌─┐┌─┐┌─┐┌─┐┬─┐┌┬┐" <=>
str "├─┤├─┤└─┐│ ├─┤├┬┘ ││" <=> str "├─┤├─┤└─┐│ ├─┤├┬┘ ││" <=>
str "┴ ┴┴ ┴└─┘└─┘┴ ┴┴└──┴┘" str "┴ ┴┴ ┴└─┘└─┘┴ ┴┴└──┴┘"
-- str " _ _" <=>
-- str "| | | |"<=>
-- str "| |__ __ _ ___ ___ __ _ _ __ __| |"<=>
-- str "| '_ \\ / _` / __|/ __/ _` | '__/ _` |"<=>
-- str "| | | | (_| \\__ \\ (_| (_| | | | (_| |"<=>
-- str "|_| |_|\\__,_|___/\\___\\__,_|_| \\__,_|"
drawUI :: State -> [Widget Name] drawUI :: State -> [Widget Name]
drawUI s = drawUI s =

View File

@ -17,7 +17,7 @@
# #
# resolver: ./custom-snapshot.yaml # resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml # resolver: https://example.com/snapshots/2018-01-01.yaml
resolver: lts-14.20 resolver: lts-16.2
# User packages to be built. # User packages to be built.
# Various formats can be used as shown in the example below. # 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 # These entries can reference officially published versions as well as
# forks / in-progress versions pinned to a git hash. For example: # forks / in-progress versions pinned to a git hash. For example:
# #
# extra-deps: extra-deps:
# - acme-missiles-0.3 # - acme-missiles-0.3
# - git: https://github.com/commercialhaskell/stack.git # - git: https://github.com/commercialhaskell/stack.git
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a # commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a

View File

@ -6,7 +6,7 @@
packages: [] packages: []
snapshots: snapshots:
- completed: - completed:
size: 524154 size: 531674
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/14/20.yaml url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/16/2.yaml
sha256: 2f5099f69ddb6abfe64400fe1e6a604e8e628f55e6837211cd70a81eb0a8fa4d sha256: 4b08fb9338ca297de7ade8318f4be1216f14dff8c0426c001fb7886ee88cb84a
original: lts-14.20 original: lts-16.2