Make sure to add screen row to block decoration nodes

This commit is contained in:
Antonio Scandurra
2015-12-03 16:25:24 +01:00
parent 14b126ace0
commit 36103a024a
2 changed files with 38 additions and 6 deletions

View File

@@ -3540,6 +3540,37 @@ describe('TextEditorComponent', function () {
})
})
describe('when the mousewheel event\'s target is a block decoration', function () {
it('keeps it on the DOM if it is scrolled off-screen', async function () {
wrapperNode.style.height = 4.5 * lineHeightInPixels + 'px'
wrapperNode.style.width = 20 * charWidth + 'px'
component.measureDimensions()
await nextViewUpdatePromise()
let item = document.createElement("div")
item.style.width = "30px"
item.style.height = "30px"
item.className = "decoration-1"
editor.addBlockDecorationForScreenRow(0, item)
await nextViewUpdatePromise()
let wheelEvent = new WheelEvent('mousewheel', {
wheelDeltaX: 0,
wheelDeltaY: -500
})
Object.defineProperty(wheelEvent, 'target', {
get: function () {
return item
}
})
componentNode.dispatchEvent(wheelEvent)
await nextAnimationFramePromise()
expect(component.getTopmostDOMNode().contains(item)).toBe(true)
})
})
it('only prevents the default action of the mousewheel event if it actually lead to scrolling', async function () {
spyOn(WheelEvent.prototype, 'preventDefault').andCallThrough()
wrapperNode.style.height = 4.5 * lineHeightInPixels + 'px'

View File

@@ -31,10 +31,9 @@ class BlockDecorationsComponent
if @oldState.blockDecorations.hasOwnProperty(id)
@updateBlockDecorationNode(id)
else
@oldState.blockDecorations[id] = {}
@createAndAppendBlockDecorationNode(id)
@oldState.blockDecorations[id] = cloneObject(blockDecorationState)
measureBlockDecorations: ->
for decorationId, blockDecorationNode of @blockDecorationNodesById
decoration = @newState.blockDecorations[decorationId].decoration
@@ -48,18 +47,20 @@ class BlockDecorationsComponent
blockDecorationState = @newState.blockDecorations[id]
blockDecorationNode = @views.getView(blockDecorationState.decoration.getProperties().item)
blockDecorationNode.id = "atom--block-decoration-#{id}"
unless blockDecorationState.isVisible
blockDecorationNode.classList.add("atom--invisible-block-decoration")
@container.appendChild(blockDecorationNode)
@blockDecorationNodesById[id] = blockDecorationNode
@updateBlockDecorationNode(id)
updateBlockDecorationNode: (id) ->
newBlockDecorationState = @newState.blockDecorations[id]
oldBlockDecorationState = @oldState.blockDecorations[id]
blockDecorationNode = @blockDecorationNodesById[id]
if newBlockDecorationState.isVisible
blockDecorationNode.classList.remove("atom--invisible-block-decoration")
else
blockDecorationNode.classList.add("atom--invisible-block-decoration")
if oldBlockDecorationState.screenRow isnt newBlockDecorationState.screenRow
blockDecorationNode.dataset.screenRow = newBlockDecorationState.screenRow
oldBlockDecorationState.screenRow = newBlockDecorationState.screenRow