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 };