mirador
Version:
An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.
121 lines (95 loc) • 4.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _mosaicUpdates = require("react-mosaic-component/lib/util/mosaicUpdates");
var _mosaicUtilities = require("react-mosaic-component/lib/util/mosaicUtilities");
var _dropRight = _interopRequireDefault(require("lodash/dropRight"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/** */
var MosaicLayout = /*#__PURE__*/function () {
/** */
function MosaicLayout(layout) {
_classCallCheck(this, MosaicLayout);
this.layout = layout;
}
/** */
_createClass(MosaicLayout, [{
key: "pathToCorner",
value: function pathToCorner() {
var corner = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _mosaicUtilities.Corner.TOP_RIGHT;
return (0, _mosaicUtilities.getPathToCorner)(this.layout, corner);
}
/** */
}, {
key: "pathToParent",
value: function pathToParent(path) {
return (0, _mosaicUtilities.getNodeAtPath)(this.layout, (0, _dropRight["default"])(path));
}
/** */
}, {
key: "nodeAtPath",
value: function nodeAtPath(path) {
return (0, _mosaicUtilities.getNodeAtPath)(this.layout, path);
}
/**
* addWindows - updates the layout with new windows using an algorithm ported
* from the react-mosaic-components examples. Will always add to the Top Right
* https://github.com/nomcopter/react-mosaic/blob/5081df8d1528d4c3b83a72763a46a30b3048fe95/demo/ExampleApp.tsx#L119-L154
* @param {Array} addedWindowIds [description]
*/
}, {
key: "addWindows",
value: function addWindows(addedWindowIds) {
var _this = this;
addedWindowIds.forEach(function (windowId, i) {
var path = _this.pathToCorner();
var parent = _this.pathToParent(path);
var destination = _this.nodeAtPath(path);
var direction = parent ? (0, _mosaicUtilities.getOtherDirection)(parent.direction) : 'row';
var first;
var second;
if (direction === 'row') {
first = destination;
second = addedWindowIds[i];
} else {
first = addedWindowIds[i];
second = destination;
}
var update = {
path: path,
spec: {
$set: {
direction: direction,
first: first,
second: second
}
}
}; // We cannot batch the updates together because we need to recalculate
// the new location for each new window
_this.layout = (0, _mosaicUpdates.updateTree)(_this.layout, [update]);
});
}
/**
* removeWindows - Generate a set of "removeUpdates" to update layout binary
* tree. Then update the layout.
* @param {Array} removedWindowIds
* @param {Object} windowPaths - a lookup table for window paths
*/
}, {
key: "removeWindows",
value: function removeWindows(removedWindowIds, windowPaths) {
var _this2 = this;
var removeUpdates = removedWindowIds.map(function (windowId) {
return (0, _mosaicUpdates.createRemoveUpdate)(_this2.layout, windowPaths[windowId]);
});
this.layout = (0, _mosaicUpdates.updateTree)(this.layout, removeUpdates);
}
}]);
return MosaicLayout;
}();
exports["default"] = MosaicLayout;