87 lines
2.1 KiB
JavaScript
87 lines
2.1 KiB
JavaScript
|
let register = Toolkit => Toolkit.Desktop =
|
||
|
|
||
|
// Layered window manager
|
||
|
class Desktop extends Toolkit.Component {
|
||
|
|
||
|
//////////////////////////////// Constants ////////////////////////////////
|
||
|
|
||
|
// Comparator for ordering child windows
|
||
|
static CHILD_ORDER(a, b) {
|
||
|
return b.element.style.zIndex - a.element.style.zIndex;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
///////////////////////// Initialization Methods //////////////////////////
|
||
|
|
||
|
constructor(app, options = {}) {
|
||
|
super(app, Object.assign({
|
||
|
class: "tk desktop"
|
||
|
}, options, { style: Object.assign({
|
||
|
position: "relative",
|
||
|
zIndex : "0"
|
||
|
}, options.style || {})} ));
|
||
|
|
||
|
// Configure event listeners
|
||
|
this.addEventListener("resize", e=>this.onResize());
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
///////////////////////////// Event Handlers //////////////////////////////
|
||
|
|
||
|
// Element resized
|
||
|
onResize() {
|
||
|
|
||
|
// The element is hidden: its size is indeterminate
|
||
|
if (!this.isVisible())
|
||
|
return;
|
||
|
|
||
|
// Don't allow children to be out-of-frame
|
||
|
if (this.children != null) {
|
||
|
for (let child of this.children) {
|
||
|
child.left = child.left;
|
||
|
child.top = child.top;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
///////////////////////////// Public Methods //////////////////////////////
|
||
|
|
||
|
// Add a child component
|
||
|
add(comp) {
|
||
|
super.add(comp);
|
||
|
this.bringToFront(comp);
|
||
|
}
|
||
|
|
||
|
// Retrieve the foremost visible window
|
||
|
getActiveWindow() {
|
||
|
if (this.children != null) {
|
||
|
for (let child of this.children) {
|
||
|
if (child.isVisible())
|
||
|
return child;
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
///////////////////////////// Package Methods /////////////////////////////
|
||
|
|
||
|
// Reorder children so that a particular child is in front
|
||
|
bringToFront(child) {
|
||
|
this.children.splice(this.children.indexOf(child), 1);
|
||
|
this.children.push(child);
|
||
|
let z = 1 - this.children.length;
|
||
|
for (let child of this.children)
|
||
|
child.element.style.zIndex = z++;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
export { register };
|