diff --git a/js/actionCreators/milkdrop.ts b/js/actionCreators/milkdrop.ts index c66b8126..bac2748a 100644 --- a/js/actionCreators/milkdrop.ts +++ b/js/actionCreators/milkdrop.ts @@ -65,7 +65,7 @@ export function loadPresets(presets: StatePreset[]): Dispatchable { const state = getState(); const presetsLength = state.milkdrop.presets.length; dispatch({ type: GOT_BUTTERCHURN_PRESETS, presets }); - if (state.milkdrop.randomize) { + if (presetsLength === 0 && Selectors.getRandomizePresets(state)) { dispatch(selectRandomPreset()); } else { dispatch( @@ -116,7 +116,7 @@ export function selectNextPreset( ): Dispatchable { return (dispatch, getState) => { const state = getState(); - if (state.milkdrop.randomize) { + if (Selectors.getRandomizePresets(state)) { return dispatch(selectRandomPreset(transitionType)); } const currentPresetIndex = Selectors.getCurrentPresetIndex(state); diff --git a/js/components/MilkdropWindow/PresetOverlay.tsx b/js/components/MilkdropWindow/PresetOverlay.tsx index cef80a02..878271f2 100644 --- a/js/components/MilkdropWindow/PresetOverlay.tsx +++ b/js/components/MilkdropWindow/PresetOverlay.tsx @@ -225,7 +225,7 @@ function mapStateToProps(state: AppState): StateProps { function mapDispatchToProps(dispatch: Dispatch): DispatchProps { return { requestPresetAtIndex: (i: number) => { - dispatch(Actions.requestPresetAtIndex(i, TransitionType.DEFAULT)); + dispatch(Actions.requestPresetAtIndex(i, TransitionType.DEFAULT, true)); }, togglePresetOverlay: () => dispatch(Actions.togglePresetOverlay()), appendPresetFileList: (fileList: FileList) => diff --git a/js/reducers/milkdrop.test.js b/js/reducers/milkdrop.test.js index d322928f..f52f7d2d 100644 --- a/js/reducers/milkdrop.test.js +++ b/js/reducers/milkdrop.test.js @@ -13,14 +13,31 @@ const media = { on: jest.fn() }; -const store = createStore(media, new Emitter()); +test("The first tack is picked at random", () => { + const store = createStore(media, new Emitter()); + const mockPreset = [ + { type: "RESOLVED", name: "First", preset: {} }, + { type: "RESOLVED", name: "Second", preset: {} }, + { type: "RESOLVED", name: "Third", preset: {} }, + { type: "RESOLVED", name: "Fourth", preset: {} } + ]; + Math.random = () => 0.5; + // Just confirm that the default setting is correct + expect(Selectors.getRandomizePresets(store.getState())).toBe(true); + store.dispatch(Actions.loadPresets(mockPreset)); + expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(2); +}); -test("handles history correctly", () => { +test("handles history (prev/next) correctly", () => { + const store = createStore(media, new Emitter()); const mockPreset = [ { type: "RESOLVED", name: "First", preset: {} }, { type: "RESOLVED", name: "Second", preset: {} } ]; + expect(Selectors.getRandomizePresets(store.getState())).toBe(true); store.dispatch(Actions.toggleRandomizePresets()); + expect(Selectors.getRandomizePresets(store.getState())).toBe(false); + // Check initial state expect(store.getState().milkdrop.presetHistory).toEqual([]); expect(Selectors.getCurrentPreset(store.getState())).toBe(null); @@ -51,3 +68,28 @@ test("handles history correctly", () => { expect(store.getState().milkdrop.presetHistory).toEqual([0]); expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0); }); + +test("selectes the first preset in a new set when added", async () => { + const store = createStore(media, new Emitter()); + const mockPreset = [ + { type: "RESOLVED", name: "First", preset: {} }, + { type: "RESOLVED", name: "Second", preset: {} } + ]; + store.dispatch(Actions.toggleRandomizePresets()); + + // Load some presets + store.dispatch(Actions.loadPresets(mockPreset)); + expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0); + + const presetPromise = Promise.resolve({}); + // Load some more presets + const newMockPresets = [ + { type: "UNRESOLVED", name: "First", getPreset: () => presetPromise } + ]; + store.dispatch(Actions.loadPresets(newMockPresets)); + // The new presets are not selected right away + expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(0); + await presetPromise; + // Once the first preset is loaded, it gets selected + expect(Selectors.getCurrentPresetIndex(store.getState())).toBe(2); +}); diff --git a/js/selectors.ts b/js/selectors.ts index 20281b6a..bb09a9af 100644 --- a/js/selectors.ts +++ b/js/selectors.ts @@ -652,3 +652,7 @@ export function getPresetOverlayOpen(state: AppState): boolean { export function getPresetsAreCycling(state: AppState): boolean { return state.milkdrop.cycling; } + +export function getRandomizePresets(state: AppState): boolean { + return state.milkdrop.randomize; +}