From 3157d748bcc3411c602cbb11025cde757f188c76 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Wed, 1 Jul 2020 11:50:43 +1000 Subject: [PATCH] Scene selection improvements (#642) * Select subsequent scenes on card click --- .../components/Changelog/versions/v030.tsx | 1 + ui/v2.5/src/components/Scenes/SceneCard.tsx | 41 ++++++++++++++++++- ui/v2.5/src/components/Scenes/SceneList.tsx | 1 + ui/v2.5/src/components/Scenes/styles.scss | 31 +++++++++----- 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/ui/v2.5/src/components/Changelog/versions/v030.tsx b/ui/v2.5/src/components/Changelog/versions/v030.tsx index 55525faa1..49189b60b 100644 --- a/ui/v2.5/src/components/Changelog/versions/v030.tsx +++ b/ui/v2.5/src/components/Changelog/versions/v030.tsx @@ -9,6 +9,7 @@ const markup = ` * Add support for parent/child studios. ### 🎨 Improvements +* Allow click and click-drag selection after selecting scene. * Added multi-scene edit dialog. * Moved images to separate tables, increasing performance. * Add gallery grid view. diff --git a/ui/v2.5/src/components/Scenes/SceneCard.tsx b/ui/v2.5/src/components/Scenes/SceneCard.tsx index 4f89f1df2..f55884343 100644 --- a/ui/v2.5/src/components/Scenes/SceneCard.tsx +++ b/ui/v2.5/src/components/Scenes/SceneCard.tsx @@ -10,6 +10,7 @@ import { TextUtils } from "src/utils"; interface ISceneCardProps { scene: GQL.SlimSceneDataFragment; + selecting?: boolean; selected: boolean | undefined; zoomIndex: number; onSelectedChanged: (selected: boolean, shiftKey: boolean) => void; @@ -221,11 +222,42 @@ export const SceneCard: React.FC = ( } hoverHandler.onMouseEnter(); } + function onMouseLeave() { hoverHandler.onMouseLeave(); setPreviewPath(""); } + function handleSceneClick( + event: React.MouseEvent + ) { + const { shiftKey } = event; + + if (props.selecting) { + props.onSelectedChanged(!props.selected, shiftKey); + event.preventDefault(); + } + } + + function handleDrag(event: React.DragEvent) { + if (props.selecting) { + event.dataTransfer.setData("text/plain", ""); + event.dataTransfer.setDragImage(new Image(), 0, 0); + } + } + + function handleDragOver(event: React.DragEvent) { + const ev = event; + const shiftKey = false; + + if (props.selecting && !props.selected) { + props.onSelectedChanged(true, shiftKey); + } + + ev.dataTransfer.dropEffect = "move"; + ev.preventDefault(); + } + function isPortrait() { const { file } = props.scene; const width = file.width ? file.width : 0; @@ -253,7 +285,14 @@ export const SceneCard: React.FC = ( }} /> - + {maybeRenderRatingBanner()} {maybeRenderSceneStudioOverlay()} {maybeRenderSceneSpecsOverlay()} diff --git a/ui/v2.5/src/components/Scenes/SceneList.tsx b/ui/v2.5/src/components/Scenes/SceneList.tsx index a9015f550..0ab05feed 100644 --- a/ui/v2.5/src/components/Scenes/SceneList.tsx +++ b/ui/v2.5/src/components/Scenes/SceneList.tsx @@ -100,6 +100,7 @@ export const SceneList: React.FC = ({ key={scene.id} scene={scene} zoomIndex={zoomIndex} + selecting={selectedIds.size > 0} selected={selectedIds.has(scene.id)} onSelectedChanged={(selected: boolean, shiftKey: boolean) => listData.onSelectChange(scene.id, selected, shiftKey) diff --git a/ui/v2.5/src/components/Scenes/styles.scss b/ui/v2.5/src/components/Scenes/styles.scss index 39f179204..b0e19cbf6 100644 --- a/ui/v2.5/src/components/Scenes/styles.scss +++ b/ui/v2.5/src/components/Scenes/styles.scss @@ -24,17 +24,6 @@ } } -.scene-card-check { - left: 0.5rem; - margin-top: -12px; - opacity: 0.5; - padding-left: 15px; - position: absolute; - top: 0.7rem; - width: 1.2rem; - z-index: 1; -} - .performer-tag-container, .movie-tag-container { display: inline-block; @@ -189,6 +178,21 @@ position: relative; } + .scene-card-check { + left: 0.5rem; + margin-top: -12px; + opacity: 0; + padding-left: 15px; + position: absolute; + top: 0.7rem; + width: 1.2rem; + z-index: 1; + + &:checked { + opacity: 0.75; + } + } + .scene-specs-overlay, .rating-banner, .scene-studio-overlay { @@ -207,6 +211,11 @@ opacity: 0.75; transition: opacity 0.5s; } + + .scene-card-check { + opacity: 0.75; + transition: opacity 0.5s; + } } }