From 6bd971a30a86382ac771b74d5ed6a24082fbc9c0 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Fri, 10 Mar 2017 01:07:57 +1100 Subject: [PATCH 1/5] Consume File-Icons' element-icon service --- lib/file-icons.coffee | 15 --------------- lib/fuzzy-finder-view.js | 36 ++++++++++++++++++++++++------------ lib/icon-services.coffee | 27 +++++++++++++++++++++++++++ lib/main.coffee | 11 ++++++++--- package.json | 5 +++++ 5 files changed, 64 insertions(+), 30 deletions(-) delete mode 100644 lib/file-icons.coffee create mode 100644 lib/icon-services.coffee diff --git a/lib/file-icons.coffee b/lib/file-icons.coffee deleted file mode 100644 index fdc809db..00000000 --- a/lib/file-icons.coffee +++ /dev/null @@ -1,15 +0,0 @@ -DefaultFileIcons = require './default-file-icons' - -class FileIcons - constructor: -> - @service = new DefaultFileIcons - - getService: -> - @service - - resetService: -> - @service = new DefaultFileIcons - - setService: (@service) -> - -module.exports = new FileIcons diff --git a/lib/fuzzy-finder-view.js b/lib/fuzzy-finder-view.js index 13f93849..5d139a83 100644 --- a/lib/fuzzy-finder-view.js +++ b/lib/fuzzy-finder-view.js @@ -8,7 +8,7 @@ import path from 'path' import SelectListView from 'atom-select-list' import {repositoryForPath} from './helpers' -import FileIcons from './file-icons' +import IconServices from './icon-services' export default class FuzzyFinderView { constructor () { @@ -39,6 +39,10 @@ export default class FuzzyFinderView { this.confirm() }, didChangeQuery: () => { + if (this.iconDisposables) { + this.iconDisposables.dispose() + this.iconDisposables = null + } const isLineJump = this.isQueryALineJump() if (!this.previousQueryWasLineJump && isLineJump) { this.previousQueryWasLineJump = true @@ -77,22 +81,30 @@ export default class FuzzyFinderView { } } - const iconClasses = FileIcons.getService().iconClassForPath(filePath, 'fuzzy-finder') - let classList - if (Array.isArray(iconClasses)) { - classList = iconClasses - } else if (iconClasses) { - classList = iconClasses.toString().split(/\s+/g) - } else { - classList = [] - } - const fileBasename = path.basename(filePath) const baseOffset = projectRelativePath.length - fileBasename.length const primaryLine = document.createElement('div') - primaryLine.classList.add('primary-line', 'file', 'icon', ...classList) primaryLine.dataset.name = fileBasename primaryLine.dataset.path = projectRelativePath + + let classList = [] + const addIconToElement = IconServices.get('element-icons') + if(addIconToElement){ + if (!this.iconDisposables) { + this.iconDisposables = new CompositeDisposable() + this.subscriptions.add(this.iconDisposables) + } + this.iconDisposables.add(addIconToElement(primaryLine, filePath)) + } else { + const iconClasses = IconServices.get('file-icons').iconClassForPath(filePath, 'fuzzy-finder') + if (Array.isArray(iconClasses)) { + classList = iconClasses + } else if (iconClasses) { + classList = iconClasses.toString().split(/\s+/g) + } + } + + primaryLine.classList.add('primary-line', 'file', 'icon', ...classList) primaryLine.appendChild(highlight(fileBasename, matches, baseOffset)) li.appendChild(primaryLine) diff --git a/lib/icon-services.coffee b/lib/icon-services.coffee new file mode 100644 index 00000000..384a8f83 --- /dev/null +++ b/lib/icon-services.coffee @@ -0,0 +1,27 @@ +DefaultFileIcons = require './default-file-icons' +{Emitter} = require 'atom' + +defaultServices = + 'file-icons': new DefaultFileIcons + 'element-icons': null + +class IconServices + constructor: -> + @emitter = new Emitter() + @activeServices = Object.assign {}, defaultServices + + get: (name) -> + @activeServices[name] or defaultServices[name] + + reset: (name) -> + @set name, defaultServices[name] + + set: (name, service) -> + if service isnt @activeServices[name] + @activeServices[name] = service + @emitter.emit 'did-change' + + onDidChange: (callback) -> + @emitter.on 'did-change', callback + +module.exports = new IconServices diff --git a/lib/main.coffee b/lib/main.coffee index 420bbf09..7c0c296f 100644 --- a/lib/main.coffee +++ b/lib/main.coffee @@ -1,5 +1,5 @@ {Disposable} = require 'atom' -FileIcons = require './file-icons' +IconServices = require './icon-services' module.exports = activate: (state) -> @@ -35,10 +35,15 @@ module.exports = @stopLoadPathsTask() @active = false + consumeElementIcons: (service) -> + IconServices.set 'element-icons', service + new Disposable => + IconServices.reset 'element-icons' + consumeFileIcons: (service) -> - FileIcons.setService(service) + IconServices.set 'file-icons', service new Disposable -> - FileIcons.resetService() + IconServices.reset 'file-icons' serialize: -> paths = {} diff --git a/package.json b/package.json index 542afc2d..4d903e6a 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,11 @@ "versions": { "1.0.0": "consumeFileIcons" } + }, + "file-icons.element-icons": { + "versions": { + "1.0.0": "consumeElementIcons" + } } }, "configSchema": { From 30044f5785e18dc4e83c09b40e221bd34296e76a Mon Sep 17 00:00:00 2001 From: Alhadis Date: Wed, 6 Sep 2017 23:01:46 +1000 Subject: [PATCH 2/5] Decaffeinate lib/icon-services.coffee --- lib/icon-services.coffee | 27 --------------------------- lib/icon-services.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 27 deletions(-) delete mode 100644 lib/icon-services.coffee create mode 100644 lib/icon-services.js diff --git a/lib/icon-services.coffee b/lib/icon-services.coffee deleted file mode 100644 index 384a8f83..00000000 --- a/lib/icon-services.coffee +++ /dev/null @@ -1,27 +0,0 @@ -DefaultFileIcons = require './default-file-icons' -{Emitter} = require 'atom' - -defaultServices = - 'file-icons': new DefaultFileIcons - 'element-icons': null - -class IconServices - constructor: -> - @emitter = new Emitter() - @activeServices = Object.assign {}, defaultServices - - get: (name) -> - @activeServices[name] or defaultServices[name] - - reset: (name) -> - @set name, defaultServices[name] - - set: (name, service) -> - if service isnt @activeServices[name] - @activeServices[name] = service - @emitter.emit 'did-change' - - onDidChange: (callback) -> - @emitter.on 'did-change', callback - -module.exports = new IconServices diff --git a/lib/icon-services.js b/lib/icon-services.js new file mode 100644 index 00000000..0228dc4e --- /dev/null +++ b/lib/icon-services.js @@ -0,0 +1,35 @@ +const DefaultFileIcons = require('./default-file-icons') +const {Emitter} = require('atom') + +const defaultServices = { + 'file-icons': new DefaultFileIcons(), + 'element-icons': null +} + +class IconServices { + constructor () { + this.emitter = new Emitter() + this.activeServices = Object.assign({}, defaultServices) + } + + get (name) { + return this.activeServices[name] || defaultServices[name] + } + + reset (name) { + this.set(name, defaultServices[name]) + } + + set (name, service) { + if (service !== this.activeServices[name]) { + this.activeServices[name] = service + this.emitter.emit('did-change') + } + } + + onDidChange (callback) { + return this.emitter.on('did-change', callback) + } +} + +module.exports = new IconServices() From f4df9b3d2558013f16a5937efeba11b4440e6801 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Tue, 19 Sep 2017 03:33:07 +1000 Subject: [PATCH 3/5] Fix linting error and shut "Standard" the hell up --- lib/fuzzy-finder-view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fuzzy-finder-view.js b/lib/fuzzy-finder-view.js index 0f9bb123..5091c10c 100644 --- a/lib/fuzzy-finder-view.js +++ b/lib/fuzzy-finder-view.js @@ -89,7 +89,7 @@ export default class FuzzyFinderView { let classList = [] const addIconToElement = IconServices.get('element-icons') - if(addIconToElement){ + if (addIconToElement) { if (!this.iconDisposables) { this.iconDisposables = new CompositeDisposable() this.subscriptions.add(this.iconDisposables) From 4b8b4dd91f83d31a9a61922cb88a6dd57570e3d5 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Fri, 27 Oct 2017 08:43:47 +1100 Subject: [PATCH 4/5] Amend revisions requested in atom/tree-view#1146 --- lib/default-file-icons.js | 3 +- lib/file-icons.js | 21 -------------- lib/fuzzy-finder-view.js | 50 ++++++++++++--------------------- lib/icon-services.js | 58 +++++++++++++++++++++++++++------------ lib/main.js | 8 +++--- spec/fuzzy-finder-spec.js | 6 ++-- 6 files changed, 66 insertions(+), 80 deletions(-) delete mode 100644 lib/file-icons.js diff --git a/lib/default-file-icons.js b/lib/default-file-icons.js index fc58e8fc..96c7a8d3 100644 --- a/lib/default-file-icons.js +++ b/lib/default-file-icons.js @@ -1,7 +1,6 @@ const fs = require('fs-plus') const path = require('path') -module.exports = class DefaultFileIcons { iconClassForPath (filePath) { const extension = path.extname(filePath) @@ -23,3 +22,5 @@ class DefaultFileIcons { } } } + +module.exports = new DefaultFileIcons() diff --git a/lib/file-icons.js b/lib/file-icons.js deleted file mode 100644 index ce58b273..00000000 --- a/lib/file-icons.js +++ /dev/null @@ -1,21 +0,0 @@ -const DefaultFileIcons = require('./default-file-icons') - -class FileIcons { - constructor () { - this.service = new DefaultFileIcons() - } - - getService () { - return this.service - } - - resetService () { - this.service = new DefaultFileIcons() - } - - setService (service) { - this.service = service - } -} - -module.exports = new FileIcons() diff --git a/lib/fuzzy-finder-view.js b/lib/fuzzy-finder-view.js index 5091c10c..cfb594ab 100644 --- a/lib/fuzzy-finder-view.js +++ b/lib/fuzzy-finder-view.js @@ -67,9 +67,10 @@ export default class FuzzyFinderView { const li = document.createElement('li') li.classList.add('two-lines') - const repository = repositoryForPath(filePath) + this.filePath = filePath + const repository = repositoryForPath(this.filePath) if (repository) { - const status = repository.getCachedPathStatus(filePath) + const status = repository.getCachedPathStatus(this.filePath) if (repository.isStatusNew(status)) { const div = document.createElement('div') div.classList.add('status', 'status-added', 'icon', 'icon-diff-added') @@ -81,38 +82,21 @@ export default class FuzzyFinderView { } } - const fileBasename = path.basename(filePath) + const fileBasename = path.basename(this.filePath) const baseOffset = projectRelativePath.length - fileBasename.length - const primaryLine = document.createElement('div') - primaryLine.dataset.name = fileBasename - primaryLine.dataset.path = projectRelativePath - - let classList = [] - const addIconToElement = IconServices.get('element-icons') - if (addIconToElement) { - if (!this.iconDisposables) { - this.iconDisposables = new CompositeDisposable() - this.subscriptions.add(this.iconDisposables) - } - this.iconDisposables.add(addIconToElement(primaryLine, filePath)) - } else { - const iconClasses = IconServices.get('file-icons').iconClassForPath(filePath, 'fuzzy-finder') - if (Array.isArray(iconClasses)) { - classList = iconClasses - } else if (iconClasses) { - classList = iconClasses.toString().split(/\s+/g) - } - } - - primaryLine.classList.add('primary-line', 'file', 'icon', ...classList) - primaryLine.appendChild(highlight(fileBasename, matches, baseOffset)) - li.appendChild(primaryLine) - - const secondaryLine = document.createElement('div') - secondaryLine.classList.add('secondary-line', 'path', 'no-icon') - secondaryLine.appendChild(highlight(projectRelativePath, matches, 0)) - li.appendChild(secondaryLine) - + this.primaryLine = document.createElement('div') + this.primaryLine.dataset.name = fileBasename + this.primaryLine.dataset.path = projectRelativePath + this.primaryLine.classList.add('primary-line', 'file', 'icon') + this.primaryLine.appendChild(highlight(fileBasename, matches, baseOffset)) + li.appendChild(this.primaryLine) + + this.secondaryLine = document.createElement('div') + this.secondaryLine.classList.add('secondary-line', 'path', 'no-icon') + this.secondaryLine.appendChild(highlight(projectRelativePath, matches, 0)) + li.appendChild(this.secondaryLine) + + IconServices.updateIcon(this) return li } }) diff --git a/lib/icon-services.js b/lib/icon-services.js index 0228dc4e..9a784691 100644 --- a/lib/icon-services.js +++ b/lib/icon-services.js @@ -1,34 +1,58 @@ const DefaultFileIcons = require('./default-file-icons') -const {Emitter} = require('atom') - -const defaultServices = { - 'file-icons': new DefaultFileIcons(), - 'element-icons': null -} +const {Emitter, CompositeDisposable} = require('atom') class IconServices { constructor () { this.emitter = new Emitter() - this.activeServices = Object.assign({}, defaultServices) + this.elementIcons = null + this.elementIconDisposables = new CompositeDisposable() + this.fileIcons = DefaultFileIcons + } + + onDidChange (callback) { + return this.emitter.on('did-change', callback) } - get (name) { - return this.activeServices[name] || defaultServices[name] + resetElementIcons () { + this.setElementIcons(null) } - reset (name) { - this.set(name, defaultServices[name]) + resetFileIcons () { + this.setFileIcons(DefaultFileIcons) } - set (name, service) { - if (service !== this.activeServices[name]) { - this.activeServices[name] = service - this.emitter.emit('did-change') + setElementIcons (service) { + if (service !== this.elementIcons) { + if (this.elementIconDisposables != null) { + this.elementIconDisposables.dispose() + } + if (service) { this.elementIconDisposables = new CompositeDisposable() } + this.elementIcons = service + return this.emitter.emit('did-change') } } - onDidChange (callback) { - return this.emitter.on('did-change', callback) + setFileIcons (service) { + if (service !== this.fileIcons) { + this.fileIcons = service + return this.emitter.emit('did-change') + } + } + + updateIcon (view) { + if (this.elementIcons) { + const disposable = this.elementIcons(view.primaryLine, view.filePath); + this.elementIconDisposables.add(disposable) + } else { + let classList = [] + const iconClasses = this.fileIcons.iconClassForPath(view.filePath, 'fuzzy-finder') + if (Array.isArray(iconClasses)) { + classList = iconClasses + } else if (iconClasses) { + classList = iconClasses.toString().split(/\s+/g) + } + view.primaryLine.classList.add(...classList) + } } } diff --git a/lib/main.js b/lib/main.js index 2ee5183e..41bec269 100644 --- a/lib/main.js +++ b/lib/main.js @@ -49,13 +49,13 @@ module.exports = { }, consumeElementIcons (service) { - IconServices.set('element-icons', service) - return new Disposable(() => IconServices.reset('element-icons')) + IconServices.setElementIcons(service) + return new Disposable(() => IconServices.resetElementIcons()) }, consumeFileIcons (service) { - IconServices.set('file-icons', service) - return new Disposable(() => IconServices.reset('file-icons')) + IconServices.setFileIcons(service) + return new Disposable(() => IconServices.resetFileIcons()) }, serialize () { diff --git a/spec/fuzzy-finder-spec.js b/spec/fuzzy-finder-spec.js index 2de28700..34a05308 100644 --- a/spec/fuzzy-finder-spec.js +++ b/spec/fuzzy-finder-spec.js @@ -1186,8 +1186,6 @@ describe('FuzzyFinder', () => { }) describe('file icons', () => { - const fileIcons = new DefaultFileIcons() - it('defaults to text', () => { waitsForPromise(() => atom.workspace.open('sample.js')) @@ -1202,7 +1200,7 @@ describe('FuzzyFinder', () => { runs(() => { const firstResult = bufferView.element.querySelector('li .primary-line') - expect(fileIcons.iconClassForPath(firstResult.dataset.path)).toBe('icon-file-text') + expect(DefaultFileIcons.iconClassForPath(firstResult.dataset.path)).toBe('icon-file-text') }) }) @@ -1220,7 +1218,7 @@ describe('FuzzyFinder', () => { runs(() => { const firstResult = bufferView.element.querySelector('li .primary-line') - expect(fileIcons.iconClassForPath(firstResult.dataset.path)).toBe('icon-file-media') + expect(DefaultFileIcons.iconClassForPath(firstResult.dataset.path)).toBe('icon-file-media') }) }) }) From 980ee7fca627b1f5f3b16df7e4df8f5344f48a83 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Fri, 27 Oct 2017 09:38:31 +1100 Subject: [PATCH 5/5] Delete venomous semicolon and restore world peace Happy now, StandardJS? --- lib/icon-services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/icon-services.js b/lib/icon-services.js index 9a784691..08e4632d 100644 --- a/lib/icon-services.js +++ b/lib/icon-services.js @@ -41,7 +41,7 @@ class IconServices { updateIcon (view) { if (this.elementIcons) { - const disposable = this.elementIcons(view.primaryLine, view.filePath); + const disposable = this.elementIcons(view.primaryLine, view.filePath) this.elementIconDisposables.add(disposable) } else { let classList = []