mirror of
https://github.com/Jermolene/TiddlyWiki5.git
synced 2025-12-15 15:10:30 -08:00
* feat: added info tiddlers for viewport dimensions * feat: multi window support for dimensions info tiddlers * refactor: introduce standalone eventbus and refactor for ES2017 * docs: extended docs for InfoMechanism to cover new additions
86 lines
2.3 KiB
JavaScript
86 lines
2.3 KiB
JavaScript
/*\
|
|
title: $:/core/modules/info/windowdimensions.js
|
|
type: application/javascript
|
|
module-type: info
|
|
\*/
|
|
|
|
exports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {
|
|
if(!$tw.browser) {
|
|
return [];
|
|
}
|
|
|
|
class WindowDimensionsTracker {
|
|
constructor(updateCallback) {
|
|
this.updateCallback = updateCallback;
|
|
this.resizeHandlers = new Map();
|
|
this.dimensionsInfo = [
|
|
["outer/width", win => win.outerWidth],
|
|
["outer/height", win => win.outerHeight],
|
|
["inner/width", win => win.innerWidth],
|
|
["inner/height", win => win.innerHeight],
|
|
["client/width", win => win.document.documentElement.clientWidth],
|
|
["client/height", win => win.document.documentElement.clientHeight]
|
|
];
|
|
}
|
|
|
|
buildTiddlers(win,windowId) {
|
|
const prefix = `$:/info/browser/window/${windowId}/`;
|
|
return this.dimensionsInfo.map(([suffix, getter]) => ({
|
|
title: prefix + suffix,
|
|
text: String(getter(win))
|
|
}));
|
|
}
|
|
|
|
clearTiddlers(windowId) {
|
|
const prefix = `$:/info/browser/window/${windowId}/`,
|
|
deletions = this.dimensionsInfo.map(([suffix]) => prefix + suffix);
|
|
this.updateCallback([], deletions);
|
|
}
|
|
|
|
getUpdateHandler(win,windowId) {
|
|
let scheduled = false;
|
|
return () => {
|
|
if(!scheduled) {
|
|
scheduled = true;
|
|
requestAnimationFrame(() => {
|
|
this.updateCallback(this.buildTiddlers(win,windowId), []);
|
|
scheduled = false;
|
|
});
|
|
}
|
|
};
|
|
}
|
|
|
|
trackWindow(win,windowId) {
|
|
const handler = this.getUpdateHandler(win, windowId);
|
|
handler(); // initial update
|
|
win.addEventListener("resize",handler,{passive:true});
|
|
this.resizeHandlers.set(windowId,{win, handler});
|
|
}
|
|
|
|
untrackWindow(windowId) {
|
|
const entry = this.resizeHandlers.get(windowId);
|
|
if(entry) {
|
|
entry.win.removeEventListener("resize", entry.handler);
|
|
this.resizeHandlers.delete(windowId);
|
|
}
|
|
this.clearTiddlers(windowId);
|
|
}
|
|
}
|
|
|
|
const tracker = new WindowDimensionsTracker(updateInfoTiddlersCallback);
|
|
|
|
// Track main window
|
|
tracker.trackWindow(window,"system/main");
|
|
|
|
// Hook into event bus for user windows
|
|
if($tw.eventBus) {
|
|
$tw.eventBus.on("window:opened", ({window: win, windowID}) => {
|
|
tracker.trackWindow(win, "user/" + windowID);
|
|
});
|
|
$tw.eventBus.on("window:closed", ({windowID}) => {
|
|
tracker.untrackWindow("user/" + windowID);
|
|
});
|
|
}
|
|
|
|
return [];
|
|
};
|