Skip to content

Commit

Permalink
Replace tooltip dock with atom-ide-ui datatips
Browse files Browse the repository at this point in the history
Datatips are much like our original tooltips, but they have a way to
become sticky, after which the user can drag them anywhere he wants
and also scroll through them. This pretty much removes the need for
a separate dock.

It also makes our UI consistent with that of other IDE packages and
allows us to benefit from UI and functionality improvements done in
atom-ide-ui itself.

Finally, this code is pretty much ready for use, except there are some
minor nitpicks in atom-ide-ui that I'd like ironed out before pushing
this in php-integrator:

  - facebookarchive/atom-ide-ui#98
  - facebookarchive/atom-ide-ui#99

References #315
  • Loading branch information
Gert-dev committed Oct 18, 2017
1 parent 241328a commit 9a9dee4
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 332 deletions.
2 changes: 1 addition & 1 deletion lib/AtomConfig.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class AtomConfig extends Config
'general.indexContinuously'
'general.additionalIndexingDelay'
'general.insertNewlinesForUseStatements'
'tooltips.enable'
'datatips.enable'
'signatureHelp.enable'
'gotoDefinition.enable'
'linting.enable'
Expand Down
2 changes: 1 addition & 1 deletion lib/Config.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class Config
additionalIndexingDelay : 200
insertNewlinesForUseStatements : false

tooltips:
datatips:
enable : true

signatureHelp:
Expand Down
84 changes: 84 additions & 0 deletions lib/DatatipProvider.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{Disposable, CompositeDisposable} = require 'atom'

SymbolHelpers = require './SymbolHelpers'

module.exports =

##*
# Provides datatips (tooltips).
##
class DatatipProvider
###*
* The service (that can be used to query the source code and contains utility methods).
*
* @var {Object|null}
###
service: null

###*
* @var {Array}
###
grammarScopes: ['text.html.php']

###*
* @var {Number}
###
priority: 1

###*
* @var {String}
###
providerName: 'php-integrator'

###*
* Initializes this provider.
*
* @param {mixed} service
###
activate: (@service) ->

###*
* Deactives the provider.
###
deactivate: () ->

###*
* @param {TextEditor} editor
* @param {Point} bufferPosition
*
* @return {Promise|null}
###
datatip: (editor, bufferPosition, heldKeys) ->
if not @service.getCurrentProjectSettings()
return new Promise (resolve, reject) =>
reject()

scopeChain = editor.scopeDescriptorForBufferPosition(bufferPosition).getScopeChain()

if scopeChain.length == 0
return new Promise (resolve, reject) =>
reject()

# Skip whitespace and other noise
if scopeChain == '.text.html.php .meta.embedded.block.php .source.php'
return new Promise (resolve, reject) =>
reject()

successHandler = (tooltip) =>
return null if not tooltip?

return {
markedStrings : [{
type : 'markdown'
value : tooltip.contents
}]

# FIXME: core doesn't generate ranges yet, otherwise we could use tooltip.range
range : SymbolHelpers.getRangeForSymbolAtPosition(editor, bufferPosition)
pinnable : true
}

failureHandler = () ->
return null

return @service.tooltipAt(editor, bufferPosition).then(successHandler, failureHandler)
52 changes: 24 additions & 28 deletions lib/Main.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ ConfigTester = require './ConfigTester'
ProjectManager = require './ProjectManager'
LinterProvider = require './LinterProvider'
ComposerService = require './ComposerService';
TooltipProvider = require './TooltipProvider'
DatatipProvider = require './DatatipProvider'
StatusBarManager = require "./Widgets/StatusBarManager"
IndexingMediator = require './IndexingMediator'
UseStatementHelper = require './UseStatementHelper';
Expand Down Expand Up @@ -83,16 +83,14 @@ module.exports =
default : false
order : 3

tooltips:
datatips:
type: 'object'
order: 3
properties:
enable:
title : 'Enable'
description : 'When enabled, documentation for various structural elements can be displayed in a
dock by activating intentions. (This is called tooltips as the data provided is
meant to be displayed in tooltips, but a dock offers advantages such as proper
scrolling and can be permanent.)'
datatip (tooltip).'
type : 'boolean'
default : true
order : 1
Expand Down Expand Up @@ -272,7 +270,7 @@ module.exports =
###*
* @var {Object|null}
###
tooltipProvider: null
datatipProvider: null

###*
* @var {Object|null}
Expand Down Expand Up @@ -424,12 +422,12 @@ module.exports =
config.onDidChange 'general.insertNewlinesForUseStatements', (value) =>
@getUseStatementHelper().setAllowAdditionalNewlines(value)

config.onDidChange 'tooltips.enable', (value) =>
config.onDidChange 'datatips.enable', (value) =>
if value
@activateTooltips()
@activateDatatips()

else
@deactivateTooltips()
@deactivateDatatips()

config.onDidChange 'signatureHelp.enable', (value) =>
if value
Expand Down Expand Up @@ -608,8 +606,8 @@ module.exports =

@registerAtomListeners()

if @getConfiguration().get('tooltips.enable')
@activateTooltips()
if @getConfiguration().get('datatips.enable')
@activateDatatips()

if @getConfiguration().get('signatureHelp.enable')
@activateSignatureHelp()
Expand All @@ -630,16 +628,16 @@ module.exports =
@registerTextEditorListeners(editor)

###*
* Activates the tooltip provider.
* Activates the datatip provider.
###
activateTooltips: () ->
@getTooltipProvider().activate(@getService())
activateDatatips: () ->
@getDatatipProvider().activate(@getService())

###*
* Deactivates the tooltip provider.
* Deactivates the datatip provider.
###
deactivateTooltips: () ->
@getTooltipProvider().deactivate()
deactivateDatatips: () ->
@getDatatipProvider().deactivate()

###*
* Activates the signature help provider.
Expand Down Expand Up @@ -731,7 +729,7 @@ module.exports =
@disposables = null

@getLinterProvider().deactivate()
@getTooltipProvider().deactivate()
@getDatatipProvider().deactivate()
@getSignatureHelpProvider().deactivate()

@getCachingProxy().stopPhpServer()
Expand Down Expand Up @@ -824,12 +822,10 @@ module.exports =
# return [@getAutocompletionProvider()]

###*
* Returns a list of intention providers.
*
* @return {Array}
* @param {Object} datatipService
###
getIntentionProviders: () ->
return @getTooltipProvider().getIntentionProviders()
consumeDatatipService: (datatipService) ->
datatipService.addProvider(@getDatatipProvider())

###*
* Returns the hyperclick provider.
Expand Down Expand Up @@ -944,13 +940,13 @@ module.exports =
return @projectManager

###*
* @return {TooltipProvider}
* @return {DatatipProvider}
###
getTooltipProvider: () ->
if not @tooltipProvider?
@tooltipProvider = new TooltipProvider()
getDatatipProvider: () ->
if not @datatipProvider?
@datatipProvider = new DatatipProvider()

return @tooltipProvider
return @datatipProvider

###*
* @return {SignatureHelpProvider}
Expand Down
Loading

0 comments on commit 9a9dee4

Please sign in to comment.