mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-29 01:50:07 +00:00
click-n-drag selection not works on all elements (expanding elements still need tweaks)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
2f3255b53d
commit
6674ece80e
@ -50,7 +50,8 @@ var getCharOffset = function(elem, x, y, c){
|
||||
&& b.y <= y
|
||||
&& b.bottom >= y){
|
||||
// get the closest gap between chars to the click...
|
||||
return Math.abs(b.x - x) <= Math.abs(prev.x - x) ?
|
||||
return (!prev
|
||||
|| Math.abs(b.x - x) <= Math.abs(prev.x - x)) ?
|
||||
c + i
|
||||
: c + i - 1 } }
|
||||
c += i - 1
|
||||
@ -2053,11 +2054,8 @@ var Outline = {
|
||||
outline.addEventListener('mousemove',
|
||||
function(evt){
|
||||
// handle selection in element with text offset by markup...
|
||||
// XXX should there be a timeout???
|
||||
if(selecting != null){
|
||||
// XXX need to get offset under cursor...
|
||||
var c = getTextAreaOffset(selecting, evt.clientX, evt.clientY)
|
||||
return
|
||||
var c = selecting.getTextOffsetAt(evt.clientX, evt.clientY)
|
||||
if(c > start){
|
||||
selecting.selectionStart = start
|
||||
selecting.selectionEnd = c
|
||||
|
||||
@ -63,13 +63,10 @@ HTMLTextAreaElement.prototype.autoUpdateSize = function(){
|
||||
function(evt){
|
||||
that.updateSize() })
|
||||
return this }
|
||||
HTMLTextAreaElement.prototype.getTextGeometry = function(func){
|
||||
var offset = this.selectionStart
|
||||
var text = this.value
|
||||
|
||||
// get the relevant styles...
|
||||
var style = getComputedStyle(this)
|
||||
var paddingV = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)
|
||||
|
||||
var cloneAsOffscreenSpan = function(elem){
|
||||
var style = getComputedStyle(elem)
|
||||
var s = {}
|
||||
for(var i=0; i < style.length; i++){
|
||||
var k = style[i]
|
||||
@ -77,12 +74,6 @@ HTMLTextAreaElement.prototype.getTextGeometry = function(func){
|
||||
|| k.startsWith('line')
|
||||
|| k.startsWith('white-space')){
|
||||
s[k] = style[k] } }
|
||||
|
||||
var carret = document.createElement('span')
|
||||
carret.innerText = '|'
|
||||
carret.style.margin = '0px'
|
||||
carret.style.padding = '0px'
|
||||
|
||||
var span = document.createElement('span')
|
||||
Object.assign(span.style, {
|
||||
...s,
|
||||
@ -108,13 +99,28 @@ HTMLTextAreaElement.prototype.getTextGeometry = function(func){
|
||||
|
||||
pointerEvents: 'none',
|
||||
})
|
||||
return span }
|
||||
|
||||
HTMLTextAreaElement.prototype.getTextGeometry = function(func){
|
||||
var offset = this.selectionStart
|
||||
var text = this.value
|
||||
|
||||
// get the relevant styles...
|
||||
var style = getComputedStyle(this)
|
||||
var paddingV = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)
|
||||
|
||||
var carret = document.createElement('span')
|
||||
carret.innerText = '|'
|
||||
carret.style.margin = '0px'
|
||||
carret.style.padding = '0px'
|
||||
|
||||
var span = cloneAsOffscreenSpan(this)
|
||||
span.append(
|
||||
text.slice(0, offset),
|
||||
carret,
|
||||
// NOTE: wee need the rest of the text for the carret to be typeset
|
||||
// to the correct line...
|
||||
text.slice(offset))
|
||||
|
||||
document.body.append(span)
|
||||
|
||||
var res = {
|
||||
@ -135,6 +141,75 @@ HTMLTextAreaElement.prototype.getTextGeometry = function(func){
|
||||
|
||||
return res }
|
||||
|
||||
HTMLTextAreaElement.prototype.getTextOffsetAt = function(x, y){
|
||||
var that = this
|
||||
var text = this.value
|
||||
|
||||
// cleanup cached span...
|
||||
this.__getTextOffsetAt_timeout
|
||||
&& clearTimeout(this.__getTextOffsetAt_timeout)
|
||||
this.__getTextOffsetAt_timeout = setTimeout(function(){
|
||||
delete that.__getTextOffsetAt_timeout
|
||||
that.__getTextOffsetAt_clone.remove()
|
||||
delete that.__getTextOffsetAt_clone }, 50)
|
||||
|
||||
// create/get clone span...
|
||||
if(this.__getTextOffsetAt_clone == null){
|
||||
var span =
|
||||
this.__getTextOffsetAt_clone =
|
||||
cloneAsOffscreenSpan(this)
|
||||
span.append(text)
|
||||
document.body.append(span)
|
||||
} else {
|
||||
var span = this.__getTextOffsetAt_clone }
|
||||
|
||||
var r = document.createRange()
|
||||
var t = span.firstChild
|
||||
|
||||
var clone = span.getBoundingClientRect()
|
||||
var target = this.getBoundingClientRect()
|
||||
|
||||
var ox = x - target.x
|
||||
var oy = y - target.y
|
||||
|
||||
var rect, prev
|
||||
var cursor_line
|
||||
var col
|
||||
for(var i=0; i <= t.length; i++){
|
||||
r.setStart(t, i)
|
||||
r.setEnd(t, i)
|
||||
prev = rect
|
||||
rect = r.getBoundingClientRect()
|
||||
|
||||
// line change...
|
||||
if(prev && prev.y != rect.y){
|
||||
// went off the cursor line
|
||||
if(cursor_line
|
||||
// cursor above block
|
||||
|| oy <= prev.y - clone.y){
|
||||
// end of prev line...
|
||||
return col
|
||||
?? i - 1 }
|
||||
// reset col
|
||||
col = undefined }
|
||||
|
||||
// cursor line...
|
||||
cursor_line =
|
||||
oy >= rect.y - clone.y
|
||||
&& oy <= rect.bottom - clone.y
|
||||
|
||||
// cursor col -- set once per line...
|
||||
if(col == null
|
||||
&& ox <= rect.x - clone.x){
|
||||
col = (!prev
|
||||
|| Math.abs(rect.x - clone.x - x) <= Math.abs(prev.x - clone.x - x)) ?
|
||||
i
|
||||
: i - 1
|
||||
if(cursor_line){
|
||||
return col } } }
|
||||
return col
|
||||
?? i }
|
||||
|
||||
// calculate number of lines in text area (both wrapped and actual lines)
|
||||
Object.defineProperty(HTMLTextAreaElement.prototype, 'heightLines', {
|
||||
enumerable: false,
|
||||
|
||||
@ -56,8 +56,13 @@ var setup = function(){
|
||||
- side margins are a bit too large (account for toolbat to the right)
|
||||
-
|
||||
- ## ToDo:
|
||||
- DONE selecting expanded code by _click-n-drag_
|
||||
- # this is a test
|
||||
string with
|
||||
some extra words
|
||||
- BUG: while selecting if the cursor moves to the left far enough (outside parent?) the first char in current line gets toggled...
|
||||
- custom element / web component
|
||||
- BUG: selecting by _click-n-drag_ or _double/triple click_ for some reason does not work...
|
||||
- BUG: select via click-n-drag and double/triple clicks does not work...
|
||||
- BUG/race: the non-value versions of custom elem seem to sometimes get loaded as empty...
|
||||
- DONE data interface:
|
||||
collapsed:: true
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user