pulsar/packages/dev-live-reload/lib/ui-watcher.js
2019-05-31 18:33:56 +02:00

115 lines
3.0 KiB
JavaScript

const { CompositeDisposable } = require('atom');
const BaseThemeWatcher = require('./base-theme-watcher');
const PackageWatcher = require('./package-watcher');
module.exports = class UIWatcher {
constructor() {
this.subscriptions = new CompositeDisposable();
this.reloadAll = this.reloadAll.bind(this);
this.watchers = [];
this.baseTheme = this.createWatcher(new BaseThemeWatcher());
this.watchPackages();
}
watchPackages() {
this.watchedThemes = new Map();
this.watchedPackages = new Map();
for (const theme of atom.themes.getActiveThemes()) {
this.watchTheme(theme);
}
for (const pack of atom.packages.getActivePackages()) {
this.watchPackage(pack);
}
this.watchForPackageChanges();
}
watchForPackageChanges() {
this.subscriptions.add(
atom.themes.onDidChangeActiveThemes(() => {
// We need to destroy all theme watchers as all theme packages are destroyed
// when a theme changes.
for (const theme of this.watchedThemes.values()) {
theme.destroy();
}
this.watchedThemes.clear();
// Rewatch everything!
for (const theme of atom.themes.getActiveThemes()) {
this.watchTheme(theme);
}
})
);
this.subscriptions.add(
atom.packages.onDidActivatePackage(pack => this.watchPackage(pack))
);
this.subscriptions.add(
atom.packages.onDidDeactivatePackage(pack => {
// This only handles packages - onDidChangeActiveThemes handles themes
const watcher = this.watchedPackages.get(pack.name);
if (watcher) watcher.destroy();
this.watchedPackages.delete(pack.name);
})
);
}
watchTheme(theme) {
if (PackageWatcher.supportsPackage(theme, 'theme')) {
this.watchedThemes.set(
theme.name,
this.createWatcher(new PackageWatcher(theme))
);
}
}
watchPackage(pack) {
if (PackageWatcher.supportsPackage(pack, 'atom')) {
this.watchedPackages.set(
pack.name,
this.createWatcher(new PackageWatcher(pack))
);
}
}
createWatcher(watcher) {
watcher.onDidChangeGlobals(() => {
console.log('Global changed, reloading all styles');
this.reloadAll();
});
watcher.onDidDestroy(() =>
this.watchers.splice(this.watchers.indexOf(watcher), 1)
);
this.watchers.push(watcher);
return watcher;
}
reloadAll() {
this.baseTheme.loadAllStylesheets();
for (const pack of atom.packages.getActivePackages()) {
if (PackageWatcher.supportsPackage(pack, 'atom')) {
pack.reloadStylesheets();
}
}
for (const theme of atom.themes.getActiveThemes()) {
if (PackageWatcher.supportsPackage(theme, 'theme')) {
theme.reloadStylesheets();
}
}
}
destroy() {
this.subscriptions.dispose();
this.baseTheme.destroy();
for (const pack of this.watchedPackages.values()) {
pack.destroy();
}
for (const theme of this.watchedThemes.values()) {
theme.destroy();
}
}
};