mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-10-27 11:42:41 +03:00
115 lines
3.0 KiB
JavaScript
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();
|
|
}
|
|
}
|
|
};
|