117 lines
2.8 KiB
JavaScript
117 lines
2.8 KiB
JavaScript
/* 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;
|
|
};
|