Skip to content

Commit

Permalink
Overlay refactoring.
Browse files Browse the repository at this point in the history
  • Loading branch information
ethercrow committed Nov 2, 2014
1 parent e794740 commit 1ac76a7
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 38 deletions.
60 changes: 30 additions & 30 deletions src/library/Yi/Buffer/Implementation.hs
Expand Up @@ -28,7 +28,7 @@ module Yi.Buffer.Implementation
, Size
, Direction (..)
, BufferImpl
, Overlay, OvlLayer (..)
, Overlay
, mkOverlay
, overlayUpdate
, applyUpdateI
Expand All @@ -51,7 +51,7 @@ module Yi.Buffer.Implementation
, setSyntaxBI
, addOverlayBI
, delOverlayBI
, delOverlayLayer
, delOverlaysOfOwnerBI
, updateSyntax
, getAst, focusAst
, strokesRangesBI
Expand Down Expand Up @@ -105,33 +105,30 @@ type Marks = M.Map Mark MarkValue

data HLState syntax = forall cache. HLState !(Highlighter cache syntax) !cache

data OvlLayer = UserLayer | HintLayer
deriving (Ord, Eq)
data Overlay = Overlay {
overlayLayer :: OvlLayer,
-- underscores to avoid 'defined but not used'. Remove if desired
_overlayBegin :: MarkValue,
_overlayEnd :: MarkValue,
_overlayStyle :: StyleName
}
data Overlay = Overlay
{ overlayOwner :: R.YiString
, _overlayBegin :: MarkValue
, _overlayEnd :: MarkValue
, _overlayStyle :: StyleName
}

instance Eq Overlay where
Overlay a b c _ == Overlay a' b' c' _ = a == a' && b == b' && c == c'

