diff --git a/src/focus-context.coffee b/src/focus-context.coffee index e52b0487f..c17514471 100644 --- a/src/focus-context.coffee +++ b/src/focus-context.coffee @@ -3,3 +3,13 @@ module.exports = class FocusContext extends Model @property 'focusedObject', null + + blurSuppressionCounter: 0 + + isBlurSuppressed: -> + @blurSuppressionCounter > 0 + + suppressBlur: (fn) -> + @blurSuppressionCounter++ + fn() + @blurSuppressionCounter-- diff --git a/src/focusable.coffee b/src/focusable.coffee index 69c966896..c046e7cd2 100644 --- a/src/focusable.coffee +++ b/src/focusable.coffee @@ -12,8 +12,17 @@ class Focusable extends Mixin focus: -> throw new Error("Object must be assigned a focusContext to be focus") unless @focusContext - @focusContext.focusedObject = this + unless @focused + @suppressBlur => + @focusContext.focusedObject = this blur: -> throw new Error("Object must be assigned a focusContext to be blurred") unless @focusContext - @focusContext.focusedObject = null if @focused + if @focused and not @focusContext.isBlurSuppressed() + @focusContext.focusedObject = null + + suppressBlur: (fn) -> + if @focusContext? + @focusContext.suppressBlur(fn) + else + fn()