overte-JulianGro/scripts/system/modules/createWindow.js

151 lines
4.5 KiB
JavaScript

"use strict";
// createWindow.js
//
// Created by Thijs Wenker on 6/1/18
//
// Copyright 2018 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
var getWindowRect = function(settingsKey, defaultRect) {
var windowRect = Settings.getValue(settingsKey, defaultRect);
return windowRect;
};
var setWindowRect = function(settingsKey, position, size) {
Settings.setValue(settingsKey, {
position: position,
size: size
});
};
var CallableEvent = (function() {
function CallableEvent() {
this.callbacks = [];
}
CallableEvent.prototype = {
callbacks: null,
call: function () {
var callArguments = arguments;
this.callbacks.forEach(function(callbackObject) {
try {
callbackObject.callback.apply(callbackObject.context ? callbackObject.context : this, callArguments);
} catch (e) {
console.error('Call to CallableEvent callback failed!');
}
});
},
addListener: function(contextOrCallback, callback) {
if (callback) {
this.callbacks.push({
context: contextOrCallback,
callback: callback
});
} else {
this.callbacks.push({
callback: contextOrCallback
});
}
},
removeListener: function(callback) {
var foundIndex = -1;
this.callbacks.forEach(function (callbackObject, index) {
if (callbackObject.callback === callback) {
foundIndex = index;
}
});
if (foundIndex !== -1) {
this.callbacks.splice(foundIndex, 1);
}
}
};
return CallableEvent;
})();
module.exports = (function() {
function CreateWindow(qmlPath, title, settingsKey, defaultRect, createOnStartup) {
this.qmlPath = qmlPath;
this.title = title;
this.settingsKey = settingsKey;
this.defaultRect = defaultRect;
this.webEventReceived = new CallableEvent();
this.fromQml = new CallableEvent();
if (createOnStartup) {
this.createWindow();
}
}
CreateWindow.prototype = {
window: null,
createWindow: function() {
var defaultRect = this.defaultRect;
if (typeof this.defaultRect === "function") {
defaultRect = this.defaultRect();
}
var windowRect = getWindowRect(this.settingsKey, defaultRect);
this.window = Desktop.createWindow(this.qmlPath, {
title: this.title,
flags: Desktop.ALWAYS_ON_TOP | Desktop.CLOSE_BUTTON_HIDES,
presentationMode: Desktop.PresentationMode.NATIVE,
size: windowRect.size,
visible: true,
position: windowRect.position
});
var windowRectChanged = function () {
if (this.window.visible) {
setWindowRect(this.settingsKey, this.window.position, this.window.size);
}
};
this.window.sizeChanged.connect(this, windowRectChanged);
this.window.positionChanged.connect(this, windowRectChanged);
this.window.webEventReceived.connect(this, function (data) {
this.webEventReceived.call(data);
});
this.window.fromQml.connect(this, function (data) {
this.fromQml.call(data);
});
Script.scriptEnding.connect(this, function() {
this.window.close();
});
},
setVisible: function(visible) {
if (visible && !this.window) {
this.createWindow();
}
if (this.window) {
if (visible) {
this.window.show();
} else {
this.window.visible = false;
}
}
},
emitScriptEvent: function(data) {
if (this.window) {
this.window.emitScriptEvent(data);
}
},
sendToQml: function(data) {
if (this.window) {
this.window.sendToQml(data);
}
},
webEventReceived: null,
fromQml: null
};
return CreateWindow;
})();