mirror of
https://github.com/FoggedLens/iD.git
synced 2026-03-12 22:26:07 +00:00
107 lines
2.5 KiB
JavaScript
107 lines
2.5 KiB
JavaScript
import { dispatch as d3_dispatch } from 'd3-dispatch';
|
|
import { zoom as d3_zoom, zoomIdentity as d3_zoomIdentity } from 'd3-zoom';
|
|
import { utilSetTransform, utilRebind } from '../util';
|
|
|
|
const dispatch = d3_dispatch('viewerChanged');
|
|
|
|
let _photo;
|
|
let _wrapper;
|
|
let imgZoom;
|
|
let _widthOverflow;
|
|
|
|
function zoomPan (d3_event) {
|
|
let t = d3_event.transform;
|
|
_photo.call(utilSetTransform, t.x, t.y, t.k);
|
|
}
|
|
|
|
function zoomBeahvior () {
|
|
const {width: wrapperWidth, height: wrapperHeight} = _wrapper.node().getBoundingClientRect();
|
|
const {naturalHeight, naturalWidth} = _photo.node();
|
|
const intrinsicRatio = naturalWidth / naturalHeight;
|
|
_widthOverflow = wrapperHeight * intrinsicRatio - wrapperWidth;
|
|
return d3_zoom()
|
|
.extent([[0, 0], [wrapperWidth, wrapperHeight]])
|
|
.translateExtent([[0, 0], [wrapperWidth + _widthOverflow, wrapperHeight]])
|
|
.scaleExtent([1, 15])
|
|
.on('zoom', zoomPan);
|
|
}
|
|
|
|
function loadImage (selection, path) {
|
|
return new Promise((resolve) => {
|
|
selection.attr('src', path);
|
|
selection.on('load', () => {
|
|
resolve(selection);
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
export default {
|
|
|
|
init: async function(context, selection) {
|
|
this.event = utilRebind(this, dispatch, 'on');
|
|
|
|
_wrapper = selection
|
|
.append('div')
|
|
.attr('class', 'photo-frame plane-frame')
|
|
.classed('hide', true);
|
|
|
|
_photo = _wrapper
|
|
.append('img')
|
|
.attr('class', 'plane-photo');
|
|
|
|
context.ui().photoviewer.on('resize.plane', () => {
|
|
imgZoom = zoomBeahvior();
|
|
_wrapper.call(imgZoom);
|
|
});
|
|
|
|
await Promise.resolve();
|
|
|
|
return this;
|
|
},
|
|
|
|
showPhotoFrame: function (context) {
|
|
const isHidden = context.selectAll('.photo-frame.plane-frame.hide').size();
|
|
|
|
if (isHidden) {
|
|
context
|
|
.selectAll('.photo-frame:not(.plane-frame)')
|
|
.classed('hide', true);
|
|
|
|
context
|
|
.selectAll('.photo-frame.plane-frame')
|
|
.classed('hide', false);
|
|
}
|
|
|
|
return this;
|
|
},
|
|
|
|
|
|
hidePhotoFrame: function (context) {
|
|
context
|
|
.select('photo-frame.plane-frame')
|
|
.classed('hide', false);
|
|
|
|
return this;
|
|
},
|
|
|
|
selectPhoto: function (data, keepOrientation) {
|
|
dispatch.call('viewerChanged');
|
|
loadImage(_photo, '');
|
|
loadImage(_photo, data.image_path)
|
|
.then(() => {
|
|
if (!keepOrientation) {
|
|
imgZoom = zoomBeahvior();
|
|
_wrapper.call(imgZoom);
|
|
_wrapper.call(imgZoom.transform, d3_zoomIdentity.translate(-_widthOverflow / 2, 0));
|
|
}
|
|
});
|
|
return this;
|
|
},
|
|
|
|
getYaw: function() {
|
|
return 0;
|
|
}
|
|
|
|
};
|