WIP: Getting specs passing with new stand-in vertical scrollbar

This commit is contained in:
Corey Johnson & Nathan Sobo 2012-05-11 11:52:03 -06:00
parent e433e08c78
commit 9427c82084
6 changed files with 53 additions and 33 deletions

View File

@ -403,57 +403,56 @@ describe "Editor", ->
describe "when the scroller element is scrolled", ->
describe "whes scrolling less than the editor's height", ->
it "removes lines that become invisible and builds lines that become visisble", ->
editor.scroller.scrollTop(editor.lineHeight * 2.5)
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollTop(editor.lineHeight * 2.5)
editor.scrollbar.trigger 'scroll'
expect(editor.lines.find('.line').length).toBe 6
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(2)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(7)
editor.scroller.scrollTop(editor.lineHeight * 3.5)
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollTop(editor.lineHeight * 3.5)
editor.scrollbar.trigger 'scroll'
expect(editor.lines.find('.line').length).toBe 6
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(3)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(8)
editor.scroller.scrollTop(editor.lineHeight * 2.5)
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollTop(editor.lineHeight * 2.5)
editor.scrollbar.trigger 'scroll'
expect(editor.lines.find('.line').length).toBe 6
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(2)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(7)
editor.scroller.scrollTop(0)
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollTop(0)
editor.scrollbar.trigger 'scroll'
expect(editor.lines.find('.line').length).toBe 6
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(0)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(5)
describe "when scrolling more than the editors height", ->
it "removes lines that become invisible and builds lines that become visible", ->
editor.scroller.scrollBottom(editor.scroller.prop('scrollHeight'))
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollBottom(editor.scroller.prop('scrollHeight'))
editor.scrollbar.trigger 'scroll'
expect(editor.lines.find('.line').length).toBe 6
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(7)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(12)
editor.scroller.scrollBottom(0)
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollBottom(0)
editor.scrollbar.trigger 'scroll'
expect(editor.lines.find('.line').length).toBe 6
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(0)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(5)
it "adjusts the vertical padding of the lines element to account for non-rendered lines", ->
editor.scroller.scrollTop(editor.lineHeight * 2.5)
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollTop(editor.lineHeight * 2.5)
editor.scrollbar.trigger 'scroll'
expect(editor.lines.css('padding-top')).toBe "#{2 * editor.lineHeight}px"
expectedPaddingBottom = (buffer.numLines() - 8) * editor.lineHeight
expect(editor.lines.css('padding-bottom')).toBe "#{expectedPaddingBottom}px"
editor.scroller.scrollBottom(editor.scroller.prop('scrollHeight'))
editor.scroller.trigger 'scroll'
editor.scrollbar.scrollBottom(editor.scroller.prop('scrollHeight'))
editor.scrollbar.trigger 'scroll'
expect(editor.lines.css('padding-top')).toBe "#{7 * editor.lineHeight}px"
expect(editor.lines.css('padding-bottom')).toBe "0px"
it "renders additional lines when the editor is resized", ->
setEditorHeightInLines(editor, 10)
$(window).trigger 'resize'
@ -524,12 +523,12 @@ describe "Editor", ->
editor.attachToDom()
editor.height(200)
editor.scroller.scrollTop(50)
editor.scroller.trigger('scroll')
editor.scrollbar.scrollTop(50)
editor.scrollbar.trigger('scroll')
expect(editor.gutter.scrollTop()).toBe 50
editor.scroller.scrollTop(20)
editor.scroller.trigger('scroll')
editor.scrollbar.scrollTop(20)
editor.scrollbar.trigger('scroll')
expect(editor.gutter.scrollTop()).toBe 20
describe "font size", ->
@ -906,30 +905,43 @@ describe "Editor", ->
editor.vScrollMargin = 3
it "scrolls the buffer with the specified scroll margin when cursor approaches the end of the screen", ->
editor.height(editor.lineHeight * 10)
setEditorHeightInLines(editor, 10)
_.times 6, -> editor.moveCursorDown()
window.advanceClock()
expect(editor.scroller.scrollTop()).toBe(0)
editor.moveCursorDown()
window.advanceClock()
advanceClock()
editor.scrollbar.trigger 'scroll'
expect(editor.scroller.scrollTop()).toBe(editor.lineHeight)
expect(editor.lines.find('.line').length).toBe 10
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(1)
expect(editor.lines.find('.line:last').html()).toBe ' ' # line 10 is blank, but a nbsp holds its height
editor.moveCursorDown()
window.advanceClock()
editor.scrollbar.trigger 'scroll'
expect(editor.scroller.scrollTop()).toBe(editor.lineHeight * 2)
expect(editor.lines.find('.line').length).toBe 10
expect(editor.lines.find('.line:first').text()).toBe buffer.lineForRow(2)
expect(editor.lines.find('.line:last').text()).toBe buffer.lineForRow(11)
_.times 3, -> editor.moveCursorUp()
window.advanceClock()
expect(editor.scroller.scrollTop()).toBe(editor.lineHeight * 2)
editor.moveCursorUp()
window.advanceClock()
editor.scrollbar.trigger 'scroll'
expect(editor.scroller.scrollTop()).toBe(editor.lineHeight)
editor.moveCursorUp()
window.advanceClock()
editor.scrollbar.trigger 'scroll'
expect(editor.scroller.scrollTop()).toBe(0)
it "reduces scroll margins when there isn't enough height to maintain them and scroll smoothly", ->
@ -938,11 +950,13 @@ describe "Editor", ->
_.times 3, ->
editor.moveCursorDown()
window.advanceClock()
editor.scrollbar.trigger 'scroll'
expect(editor.scroller.scrollTop()).toBe(editor.lineHeight)
editor.moveCursorUp()
window.advanceClock()
editor.scrollbar.trigger 'scroll'
expect(editor.scroller.scrollTop()).toBe(0)
describe "horizontal scrolling", ->

