From 6af96249d408d3a4131bafc5a6b83b46d6b90523 Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Sat, 4 Aug 2012 22:41:07 -0700 Subject: Prototype for tab-through-input-elements feature. Refs #508. --- content_scripts/vimium_frontend.coffee | 35 ++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'content_scripts/vimium_frontend.coffee') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 5b7a7402..1ab938fe 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -301,19 +301,34 @@ extend window, HUD.showForDuration("Yanked URL", 1000) focusInput: (count) -> - results = DomUtils.evaluateXPath(textInputXPath, XPathResult.ORDERED_NODE_ITERATOR_TYPE) + xpathResult = DomUtils.evaluateXPath(textInputXPath, XPathResult.ORDERED_NODE_ITERATOR_TYPE) + visibleInputs = + while (currentInputBox = xpathResult.iterateNext()) + rect = DomUtils.getVisibleClientRect(currentInputBox) + continue if rect == null + { element: currentInputBox, rect: rect } - lastInputBox - i = 0 + return if visibleInputs.length == 0 - while (i < count) - currentInputBox = results.iterateNext() - break unless currentInputBox - continue if (DomUtils.getVisibleClientRect(currentInputBox) == null) - lastInputBox = currentInputBox - i += 1 + selectedInputIndex = Math.min(count - 1, visibleInputs.length - 1) - lastInputBox.focus() if lastInputBox + visibleInputs[selectedInputIndex].element.focus() + + hintMarkers = (LinkHints.createMarkerFor(el) for el in visibleInputs) + + for marker, idx in hintMarkers + marker.innerHTML = "#{idx + 1}" + + hintMarkerContainingDiv = LinkHints.displayHints(hintMarkers) + + handlerStack.push keydown: -> + if event.keyCode == KeyboardUtils.keyCodes.tab + if ++selectedInputIndex == hintMarkers.length + selectedInputIndex = 0 + hintMarkers[selectedInputIndex].clickableItem.focus() + else + DomUtils.removeElement hintMarkerContainingDiv + handlerStack.pop() # # Sends everything except i & ESC to the handler in background_page. i & ESC are special because they control -- cgit v1.2.3 From 3afb5e6ee1295de6ccb043b3164b53955e8e1fc7 Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Tue, 7 Aug 2012 21:22:27 -0700 Subject: Don't show hints on `gi` if there is only one input element. --- content_scripts/vimium_frontend.coffee | 2 ++ 1 file changed, 2 insertions(+) (limited to 'content_scripts/vimium_frontend.coffee') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 1ab938fe..2fa6b93f 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -314,6 +314,8 @@ extend window, visibleInputs[selectedInputIndex].element.focus() + return if visibleInputs.length == 1 + hintMarkers = (LinkHints.createMarkerFor(el) for el in visibleInputs) for marker, idx in hintMarkers -- cgit v1.2.3 From 972bf075af18266593b63ac50c4bca7cef0ecf43 Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Tue, 7 Aug 2012 21:39:36 -0700 Subject: Highlight the selected hint with a different color. The actual color / appearance could probably use some tweaking. --- content_scripts/vimium_frontend.coffee | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'content_scripts/vimium_frontend.coffee') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 2fa6b93f..68b58766 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -318,6 +318,8 @@ extend window, hintMarkers = (LinkHints.createMarkerFor(el) for el in visibleInputs) + hintMarkers[0].classList.add 'internalVimiumSelectedHintMarker' + for marker, idx in hintMarkers marker.innerHTML = "#{idx + 1}" @@ -325,8 +327,10 @@ extend window, handlerStack.push keydown: -> if event.keyCode == KeyboardUtils.keyCodes.tab + hintMarkers[selectedInputIndex].classList.remove 'internalVimiumSelectedHintMarker' if ++selectedInputIndex == hintMarkers.length selectedInputIndex = 0 + hintMarkers[selectedInputIndex].classList.add 'internalVimiumSelectedHintMarker' hintMarkers[selectedInputIndex].clickableItem.focus() else DomUtils.removeElement hintMarkerContainingDiv -- cgit v1.2.3 From 872e8391feda36642d36a4c0813bcb053d808fd3 Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Sun, 19 Aug 2012 00:00:54 -0700 Subject: Shift-tab scrolls backwards in focus-input mode. --- content_scripts/vimium_frontend.coffee | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'content_scripts/vimium_frontend.coffee') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 68b58766..5d31b67a 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -325,14 +325,18 @@ extend window, hintMarkerContainingDiv = LinkHints.displayHints(hintMarkers) - handlerStack.push keydown: -> + handlerStack.push keydown: (event) -> if event.keyCode == KeyboardUtils.keyCodes.tab hintMarkers[selectedInputIndex].classList.remove 'internalVimiumSelectedHintMarker' - if ++selectedInputIndex == hintMarkers.length - selectedInputIndex = 0 + if event.shiftKey + if --selectedInputIndex == -1 + selectedInputIndex = hintMarkers.length - 1 + else + if ++selectedInputIndex == hintMarkers.length + selectedInputIndex = 0 hintMarkers[selectedInputIndex].classList.add 'internalVimiumSelectedHintMarker' hintMarkers[selectedInputIndex].clickableItem.focus() - else + else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey DomUtils.removeElement hintMarkerContainingDiv handlerStack.pop() -- cgit v1.2.3 From 3cbe7758d7ca4cfac70c931c4c3fa58c50841d90 Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Mon, 20 Aug 2012 00:45:01 -0700 Subject: Style input hints as number-less overlays. --- content_scripts/vimium_frontend.coffee | 39 +++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'content_scripts/vimium_frontend.coffee') diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 5d31b67a..3f73919b 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -301,12 +301,13 @@ extend window, HUD.showForDuration("Yanked URL", 1000) focusInput: (count) -> - xpathResult = DomUtils.evaluateXPath(textInputXPath, XPathResult.ORDERED_NODE_ITERATOR_TYPE) + resultSet = DomUtils.evaluateXPath(textInputXPath, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE) visibleInputs = - while (currentInputBox = xpathResult.iterateNext()) - rect = DomUtils.getVisibleClientRect(currentInputBox) + for i in [0...resultSet.snapshotLength] by 1 + element = resultSet.snapshotItem(i) + rect = DomUtils.getVisibleClientRect(element) continue if rect == null - { element: currentInputBox, rect: rect } + { element: element, rect: rect } return if visibleInputs.length == 0 @@ -316,28 +317,36 @@ extend window, return if visibleInputs.length == 1 - hintMarkers = (LinkHints.createMarkerFor(el) for el in visibleInputs) + hints = for tuple in visibleInputs + hint = document.createElement("div") + hint.className = "vimiumReset internalVimiumInputHint vimiumInputHint" - hintMarkers[0].classList.add 'internalVimiumSelectedHintMarker' + # minus 1 for the border + hint.style.left = (tuple.rect.left - 1) + window.scrollX + "px" + hint.style.top = (tuple.rect.top - 1) + window.scrollY + "px" + hint.style.width = tuple.rect.width + "px" + hint.style.height = tuple.rect.height + "px" - for marker, idx in hintMarkers - marker.innerHTML = "#{idx + 1}" + hint - hintMarkerContainingDiv = LinkHints.displayHints(hintMarkers) + hints[0].classList.add 'internalVimiumSelectedInputHint' + + hintContainingDiv = DomUtils.addElementList(hints, + { id: "vimiumInputMarkerContainer", className: "vimiumReset" }) handlerStack.push keydown: (event) -> if event.keyCode == KeyboardUtils.keyCodes.tab - hintMarkers[selectedInputIndex].classList.remove 'internalVimiumSelectedHintMarker' + hints[selectedInputIndex].classList.remove 'internalVimiumSelectedInputHint' if event.shiftKey if --selectedInputIndex == -1 - selectedInputIndex = hintMarkers.length - 1 + selectedInputIndex = hints.length - 1 else - if ++selectedInputIndex == hintMarkers.length + if ++selectedInputIndex == hints.length selectedInputIndex = 0 - hintMarkers[selectedInputIndex].classList.add 'internalVimiumSelectedHintMarker' - hintMarkers[selectedInputIndex].clickableItem.focus() + hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint' + visibleInputs[selectedInputIndex].element.focus() else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey - DomUtils.removeElement hintMarkerContainingDiv + DomUtils.removeElement hintContainingDiv handlerStack.pop() # -- cgit v1.2.3