Add local default icon + implements files search cache
This commit is contained in:
parent
99c60aae12
commit
411894586b
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" ><path d="M0 0h512v512H0z" fill="transparent" stroke="#fff" stroke-width="0"></path><path d="M256 16C123.45 16 16 123.45 16 256s107.45 240 240 240 240-107.45 240-240S388.55 16 256 16zm0 60c99.41 0 180 80.59 180 180s-80.59 180-180 180S76 355.41 76 256 156.59 76 256 76zm-80.625 60c-.97-.005-2.006.112-3.063.313v-.032c-18.297 3.436-45.264 34.743-33.375 46.626l73.157 73.125-73.156 73.126c-14.63 14.625 29.275 58.534 43.906 43.906L256 299.906l73.156 73.156c14.63 14.628 58.537-29.28 43.906-43.906l-73.156-73.125 73.156-73.124c14.63-14.625-29.275-58.5-43.906-43.875L256 212.157l-73.156-73.125c-2.06-2.046-4.56-3.015-7.47-3.03z" fill="#fff"></path></svg>
|
After Width: | Height: | Size: 712 B |
|
@ -3,6 +3,7 @@ var Util = require('../util');
|
||||||
var LazyLoad = require('./mixins/lazy-load');
|
var LazyLoad = require('./mixins/lazy-load');
|
||||||
|
|
||||||
var LOADING_ICON = 'img/hourglass.svg';
|
var LOADING_ICON = 'img/hourglass.svg';
|
||||||
|
var DEFAULT_ICON = 'img/default-icon.svg';
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
|
|
||||||
|
@ -53,7 +54,6 @@ module.exports = React.createClass({
|
||||||
_findIcon: function(iconPath, theme) {
|
_findIcon: function(iconPath, theme) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
var DEFAULT_ICON = 'application-default-icon';
|
|
||||||
|
|
||||||
console.log('Search icon %s:%s', iconPath, theme);
|
console.log('Search icon %s:%s', iconPath, theme);
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,10 @@ module.exports = React.createClass({
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
options.unshift(
|
||||||
|
<option key="__none__"></option>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<select value={selectedTheme} onChange={this.onChange}>
|
<select value={selectedTheme} onChange={this.onChange}>
|
||||||
{options}
|
{options}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
var React = require('react');
|
var React = require('react');
|
||||||
|
|
||||||
|
var _listeners = [];
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
||||||
isInViewport: function() {
|
isInViewport: function() {
|
||||||
|
@ -10,35 +12,54 @@ module.exports = {
|
||||||
|
|
||||||
var rect = el.getBoundingClientRect();
|
var rect = el.getBoundingClientRect();
|
||||||
|
|
||||||
|
var viewportHeight = global.window.innerHeight || global.document.documentElement.clientHeight;
|
||||||
|
var viewportWidth = global.window.innerWidth || global.document.documentElement.clientWidth;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
rect.top >= 0 &&
|
rect.bottom >= 0 &&
|
||||||
rect.left >= 0 &&
|
rect.right >= 0 &&
|
||||||
rect.bottom <= (global.window.innerHeight || global.document.documentElement.clientHeight) && /*or $(window).height() */
|
rect.top <= viewportHeight &&
|
||||||
rect.right <= (global.window.innerWidth || global.document.documentElement.clientWidth) /*or $(window).width() */
|
rect.left <= viewportWidth
|
||||||
);
|
);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidMount: function() {
|
componentDidMount: function() {
|
||||||
|
|
||||||
function _onInViewport(){
|
if(typeof this.onInViewport === 'function') {
|
||||||
|
|
||||||
|
_listeners.push(this);
|
||||||
|
|
||||||
if( this.isInViewport() ) {
|
if( this.isInViewport() ) {
|
||||||
this.onInViewport();
|
this.onInViewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var el = React.findDOMNode(this);
|
},
|
||||||
|
|
||||||
if(typeof this.onInViewport === 'function') {
|
|
||||||
window.document.addEventListener('scroll', debounce(_onInViewport.bind(this), 250), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
_onInViewport.call(this);
|
|
||||||
|
|
||||||
|
componentWillUnmount: function() {
|
||||||
|
var index = _listeners.indexOf(this);
|
||||||
|
if(index !== -1) return _listeners.splice(index, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var computeComponentsVisibilityDebounced = debounce(computeComponentsVisibility, 250);
|
||||||
|
|
||||||
|
// Start listening for changes
|
||||||
|
window.document.addEventListener('scroll', computeComponentsVisibilityDebounced, true);
|
||||||
|
window.addEventListener('resize', computeComponentsVisibilityDebounced);
|
||||||
|
|
||||||
|
function computeComponentsVisibility() {
|
||||||
|
_listeners.forEach(function(listener) {
|
||||||
|
if( listener.isInViewport() ) {
|
||||||
|
listener.onInViewport();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function debounce(func, wait, immediate) {
|
function debounce(func, wait, immediate) {
|
||||||
var timeout;
|
var timeout;
|
||||||
return function() {
|
return function() {
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
function Cache() {
|
||||||
|
this._store = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Cache.prototype.get = function(key) {
|
||||||
|
key = this._serialize(key);
|
||||||
|
return key in this._store ? this._store[key] : undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
Cache.prototype.set = function(key, value) {
|
||||||
|
key = this._serialize(key);
|
||||||
|
this._store[key] = value;
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
Cache.prototype._serialize = function(mixedKey) {
|
||||||
|
var json = JSON.stringify(mixedKey);
|
||||||
|
return this._hash(json);
|
||||||
|
};
|
||||||
|
|
||||||
|
Cache.prototype._hash = function(str) {
|
||||||
|
var hash = 0, i, chr, len;
|
||||||
|
if (str.length === 0) return hash;
|
||||||
|
for (i = 0, len = str.length; i < len; i++) {
|
||||||
|
chr = str.charCodeAt(i);
|
||||||
|
hash = ((hash << 5) - hash) + chr;
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Cache;
|
|
@ -1,2 +1,3 @@
|
||||||
exports.System = require('./system');
|
exports.System = require('./system');
|
||||||
exports.DesktopApps = require('./desktop-apps');
|
exports.DesktopApps = require('./desktop-apps');
|
||||||
|
exports.Cache = require('./cache');
|
||||||
|
|
|
@ -2,6 +2,7 @@ var fs = require('fs');
|
||||||
var cp = require('child_process');
|
var cp = require('child_process');
|
||||||
var glob = require('glob');
|
var glob = require('glob');
|
||||||
var ini = require('ini');
|
var ini = require('ini');
|
||||||
|
var Cache = require('./cache');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a JSON file
|
* Load a JSON file
|
||||||
|
@ -52,12 +53,22 @@ exports.runApp = function(execPath) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var _searchCache = new Cache();
|
||||||
|
|
||||||
exports.findFiles = function(pattern, opts) {
|
exports.findFiles = function(pattern, opts) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
|
|
||||||
|
var cachedResult = _searchCache.get([pattern, opts]);
|
||||||
|
if( cachedResult !== undefined) {
|
||||||
|
return resolve(cachedResult);
|
||||||
|
}
|
||||||
|
|
||||||
glob(pattern, opts, function(err, files) {
|
glob(pattern, opts, function(err, files) {
|
||||||
if(err) return reject(err);
|
if(err) return reject(err);
|
||||||
|
_searchCache.set([pattern, opts], files);
|
||||||
return resolve(files);
|
return resolve(files);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue