diff --git a/js/actionCreators/index.ts b/js/actionCreators/index.ts index 545d94a0..8db758f4 100644 --- a/js/actionCreators/index.ts +++ b/js/actionCreators/index.ts @@ -103,7 +103,8 @@ export { togglePresetOverlay, appendPresetFileList, handlePresetDrop, - loadPresets + loadPresets, + toggleRandomizePresets } from "./milkdrop"; import * as Selectors from "../selectors"; diff --git a/js/actionCreators/milkdrop.ts b/js/actionCreators/milkdrop.ts index 0a89b4b4..888d84ab 100644 --- a/js/actionCreators/milkdrop.ts +++ b/js/actionCreators/milkdrop.ts @@ -4,7 +4,8 @@ import { SELECT_PRESET_AT_INDEX, RESOLVE_PRESET_AT_INDEX, TOGGLE_PRESET_OVERLAY, - PRESET_REQUESTED + PRESET_REQUESTED, + TOGGLE_RANDOMIZE_PRESETS } from "../actionTypes"; import * as Selectors from "../selectors"; import { @@ -60,11 +61,16 @@ export function initializePresets( export function loadPresets(presets: StatePreset[]): Dispatchable { return (dispatch, getState) => { - const presetLength = getState().milkdrop.presets.length; + const state = getState(); + const presetsLength = state.milkdrop.presets.length; dispatch({ type: GOT_BUTTERCHURN_PRESETS, presets }); - dispatch( - requestPresetAtIndex(presetLength, TransitionType.IMMEDIATE, true) - ); + if (state.milkdrop.randomize) { + dispatch(selectRandomPreset()); + } else { + dispatch( + requestPresetAtIndex(presetsLength, TransitionType.IMMEDIATE, true) + ); + } }; } @@ -101,7 +107,6 @@ export function appendPresetFileList(fileList: FileList): Dispatchable { }) .filter(Boolean); dispatch(loadPresets(presets)); - // TODO: Select the first of these presets }; } @@ -109,7 +114,11 @@ export function selectNextPreset( transitionType: TransitionType = TransitionType.DEFAULT ): Dispatchable { return (dispatch, getState) => { - const currentPresetIndex = Selectors.getCurrentPresetIndex(getState()); + const state = getState(); + if (state.milkdrop.randomize) { + return dispatch(selectRandomPreset(transitionType)); + } + const currentPresetIndex = Selectors.getCurrentPresetIndex(state); if (currentPresetIndex == null) { return; } @@ -183,3 +192,7 @@ export function handlePresetDrop(e: React.DragEvent): Dispatchable { export function togglePresetOverlay(): Dispatchable { return { type: TOGGLE_PRESET_OVERLAY }; } + +export function toggleRandomizePresets(): Dispatchable { + return { type: TOGGLE_RANDOMIZE_PRESETS }; +} diff --git a/js/actionTypes.ts b/js/actionTypes.ts index 8053d7ae..94ec80fc 100644 --- a/js/actionTypes.ts +++ b/js/actionTypes.ts @@ -83,3 +83,4 @@ export const RESOLVE_PRESET_AT_INDEX = "RESOLVE_PRESET_AT_INDEX"; export const SELECT_PRESET_AT_INDEX = "SELECT_PRESET_AT_INDEX"; export const TOGGLE_PRESET_OVERLAY = "TOGGLE_PRESET_OVERLAY"; export const PRESET_REQUESTED = "PRESET_REQUESTED"; +export const TOGGLE_RANDOMIZE_PRESETS = "TOGGLE_RANDOMIZE_PRESETS"; diff --git a/js/components/MilkdropWindow/index.tsx b/js/components/MilkdropWindow/index.tsx index d7029ebf..b308ad24 100644 --- a/js/components/MilkdropWindow/index.tsx +++ b/js/components/MilkdropWindow/index.tsx @@ -28,6 +28,7 @@ interface DispatchProps { toggleDesktop(): void; togglePresetOverlay(): void; selectRandomPreset(): void; + toggleRandomize(): void; handlePresetDrop(e: React.DragEvent): void; selectNextPreset(transitionType?: TransitionType): void; selectPreviousPreset(transitionType?: TransitionType): void; @@ -47,7 +48,6 @@ function Milkdrop(props: Props) { // Handle keyboard events useEffect(() => { return props.onFocusedKeyDown(e => { - console.log(e.keyCode); switch (e.keyCode) { case 32: // spacebar props.selectNextPreset(); @@ -59,7 +59,7 @@ function Milkdrop(props: Props) { props.selectNextPreset(TransitionType.IMMEDIATE); break; case 82: // R - // this.props.presets.toggleRandomize(); + props.toggleRandomize(); break; case 76: // L props.togglePresetOverlay(); @@ -141,6 +141,7 @@ const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => ({ toggleDesktop: () => dispatch(Actions.toggleMilkdropDesktop()), togglePresetOverlay: () => dispatch(Actions.togglePresetOverlay()), selectRandomPreset: () => dispatch(Actions.selectRandomPreset()), + toggleRandomize: () => dispatch(Actions.toggleRandomizePresets()), handlePresetDrop: e => dispatch(Actions.handlePresetDrop(e)), selectNextPreset: (transitionType?: TransitionType) => dispatch(Actions.selectNextPreset(transitionType)), diff --git a/js/reducers/milkdrop.test.js b/js/reducers/milkdrop.test.js index f84b3b26..d322928f 100644 --- a/js/reducers/milkdrop.test.js +++ b/js/reducers/milkdrop.test.js @@ -20,6 +20,7 @@ test("handles history correctly", () => { { type: "RESOLVED", name: "First", preset: {} }, { type: "RESOLVED", name: "Second", preset: {} } ]; + store.dispatch(Actions.toggleRandomizePresets()); // Check initial state expect(store.getState().milkdrop.presetHistory).toEqual([]); expect(Selectors.getCurrentPreset(store.getState())).toBe(null); diff --git a/js/reducers/milkdrop.ts b/js/reducers/milkdrop.ts index 0a809274..674a42d7 100644 --- a/js/reducers/milkdrop.ts +++ b/js/reducers/milkdrop.ts @@ -6,7 +6,8 @@ import { RESOLVE_PRESET_AT_INDEX, SELECT_PRESET_AT_INDEX, TOGGLE_PRESET_OVERLAY, - PRESET_REQUESTED + PRESET_REQUESTED, + TOGGLE_RANDOMIZE_PRESETS } from "../actionTypes"; import * as Utils from "../utils"; import { TransitionType } from "../types"; @@ -19,6 +20,7 @@ export interface MilkdropState { currentPresetIndex: number | null; butterchurn: any; transitionType: TransitionType; + randomize: boolean; } const defaultMilkdropState = { @@ -28,7 +30,8 @@ const defaultMilkdropState = { presets: [], currentPresetIndex: null, butterchurn: null, - transitionType: TransitionType.DEFAULT + transitionType: TransitionType.DEFAULT, + randomize: true }; export const milkdrop = ( @@ -52,7 +55,6 @@ export const milkdrop = ( presetHistory: [...state.presetHistory, action.index] }; } - console.log(state.presetHistory); return { ...state, presetHistory: state.presetHistory.slice(0, -1) @@ -75,6 +77,8 @@ export const milkdrop = ( }; case TOGGLE_PRESET_OVERLAY: return { ...state, overlay: !state.overlay }; + case TOGGLE_RANDOMIZE_PRESETS: + return { ...state, randomize: !state.randomize }; default: return state; } diff --git a/js/types.ts b/js/types.ts index a6719ed0..503f359d 100644 --- a/js/types.ts +++ b/js/types.ts @@ -475,6 +475,9 @@ export type Action = type: "GOT_BUTTERCHURN"; butterchurn: any; } + | { + type: "TOGGLE_RANDOMIZE_PRESETS"; + } | { type: "RESOLVE_PRESET_AT_INDEX"; index: number;