1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/frontend/app/gallery/map/lightbox/lightbox.map.gallery.component.ts

192 lines
5.0 KiB
TypeScript
Raw Normal View History

2018-03-31 03:30:30 +08:00
import {Component, ElementRef, HostListener, Input, OnChanges, ViewChild} from '@angular/core';
import {PhotoDTO} from '../../../../../common/entities/PhotoDTO';
import {Dimension} from '../../../model/IRenderable';
import {FullScreenService} from '../../fullscreen.service';
import {AgmMap} from '@agm/core';
import {IconThumbnail, Thumbnail, ThumbnailManagerService} from '../../thumnailManager.service';
import {IconPhoto} from '../../IconPhoto';
import {Photo} from '../../Photo';
2017-02-06 00:27:58 +08:00
@Component({
selector: 'gallery-map-lightbox',
styleUrls: ['./lightbox.map.gallery.component.css'],
templateUrl: './lightbox.map.gallery.component.html',
2017-02-06 00:27:58 +08:00
})
export class GalleryMapLightboxComponent implements OnChanges {
@Input() photos: Array<PhotoDTO>;
private startPosition = null;
public lightboxDimension: Dimension = <Dimension>{top: 0, left: 0, width: 0, height: 0};
public mapDimension: Dimension = <Dimension>{top: 0, left: 0, width: 0, height: 0};
public visible = false;
public opacity = 1.0;
2017-07-21 02:07:19 +08:00
mapPhotos: MapPhoto[] = [];
mapCenter = {latitude: 0, longitude: 0};
2017-02-06 00:27:58 +08:00
2018-03-31 03:30:30 +08:00
@ViewChild('root') elementRef: ElementRef;
2017-02-06 00:27:58 +08:00
@ViewChild(AgmMap) map: AgmMap;
2017-02-06 00:27:58 +08:00
2017-07-24 04:36:53 +08:00
constructor(public fullScreenService: FullScreenService,
private thumbnailService: ThumbnailManagerService) {
}
2017-02-06 00:27:58 +08:00
//TODO: fix zooming
ngOnChanges() {
if (this.visible == false) {
return;
2017-02-06 00:27:58 +08:00
}
this.showImages();
}
public show(position: Dimension) {
2017-07-25 22:13:21 +08:00
this.hideImages();
this.visible = true;
this.opacity = 1.0;
this.startPosition = position;
this.lightboxDimension = position;
this.lightboxDimension.top -= this.getBodyScrollTop();
this.mapDimension = <Dimension>{
top: 0,
left: 0,
width: this.getScreenWidth(),
height: this.getScreenHeight()
};
this.map.triggerResize();
document.getElementsByTagName('body')[0].style.overflowY = 'hidden';
2017-06-11 04:56:23 +08:00
setTimeout(() => {
this.lightboxDimension = <Dimension>{
top: 0,
left: 0,
width: this.getScreenWidth(),
height: this.getScreenHeight()
};
2017-07-25 22:13:21 +08:00
this.showImages();
2017-06-11 04:56:23 +08:00
}, 0);
}
public hide() {
this.fullScreenService.exitFullScreen();
let to = this.startPosition;
//iff target image out of screen -> scroll to there
if (this.getBodyScrollTop() > to.top || this.getBodyScrollTop() + this.getScreenHeight() < to.top) {
this.setBodyScrollTop(to.top);
2017-02-06 00:27:58 +08:00
}
this.lightboxDimension = this.startPosition;
this.lightboxDimension.top -= this.getBodyScrollTop();
document.getElementsByTagName('body')[0].style.overflowY = 'scroll';
this.opacity = 0.0;
setTimeout(() => {
this.visible = false;
this.hideImages();
}, 500);
}
showImages() {
this.hideImages();
this.mapPhotos = this.photos.filter(p => {
return p.metadata && p.metadata.positionData && p.metadata.positionData.GPSData;
}).map(p => {
2017-07-21 02:07:19 +08:00
let width = 500;
let height = 500;
if (p.metadata.size.width > p.metadata.size.height) {
height = width * (p.metadata.size.height / p.metadata.size.width);
} else {
width = height * (p.metadata.size.width / p.metadata.size.height);
}
const iconTh = this.thumbnailService.getIcon(new IconPhoto(p));
2017-07-24 04:36:53 +08:00
iconTh.Visible = true;
2017-07-21 02:07:19 +08:00
const obj: MapPhoto = {
latitude: p.metadata.positionData.GPSData.latitude,
longitude: p.metadata.positionData.GPSData.longitude,
2017-07-21 02:07:19 +08:00
iconThumbnail: iconTh,
preview: {
width: width,
height: height,
2017-07-24 04:36:53 +08:00
thumbnail: this.thumbnailService.getLazyThumbnail(new Photo(p, width, height))
2017-07-21 02:07:19 +08:00
}
};
2017-07-21 02:07:19 +08:00
if (iconTh.Available == true) {
obj.iconUrl = iconTh.Src;
} else {
2017-07-21 02:07:19 +08:00
iconTh.OnLoad = () => {
obj.iconUrl = iconTh.Src;
};
}
return obj;
});
2017-02-06 00:27:58 +08:00
if (this.mapPhotos.length > 0) {
this.mapCenter = this.mapPhotos[0];
2017-02-06 00:27:58 +08:00
}
}
2017-02-06 00:27:58 +08:00
2017-07-25 22:13:21 +08:00
2017-07-24 04:36:53 +08:00
public loadPreview(mp: MapPhoto) {
mp.preview.thumbnail.load();
2017-07-26 05:40:07 +08:00
mp.preview.thumbnail.CurrentlyWaiting = true;
2017-07-24 04:36:53 +08:00
}
hideImages() {
2017-07-25 22:13:21 +08:00
this.mapCenter = {longitude: 0, latitude: 0};
2017-07-24 04:36:53 +08:00
this.mapPhotos.forEach((mp) => {
mp.iconThumbnail.destroy();
mp.preview.thumbnail.destroy();
});
this.mapPhotos = [];
}
2017-03-20 07:01:41 +08:00
private getBodyScrollTop(): number {
return window.scrollY;
}
2017-02-06 00:27:58 +08:00
private setBodyScrollTop(value: number) {
window.scrollTo(window.scrollX, value);
}
2017-02-06 00:27:58 +08:00
private getScreenWidth() {
return window.innerWidth;
}
2017-02-06 00:27:58 +08:00
private getScreenHeight() {
return window.innerHeight;
}
2017-02-06 00:27:58 +08:00
//noinspection JSUnusedGlobalSymbols
@HostListener('window:keydown', ['$event'])
onKeyPress(e: KeyboardEvent) {
if (this.visible != true) {
return;
2017-02-06 00:27:58 +08:00
}
let event: KeyboardEvent = window.event ? <any>window.event : e;
switch (event.keyCode) {
case 27: //escape
this.hide();
break;
}
}
2017-02-06 00:27:58 +08:00
}
2017-07-21 02:07:19 +08:00
export interface MapPhoto {
latitude: number;
longitude: number;
iconUrl?: string;
iconThumbnail: IconThumbnail;
preview: {
width: number;
height: number;
2017-07-24 04:36:53 +08:00
thumbnail: Thumbnail;
2017-07-21 02:07:19 +08:00
}
}