aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2015-01-03 18:32:47 +0000
committerStephen Blott2015-01-03 18:33:33 +0000
commit7537736a0898f736d689092b9bd350886f327ab0 (patch)
tree78cc0cd10b1576b01c17c73b1c6b4e69c19a6858
parent6a817e575d55daec146203e7ef8929fdfd81bace (diff)
downloadvimium-7537736a0898f736d689092b9bd350886f327ab0.tar.bz2
Modes; add ConstrainedMode.
-rw-r--r--content_scripts/mode.coffee19
-rw-r--r--content_scripts/mode_visual.coffee6
2 files changed, 22 insertions, 3 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee
index a19c3df0..e4e2679d 100644
--- a/content_scripts/mode.coffee
+++ b/content_scripts/mode.coffee
@@ -83,7 +83,26 @@ class MultiMode extends Mode
exit: ->
mode.exit() for mode in modes
+# When the user clicks anywhere outside of the given element, the mode is exited.
+class ConstrainedMode extends Mode
+ constructor: (@element, options) ->
+ options.name = if options.name? then "constrained-#{options.name}" else "constrained"
+ super options
+
+ @handlers.push handlerStack.push
+ "click": (event) =>
+ @exit() unless @isDOMDescendant @element, event.srcElement
+ @continueBubbling
+
+ isDOMDescendant: (parent, child) ->
+ node = child
+ while (node != null)
+ return true if (node == parent)
+ node = node.parentNode
+ false
+
root = exports ? window
root.Mode = Mode
root.SingletonMode = SingletonMode
root.MultiMode = MultiMode
+root.ConstrainedMode = ConstrainedMode
diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee
index 67f485a0..07530e94 100644
--- a/content_scripts/mode_visual.coffee
+++ b/content_scripts/mode_visual.coffee
@@ -1,12 +1,12 @@
-class VisualMode extends Mode
+class VisualMode extends ConstrainedMode
# Proposal... The visual selection must stay within element. This will become relevant if we ever get so
# far as implementing a vim-like editing mode for text areas/content editable.
#
constructor: (element=document.body) ->
- super
- name: "Visual"
+ super element,
+ name: "visual"
badge: "V"
keydown: (event) =>