From b61e65bd83ce7f247a106d6ed4dd184227000cfd Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sat, 14 Mar 2020 22:02:35 -0700 Subject: [PATCH] Pair-up portraits when in landscape mode. --- react-slideshow/src/App.tsx | 43 ++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/react-slideshow/src/App.tsx b/react-slideshow/src/App.tsx index e7442dd..b4c6358 100644 --- a/react-slideshow/src/App.tsx +++ b/react-slideshow/src/App.tsx @@ -43,7 +43,7 @@ const roundup = (v: number, mod: number) => { * From https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array * @param {Array} a items An array containing the items. */ -function shuffle(a: Array) { +function shuffle(a: Array) { let rng = new Random(new Date().getDate()); for (let i = a.length - 1; i > 0; i--) { const j = Math.floor(rng.nextFloat() * (i + 1)); @@ -82,15 +82,19 @@ class Slide { return this.items.map(img => `/api/image/${img.id}?w=${w}&h=${h}`); } render() { - const imgs = this.imageUrls.map(url => { + let urls = this.imageUrls; + let frac = 100 / urls.length; + let imgs = urls.map(url => { + // TODO(wathiede): make this landscape/portrait aware. let style: React.CSSProperties = { height: '100%', - width: '100%', + width: frac + '%', backgroundColor: 'black', backgroundImage: `url(${url})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center center', backgroundSize: 'cover', + float: 'left', }; return
; }); @@ -102,6 +106,16 @@ class Slide { } }; +function makePairs(items: Array) { + const half = Math.floor(items.length/2); + console.log(`items ${items.length} half ${half}`) + let pairs = []; + for (let i = 0; i < half; i++) { + pairs.push([items[2*i], items[2*i+1]]); + } + return pairs; +} + type MediaMetadata = { width: number; height: number; @@ -156,18 +170,24 @@ class Album extends React.Component { console.log(`${landscapes.length} landscape photos`); console.log(`${portraits.length} portraits photos`); - let photos; + let slides: Array; if (ratio > 1) { console.log('display in landscape mode'); - photos = landscapes; + slides = landscapes.map((p)=>{ + return new Slide([p]); + }); + let pairs = makePairs(shuffle(portraits)); + slides = slides.concat(pairs.map((p, i) => new Slide(p))); } else { console.log('display in portrait mode'); - photos = portraits; + slides = portraits.map((p)=>{ + return new Slide([p]); + }); + // TODO(wathiede): fix Slide::render before adding landscapes + // to slides here. } - photos = shuffle(photos); - let slides = photos.map((p)=>{ - return new Slide([p]); - }); + slides = shuffle(slides); + console.log(`${slides.length} slides`); let numSlides = slides.length; slides.forEach((p, idx)=>{ let nextIdx = (idx+1)%numSlides; @@ -196,7 +216,6 @@ class Album extends React.Component { } render() { // TODO(wathiede): fade transition. - // TODO(wathiede): pair-up portrait orientation images. let {curSlide, error, showUI} = this.state; if (error !== null) { return

Error: {JSON.stringify(error)}

; @@ -229,7 +248,7 @@ class Album extends React.Component { this.setState({curSlide: curSlide?.prevSlide}) }}>{ prevSlide?.render() } {/* TODO(wathiede): make this work with multiple items. */} -
{curSlide?.items[0].filename}
+
{curSlide?.items.map(i=>i.filename).join(' | ')}
{