UNPKG

react-qml

Version:
281 lines (209 loc) 8.29 kB
"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;