aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/mode.coffee10
-rw-r--r--content_scripts/mode_insert.coffee1
-rw-r--r--content_scripts/mode_visual_edit.coffee7
-rw-r--r--content_scripts/vimium_frontend.coffee28
4 files changed, 31 insertions, 15 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee
index 292dc24e..ad66f2d7 100644
--- a/content_scripts/mode.coffee
+++ b/content_scripts/mode.coffee
@@ -51,6 +51,14 @@ class Mode
keydown: @options.keydown || null
keypress: @options.keypress || null
keyup: @options.keyup || null
+ indicator: =>
+ # Update the mode indicator. Setting @options.indicator to a string shows a mode indicator in the
+ # HUD. Setting @options.indicator to 'false' forces no mode indicator. If @options.indicator is
+ # undefined, then the request propagates to the next mode.
+ if @options.indicator?
+ if @options.indicator then HUD?.show @options.indicator else HUD?.hide true, false
+ @stopBubblingAndTrue
+ else @continueBubbling
# If @options.exitOnEscape is truthy, then the mode will exit when the escape key is pressed.
if @options.exitOnEscape
@@ -122,6 +130,7 @@ class Mode
if KeyboardUtils.isPrintable event then @stopBubblingAndFalse else @stopBubblingAndTrue
Mode.modes.push @
+ handlerStack.bubbleEvent 'indicator'
@logModes()
# End of Mode constructor.
@@ -143,6 +152,7 @@ class Mode
handlerStack.remove handlerId for handlerId in @handlers
Mode.modes = Mode.modes.filter (mode) => mode != @
@modeIsActive = false
+ handlerStack.bubbleEvent 'indicator'
deactivateSingleton: (singleton) ->
Mode.singletons?[Utils.getIdentity singleton]?.exit()
diff --git a/content_scripts/mode_insert.coffee b/content_scripts/mode_insert.coffee
index c0f4c6e7..825229f7 100644
--- a/content_scripts/mode_insert.coffee
+++ b/content_scripts/mode_insert.coffee
@@ -24,6 +24,7 @@ class InsertMode extends Mode
defaults =
name: "insert"
+ indicator: if @global then "Insert mode" else null
keypress: handleKeyEvent
keyup: handleKeyEvent
keydown: handleKeyEvent
diff --git a/content_scripts/mode_visual_edit.coffee b/content_scripts/mode_visual_edit.coffee
index 9b01094b..7a94831c 100644
--- a/content_scripts/mode_visual_edit.coffee
+++ b/content_scripts/mode_visual_edit.coffee
@@ -376,10 +376,10 @@ class Movement extends CountPrefix
message = @yankedText.replace /\s+/g, " "
message = message[...12] + "..." if 15 < @yankedText.length
plural = if @yankedText.length == 1 then "" else "s"
- HUD.showForDuration "Yanked #{@yankedText.length} character#{plural}: \"#{message}\".", 2500
@options.onYank?.call @, @yankedText
@exit()
+ HUD.showForDuration "Yanked #{@yankedText.length} character#{plural}: \"#{message}\".", 2500
@yankedText
exit: (event, target) ->
@@ -466,6 +466,7 @@ class VisualMode extends Movement
defaults =
name: "visual"
+ indicator: if options.indicator? then options.indicator else "Visual mode"
singleton: VisualMode
exitOnEscape: true
super extend defaults, options
@@ -566,7 +567,7 @@ class VisualMode extends Movement
class VisualLineMode extends VisualMode
constructor: (options = {}) ->
- super extend { name: "visual/line" }, options
+ super extend { name: "visual/line", indicator: "Visual mode (line)" }, options
@extendSelection()
@commands.v = -> @changeMode VisualMode
@@ -586,6 +587,7 @@ class CaretMode extends Movement
defaults =
name: "caret"
+ indicator: "Caret mode"
singleton: VisualMode
exitOnEscape: true
super extend defaults, options
@@ -650,6 +652,7 @@ class EditMode extends Movement
defaults =
name: "edit"
+ indicator: "Edit mode"
exitOnEscape: true
exitOnBlur: @element
super extend defaults, options
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index cc8d820c..74f61995 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -129,6 +129,7 @@ window.initializeModes = ->
constructor: ->
super
name: "normal"
+ indicator: false # There is no mode indicator in normal mode.
keydown: (event) => onKeydown.call @, event
keypress: (event) => onKeypress.call @, event
keyup: (event) => onKeyup.call @, event
@@ -691,7 +692,6 @@ handleKeyCharForFindMode = (keyChar) ->
updateQueryForFindMode findModeQuery.rawQuery + keyChar
handleEscapeForFindMode = ->
- exitFindMode()
document.body.classList.remove("vimiumFindMode")
# removing the class does not re-color existing selections. we recreate the current selection so it reverts
# back to the default color.
@@ -705,7 +705,7 @@ handleEscapeForFindMode = ->
# Return true if character deleted, false otherwise.
handleDeleteForFindMode = ->
if findModeQuery.rawQuery.length == 0
- exitFindMode()
+ HUD.hide()
performFindInPlace()
false
else
@@ -716,7 +716,6 @@ handleDeleteForFindMode = ->
# <esc> corresponds approximately to 'nevermind, I have found it already' while <cr> means 'I want to save
# this query and do more searches with it'
handleEnterForFindMode = ->
- exitFindMode()
focusFoundLink()
document.body.classList.add("vimiumFindMode")
FindModeHistory.saveQuery findModeQuery.rawQuery
@@ -727,6 +726,7 @@ class FindMode extends Mode
@partialQuery = ""
super
name: "find"
+ indicator: false
exitOnEscape: true
exitOnClick: true
@@ -991,11 +991,9 @@ window.enterFindMode = ->
# Save the selection, so performFindInPlace can restore it.
findModeSaveSelection()
findModeQuery = { rawQuery: "" }
- HUD.show("/")
- new FindMode()
-
-exitFindMode = ->
- HUD.hide()
+ findMode = new FindMode()
+ HUD.show "/"
+ findMode
window.showHelpDialog = (html, fid) ->
return if (isShowingHelpDialog || !document.body || fid != frameId)
@@ -1098,13 +1096,17 @@ HUD =
document.body.appendChild(element)
element
- hide: (immediate) ->
+ # Hide the HUD.
+ # If :immediate is falsy, then the HUD is faded out smoothly (otherwise it is hidden immediately).
+ # If :updateIndicator is truthy, then we also refresh the mode indicator. The only time we don't update the
+ # mode indicator, is when hide() is called for the mode indicator itself.
+ hide: (immediate = false, updateIndicator = true) ->
clearInterval(HUD._tweenId)
- if (immediate)
- HUD.displayElement().style.display = "none"
+ if immediate
+ HUD.displayElement().style.display = "none" unless updateIndicator
+ handlerStack.bubbleEvent "indicator" if updateIndicator
else
- HUD._tweenId = Tween.fade(HUD.displayElement(), 0, 150,
- -> HUD.displayElement().style.display = "none")
+ HUD._tweenId = Tween.fade HUD.displayElement(), 0, 150, -> HUD.hide true, updateIndicator
isReady: -> document.body != null