From a33ab44966b4a01360e6f8ec78886febbc702ffd Mon Sep 17 00:00:00 2001 From: Christopher Chedeau Date: Thu, 22 Dec 2016 23:01:42 +0000 Subject: [PATCH] Add atom.tooltips.findTooltips(target) Right now, it is not possible to hide a tooltip programatically. This is useful when we know better than the tooltip implementation that we did an action that should hide it. After discussing with @lee-dohm, he suggested the findTooltips API that mimicks the KeyMapManager API. Released under CC0 --- spec/tooltip-manager-spec.coffee | 23 ++++++++++++++++++++++- src/tooltip-manager.coffee | 21 ++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/spec/tooltip-manager-spec.coffee b/spec/tooltip-manager-spec.coffee index a7e8ccb1f..51ac61c00 100644 --- a/spec/tooltip-manager-spec.coffee +++ b/spec/tooltip-manager-spec.coffee @@ -185,8 +185,29 @@ describe "TooltipManager", -> describe "when the window is resized", -> it "hides the tooltips", -> - manager.add element, title: "Title" + disposable = manager.add element, title: "Title" hover element, -> expect(document.body.querySelector(".tooltip")).not.toBeNull() window.dispatchEvent(new CustomEvent('resize')) expect(document.body.querySelector(".tooltip")).toBeNull() + disposable.dispose() + + describe "findTooltips", -> + it "adds and remove tooltips correctly", -> + expect(manager.findTooltips(element).length).toBe(0) + disposable1 = manager.add element, title: "elem1" + expect(manager.findTooltips(element).length).toBe(1) + disposable2 = manager.add element, title: "elem2" + expect(manager.findTooltips(element).length).toBe(2) + disposable1.dispose() + expect(manager.findTooltips(element).length).toBe(1) + disposable2.dispose() + expect(manager.findTooltips(element).length).toBe(0) + + it "lets us hide tooltips programatically", -> + disposable = manager.add element, title: "Title" + hover element, -> + expect(document.body.querySelector(".tooltip")).not.toBeNull() + manager.findTooltips(element)[0].hide(); + expect(document.body.querySelector(".tooltip")).toBeNull() + disposable.dispose() diff --git a/src/tooltip-manager.coffee b/src/tooltip-manager.coffee index 4419ec740..d9f060113 100644 --- a/src/tooltip-manager.coffee +++ b/src/tooltip-manager.coffee @@ -56,6 +56,7 @@ class TooltipManager {delay: {show: 1000, hide: 100}} constructor: ({@keymapManager, @viewRegistry}) -> + @tooltips = new Map() # Essential: Add a tooltip to the given element. # @@ -129,19 +130,37 @@ class TooltipManager tooltip = new Tooltip(target, options, @viewRegistry) + if !@tooltips.has(target) + @tooltips.set(target, []) + @tooltips.get(target).push(tooltip) + hideTooltip = -> tooltip.leave(currentTarget: target) tooltip.hide() window.addEventListener('resize', hideTooltip) - disposable = new Disposable -> + disposable = new Disposable => window.removeEventListener('resize', hideTooltip) hideTooltip() tooltip.destroy() + if @tooltips.has(target) + tooltipsForTarget = @tooltips.get(target) + index = tooltipsForTarget.indexOf(tooltip) + if index != -1 + tooltipsForTarget.splice(index, 1) + if tooltipsForTarget.length == 0 + @tooltips.delete(target) + disposable + findTooltips: (target) -> + if @tooltips.has(target) + @tooltips.get(target).slice() + else + [] + humanizeKeystrokes = (keystroke) -> keystrokes = keystroke.split(' ') keystrokes = (_.humanizeKeystroke(stroke) for stroke in keystrokes)