Add an indicator when Combined mode is loading (#308)
* Add an indicator when Combined mode is loading Fixes #297 * Proper centering * Clean up
This commit is contained in:
@ -2,7 +2,12 @@ import { Box, Spinner } from '@primer/react'
|
|||||||
|
|
||||||
export function Loading() {
|
export function Loading() {
|
||||||
return (
|
return (
|
||||||
<Box display="flex" alignItems="center" justifyContent="space-around">
|
<Box
|
||||||
|
display="flex"
|
||||||
|
alignItems="center"
|
||||||
|
justifyContent="space-around"
|
||||||
|
height="100%"
|
||||||
|
>
|
||||||
<Box display="block" py={4}>
|
<Box display="block" py={4}>
|
||||||
<Spinner size="large" />
|
<Spinner size="large" />
|
||||||
</Box>
|
</Box>
|
||||||
|
@ -20,6 +20,7 @@ import { getCommonSphere, loadGeometry } from '../../utils/three'
|
|||||||
import { OrbitControls } from 'three-stdlib'
|
import { OrbitControls } from 'three-stdlib'
|
||||||
import { RecenterButton } from './RecenterButton'
|
import { RecenterButton } from './RecenterButton'
|
||||||
import { ErrorMessage } from './ErrorMessage'
|
import { ErrorMessage } from './ErrorMessage'
|
||||||
|
import { Loading } from '../Loading'
|
||||||
|
|
||||||
function Viewer3D2Up({
|
function Viewer3D2Up({
|
||||||
beforeGeometry,
|
beforeGeometry,
|
||||||
@ -116,8 +117,14 @@ function Viewer3DCombined({
|
|||||||
const [showUnchanged, setShowUnchanged] = useState(true)
|
const [showUnchanged, setShowUnchanged] = useState(true)
|
||||||
const [showAdditions, setShowAdditions] = useState(true)
|
const [showAdditions, setShowAdditions] = useState(true)
|
||||||
const [showDeletions, setShowDeletions] = useState(true)
|
const [showDeletions, setShowDeletions] = useState(true)
|
||||||
|
const [rendering, setRendering] = useState(true)
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
{rendering && (
|
||||||
|
<Box top={0} left={0} right={0} bottom={0} position="absolute">
|
||||||
|
<Loading />
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
<Viewer3D
|
<Viewer3D
|
||||||
geometry={beforeGeometry}
|
geometry={beforeGeometry}
|
||||||
boundingSphere={boundingSphere}
|
boundingSphere={boundingSphere}
|
||||||
@ -133,6 +140,7 @@ function Viewer3DCombined({
|
|||||||
showUnchanged={showUnchanged}
|
showUnchanged={showUnchanged}
|
||||||
showAdditions={showAdditions}
|
showAdditions={showAdditions}
|
||||||
showDeletions={showDeletions}
|
showDeletions={showDeletions}
|
||||||
|
onRendered={() => setRendering(false)}
|
||||||
/>
|
/>
|
||||||
</Viewer3D>
|
</Viewer3D>
|
||||||
<LegendBox>
|
<LegendBox>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { MutableRefObject } from 'react'
|
import { MutableRefObject, useState } from 'react'
|
||||||
import { useTheme } from '@primer/react'
|
import { useTheme } from '@primer/react'
|
||||||
import { BufferGeometry, Sphere } from 'three'
|
import { BufferGeometry, Sphere } from 'three'
|
||||||
import { Geometry, Base, Subtraction, Intersection } from '@react-three/csg'
|
import { Geometry, Base, Subtraction, Intersection } from '@react-three/csg'
|
||||||
@ -11,6 +11,7 @@ type CombinedModelProps = {
|
|||||||
showUnchanged: boolean
|
showUnchanged: boolean
|
||||||
showAdditions: boolean
|
showAdditions: boolean
|
||||||
showDeletions: boolean
|
showDeletions: boolean
|
||||||
|
onRendered?: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export function CombinedModel({
|
export function CombinedModel({
|
||||||
@ -20,16 +21,25 @@ export function CombinedModel({
|
|||||||
showUnchanged,
|
showUnchanged,
|
||||||
showAdditions,
|
showAdditions,
|
||||||
showDeletions,
|
showDeletions,
|
||||||
|
onRendered,
|
||||||
}: CombinedModelProps) {
|
}: CombinedModelProps) {
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const commonColor = theme?.colors.fg.muted
|
const commonColor = theme?.colors.fg.muted
|
||||||
const additionsColor = theme?.colors.success.muted
|
const additionsColor = theme?.colors.success.muted
|
||||||
const deletionsColor = theme?.colors.danger.muted
|
const deletionsColor = theme?.colors.danger.muted
|
||||||
|
const [rendered, setRendered] = useState(false)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BaseModel boundingSphere={boundingSphere}>
|
<BaseModel boundingSphere={boundingSphere}>
|
||||||
{/* Unchanged */}
|
{/* Unchanged */}
|
||||||
<mesh>
|
<mesh
|
||||||
|
onAfterRender={() => {
|
||||||
|
if (!rendered) {
|
||||||
|
setRendered(true)
|
||||||
|
onRendered && onRendered()
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
<meshPhongMaterial
|
<meshPhongMaterial
|
||||||
color={commonColor}
|
color={commonColor}
|
||||||
transparent
|
transparent
|
||||||
|
Reference in New Issue
Block a user