about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/local/container.nim55
-rw-r--r--src/server/buffer.nim6
2 files changed, 60 insertions, 1 deletions
diff --git a/src/local/container.nim b/src/local/container.nim
index 0c592ee4..bee93e73 100644
--- a/src/local/container.nim
+++ b/src/local/container.nim
@@ -1128,6 +1128,61 @@ proc cursorPrevLink*(container: Container; n = 1) {.jsfunc.} =
         container.markPos()
     )
 
+proc cursorLinkNavDown*(container: Container; n = 1) {.jsfunc.} =
+  if container.iface == nil:
+    return
+  container.markPos0()
+  container.iface
+    .findNextLink(container.cursorx, container.cursory, n)
+    .then(proc(res: tuple[x, y: int]) =
+      if res.x == -1 and res.y == -1:
+        if container.numLines <= container.height:
+          container.iface
+            .findNextLink(-1, 0, n = 1).then(proc(res2: tuple[x, y: int]) =
+              container.setCursorXYCenter(res2.x, res2.y)
+              container.markPos()
+            )
+        else:
+          container.pageDown()
+          container.markPos()
+      elif res.y < container.fromy + container.height:
+        container.setCursorXYCenter(res.x, res.y)
+        container.markPos()
+      else:
+        container.pageDown()
+        if res.y < container.fromy + container.height:
+          container.setCursorXYCenter(res.x, res.y)
+          container.markPos()
+    )
+
+proc cursorLinkNavUp*(container: Container; n = 1) {.jsfunc.} =
+  if container.iface == nil:
+    return
+  container.markPos0()
+  container.iface
+    .findPrevLink(container.cursorx, container.cursory, n)
+    .then(proc(res: tuple[x, y: int]) =
+      if res.x == -1 and res.y == -1:
+        if container.numLines <= container.height:
+          container.iface
+            .findPrevLink(int.high, container.numLines - 1, n = 1)
+            .then(proc(res2: tuple[x, y: int]) =
+              container.setCursorXYCenter(res2.x, res2.y)
+              container.markPos()
+            )
+        else:
+          container.pageUp()
+          container.markPos()
+      elif res.y >= container.fromy:
+        container.setCursorXYCenter(res.x, res.y)
+        container.markPos()
+      else:
+        container.pageUp()
+        if res.y >= container.fromy:
+          container.setCursorXYCenter(res.x, res.y)
+          container.markPos()
+    )
+
 proc cursorNextParagraph*(container: Container; n = 1) {.jsfunc.} =
   if container.iface == nil:
     return
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index cdffcc7f..120fd748 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -451,7 +451,11 @@ proc findPrevLink*(buffer: Buffer; cursorx, cursory, n: int):
   var found = 0
   var i = buffer.lines[cursory].findFormatN(cursorx) - 1
   var link: Element = nil
-  if i >= 0:
+  if cursorx == int.high:
+    # Special case for when we want to jump to the last link on this
+    # line (for cursorLinkNavUp).
+    i = buffer.lines[cursory].formats.len
+  elif i >= 0:
     link = buffer.lines[cursory].formats[i].node.getClickable()
   dec i
   var ly = 0 # last y