diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /devtools/client/inspector/animation/reducers/animations.js | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/client/inspector/animation/reducers/animations.js')
-rw-r--r-- | devtools/client/inspector/animation/reducers/animations.js | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/devtools/client/inspector/animation/reducers/animations.js b/devtools/client/inspector/animation/reducers/animations.js new file mode 100644 index 0000000000..ead3e84147 --- /dev/null +++ b/devtools/client/inspector/animation/reducers/animations.js @@ -0,0 +1,117 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const { + UPDATE_ANIMATIONS, + UPDATE_DETAIL_VISIBILITY, + UPDATE_ELEMENT_PICKER_ENABLED, + UPDATE_HIGHLIGHTED_NODE, + UPDATE_PLAYBACK_RATES, + UPDATE_SELECTED_ANIMATION, + UPDATE_SIDEBAR_SIZE, +} = require("resource://devtools/client/inspector/animation/actions/index.js"); + +loader.lazyRequireGetter( + this, + "TimeScale", + "resource://devtools/client/inspector/animation/utils/timescale.js" +); + +const INITIAL_STATE = { + animations: [], + detailVisibility: false, + elementPickerEnabled: false, + highlightedNode: null, + playbackRates: [], + selectedAnimation: null, + sidebarSize: { + height: 0, + width: 0, + }, + timeScale: null, +}; + +const reducers = { + [UPDATE_ANIMATIONS](state, { animations }) { + let detailVisibility = state.detailVisibility; + let selectedAnimation = state.selectedAnimation; + + if ( + !state.selectedAnimation || + !animations.find( + animation => animation.actorID === selectedAnimation.actorID + ) + ) { + selectedAnimation = animations.length === 1 ? animations[0] : null; + detailVisibility = !!selectedAnimation; + } + + const playbackRates = getPlaybackRates(state.playbackRates, animations); + + return Object.assign({}, state, { + animations, + detailVisibility, + playbackRates, + selectedAnimation, + timeScale: new TimeScale(animations), + }); + }, + + [UPDATE_DETAIL_VISIBILITY](state, { detailVisibility }) { + const selectedAnimation = detailVisibility ? state.selectedAnimation : null; + + return Object.assign({}, state, { + detailVisibility, + selectedAnimation, + }); + }, + + [UPDATE_ELEMENT_PICKER_ENABLED](state, { elementPickerEnabled }) { + return Object.assign({}, state, { + elementPickerEnabled, + }); + }, + + [UPDATE_HIGHLIGHTED_NODE](state, { highlightedNode }) { + return Object.assign({}, state, { + highlightedNode, + }); + }, + + [UPDATE_PLAYBACK_RATES](state) { + return Object.assign({}, state, { + playbackRates: getPlaybackRates([], state.animations), + }); + }, + + [UPDATE_SELECTED_ANIMATION](state, { selectedAnimation }) { + const detailVisibility = !!selectedAnimation; + + return Object.assign({}, state, { + detailVisibility, + selectedAnimation, + }); + }, + + [UPDATE_SIDEBAR_SIZE](state, { sidebarSize }) { + return Object.assign({}, state, { + sidebarSize, + }); + }, +}; + +function getPlaybackRates(basePlaybackRate, animations) { + return [ + ...new Set( + animations.map(a => a.state.playbackRate).concat(basePlaybackRate) + ), + ]; +} + +module.exports = function (state = INITIAL_STATE, action) { + const reducer = reducers[action.type]; + return reducer ? reducer(state, action) : state; +}; |