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

73 lines
2.0 KiB
TypeScript
Raw Normal View History

2018-03-31 03:30:30 +08:00
import {PhotoDTO} from '../../../../common/entities/PhotoDTO';
2018-11-05 02:28:32 +08:00
import {MediaDTO} from '../../../../common/entities/MediaDTO';
2016-05-09 23:04:56 +08:00
export class GridRowBuilder {
2018-11-02 17:40:09 +08:00
private photoRow: PhotoDTO[] = [];
2016-05-09 23:04:56 +08:00
2018-11-05 02:28:32 +08:00
private photoIndex = 0; // index of the last pushed media to the photoRow
2016-05-09 23:04:56 +08:00
2018-11-02 17:40:09 +08:00
constructor(private photos: PhotoDTO[],
2017-07-17 03:03:37 +08:00
private startIndex: number,
private photoMargin: number,
private containerWidth: number) {
this.photoIndex = startIndex;
if (this.containerWidth <= 0) {
throw new Error('container width cant be <=0, got:' + this.containerWidth);
}
}
public addPhotos(number: number) {
for (let i = 0; i < number; i++) {
this.addPhoto();
}
}
2017-07-17 03:03:37 +08:00
private addPhoto(): boolean {
if (this.photoIndex + 1 > this.photos.length) {
return false;
}
this.photoRow.push(this.photos[this.photoIndex]);
this.photoIndex++;
return true;
}
public removePhoto(): boolean {
if (this.photoIndex - 1 < this.startIndex) {
return false;
}
this.photoIndex--;
this.photoRow.pop();
return true;
}
2018-11-02 17:40:09 +08:00
public getPhotoRow(): PhotoDTO[] {
return this.photoRow;
}
public adjustRowHeightBetween(minHeight: number, maxHeight: number) {
2018-05-04 07:17:08 +08:00
while (this.calcRowHeight() > maxHeight && this.addPhoto() === true) { // row too high -> add more images
}
2018-05-04 07:17:08 +08:00
while (this.calcRowHeight() < minHeight && this.removePhoto() === true) { // roo too small -> remove images
}
2018-11-05 02:28:32 +08:00
// keep at least one media int thr row
if (this.photoRow.length <= 0) {
this.addPhoto();
}
}
public calcRowHeight(): number {
let width = 0;
for (let i = 0; i < this.photoRow.length; i++) {
2018-11-05 02:28:32 +08:00
const size = MediaDTO.getRotatedSize(this.photoRow[i]);
2018-11-02 17:40:09 +08:00
width += (size.width / size.height); // summing up aspect ratios
}
2018-05-04 07:17:08 +08:00
const height = (this.containerWidth - this.photoRow.length * (this.photoMargin * 2) - 1) / width; // cant be equal -> width-1
return height + (this.photoMargin * 2);
}
}