react-qml
Version:
281 lines (209 loc) • 8.29 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _RQElementContainer = _interopRequireDefault(require("./RQElementContainer"));
var _AppRegistry = _interopRequireDefault(require("../common/AppRegistry"));
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var contextRoots = new Map();
var createHostContext = function createHostContext(rootContainerInstance) {
var qml = "import QtQuick 2.7; Item { visible: false; }";
var fakeRoot = Qt.createQmlObject(qml, rootContainerInstance.element, 'HostContext');
fakeRoot.objectName = 'HostContext';
return new _RQElementContainer.default(fakeRoot, {
defaultProp: 'data'
});
};
function getHostContext(rootContainerInstance) {
var rootContext = contextRoots.get(rootContainerInstance);
if (!rootContext) {
rootContext = createHostContext(rootContainerInstance);
contextRoots.set(rootContainerInstance, rootContext);
}
return rootContext;
}
function createElementContainer(type, props, rootContainerInstance, hostContext) {
var hostElement = hostContext.element;
var rawComponentDefinition = _AppRegistry.default.getRawComponent(type);
if (rawComponentDefinition) {
var rawContent = rawComponentDefinition.rawContent,
metadata = rawComponentDefinition.metadata;
var element = Qt.createQmlObject(rawContent, hostElement, type);
var container = new _RQElementContainer.default(element, metadata, hostContext);
container.setNativeProps(props);
return container;
}
var componentDefinition = _AppRegistry.default.getComponent(type);
if (componentDefinition) {
var component = componentDefinition.component,
_metadata = componentDefinition.metadata;
var _element = component.createObject(hostElement, props);
if (!_element) {
throw new Error("Unable to create element: ".concat(type));
}
var _container = new _RQElementContainer.default(_element, _metadata, hostContext);
_container.setNativeProps(props);
return _container;
}
throw new Error("Unknown type ".concat(type));
}
function appendChild(parentContainer, childContainer) {
var parent = parentContainer.element;
var child = childContainer.element; // appending new child or just moving around?
var moving = (0, _utils.findChildIndex)(parent[parentContainer.metadata.defaultProp], child) > -1;
if (moving && child.parent && parent.children) {
// moving only applied for visual items
var childIndex = (0, _utils.findChildIndex)(parent.children, child);
moveChild(parentContainer, childIndex, parent.children.length - 1);
return;
}
var parentType = (0, _utils.getObjectType)(parent);
var childType = (0, _utils.getObjectType)(child); // special cases
// - add MenuBar to ApplicationWindow
if (childType === 'QQuickMenuBar' && parentType === 'QQuickApplicationWindow') {
parent.menuBar = child;
return;
} // - sync QQuickPlatformMenu
if (childType === 'QQuickPlatformMenu' && parentType === 'QQuickPlatformMenuBar') {
parent.addMenu(child); // this is a hack to "sync" menu
child.visible = false;
child.visible = true;
return;
} // - QQuickPlatformMenuBar requires manually setting window
if (childType === 'QQuickPlatformMenuBar' && (0, _utils.isWindow)(parent)) {
child.window = parent;
} // - QQuickPlatformDialog requires manually setting parentWindow
if ((0, _utils.isPlatformDialog)(child) && (0, _utils.isWindow)(parent)) {
child.parentWindow = parent;
} // - set animation's target to parent, if not specified
if ((0, _utils.isAnimation)(child) && !(0, _utils.isAnimation)(parent) && (0, _utils.isQuickItem)(parent) && !child.target) {
child.target = parent;
}
if (parent.contentItem && child.hasOwnProperty('parent')) {
try {
child.parent = parent.contentItem;
} catch (ex) {// child.parent = parent;
}
} else {
if ((0, _utils.isQuickItem)(parent) && (0, _utils.isQuickItem)(child)) {
child.parent = parent;
}
} // append child to parent's default prop
var parentDefaultProp = parentContainer.metadata.defaultProp;
var parentData = parent[parentDefaultProp];
if (parentData && parentData.push) {
parentData.push(child);
}
}
function removeAllChildren(rootContext) {
var defaultProp = rootContext.metadata.defaultProp;
var data = rootContext.element[defaultProp];
if (data && data.length > 0) {
// destroy all children
for (var index = data.length; index > 0; index--) {
var child = data[index - 1];
removeChildElement(rootContext, child);
}
}
}
function removeChild(parentContainer, childContainer) {
return removeChildElement(parentContainer, childContainer.element);
}
function removeChildElement(parentContainer, child) {
var parent = parentContainer.element;
var parentDefaultProp = parentContainer.metadata.defaultProp;
var parentType = (0, _utils.getObjectType)(parent);
var childType = (0, _utils.getObjectType)(child);
if ((0, _utils.isQuickItem)(parent) && (0, _utils.isQuickItem)(child)) {
child.parent = null;
} else {
var parentData = parent[parentDefaultProp];
if (parentData) {
var childIndex = (0, _utils.findChildIndex)(parentData, child);
if (childIndex > -1) {
if (parent.remove) {
parent.remove(childIndex);
} else {}
}
}
}
if (child.hasOwnProperty('parent')) {
try {
child.parent = null;
} catch (error) {// ignore
}
}
child.destroy(1);
}
function moveChild(parent, fromIndex, toIndex) {
var parentType = (0, _utils.getObjectType)(parent.element);
if (parentType === 'QQmlObjectModel') {
var model = parent.element;
model.move(fromIndex, toIndex);
return;
}
var children = parent.element.children;
if (!children) {
console.warn("Move child doesn't work with non-visual items");
return;
}
var collection = [];
for (var i = 0; i < children.length; i++) {
collection.push(children[i]);
}
var sourceItem = collection[fromIndex];
collection.splice(fromIndex, 1);
collection.splice(toIndex, 0, sourceItem);
for (var _i = children.length - 1; _i >= 0; _i--) {
children[_i].parent = null;
}
for (var _i2 = 0; _i2 < collection.length; _i2++) {
children[_i2] = collection[_i2];
children[_i2].parent = parent.element;
}
}
function insertBefore(parent, child, beforeChild) {
var parentType = (0, _utils.getObjectType)(parent.element);
if (parentType === 'QQmlObjectModel') {
var model = parent.element;
var _childIndex = (0, _utils.findModelChildIndex)(model, child.element);
var _beforeChildIndex = (0, _utils.findModelChildIndex)(model, beforeChild.element); // Move existing child or add new child?
if (_childIndex >= 0) {
// move from childIndex to beforeChildIndex-1
moveChild(parent, _childIndex, _beforeChildIndex);
} else {
// insert child into beforeChildIndex first
appendChild(parent, child); // then move
moveChild(parent, model.count - 1, _beforeChildIndex);
}
return;
}
var children = parent.element.children;
if (!children) {
console.warn("Move child doesn't work with non-visual items");
return;
} // there is no indexOf for qml list, sad
// @see https://stackoverflow.com/questions/43030433/qtquick-item-children-indexof-doesnt-exist
var childIndex = (0, _utils.findChildIndex)(children, child.element);
var beforeChildIndex = (0, _utils.findChildIndex)(children, beforeChild.element); // Move existing child or add new child?
if (childIndex >= 0) {
// move from childIndex to beforeChildIndex-1
moveChild(parent, childIndex, beforeChildIndex - 1);
} else {
// insert child into beforeChildIndex first
appendChild(parent, child); // then move
moveChild(parent, children.length - 1, beforeChildIndex);
}
}
var UIManager = {
getHostContext: getHostContext,
createElementContainer: createElementContainer,
appendChild: appendChild,
removeAllChildren: removeAllChildren,
removeChild: removeChild,
insertBefore: insertBefore
};
var _default = UIManager;
exports.default = _default;