From 26e3404d217a9adcaccbd0e739a57ff37a4118cf Mon Sep 17 00:00:00 2001
From: "Andrew Winget (Standard)" <scipioaffricanus@gmail.com>
Date: Wed, 20 Feb 2019 10:27:41 -0800
Subject: [PATCH] add bounding box function

---
 src/components/WorkspaceElastic.js |  3 +++
 src/config/settings.js             |  2 +-
 src/containers/WorkspaceElastic.js |  2 ++
 src/state/reducers/workspace.js    |  4 ++--
 src/state/selectors/index.js       | 20 ++++++++++++++++++++
 src/styles/index.scss              |  1 +
 6 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/components/WorkspaceElastic.js b/src/components/WorkspaceElastic.js
index 65de11c19..896c3c4fc 100644
--- a/src/components/WorkspaceElastic.js
+++ b/src/components/WorkspaceElastic.js
@@ -15,11 +15,13 @@ class WorkspaceElastic extends React.Component {
   render() {
     const {
       workspace,
+      boundingBox,
       windows,
       setWorkspaceViewportPosition,
       updateWindowPosition,
       setWindowSize,
     } = this.props;
+    console.log(boundingBox);
     return (
       <Rnd
         default={{
@@ -77,6 +79,7 @@ WorkspaceElastic.propTypes = {
   setWorkspaceViewportPosition: PropTypes.func.isRequired,
   windows: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
   workspace: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
+  boundingBox: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
   updateWindowPosition: PropTypes.func.isRequired,
   setWindowSize: PropTypes.func.isRequired,
 };
diff --git a/src/config/settings.js b/src/config/settings.js
index f3d393155..deae277ae 100644
--- a/src/config/settings.js
+++ b/src/config/settings.js
@@ -18,7 +18,7 @@ export default {
     height: 150,
   },
   workspace: {
-    type: 'freeform',
+    type: 'elastic',
   },
   workspaceControlPanel: {
     enabled: true,
diff --git a/src/containers/WorkspaceElastic.js b/src/containers/WorkspaceElastic.js
index 8c0b8d714..877673db8 100644
--- a/src/containers/WorkspaceElastic.js
+++ b/src/containers/WorkspaceElastic.js
@@ -1,6 +1,7 @@
 import { compose } from 'redux';
 import { connect } from 'react-redux';
 import * as actions from '../state/actions';
+import { getWorkspaceBoundingBox } from '../state/selectors';
 import WorkspaceElastic from '../components/WorkspaceElastic';
 
 /**
@@ -10,6 +11,7 @@ import WorkspaceElastic from '../components/WorkspaceElastic';
  */
 const mapStateToProps = state => (
   {
+    boundingBox: getWorkspaceBoundingBox(state.windows),
     workspace: state.workspace,
     windows: state.windows,
   }
diff --git a/src/state/reducers/workspace.js b/src/state/reducers/workspace.js
index b98216833..6abaeb93a 100644
--- a/src/state/reducers/workspace.js
+++ b/src/state/reducers/workspace.js
@@ -9,7 +9,7 @@ export const workspaceReducer = (
       x: -2500,
       y: -2500,
     },
-    exposedModeOn: false,
+    exposeModeOn: false,
   },
   action,
 ) => {
@@ -27,7 +27,7 @@ export const workspaceReducer = (
     case ActionTypes.SET_WORKSPACE_VIEWPORT_POSITION:
       return { ...state, viewportPosition: action.payload.position };
     case ActionTypes.TOGGLE_WORKSPACE_EXPOSE_MODE:
-      return { ...state, exposeModeOn: !state.exposedModeOn };
+      return { ...state, exposeModeOn: !state.exposeModeOn };
     default:
       return state;
   }
diff --git a/src/state/selectors/index.js b/src/state/selectors/index.js
index 69a9c3646..04c33d17c 100644
--- a/src/state/selectors/index.js
+++ b/src/state/selectors/index.js
@@ -189,3 +189,23 @@ export function getCompanionWindowForPosition(state, windowId, position) {
     && state.windows[windowId].companionWindows
     && state.windows[windowId].companionWindows[position];
 }
+
+/**
+ * Return the bounding box for all open windows in the elastic workspace
+ * in workspace coordinates
+ * @param {object} state
+ * @return {object}
+ */
+export function getWorkspaceBoundingBox(windows) {
+  const windowObjects = Object.values(windows);
+  const minX = Math.min(...windowObjects.map(win => win.x));
+  const minY = Math.min(...windowObjects.map(win => win.y));
+  const maxX = Math.max(...windowObjects.map(win => win.x + win.width));
+  const maxY = Math.max(...windowObjects.map(win => win.y + win.height));
+  return {
+    x: minX,
+    y: minY,
+    width: maxX - minX,
+    height: maxY - minY,
+  };
+}
diff --git a/src/styles/index.scss b/src/styles/index.scss
index d681f4e04..6103d91c8 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -7,6 +7,7 @@
     right: 0;
     bottom: 0;
     left: 0;
+    overflow: hidden;
   }
 
   &-workspace-viewport {
-- 
GitLab