alignment.js
Version:
A suite of reusable [React](http://reactjs.org/) components for creating a variety of visualizations involving [multiple sequence alignments](https://en.wikipedia.org/wiki/Multiple_sequence_alignment). [View the live demo here](http://alignment.hyphy.org/
98 lines (86 loc) • 3.89 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
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 ScrollBroadcaster = /*#__PURE__*/function () {
function ScrollBroadcaster(broadcast_units) {
var _this = this;
_classCallCheck(this, ScrollBroadcaster);
if (!Array.isArray(broadcast_units)) {
if (!broadcast_units.name) {
broadcast_units.name = "main";
}
broadcast_units = [broadcast_units];
} else if (broadcast_units.length == 1 && !broadcast_units[0].name) {
broadcast_units.name = "main";
}
broadcast_units.forEach(function (unit) {
_this[unit.name] = {};
_this[unit.name].width = unit.width;
_this[unit.name].height = unit.height;
_this[unit.name].x_pad = unit.x_pad;
_this[unit.name].y_pad = unit.y_pad;
_this[unit.name].bidirectional = unit.bidirectional;
_this[unit.name].horizontal = unit.horizontal;
_this[unit.name].vertical = unit.vertical;
_this[unit.name].x_fraction = unit.x_pixel / unit.width || 0;
_this[unit.name].y_fraction = unit.y_pixel / unit.height || 0;
_this[unit.name].upper_x_fraction = Math.max(unit.width - unit.x_pad, 0) / unit.width;
_this[unit.name].upper_y_fraction = Math.max(unit.height - unit.y_pad, 0) / unit.height;
});
}
_createClass(ScrollBroadcaster, [{
key: "handleWheel",
value: function handleWheel(e, sender) {
var unit = this[sender],
old_x_pixel = unit.width * unit.x_fraction,
old_y_pixel = unit.height * unit.y_fraction,
new_x_pixel = old_x_pixel + e.deltaX,
new_y_pixel = old_y_pixel + e.deltaY,
x_fraction_candidate = new_x_pixel / unit.width,
y_fraction_candidate = new_y_pixel / unit.height;
this.broadcast(x_fraction_candidate, y_fraction_candidate, sender);
}
}, {
key: "broadcast",
value: function broadcast(x_fraction_candidate, y_fraction_candidate, sender) {
var unit = this[sender];
unit.x_fraction = Math.min(Math.max(0, x_fraction_candidate), unit.upper_x_fraction);
unit.y_fraction = Math.min(Math.max(0, y_fraction_candidate), unit.upper_y_fraction);
var detail = {
x_fraction: unit.x_fraction,
y_fraction: unit.y_fraction,
x_pixel: unit.x_fraction * unit.width,
y_pixel: unit.y_fraction * unit.height,
sender: sender
};
var wheel_event = new CustomEvent("alignmentjs_wheel_event", {
detail: detail
});
unit.bidirectional.forEach(function (recipient) {
var element = document.getElementById(recipient);
element.dispatchEvent(wheel_event);
});
}
}, {
key: "location",
value: function location(sender) {
sender = sender || "main";
return {
x_pixel: this[sender].width * this[sender].x_fraction,
y_pixel: this[sender].height * this[sender].y_fraction,
x_fraction: this[sender].x_fraction,
y_fraction: this[sender].y_fraction,
x_pad: this[sender].x_pad,
y_pad: this[sender].y_pad
};
}
}]);
return ScrollBroadcaster;
}();
var _default = ScrollBroadcaster;
exports["default"] = _default;
;