From 305fd14cd9776d46b41d2eb813a294735f0e9361 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 21 Apr 2017 13:44:12 -0600 Subject: [PATCH] Add TextEditorElement.pixelRectRangeForScreenRange for compatibility --- spec/text-editor-element-spec.js | 16 ++++++++++++++++ src/text-editor-element.js | 27 ++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/spec/text-editor-element-spec.js b/spec/text-editor-element-spec.js index afa882320..56601c455 100644 --- a/spec/text-editor-element-spec.js +++ b/spec/text-editor-element-spec.js @@ -329,6 +329,22 @@ describe('TextEditorElement', () => { }) }) + describe('::pixelRectForScreenRange(range)', () => { + it('returns a {top/left/width/height} object describing the rectangle between two screen positions, even if they are not on screen', async () => { + const element = buildTextEditorElement() + const editor = element.getModel() + editor.update({autoHeight: false}) + element.getModel().setText('xxxxxxxxxxxxxxxxxxxxxx\n'.repeat(20)) + element.style.height = '120px' + await element.getNextUpdatePromise() + element.setScrollTop(80) + await element.getNextUpdatePromise() + expect(element.getVisibleRowRange()).toEqual([4, 11]) + + expect(element.pixelRectForScreenRange([[2, 3], [13, 11]])).toEqual({top: 34, left: 22, height: 204, width: 57}) + }) + }) + describe('events', () => { let element = null diff --git a/src/text-editor-element.js b/src/text-editor-element.js index 947bf3a8e..bb530cbb9 100644 --- a/src/text-editor-element.js +++ b/src/text-editor-element.js @@ -1,4 +1,4 @@ -const {Emitter} = require('atom') +const {Emitter, Range} = require('atom') const Grim = require('grim') const TextEditorComponent = require('./text-editor-component') const dedent = require('dedent') @@ -248,6 +248,31 @@ class TextEditorElement extends HTMLElement { return this.getComponent().screenPositionForPixelPositionSync(pixelPosition) } + pixelRectForScreenRange (range) { + range = Range.fromObject(range) + + const start = this.pixelPositionForScreenPosition(range.start) + const end = this.pixelPositionForScreenPosition(range.end) + const lineHeight = this.getComponent().getLineHeight() + + console.log(start, end); + + return { + top: start.top, + left: start.left, + height: end.top + lineHeight - start.top, + width: end.left - start.left + } + } + + pixelRangeForScreenRange (range) { + range = Range.fromObject(range) + return { + start: this.pixelPositionForScreenPosition(range.start), + end: this.pixelPositionForScreenPosition(range.end) + } + } + getComponent () { if (!this.component) { this.component = new TextEditorComponent({