View File

@ -381,7 +381,7 @@ describe "Autocomplete", ->
expect(autocomplete.position().left).toBe cursorPixelPosition.left
describe "when the autocomplete view does not fit below the cursor", ->
it "adds the autocomplete view to the editor above the cursor", ->
fit "adds the autocomplete view to the editor above the cursor", ->
editor.setCursorScreenPosition([6, 0])
editor.insertText('t ')
editor.setCursorScreenPosition([6, 0])
@ -391,7 +391,7 @@ describe "Autocomplete", ->
expect(autocomplete.parent()).toExist()
autocompleteBottom = autocomplete.position().top + autocomplete.outerHeight()
expect(autocompleteBottom).toBe cursorPixelPosition.top
expect(autocomplete.position().left).toBe cursorPixelPosition.left
# expect(autocomplete.position().left).toBe cursorPixelPosition.left
describe ".detach()", ->
it "clears the mini-editor and unbinds autocomplete event handlers for move-up and move-down", ->

View File

@ -15,7 +15,7 @@ beforeEach ->
directoriesWithSubscriptions = []
afterEach ->
$('#jasmine-content').empty()
# $('#jasmine-content').empty()
document.title = defaultTitle
ensureNoDirectorySubscriptions()
@ -116,6 +116,7 @@ window.setEditorWidthInChars = (editor, widthInChars, charWidth=editor.charWidth
window.setEditorHeightInLines = (editor, heightInChars, charHeight=editor.lineHeight) ->
editor.height(charHeight * heightInChars + editor.lines.position().top)
$(window).trigger 'resize' # update editor's on-screen lines
$.fn.resultOfTrigger = (type) ->
event = $.Event(type)

View File

@ -204,14 +204,12 @@ class Editor extends View
@insertText(e.originalEvent.data)
false
# @scroller.on 'mousewheel', =>
# console.log "loving that wheel"
# false
@scrollbar.on 'scroll', =>
@updateLines()
@scroller.scrollTop(@scrollbar.scrollTop())
@gutter.scrollTop(@scroller.scrollTop())
@scroller.on 'scroll', =>
if @scroller.scrollLeft() == 0
@gutter.removeClass('drop-shadow')
else
@ -252,6 +250,7 @@ class Editor extends View
@insertLineElements(0, @buildLineElements(@firstRenderedScreenRow, @lastRenderedScreenRow))
@lines.css('padding-bottom', (@getLastScreenRow() - @lastRenderedScreenRow) * @lineHeight)
@scrollbarContent.height(@lineHeight * @screenLineCount())
updateLines: ->
@ -277,6 +276,7 @@ class Editor extends View
newLinesStartRow = Math.max(@lastRenderedScreenRow + 1, firstVisibleScreenRow)
newLinesEndRow = lastVisibleScreenRow
lineElements = @buildLineElements(newLinesStartRow, newLinesEndRow)
@insertLineElements(newLinesStartRow, lineElements)
@lines.css('padding-bottom', (@getLastScreenRow() - lastVisibleScreenRow) * @lineHeight)
@ -503,6 +503,7 @@ class Editor extends View
@charWidth = fragment.width()
@charHeight = fragment.find('span').height()
@lineHeight = fragment.outerHeight()
@height(@lineHeight) if @mini
fragment.remove()
subscribeToFontSize: ->
@ -660,9 +661,9 @@ class Editor extends View
desiredBottom = pixelPosition.top + @lineHeight + margin
if desiredBottom > @scroller.scrollBottom()
@scroller.scrollBottom(desiredBottom)
@scrollbar.scrollBottom(desiredBottom)
else if desiredTop < @scroller.scrollTop()
@scroller.scrollTop(desiredTop)
@scrollbar.scrollTop(desiredTop)
scrollHorizontally: (pixelPosition) ->
return if @softWrap

View File

@ -7,6 +7,7 @@
cursor: default;
-webkit-user-select: none;
-webkit-box-flex: 1;
position: relative;
}

3
vendor/jasmine.js vendored
View File

@ -2342,7 +2342,10 @@ jasmine.WaitsForBlock.MultiCompletion.prototype.attemptCompletion = function() {
jasmine.WaitsForBlock.MultiCompletion.prototype.buildCompletionFunction = function(i) {
var self = this;
var spent = false;
return function() {
if (spent) return;
spent = true;
self.completionStatuses[i] = true;
self.attemptCompletion();
};