diff options
| author | tv <tv@krebsco.de> | 2026-03-06 20:45:39 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-03-06 23:36:06 +0100 |
| commit | b098daf7bcb6e4a493723026f5644bd81164c641 (patch) | |
| tree | 71108cdebf54729830c72b61d725c6f91a3cfdcd /src/TextViewport/Viewport/Viewport.hs | |
| parent | 7e516fc31601fd07923d7033ba64f530175cac0e (diff) | |
modularize
Diffstat (limited to 'src/TextViewport/Viewport/Viewport.hs')
| -rw-r--r-- | src/TextViewport/Viewport/Viewport.hs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/TextViewport/Viewport/Viewport.hs b/src/TextViewport/Viewport/Viewport.hs new file mode 100644 index 0000000..e6fdaab --- /dev/null +++ b/src/TextViewport/Viewport/Viewport.hs @@ -0,0 +1,57 @@ +module TextViewport.Viewport.Viewport where + +import TextViewport.Render.RenderState (RenderState) +import TextViewport.Render.RenderState qualified as RenderState + + +data Viewport = Viewport + { vpWidth :: !Int + , vpHeight :: !Int + , vpOffset :: !Int + } deriving (Show) + +mkViewport :: Int -> Int -> RenderState -> Viewport +mkViewport width height rs = + alignBottom rs Viewport + { vpWidth = width + , vpHeight = height + , vpOffset = 0 + } + +-- any function that sets vpOffset and can overshoot should use clampViewport +clampViewport :: RenderState -> Viewport -> Viewport +clampViewport rs vp = + let total = RenderState.rsLineCount rs + maxOff = max 0 (total - vpHeight vp) + off = vpOffset vp + in vp { vpOffset = max 0 (min maxOff off) } + +scrollBy :: Int -> Viewport -> Viewport +scrollBy delta vp = + vp { vpOffset = vpOffset vp + delta } + +scrollUp :: Int -> Viewport -> Viewport +scrollUp n = scrollBy (-n) + +scrollDown :: Int -> Viewport -> Viewport +scrollDown n = scrollBy n + +pageUp :: Viewport -> Viewport +pageUp vp = + scrollBy (-(vpHeight vp)) vp + +pageDown :: Viewport -> Viewport +pageDown vp = + scrollBy (vpHeight vp) vp + +alignTop :: Viewport -> Viewport +alignTop vp = + vp { vpOffset = 0 } + +alignBottom :: RenderState -> Viewport -> Viewport +alignBottom rs vp = + let total = RenderState.rsLineCount rs + off = max 0 (total - vpHeight vp) + in vp { vpOffset = off } + + |
