Compare commits

..

3 Commits

Author SHA1 Message Date
10da7885ac notes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-11-05 03:29:09 +03:00
099ded0cf4 notes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-11-05 03:25:02 +03:00
0ed930231d bugfix + refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-11-05 03:15:13 +03:00
3 changed files with 34 additions and 36 deletions

View File

@ -29,52 +29,55 @@ function clickPoint(x,y){
// box corresponds the to desired coordinates. This accounts for nested // box corresponds the to desired coordinates. This accounts for nested
// elements. // elements.
// //
// XXX with multi-line text when clicking outside the text to the left/right
// need to select the appropriate line...
// XXX it would be a better idea to do a binary search instead of a liner // XXX it would be a better idea to do a binary search instead of a liner
// pass... // pass...
// ...though b-search will get us to the target, we stll need to count... // ...though b-search will get us to the target, we stll need to count...
// XXX HACK -- is there a better way to do this??? var getCharOffset = function(elem, x, y, options={}){
var getCharOffset = function(elem, x, y, c){
c = c ?? 0
var r = document.createRange() var r = document.createRange()
for(var e of [...elem.childNodes]){ for(var e of [...elem.childNodes]){
var c = options.c ?? 0
// text node... // text node...
if(e instanceof Text){ if(e instanceof Text){
var prev, b var prev, rect, cursor_line, col
for(var i=0; i <= e.length; i++){ for(var i=0; i <= e.length; i++){
r.setStart(e, i) r.setStart(e, i)
r.setEnd(e, i) r.setEnd(e, i)
prev = b prev = rect
b = r.getBoundingClientRect() ?? options.prev
// found target... rect = r.getBoundingClientRect()
if(b.x >= x // line change...
&& b.y <= y // NOTE: this is almost identical to .getTextOffsetAt(..) see
&& b.bottom >= y){ // that for more docs...
// get the closest gap between chars to the click... if(prev
return (!prev && prev.y != rect.y){
|| Math.abs(b.x - x) <= Math.abs(prev.x - x)) ? if(cursor_line){
return col
?? c + i - 2 }
col = undefined }
cursor_line =
rect.y <= y
&& rect.bottom >= y
if(col == null
&& rect.x >= x){
col = (c + i == 0
|| Math.abs(rect.x - x) <= Math.abs(prev.x - x)) ?
c + i c + i
: c + i - 1 } } : c + i - 1
c += i - 1 if(cursor_line){
return col } } }
options.c += c - 1
// html node... // html node...
} else { } else {
var res = getCharOffset(e, x, y, c) options.prev = prev
if(!(res instanceof Array)){ options = getCharOffset(e, x, y, options)
return res } if(typeof(options) != 'object'){
;[c, res] = res } } return options } } }
// no result was found... // no result was found...
return arguments.length > 3 ? return arguments.length > 3 ?
[c, null] options
: null } : null }
var getTextAreaOffset = function(elem, x, y){
return elem.getTextGeometry(function(res, elem){
// XXX this will not work as it needs correct placement of elem under the cursor...
return getCharOffset(elem, x, y) }) }
// Get offset in markdown relative to the resulting text... // Get offset in markdown relative to the resulting text...
// //
// v <----- position // v <----- position

View File

@ -198,7 +198,6 @@ HTMLTextAreaElement.prototype.getTextOffsetAt = function(x, y){
// cursor col -- set once per line... // cursor col -- set once per line...
if(col == null if(col == null
&& ox <= rect.x - clone.x){ && ox <= rect.x - clone.x){
// XXX not sure about this test...
col = (ox > 0 col = (ox > 0
|| i == 0) ? || i == 0) ?
i i

View File

@ -48,13 +48,6 @@ var setup = function(){
- -
- ## Bugs: - ## Bugs:
focused:: true focused:: true
- BUG? clicking a block right of the lines places the cursor at end of last line -- should be the end of the cursor line (see: `.getTextOffsetAt(..)`)
- example click right of the text:
- example text
example text
example text
example text
- _appears that the initial caret placement is correct, but then it gets moved to the end of the block..._
- BUG: mobile browsers behave quite chaotically ignoring parts of the styling... - BUG: mobile browsers behave quite chaotically ignoring parts of the styling...
- FF: - FF:
- zooming on edited field - zooming on edited field
@ -63,6 +56,7 @@ var setup = function(){
- side margins are a bit too large (account for toolbat to the right) - side margins are a bit too large (account for toolbat to the right)
- -
- ## ToDo: - ## ToDo:
- Q: can we place a cursor in a table correctly???
- custom element / web component - custom element / web component
- BUG: select via double/triple clicks does not work... - BUG: select via double/triple clicks does not work...
- _looks like something is refocusing the element..._ - _looks like something is refocusing the element..._
@ -84,6 +78,8 @@ var setup = function(){
- DONE multiple node selection (via shift+motion) - DONE multiple node selection (via shift+motion)
- fixed state -- while `shift` pressed select or deselect only depending on first action (a-la FAR) - fixed state -- while `shift` pressed select or deselect only depending on first action (a-la FAR)
- DONE double/triple click working... - DONE double/triple click working...
- delete
- copy/cut/past (???)
- touch/mouse (???) - touch/mouse (???)
- Q: should we select text (mouse/touch) without first focusing?? - Q: should we select text (mouse/touch) without first focusing??
- _...logseq does not do this either_ - _...logseq does not do this either_