Persist window states (exept position)

This commit is contained in:
Jordan Eldredge 2018-09-19 21:43:55 -07:00
parent 94e105b104
commit 690f650e4c
3 changed files with 54 additions and 13 deletions

View file

@ -1,4 +1,4 @@
import { WebampWindow, WindowPositions, Action } from "../types";
import { WebampWindow, WindowPositions, Action, WindowId } from "../types";
import { WINDOWS } from "../constants";
import {
SET_FOCUSED_WINDOW,
@ -8,16 +8,29 @@ import {
ADD_GEN_WINDOW,
UPDATE_WINDOW_POSITIONS,
WINDOW_SIZE_CHANGED,
TOGGLE_WINDOW_SHADE_MODE
TOGGLE_WINDOW_SHADE_MODE,
LOAD_SERIALIZED_STATE
} from "../actionTypes";
import { objectMap } from "../utils";
export interface WindowState {
export interface WindowsState {
focused: string;
genWindows: { [name: string]: WebampWindow };
positions: WindowPositions;
}
const defaultWindowsState: WindowState = {
interface SerializedWindow {
size: [number, number];
open: boolean;
hidden: boolean;
shade: boolean;
}
export interface WindowsSerializedStateV1 {
genWindows: { [windowId: string]: SerializedWindow };
}
const defaultWindowsState: WindowsState = {
focused: WINDOWS.MAIN,
genWindows: {
// TODO: Remove static capabilites and derive them from ids/generic
@ -62,9 +75,9 @@ const defaultWindowsState: WindowState = {
};
const windows = (
state: WindowState = defaultWindowsState,
state: WindowsState = defaultWindowsState,
action: Action
): WindowState => {
): WindowsState => {
switch (action.type) {
case SET_FOCUSED_WINDOW:
return { ...state, focused: action.window };
@ -162,9 +175,38 @@ const windows = (
...state,
positions: { ...state.positions, ...action.positions }
};
case LOAD_SERIALIZED_STATE: {
const serializedWindow = action.serializedState.windows.genWindows;
return {
...state,
genWindows: objectMap(state.genWindows, (w, windowId) => {
const serializedW = serializedWindow[windowId];
if (serializedW == null || w.generic) {
return w;
}
return { ...w, ...serializedW };
})
};
}
default:
return state;
}
};
export function getSerializedState(
state: WindowsState
): WindowsSerializedStateV1 {
return {
genWindows: objectMap(state.genWindows, w => {
return {
size: w.size,
open: w.open,
hidden: w.hidden,
shade: w.shade || false
};
})
};
}
export default windows;

View file

@ -29,6 +29,7 @@ import * as fromPlaylist from "./reducers/playlist";
import * as fromDisplay from "./reducers/display";
import * as fromEqualizer from "./reducers/equalizer";
import * as fromMedia from "./reducers/media";
import * as fromWindows from "./reducers/windows";
import { generateGraph } from "./resizeUtils";
export const getSliders = (state: AppState) => state.equalizer.sliders;
@ -411,7 +412,8 @@ export function getSerlializedState(state: AppState): SerializedStateV1 {
version: 1,
media: fromMedia.getSerializedState(state.media),
equalizer: fromEqualizer.getSerializedState(state.equalizer),
display: fromDisplay.getSerializedState(state.display)
display: fromDisplay.getSerializedState(state.display),
windows: fromWindows.getSerializedState(state.windows)
};
}

View file

@ -3,7 +3,7 @@ import { SettingsState } from "./reducers/settings";
import { UserInputState } from "./reducers/userInput";
import { MediaState, MediaSerializedStateV1 } from "./reducers/media";
import { DisplayState, DisplaySerializedStateV1 } from "./reducers/display";
import { WindowState } from "./reducers/windows";
import { WindowsState, WindowsSerializedStateV1 } from "./reducers/windows";
import {
EqualizerState,
EqualizerSerializedStateV1
@ -464,7 +464,7 @@ export interface PlaylistTrack {
export interface AppState {
userInput: UserInputState;
windows: WindowState;
windows: WindowsState;
display: DisplayState;
settings: SettingsState;
equalizer: EqualizerState;
@ -501,10 +501,7 @@ export interface MiddlewareStore {
export interface SerializedStateV1 {
version: 1;
/*
windows: WindowSerializedState;
settings: SettingsSerializedState;
*/
windows: WindowsSerializedStateV1;
media: MediaSerializedStateV1;
display: DisplaySerializedStateV1;
equalizer: EqualizerSerializedStateV1;