From 7329942e0b105bf107f420defda6d96f5413c499 Mon Sep 17 00:00:00 2001 From: DD Liu <liudi@media.mit.edu> Date: Wed, 10 May 2017 15:14:34 -0400 Subject: [PATCH] GUI accepts remove monitors actions --- src/lib/vm-listener-hoc.jsx | 6 ++++++ src/reducers/monitors.js | 30 +++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/lib/vm-listener-hoc.jsx b/src/lib/vm-listener-hoc.jsx index 265b3cfb8..d65441f1f 100644 --- a/src/lib/vm-listener-hoc.jsx +++ b/src/lib/vm-listener-hoc.jsx @@ -32,6 +32,7 @@ const vmListenerHOC = function (WrappedComponent) { this.props.vm.on('targetsUpdate', this.props.onTargetsUpdate); this.props.vm.on('SPRITE_INFO_REPORT', this.props.onSpriteInfoReport); this.props.vm.on('MONITORS_UPDATE', this.props.onMonitorsUpdate); + this.props.vm.on('MONITORS_REMOVED', this.props.onMonitorsRemoved); } componentDidMount () { if (this.props.attachKeyboardEvents) { @@ -80,6 +81,7 @@ const vmListenerHOC = function (WrappedComponent) { onKeyUp, onSpriteInfoReport, onMonitorsUpdate, + onMonitorsRemoved, onTargetsUpdate, /* eslint-enable no-unused-vars */ ...props @@ -91,6 +93,7 @@ const vmListenerHOC = function (WrappedComponent) { attachKeyboardEvents: PropTypes.bool, onKeyDown: PropTypes.func, onKeyUp: PropTypes.func, + onMonitorsRemoved: PropTypes.func, onMonitorsUpdate: PropTypes.func, onSpriteInfoReport: PropTypes.func, onTargetsUpdate: PropTypes.func, @@ -113,6 +116,9 @@ const vmListenerHOC = function (WrappedComponent) { }, onMonitorsUpdate: monitorList => { dispatch(monitors.updateMonitors(monitorList)); + }, + onMonitorsRemoved: monitorList => { + dispatch(monitors.removeMonitors(monitorList)); } }); return connect( diff --git a/src/reducers/monitors.js b/src/reducers/monitors.js index 0e9832fcd..cf1d8e177 100644 --- a/src/reducers/monitors.js +++ b/src/reducers/monitors.js @@ -1,15 +1,16 @@ const UPDATE_MONITORS = 'scratch-gui/monitors/UPDATE_MONITORS'; +const REMOVE_MONITORS = 'scratch-gui/monitors/REMOVE_MONITORS'; const initialState = []; const reducer = function (state, action) { if (typeof state === 'undefined') state = initialState; + let newState; switch (action.type) { // Adds or updates monitors case UPDATE_MONITORS: - let newState = [...state]; - let updated = false; - for (let i = 0; i < action.monitors.length; i++) { + newState = [...state]; + for (let i = 0, updated = false; i < action.monitors.length; i++) { for (let j = 0; j < state.length; j++) { if (action.monitors[i].id == state[j].id) { newState[j] = action.monitors[i]; @@ -23,6 +24,19 @@ const reducer = function (state, action) { updated = false; } return newState; + // Removes monitors + case REMOVE_MONITORS: + newState = [...state]; + for (let i = 0; i < action.monitors.length; i++) { + // Move backwards to keep indices aligned + for (let j = state.length - 1; j >= 0; j--) { + if (action.monitors[i].id == state[j].id) { + newState.splice(j, 1); + continue; + } + } + } + return newState; default: return state; } @@ -38,4 +52,14 @@ reducer.updateMonitors = function (monitors) { }; }; +reducer.removeMonitors = function (monitors) { + return { + type: REMOVE_MONITORS, + monitors: monitors, + meta: { + throttle: 30 + } + }; +}; + module.exports = reducer; -- GitLab