instance Ord Overlay where
compare (Overlay a b c _) (Overlay a' b' c' _)
= compare a a' `mappend` compare b b' `mappend` compare c c'


data BufferImpl syntax =
FBufferData { mem :: !YiString -- ^ buffer text
, marks :: !Marks -- ^ Marks for this buffer
, markNames :: !(M.Map String Mark)
, hlCache :: !(HLState syntax) -- ^ syntax highlighting state
, overlays :: !(Set.Set Overlay) -- ^ set of (non overlapping) visual overlay regions
, dirtyOffset :: !Point -- ^ Lowest modified offset since last recomputation of syntax
}
deriving Typeable

data BufferImpl syntax = FBufferData
{ mem :: !YiString -- ^ buffer text
, marks :: !Marks -- ^ Marks for this buffer
, markNames :: !(M.Map String Mark)
, hlCache :: !(HLState syntax) -- ^ syntax highlighting state
, overlays :: !(Set.Set Overlay)
-- ^ set of (non overlapping) visual overlay regions
, dirtyOffset :: !Point
-- ^ Lowest modified offset since last recomputation of syntax
} deriving Typeable

dummyHlState :: HLState syntax
dummyHlState = HLState noHighlighter (hlStartState noHighlighter)
Expand All @@ -142,8 +139,6 @@ instance Binary (BufferImpl ()) where
put b = put (mem b) >> put (marks b) >> put (markNames b)
get = FBufferData <$> get <*> get <*> get <*> pure dummyHlState <*> pure Set.empty <*> pure 0



-- | Mutation actions (also used the undo or redo list)
--
-- For the undo/redo, we use the /partial checkpoint/ (Berlage, pg16) strategy to store
Expand Down Expand Up @@ -251,12 +246,16 @@ getIndexedStream Backward (Point p) = zip (dF (pred (Point p))) . R.toReverseStr
dF n = n : dF (pred n)

-- | Create an "overlay" for the style @sty@ between points @s@ and @e@
mkOverlay :: OvlLayer -> Region -> StyleName -> Overlay
mkOverlay l r = Overlay l (MarkValue (regionStart r) Backward) (MarkValue (regionEnd r) Forward)
mkOverlay :: R.YiString -> Region -> StyleName -> Overlay
mkOverlay owner r =
Overlay owner
(MarkValue (regionStart r) Backward)
(MarkValue (regionEnd r) Forward)

-- | Obtain a style-update for a specific overlay
overlayUpdate :: Overlay -> UIUpdate
overlayUpdate (Overlay _l (MarkValue s _) (MarkValue e _) _) = StyleUpdate s (e ~- s)
overlayUpdate (Overlay _owner (MarkValue s _) (MarkValue e _) _) =
StyleUpdate s (e ~- s)

-- | Add a style "overlay" between the given points.
addOverlayBI :: Overlay -> BufferImpl syntax -> BufferImpl syntax
Expand All @@ -266,8 +265,9 @@ addOverlayBI ov fb = fb{overlays = Set.insert ov (overlays fb)}
delOverlayBI :: Overlay -> BufferImpl syntax -> BufferImpl syntax
delOverlayBI ov fb = fb{overlays = Set.delete ov (overlays fb)}

delOverlayLayer :: OvlLayer -> BufferImpl syntax -> BufferImpl syntax
delOverlayLayer layer fb = fb{overlays = Set.filter ((/= layer) . overlayLayer) (overlays fb)}
delOverlaysOfOwnerBI :: R.YiString -> BufferImpl syntax -> BufferImpl syntax
delOverlaysOfOwnerBI owner fb =
fb{overlays = Set.filter ((/= owner) . overlayOwner) (overlays fb)}
-- FIXME: this can be really inefficient.

-- | Return style information for the range @(i,j)@ Style information
Expand All @@ -291,7 +291,7 @@ strokesRangesBI getStrokes regex rgn point fb = result
-- zero-length spans seem to break stroking in general, so filter them out!
syntaxHlLayer = filter (\(Span b _m a) -> b /= a) $ getStrokes point i j

layers2 = map (map overlayStroke) $ groupBy ((==) `on` overlayLayer) $ Set.toList $ overlays fb
layers2 = map (map overlayStroke) $ groupBy ((==) `on` overlayOwner) $ Set.toList $ overlays fb
layer3 = case regex of
Just re -> takeIn $ map hintStroke $ regexRegionBI re (mkRegion i j) fb
Nothing -> []
Expand Down
10 changes: 5 additions & 5 deletions src/library/Yi/Buffer/Misc.hs
Expand Up @@ -53,7 +53,7 @@ module Yi.Buffer.Misc
, lineDown
, newB
, MarkValue(..)
, Overlay, OvlLayer(..)
, Overlay
, mkOverlay
, gotoLn
, gotoLnFrom
Expand Down Expand Up @@ -104,7 +104,7 @@ module Yi.Buffer.Misc
, markSavedB
, addOverlayB
, delOverlayB
, delOverlayLayerB
, delOverlaysOfOwnerB
, savingExcursionB
, savingPointB
, savingPositionB
Expand Down Expand Up @@ -390,9 +390,9 @@ delOverlayB ov = do
pendingUpdatesA %= (++ [overlayUpdate ov])
modifyBuffer $ delOverlayBI ov

delOverlayLayerB :: OvlLayer -> BufferM ()
delOverlayLayerB l =
modifyBuffer $ delOverlayLayer l
delOverlaysOfOwnerB :: R.YiString -> BufferM ()
delOverlaysOfOwnerB owner =
modifyBuffer $ delOverlaysOfOwnerBI owner

-- | Execute a @BufferM@ value on a given buffer and window. The new state of
-- the buffer is returned alongside the result of the computation.
Expand Down
6 changes: 3 additions & 3 deletions src/library/Yi/Dired.hs
Expand Up @@ -562,7 +562,7 @@ diredRefresh = do
insertN $ R.fromString dir <> ":\n"
p <- pointB
-- paint header
addOverlayB $ mkOverlay UserLayer (mkRegion 0 (p-2)) headStyle
addOverlayB $ mkOverlay "dired" (mkRegion 0 (p-2)) headStyle
ptsList <- mapM insertDiredLine $ zip3 strss' stys strs
putBufferDyn $ diredFilePointsA .~ ptsList $ diredNameColA .~ namecol $ ds

Expand Down Expand Up @@ -603,7 +603,7 @@ insertDiredLine (fields, sty, filenm) = bypassReadOnly $ do
insertN $ ' ' `R.cons` last fields
p2 <- pointB
newlineB
addOverlayB (mkOverlay UserLayer (mkRegion p1 p2) sty)
addOverlayB (mkOverlay "dired" (mkRegion p1 p2) sty)
return (p1, p2, R.toString filenm)

data DRStrings = DRPerms {undrs :: R.YiString}
Expand Down Expand Up @@ -816,7 +816,7 @@ diredRefreshMark = do
moveTo pos >> moveToSol >> insertB mark >> deleteN 1
e <- pointB
addOverlayB $
mkOverlay UserLayer (mkRegion (e - 1) e) (styleOfMark mark)
mkOverlay "dired" (mkRegion (e - 1) e) (styleOfMark mark)
Nothing ->
-- for deleted marks
moveTo pos >> moveToSol >> insertN " " >> deleteN 1
Expand Down

0 comments on commit 1ac76a7

Please sign in to comment.