From d778c03f6190dc2fae647d374f74649718f0509a Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sun, 30 Sep 2018 21:54:02 -0700 Subject: [PATCH] Don't re-center windows when loading from serialized state --- js/__snapshots__/serialization.test.ts.snap | 1 + .../fixtures/serializedState/v1/balance.json | 1 + .../serializedState/v1/double-mode.json | 1 + .../serializedState/v1/equalizer-auto.json | 1 + .../serializedState/v1/equalizer-band.json | 1 + .../serializedState/v1/equalizer-on.json | 1 + .../serializedState/v1/equalizer-preamp.json | 1 + .../serializedState/v1/focused-window.json | 1 + .../serializedState/v1/llama-mode.json | 1 + .../v1/main-window-position.json | 1 + .../fixtures/serializedState/v1/repeat.json | 1 + .../fixtures/serializedState/v1/shuffle.json | 1 + .../fixtures/serializedState/v1/volume.json | 1 + .../serializedState/v1/window-hidden.json | 1 + .../serializedState/v1/window-open.json | 1 + .../v1/window-positions-are-relative.json | 111 ++++++++++++++++++ .../serializedState/v1/window-shade.json | 1 + .../serializedState/v1/window-size.json | 1 + js/actionCreators/windows.ts | 18 ++- js/reducers/windows.ts | 12 +- js/selectors.ts | 4 + js/serialization.test.ts | 7 ++ js/serializedStates/v1Types.ts | 1 + js/types.ts | 1 + 24 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 js/__tests__/fixtures/serializedState/v1/window-positions-are-relative.json diff --git a/js/__snapshots__/serialization.test.ts.snap b/js/__snapshots__/serialization.test.ts.snap index 40766381..a961707a 100644 --- a/js/__snapshots__/serialization.test.ts.snap +++ b/js/__snapshots__/serialization.test.ts.snap @@ -109,6 +109,7 @@ Object { ], }, }, + "positionsAreRelative": true, }, } `; diff --git a/js/__tests__/fixtures/serializedState/v1/balance.json b/js/__tests__/fixtures/serializedState/v1/balance.json index 3e1f9732..2698d1b2 100644 --- a/js/__tests__/fixtures/serializedState/v1/balance.json +++ b/js/__tests__/fixtures/serializedState/v1/balance.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/double-mode.json b/js/__tests__/fixtures/serializedState/v1/double-mode.json index d708789b..f9193bd7 100644 --- a/js/__tests__/fixtures/serializedState/v1/double-mode.json +++ b/js/__tests__/fixtures/serializedState/v1/double-mode.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json b/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json index b04140c3..09e579e9 100644 --- a/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-auto.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-band.json b/js/__tests__/fixtures/serializedState/v1/equalizer-band.json index d5a6a1c1..c0eb62e6 100644 --- a/js/__tests__/fixtures/serializedState/v1/equalizer-band.json +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-band.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-on.json b/js/__tests__/fixtures/serializedState/v1/equalizer-on.json index 863671c7..585a01ea 100644 --- a/js/__tests__/fixtures/serializedState/v1/equalizer-on.json +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-on.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json b/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json index f7fac93e..65115b13 100644 --- a/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json +++ b/js/__tests__/fixtures/serializedState/v1/equalizer-preamp.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/focused-window.json b/js/__tests__/fixtures/serializedState/v1/focused-window.json index 79122830..0ec9358b 100644 --- a/js/__tests__/fixtures/serializedState/v1/focused-window.json +++ b/js/__tests__/fixtures/serializedState/v1/focused-window.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/llama-mode.json b/js/__tests__/fixtures/serializedState/v1/llama-mode.json index 11672b62..f761ace8 100644 --- a/js/__tests__/fixtures/serializedState/v1/llama-mode.json +++ b/js/__tests__/fixtures/serializedState/v1/llama-mode.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/main-window-position.json b/js/__tests__/fixtures/serializedState/v1/main-window-position.json index 010b4f3f..bb95446e 100644 --- a/js/__tests__/fixtures/serializedState/v1/main-window-position.json +++ b/js/__tests__/fixtures/serializedState/v1/main-window-position.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/repeat.json b/js/__tests__/fixtures/serializedState/v1/repeat.json index 5d044daf..ec16fdaa 100644 --- a/js/__tests__/fixtures/serializedState/v1/repeat.json +++ b/js/__tests__/fixtures/serializedState/v1/repeat.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/shuffle.json b/js/__tests__/fixtures/serializedState/v1/shuffle.json index 4ab8e3b7..18496b2d 100644 --- a/js/__tests__/fixtures/serializedState/v1/shuffle.json +++ b/js/__tests__/fixtures/serializedState/v1/shuffle.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/volume.json b/js/__tests__/fixtures/serializedState/v1/volume.json index 1c69d270..ca3bb494 100644 --- a/js/__tests__/fixtures/serializedState/v1/volume.json +++ b/js/__tests__/fixtures/serializedState/v1/volume.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/window-hidden.json b/js/__tests__/fixtures/serializedState/v1/window-hidden.json index fcf26b25..87555494 100644 --- a/js/__tests__/fixtures/serializedState/v1/window-hidden.json +++ b/js/__tests__/fixtures/serializedState/v1/window-hidden.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/window-open.json b/js/__tests__/fixtures/serializedState/v1/window-open.json index 162c4fbd..63b1a7dd 100644 --- a/js/__tests__/fixtures/serializedState/v1/window-open.json +++ b/js/__tests__/fixtures/serializedState/v1/window-open.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/window-positions-are-relative.json b/js/__tests__/fixtures/serializedState/v1/window-positions-are-relative.json new file mode 100644 index 00000000..c522410c --- /dev/null +++ b/js/__tests__/fixtures/serializedState/v1/window-positions-are-relative.json @@ -0,0 +1,111 @@ +{ + "version": 1, + "media": { + "volume": 78, + "balance": 0, + "shuffle": false, + "repeat": false + }, + "equalizer": { + "on": true, + "auto": false, + "sliders": { + "60": 50, + "170": 50, + "310": 50, + "600": 50, + "1000": 50, + "3000": 50, + "6000": 50, + "12000": 50, + "14000": 50, + "16000": 50, + "preamp": 50 + } + }, + "display": { + "visualizerStyle": 0, + "doubled": false, + "llama": false, + "marqueeStep": 0, + "skinImages": { + "EQ_PREAMP_LINE": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAABCAYAAADpXEERAAAAE0lEQVQoU2Pcdfruf4ZRMKRDAAD1lwNjTqcaUQAAAABJRU5ErkJggg==", + "EQ_GRAPH_LINE_COLORS": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAATCAYAAABRC2cZAAAAR0lEQVQYV2O4rCT9n+F9kOJ/hvfViv8ZHkzSQCE2afxneH/HEJm49Nr0PwOYWPLIAkp0PjL4z1B41uQ/Q9QGnf8MWrPEIAQANWYwvnlToNIAAAAASUVORK5CYII=" + }, + "skinCursors": null, + "skinRegion": {}, + "skinGenLetterWidths": null, + "skinColors": [ + "rgb(0,0,0)", + "rgb(24,33,41)", + "rgb(239,49,16)", + "rgb(206,41,16)", + "rgb(214,90,0)", + "rgb(214,102,0)", + "rgb(214,115,0)", + "rgb(198,123,8)", + "rgb(222,165,24)", + "rgb(214,181,33)", + "rgb(189,222,41)", + "rgb(148,222,33)", + "rgb(41,206,16)", + "rgb(50,190,16)", + "rgb(57,181,16)", + "rgb(49,156,8)", + "rgb(41,148,0)", + "rgb(24,132,8)", + "rgb(255,255,255)", + "rgb(214,214,222)", + "rgb(181,189,189)", + "rgb(160,170,175)", + "rgb(148,156,165)", + "rgb(150,150,150)" + ], + "skinPlaylistStyle": null + }, + "windows": { + "positionsAreRelative": false, + "genWindows": { + "main": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 100, + "y": 100 + } + }, + "equalizer": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + }, + "playlist": { + "size": [ + 0, + 0 + ], + "open": true, + "hidden": false, + "shade": false, + "position": { + "x": 0, + "y": 0 + } + } + }, + "focused": "main" + } +} \ No newline at end of file diff --git a/js/__tests__/fixtures/serializedState/v1/window-shade.json b/js/__tests__/fixtures/serializedState/v1/window-shade.json index da77c080..9f1baa59 100644 --- a/js/__tests__/fixtures/serializedState/v1/window-shade.json +++ b/js/__tests__/fixtures/serializedState/v1/window-shade.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/__tests__/fixtures/serializedState/v1/window-size.json b/js/__tests__/fixtures/serializedState/v1/window-size.json index 812e5477..bbc244e2 100644 --- a/js/__tests__/fixtures/serializedState/v1/window-size.json +++ b/js/__tests__/fixtures/serializedState/v1/window-size.json @@ -64,6 +64,7 @@ "skinPlaylistStyle": null }, "windows": { + "positionsAreRelative": true, "genWindows": { "main": { "size": [ diff --git a/js/actionCreators/windows.ts b/js/actionCreators/windows.ts index 754931d5..244cc7da 100644 --- a/js/actionCreators/windows.ts +++ b/js/actionCreators/windows.ts @@ -112,15 +112,21 @@ export function toggleWindow(windowId: WindowId): Dispatchable { } export function updateWindowPositions( - positions: WindowPositions + positions: WindowPositions, + absolute?: boolean ): Dispatchable { - return { type: UPDATE_WINDOW_POSITIONS, positions }; + return { type: UPDATE_WINDOW_POSITIONS, positions, absolute }; } export function centerWindowsInContainer(container: HTMLElement): Dispatchable { - const { left, top } = container.getBoundingClientRect(); - const { scrollWidth: width, scrollHeight: height } = container; - return centerWindows({ left, top, width, height }); + return (dispatch, getState) => { + if (!Selectors.getPositionsAreRelative(getState())) { + return; + } + const { left, top } = container.getBoundingClientRect(); + const { scrollWidth: width, scrollHeight: height } = container; + dispatch(centerWindows({ left, top, width, height })); + }; } export function centerWindowsInView(): Dispatchable { @@ -169,7 +175,7 @@ export function centerWindows(box: { {} ); - dispatch(updateWindowPositions(newPositions)); + dispatch(updateWindowPositions(newPositions, true)); }; } diff --git a/js/reducers/windows.ts b/js/reducers/windows.ts index 19842df5..dbbb133d 100644 --- a/js/reducers/windows.ts +++ b/js/reducers/windows.ts @@ -50,10 +50,12 @@ export interface WindowsState { focused: string; genWindows: { [name: string]: WebampWindow }; browserWindowSize: { height: number; width: number }; + positionsAreRelative: boolean; } const defaultWindowsState: WindowsState = { focused: WINDOWS.MAIN, + positionsAreRelative: true, genWindows: { // TODO: Remove static capabilites and derive them from ids/generic main: { @@ -199,6 +201,8 @@ const windows = ( case UPDATE_WINDOW_POSITIONS: return { ...state, + positionsAreRelative: + action.absolute === true ? false : state.positionsAreRelative, genWindows: Utils.objectMap(state.genWindows, (w, windowId) => { const newPosition = action.positions[windowId]; if (newPosition == null) { @@ -217,9 +221,14 @@ const windows = ( })) }; case LOAD_SERIALIZED_STATE: { - const { genWindows, focused } = action.serializedState.windows; + const { + genWindows, + focused, + positionsAreRelative + } = action.serializedState.windows; return { ...state, + positionsAreRelative, genWindows: Utils.objectMap(state.genWindows, (w, windowId) => { const serializedW = genWindows[windowId]; if (serializedW == null) { @@ -245,6 +254,7 @@ export function getSerializedState( state: WindowsState ): WindowsSerializedStateV1 { return { + positionsAreRelative: state.positionsAreRelative, genWindows: Utils.objectMap(state.genWindows, w => { return { size: w.size, diff --git a/js/selectors.ts b/js/selectors.ts index 98842553..bf68ada8 100644 --- a/js/selectors.ts +++ b/js/selectors.ts @@ -362,6 +362,10 @@ export function getWindowPosition(state: AppState) { return (windowId: WindowId) => state.windows.genWindows[windowId].position; } +export function getPositionsAreRelative(state: AppState) { + return state.windows.positionsAreRelative; +} + export const getGenWindows = (state: AppState) => { return state.windows.genWindows; }; diff --git a/js/serialization.test.ts b/js/serialization.test.ts index dacf87ef..f9355f66 100644 --- a/js/serialization.test.ts +++ b/js/serialization.test.ts @@ -223,6 +223,13 @@ describe("can serialize", () => { expected: { x: 100, y: 100 } }); + testSerialization({ + name: "window positions are relative", + action: Actions.updateWindowPositions({ main: { x: 100, y: 100 } }, true), + selector: Selectors.getPositionsAreRelative, + expected: false + }); + testSerialization({ name: "focused window", action: Actions.setFocusedWindow("equalizer"), diff --git a/js/serializedStates/v1Types.ts b/js/serializedStates/v1Types.ts index 25890cf0..533f988e 100644 --- a/js/serializedStates/v1Types.ts +++ b/js/serializedStates/v1Types.ts @@ -3,6 +3,7 @@ */ export interface WindowsSerializedStateV1 { + positionsAreRelative: boolean; genWindows: { [windowId: string]: { size: [number, number]; diff --git a/js/types.ts b/js/types.ts index 17e2fb99..75565330 100644 --- a/js/types.ts +++ b/js/types.ts @@ -254,6 +254,7 @@ export type Action = | { type: "UPDATE_WINDOW_POSITIONS"; positions: WindowPositions; + absolute?: boolean; } | { type: "CLICKED_TRACK";