Files
P42_UI/app/views/system/tools/statusView.js
T
2025-10-14 16:31:07 +00:00

114 lines
3.4 KiB
JavaScript
Executable File

class statusView extends WindozDomContent {
times = [];
fps;
prevTime = Date.now();
frames = 0;
paused = false;
DOMContentLoaded() {
ui.eicfy(this.el);
this.fps = 0;
if(performance && performance.memory) {
this.memchart = new BarChart(this.find('.metrics [eicbarchart].memory'), {
title: '',
maxPlot: 20,
data: [ ]
});
} else {
this.find('.metrics [eicbarchart].memory').parentElement.remove();
}
if(window.requestAnimationFrame) {
this.fpschart = new BarChart(this.find('.metrics [eicbarchart].fps'), {
title: '',
maxPlot: 20,
data: [ ]
});
window.requestAnimationFrame(this.loop.bind(this));
}
// start monitoring services
this.tickerId = setInterval(this.tick.bind(this), 1000);
this.contents = new DataGrid(this.find('.contents'), {
headers: [
{label: 'ID', sortable:true, filter: 'text'},
{label: 'class', sortable:true, filter: 'text'},
{label: 'type', sortable:true, filter: 'list'},
],
height: '200px'
});
this.assets = new DataGrid(this.find('.assets'), {
headers: [
{label: 'type', sortable:true, filter: 'list'},
{label: 'resource', sortable:true, filter: 'text'},
],
height: '200px'
});
this.refresh();
}
refresh() {
this.contents.clear();
for(let i = 0; i < Controller._contents.length; i++) {
let item = Controller._contents[i];
this.contents.addRow(item.view._sparcId, [ item.view._sparcId, item.view._className, item.type ]);
}
this.assets.clear();
for(let type in app.Assets.Store) {
let group = app.Assets.Store[type];
for(let resource in group) {
this.assets.addRow('', [ type, resource ]);
}
}
}
tick() {
if(performance && performance.memory) {
let memory = performance.memory;
let current = Math.round(100 * Math.round( memory.usedJSHeapSize / 1024) / 1024) / 100;
let max = Math.round( memory.jsHeapSizeLimit / 1024) / 1024;
this.memchart.options.title = '<tspan large>' + current + '</tspan> <tspan small>Mb (' + Math.round(1000 * (memory.totalJSHeapSize / memory.jsHeapSizeLimit)) / 10 + '%)</tspan>'
this.memchart.add({value: current, severity: 'info'});
}
this.fpschart.options.title = '<tspan large>' + this.fps + '</tspan> <tspan small>fps</tspan>';
this.fpschart.add({value: this.fps + 1, severity: 'info'});
}
loop() {
const time = Date.now();
this.frames++;
if (time > this.prevTime + 1000) {
this.fps = Math.round( ( this.frames * 1000 ) / ( time - this.prevTime ) );
this.prevTime = time;
this.frames = 0;
}
if(!this.paused) window.requestAnimationFrame(this.loop.bind(this));
}
DOMContentFocused() { this.refresh(); }
DOMContentRemoved() {
if(this.tickerId) { clearInterval(this.tickerId); }
this.paused = true;
}
}
app.registerClass('statusView', statusView);