summaryrefslogtreecommitdiffstats
path: root/src/TextViewport/Viewport
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-03-09 03:35:50 +0100
committertv <tv@krebsco.de>2026-03-09 03:35:50 +0100
commita648d77052f04d4731d728fc317a0947b35a3ed5 (patch)
tree2e125e5f3a0a5d29884dcb35e729523153e00a5c /src/TextViewport/Viewport
parentbff24914f21800719c99c80165a8c3a3759311e7 (diff)
externalize segmentation rendererHEADmaster
Diffstat (limited to 'src/TextViewport/Viewport')
-rw-r--r--src/TextViewport/Viewport/Instance.hs33
-rw-r--r--src/TextViewport/Viewport/Viewport.hs6
2 files changed, 20 insertions, 19 deletions
diff --git a/src/TextViewport/Viewport/Instance.hs b/src/TextViewport/Viewport/Instance.hs
index c3ce338..e1cc560 100644
--- a/src/TextViewport/Viewport/Instance.hs
+++ b/src/TextViewport/Viewport/Instance.hs
@@ -9,69 +9,70 @@ import TextViewport.Render.RenderState qualified as RenderState
import TextViewport.Render.RenderState (RenderState, mkRenderState)
import TextViewport.Render.RenderedBuffer qualified as RenderedBuffer
import TextViewport.Render.RenderedLine (RenderedLine(..)) -- TODO qualified
+import TextViewport.Render.Segmentation (Segmenter)
import TextViewport.Viewport.Position (lookupPosition)
import TextViewport.Viewport.Viewport (Viewport, clampViewport, mkViewport)
import TextViewport.Viewport.Viewport qualified as Viewport
-data Instance a = Instance
- { viRender :: RenderState a
+data Instance a seg = Instance
+ { viRender :: RenderState a seg
, viView :: Viewport
} deriving (Show)
-mkInstance :: (Hashable a, Textual a, Index a ~ Int) => Int -> Int -> Buffer a -> Instance a
+mkInstance :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> Int -> Buffer a seg -> Instance a seg
mkInstance width height buf =
let rs = mkRenderState width buf
vp = mkViewport width height rs
in Instance rs vp
-visibleLines :: Instance a -> [RenderedLine a]
+visibleLines :: Instance a seg -> [RenderedLine a]
visibleLines (Instance rs vp) =
take (Viewport.vpHeight vp) . drop (Viewport.vpOffset vp) . RenderedBuffer.flatten $ RenderState.rsRendered rs
-applyToInstance :: (Viewport -> Viewport) -> Instance a -> Instance a
+applyToInstance :: (Viewport -> Viewport) -> Instance a seg -> Instance a seg
applyToInstance f (Instance rs vp) =
let vp' = f vp
in Instance rs (clampViewport rs vp')
-applyToInstanceRS :: (RenderState a -> Viewport -> Viewport) -> Instance a -> Instance a
+applyToInstanceRS :: (RenderState a seg -> Viewport -> Viewport) -> Instance a seg -> Instance a seg
applyToInstanceRS f (Instance rs vp) =
let vp' = f rs vp
in Instance rs (clampViewport rs vp')
-scrollByI :: Int -> Instance a -> Instance a
+scrollByI :: Int -> Instance a seg -> Instance a seg
scrollByI delta = applyToInstance (Viewport.scrollBy delta)
-scrollUpI :: Int -> Instance a -> Instance a
+scrollUpI :: Int -> Instance a seg -> Instance a seg
scrollUpI delta = applyToInstance (Viewport.scrollUp delta)
-scrollDownI :: Int -> Instance a -> Instance a
+scrollDownI :: Int -> Instance a seg -> Instance a seg
scrollDownI delta = applyToInstance (Viewport.scrollDown delta)
-pageUpI :: Instance a -> Instance a
+pageUpI :: Instance a seg -> Instance a seg
pageUpI = applyToInstance Viewport.pageUp
-pageDownI :: Instance a -> Instance a
+pageDownI :: Instance a seg -> Instance a seg
pageDownI = applyToInstance Viewport.pageDown
-alignTopI :: Instance a -> Instance a
+alignTopI :: Instance a seg -> Instance a seg
alignTopI = applyToInstance Viewport.alignTop
-alignBottomI :: Instance a -> Instance a
+alignBottomI :: Instance a seg -> Instance a seg
alignBottomI = applyToInstanceRS Viewport.alignBottom
-modifyItemI :: (Hashable a, Textual a, Index a ~ Int) => Int -> (Item a -> Item a) -> Instance a -> Instance a
+modifyItemI :: (Segmenter seg a, Hashable a, Textual a, Index a ~ Int) => Int -> (Item a seg -> Item a seg) -> Instance a seg -> Instance a seg
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 Instance rs' vp'
-lookupPositionI :: Int -> Int -> Instance a -> Maybe (Int, Int)
+lookupPositionI :: Int -> Int -> Instance a seg -> Maybe (Int, Int)
lookupPositionI x y (Instance rs vp) =
lookupPosition x y vp (RenderState.rsRendered rs)
---debugVI :: Instance a -> IO ()
+--debugVI :: Instance a seg -> IO ()
--debugVI (Instance rs vp) = do
-- putStrLn ("offset = " ++ show (Viewport.vpOffset vp))
-- putStrLn ("height = " ++ show (Viewport.vpHeight vp))
diff --git a/src/TextViewport/Viewport/Viewport.hs b/src/TextViewport/Viewport/Viewport.hs
index 65f48e4..36392c7 100644
--- a/src/TextViewport/Viewport/Viewport.hs
+++ b/src/TextViewport/Viewport/Viewport.hs
@@ -10,7 +10,7 @@ data Viewport = Viewport
, vpOffset :: !Int
} deriving (Show)
-mkViewport :: Int -> Int -> RenderState a -> Viewport
+mkViewport :: Int -> Int -> RenderState a seg -> Viewport
mkViewport width height rs =
alignBottom rs Viewport
{ vpWidth = width
@@ -19,7 +19,7 @@ mkViewport width height rs =
}
-- any function that sets vpOffset and can overshoot should use clampViewport
-clampViewport :: RenderState a -> Viewport -> Viewport
+clampViewport :: RenderState a seg -> Viewport -> Viewport
clampViewport rs vp =
let total = RenderState.rsLineCount rs
maxOff = max 0 (total - vpHeight vp)
@@ -48,7 +48,7 @@ alignTop :: Viewport -> Viewport
alignTop vp =
vp { vpOffset = 0 }
-alignBottom :: RenderState a -> Viewport -> Viewport
+alignBottom :: RenderState a seg -> Viewport -> Viewport
alignBottom rs vp =
let total = RenderState.rsLineCount rs
off = max 0 (total - vpHeight vp)