From 783e1913ce6c698c6e0f2403be2cc14eef9a3a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= Date: Fri, 30 Jun 2023 14:23:34 +0200 Subject: [PATCH 1/7] feat: initial work on React Toolbar --- .../components/Toolbar/FitModelsButton.tsx | 32 ++++++++++++ .../src/components/Toolbar/SliceButton.tsx | 19 +++++++ .../src/components/Toolbar/Toolbar.tsx | 50 +++++++++++++++++++ .../src/components/Toolbar/ToolbarButton.tsx | 10 ++++ react-components/src/components/index.ts | 2 + react-components/stories/Toolbar.stories.tsx | 40 +++++++++++++++ 6 files changed, 153 insertions(+) create mode 100644 react-components/src/components/Toolbar/FitModelsButton.tsx create mode 100644 react-components/src/components/Toolbar/SliceButton.tsx create mode 100644 react-components/src/components/Toolbar/Toolbar.tsx create mode 100644 react-components/src/components/Toolbar/ToolbarButton.tsx create mode 100644 react-components/stories/Toolbar.stories.tsx diff --git a/react-components/src/components/Toolbar/FitModelsButton.tsx b/react-components/src/components/Toolbar/FitModelsButton.tsx new file mode 100644 index 00000000000..b9837278ab0 --- /dev/null +++ b/react-components/src/components/Toolbar/FitModelsButton.tsx @@ -0,0 +1,32 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import React, { useCallback, useEffect, useState } from 'react'; + +import { Box3 } from 'three'; + +import { useReveal } from '../RevealContainer/RevealContext'; +import { ToolbarButton } from './ToolbarButton'; + +export const FitModelsButton = () => { + const viewer = useReveal(); + + const modelList = viewer.models; + + const updateCamera = useCallback(() => { + const box = new Box3(); + + viewer.models.forEach((model) => box.union(model.getModelBoundingBox())); + + viewer.cameraManager.fitCameraToBoundingBox(box); + }, [viewer, ...modelList]); + + return ( + + ); +}; diff --git a/react-components/src/components/Toolbar/SliceButton.tsx b/react-components/src/components/Toolbar/SliceButton.tsx new file mode 100644 index 00000000000..f3a93029e4e --- /dev/null +++ b/react-components/src/components/Toolbar/SliceButton.tsx @@ -0,0 +1,19 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import React, { useEffect, useState } from 'react'; + +import { ToolbarButton } from './ToolbarButton'; + +import { useReveal } from '../RevealContainer/RevealContext'; + +export const SliceButton = () => { + const viewer = useReveal(); + + const [yClip, setYClip] = useState(undefined); + + useEffect(() => {}, []); + + return ; +}; diff --git a/react-components/src/components/Toolbar/Toolbar.tsx b/react-components/src/components/Toolbar/Toolbar.tsx new file mode 100644 index 00000000000..2166e11649b --- /dev/null +++ b/react-components/src/components/Toolbar/Toolbar.tsx @@ -0,0 +1,50 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; +import { Divider, ToolBar } from '@cognite/cogs.js'; +import { SliceButton } from './SliceButton'; +import { FitModelsButton } from './FitModelsButton'; + +import { ToolbarButton } from './ToolbarButton'; + +export type ToolbarProps = { + children?: JSX.Element; +}; + +const defaultButtons = ( + <> + + + + + + + + + + + + + + + + + +); + +const Toolbar = (props: ToolbarProps) => { + const hasCustomChildren = props.children !== undefined; + + return {hasCustomChildren ? props.children : defaultButtons}; +}; + +const FloatingToolbar = styled(ToolBar)` + position: absolute; + left: 30px; + bottom: 30px; +`; + +export default Toolbar; diff --git a/react-components/src/components/Toolbar/ToolbarButton.tsx b/react-components/src/components/Toolbar/ToolbarButton.tsx new file mode 100644 index 00000000000..770055822b5 --- /dev/null +++ b/react-components/src/components/Toolbar/ToolbarButton.tsx @@ -0,0 +1,10 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import React from 'react'; +import { Button, ButtonProps } from '@cognite/cogs.js'; + +export const ToolbarButton = (props: ButtonProps & React.RefAttributes) => ( +