diff options
| author | tv <tv@krebsco.de> | 2026-03-07 00:47:10 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-03-07 00:47:10 +0100 |
| commit | fdf2c5436dfea4a30af445059e77a54e14b64752 (patch) | |
| tree | 4cd6515e932413fda0398ddf887915bfd37ccd6a | |
| parent | 18fffd492fe7134ef1cc53e1725d1709ddbde20b (diff) | |
| -rw-r--r-- | src/TextViewport/Viewport/Instance.hs | 52 | ||||
| -rw-r--r-- | test/Spec.hs | 18 |
2 files changed, 35 insertions, 35 deletions
diff --git a/src/TextViewport/Viewport/Instance.hs b/src/TextViewport/Viewport/Instance.hs index 3d0568e..1bafcbd 100644 --- a/src/TextViewport/Viewport/Instance.hs +++ b/src/TextViewport/Viewport/Instance.hs @@ -12,65 +12,65 @@ import TextViewport.Viewport.Viewport (Viewport, clampViewport, mkViewport) import TextViewport.Viewport.Viewport qualified as Viewport -data ViewportInstance = ViewportInstance +data Instance = Instance { viRender :: RenderState , viView :: Viewport } deriving (Show) -mkViewportInstance :: Int -> Int -> Buffer -> ViewportInstance -mkViewportInstance width height buf = +mkInstance :: Int -> Int -> Buffer -> Instance +mkInstance width height buf = let rs = mkRenderState width buf vp = mkViewport width height rs - in ViewportInstance rs vp + in Instance rs vp -visibleLines :: ViewportInstance -> [RenderedLine] -visibleLines (ViewportInstance rs vp) = +visibleLines :: Instance -> [RenderedLine] +visibleLines (Instance rs vp) = take (Viewport.vpHeight vp) . drop (Viewport.vpOffset vp) . RenderedBuffer.flatten $ RenderState.rsRendered rs -applyToInstance :: (Viewport -> Viewport) -> ViewportInstance -> ViewportInstance -applyToInstance f (ViewportInstance rs vp) = +applyToInstance :: (Viewport -> Viewport) -> Instance -> Instance +applyToInstance f (Instance rs vp) = let vp' = f vp - in ViewportInstance rs (clampViewport rs vp') + in Instance rs (clampViewport rs vp') -applyToInstanceRS :: (RenderState -> Viewport -> Viewport) -> ViewportInstance -> ViewportInstance -applyToInstanceRS f (ViewportInstance rs vp) = +applyToInstanceRS :: (RenderState -> Viewport -> Viewport) -> Instance -> Instance +applyToInstanceRS f (Instance rs vp) = let vp' = f rs vp - in ViewportInstance rs (clampViewport rs vp') + in Instance rs (clampViewport rs vp') -scrollByI :: Int -> ViewportInstance -> ViewportInstance +scrollByI :: Int -> Instance -> Instance scrollByI delta = applyToInstance (Viewport.scrollBy delta) -scrollUpI :: Int -> ViewportInstance -> ViewportInstance +scrollUpI :: Int -> Instance -> Instance scrollUpI delta = applyToInstance (Viewport.scrollUp delta) -scrollDownI :: Int -> ViewportInstance -> ViewportInstance +scrollDownI :: Int -> Instance -> Instance scrollDownI delta = applyToInstance (Viewport.scrollDown delta) -pageUpI :: ViewportInstance -> ViewportInstance +pageUpI :: Instance -> Instance pageUpI = applyToInstance Viewport.pageUp -pageDownI :: ViewportInstance -> ViewportInstance +pageDownI :: Instance -> Instance pageDownI = applyToInstance Viewport.pageDown -alignTopI :: ViewportInstance -> ViewportInstance +alignTopI :: Instance -> Instance alignTopI = applyToInstance Viewport.alignTop -alignBottomI :: ViewportInstance -> ViewportInstance +alignBottomI :: Instance -> Instance alignBottomI = applyToInstanceRS Viewport.alignBottom -modifyItemI :: Int -> (Item -> Item) -> ViewportInstance -> ViewportInstance -modifyItemI ix f (ViewportInstance rs vp) = +modifyItemI :: Int -> (Item -> Item) -> Instance -> Instance +modifyItemI ix f (Instance rs vp) = let buf' = Buffer.modifyItem ix f (RenderState.rsBuffer rs) rs' = mkRenderState (RenderState.rsWidth rs) buf' vp' = clampViewport rs' vp - in ViewportInstance rs' vp' + in Instance rs' vp' -lookupPositionI :: Int -> Int -> ViewportInstance -> Maybe (Int, Int) -lookupPositionI x y (ViewportInstance rs vp) = +lookupPositionI :: Int -> Int -> Instance -> Maybe (Int, Int) +lookupPositionI x y (Instance rs vp) = lookupPosition x y vp (RenderState.rsRendered rs) ---debugVI :: ViewportInstance -> IO () ---debugVI (ViewportInstance rs vp) = do +--debugVI :: Instance -> IO () +--debugVI (Instance rs vp) = do -- putStrLn ("offset = " ++ show (Viewport.vpOffset vp)) -- putStrLn ("height = " ++ show (Viewport.vpHeight vp)) -- putStrLn ("lineCount = " ++ show (RenderState.rsLineCount rs)) diff --git a/test/Spec.hs b/test/Spec.hs index c7c2cbd..70b1815 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -403,44 +403,44 @@ main = hspec do describe "Instance" do - it "mkViewportInstance builds consistent state" do - let vi = mkViewportInstance 10 3 (mkBuf ["a","b","c"]) + it "mkInstance builds consistent state" do + let vi = mkInstance 10 3 (mkBuf ["a","b","c"]) length (visibleLines vi) `shouldBe` 3 it "scrollUpI clamps correctly" do - let vi = mkViewportInstance 10 3 (mkBuf ["a","b","c","d","e"]) + let vi = mkInstance 10 3 (mkBuf ["a","b","c","d","e"]) vi' = scrollUpI 10 vi vpOffset (viView vi') `shouldBe` 0 it "scrollDownI clamps correctly" do - let vi = mkViewportInstance 10 3 (mkBuf ["a","b","c","d","e"]) + let vi = mkInstance 10 3 (mkBuf ["a","b","c","d","e"]) vi' = scrollDownI 10 vi rs = viRender vi vpOffset (viView vi') `shouldBe` (RS.rsLineCount rs - 3) it "modifyItemI updates both buffer and renderstate" do - let vi = mkViewportInstance 10 3 (mkBuf ["a","b","c"]) + let vi = mkInstance 10 3 (mkBuf ["a","b","c"]) vi' = modifyItemI 1 (\itm -> itm { itemText = "X" }) vi RS.rsBuffer (viRender vi') `shouldBe` Buffer.fromList [mkItem "a", mkItem "X", mkItem "c"] it "lookupPositionI returns correct coordinates" do - let vi = mkViewportInstance 10 3 (mkBuf ["hello","world"]) + let vi = mkInstance 10 3 (mkBuf ["hello","world"]) lookupPositionI 1 0 vi `shouldBe` Just (0,1) it "visibleLines should clamp offset to available lines" do - let vi = mkViewportInstance 10 3 (Buffer.fromList [mkItem "a"]) + let vi = mkInstance 10 3 (Buffer.fromList [mkItem "a"]) vi' = vi { viView = (viView vi) { vpOffset = 999 } } visibleLines vi' `shouldNotBe` [] it "applyToInstance should clamp using updated render state" do - let vi0 = mkViewportInstance 10 3 (Buffer.fromList [mkItem "hello"]) + let vi0 = mkInstance 10 3 (Buffer.fromList [mkItem "hello"]) vi1 = applyToInstance (VP.scrollDown 1) vi0 vi2 = modifyItemI 0 (\_ -> mkItem "hello\nworld\nagain") vi1 vpOffset (viView vi2) `shouldBe` (RS.rsLineCount (viRender vi1) - 3) it "lookupPositionI should interpret y relative to viewport offset" do - let vi = mkViewportInstance 10 3 (Buffer.fromList [mkItem "hello", mkItem "world", mkItem "again"]) + let vi = mkInstance 10 3 (Buffer.fromList [mkItem "hello", mkItem "world", mkItem "again"]) vi' = scrollDownI 1 vi lookupPositionI 0 0 vi' `shouldBe` Just (0,1) |
