Skip to content

Commit

Permalink
save copy settings #21
Browse files Browse the repository at this point in the history
  • Loading branch information
jmlee337 committed Apr 2, 2024
1 parent 5580747 commit fd97e44
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 63 deletions.
8 changes: 8 additions & 0 deletions src/common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,3 +157,11 @@ export type Context = {
scores: ContextScore[];
};
};

export type CopySettings = {
output: Output;
writeContext: boolean;
writeDisplayNames: boolean;
writeFileNames: boolean;
writeStartTimes: boolean;
};
33 changes: 32 additions & 1 deletion src/main/ipc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,14 @@ import Store from 'electron-store';
import { rm } from 'fs/promises';
import detectUsb from 'detect-usb';
import path from 'path';
import { Context, Output, Replay, Set, StartggSet } from '../common/types';
import {
Context,
CopySettings,
Output,
Replay,
Set,
StartggSet,
} from '../common/types';
import {
getEvent,
getPhase,
Expand Down Expand Up @@ -274,6 +281,30 @@ export default function setupIPCs(mainWindow: BrowserWindow): void {
},
);

ipcMain.removeHandler('getCopySettings');
ipcMain.handle('getCopySettings', () => {
if (store.has('copySettings')) {
return store.get('copySettings') as CopySettings;
}
const newCopySettings: CopySettings = {
output: Output.ZIP,
writeContext: false,
writeDisplayNames: true,
writeFileNames: false,
writeStartTimes: true,
};
store.set('copySettings', newCopySettings);
return newCopySettings;
});

ipcMain.removeHandler('setCopySettings');
ipcMain.handle(
'setCopySettings',
(event: IpcMainInvokeEvent, newCopySettings: CopySettings) => {
store.set('copySettings', newCopySettings);
},
);

ipcMain.removeHandler('copyToClipboard');
ipcMain.handle(
'copyToClipboard',
Expand Down
5 changes: 5 additions & 0 deletions src/main/preload.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { IpcRendererEvent, contextBridge, ipcRenderer } from 'electron';
import {
Context,
CopySettings,
EnforceResult,
Event,
Output,
Expand Down Expand Up @@ -74,6 +75,10 @@ const electronHandler = {
getUseEnforcer: (): Promise<boolean> => ipcRenderer.invoke('getUseEnforcer'),
setUseEnforcer: (useEnforcer: boolean): Promise<void> =>
ipcRenderer.invoke('setUseEnforcer', useEnforcer),
getCopySettings: (): Promise<CopySettings> =>
ipcRenderer.invoke('getCopySettings'),
setCopySettings: (copySettings: CopySettings): Promise<void> =>
ipcRenderer.invoke('setCopySettings', copySettings),
copyToClipboard: (text: string): Promise<void> =>
ipcRenderer.invoke('copyToClipboard', text),
getVersion: (): Promise<string> => ipcRenderer.invoke('getVersion'),
Expand Down
60 changes: 32 additions & 28 deletions src/renderer/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import {
Context,
ContextScore,
ContextSlot,
CopySettings,
Event,
Output,
Phase,
Expand Down Expand Up @@ -111,6 +112,14 @@ function Hello() {
const [useEnforcer, setUseEnforcer] = useState(false);
const [appVersion, setAppVersion] = useState('');
const [latestAppVersion, setLatestAppVersion] = useState('');
// copy settigns
const [copySettings, setCopySettings] = useState<CopySettings>({
output: Output.FILES,
writeContext: false,
writeDisplayNames: false,
writeFileNames: false,
writeStartTimes: false,
});
useEffect(() => {
const inner = async () => {
const appVersionPromise = window.electron.getVersion();
Expand All @@ -119,12 +128,14 @@ function Hello() {
const autoDetectUsbPromise = window.electron.getAutoDetectUsb();
const scrollToBottomPromise = window.electron.getScrollToBottom();
const useEnforcerPromise = window.electron.getUseEnforcer();
const copySettingsPromise = window.electron.getCopySettings();
setAppVersion(await appVersionPromise);
setLatestAppVersion(await latestAppVersionPromise);
setStartggApiKey(await startggKeyPromise);
setAutoDetectUsb(await autoDetectUsbPromise);
setScrollToBottom(await scrollToBottomPromise);
setUseEnforcer(await useEnforcerPromise);
setCopySettings(await copySettingsPromise);
setGotSettings(true);
};
inner();
Expand Down Expand Up @@ -862,19 +873,14 @@ function Hello() {
const [copyDir, setCopyDir] = useState('');
const [copyError, setCopyError] = useState('');
const [copyErrorDialogOpen, setCopyErrorDialogOpen] = useState(false);
const [copyOutput, setCopyOutput] = useState(Output.ZIP);
const [copySuccess, setCopySuccess] = useState('');
const [copyWriteContext, setCopyWriteContext] = useState(false);
const [copyWriteDisplayNames, setCopyWriteDisplayNames] = useState(true);
const [copyWriteFileNames, setCopyWriteFileNames] = useState(false);
const [copyWriteStartTimes, setCopyWriteStartTimes] = useState(true);

const onCopy = async () => {
setIsCopying(true);

let offsetMs = 0;
let startDate = new Date(selectedReplays[0].startAt);
if (copyWriteStartTimes) {
if (copySettings.writeStartTimes) {
const lastReplay = selectedReplays[selectedReplays.length - 1];
const lastStartMs = new Date(lastReplay.startAt).getTime();
const lastDurationMs = Math.round((lastReplay.lastFrame + 124) / 0.05994);
Expand All @@ -888,9 +894,9 @@ function Hello() {
let subdir = '';
let context: Context | undefined;
if (
copyWriteFileNames ||
copyOutput === Output.FOLDER ||
copyOutput === Output.ZIP
copySettings.writeFileNames ||
copySettings.output === Output.FOLDER ||
copySettings.output === Output.ZIP
) {
const nameObjs = selectedReplays.map((replay) =>
replay.players.map(
Expand All @@ -900,7 +906,7 @@ function Hello() {
characterName: characterNames.get(
player.externalCharacterId,
)!,
displayName: copyWriteDisplayNames
displayName: copySettings.writeDisplayNames
? player.playerOverrides.displayName || player.displayName
: player.displayName,
nametag: player.nametag,
Expand All @@ -919,7 +925,10 @@ function Hello() {
return nameObj.characterName;
};

if (copyOutput === Output.FOLDER || copyOutput === Output.ZIP) {
if (
copySettings.output === Output.FOLDER ||
copySettings.output === Output.ZIP
) {
const folderLabels = nameObjs
.reduce(
(namesObj, game): NamesObj[] => {
Expand Down Expand Up @@ -988,12 +997,12 @@ function Hello() {
subdir = `${writeStartAt} ${folderLabels}`;
}

if (copyWriteFileNames) {
if (copySettings.writeFileNames) {
fileNames = nameObjs.map((game, i) => {
let prefix = `${i + 1}`;
if (copyOutput === Output.FILES) {
if (copySettings.output === Output.FILES) {
const { startAt } = selectedReplays[i];
const writeStartDate = copyWriteStartTimes
const writeStartDate = copySettings.writeStartTimes
? new Date(new Date(startAt).getTime() + offsetMs)
: new Date(startAt);
const writeStartAt = format(writeStartDate, "yyyyMMdd'T'HHmmss");
Expand All @@ -1007,7 +1016,7 @@ function Hello() {
});
}

if (selectedSet.id && copyWriteContext) {
if (selectedSet.id && copySettings.writeContext) {
const contextEvent = tournament.events.find(
(event) => event.id === selectedSetChain.eventId,
)!;
Expand Down Expand Up @@ -1097,7 +1106,7 @@ function Hello() {
}

let startTimes: string[] = [];
if (copyWriteStartTimes) {
if (copySettings.writeStartTimes) {
startTimes = selectedReplays.map((replay) =>
new Date(new Date(replay.startAt).getTime() + offsetMs).toISOString(),
);
Expand All @@ -1107,11 +1116,11 @@ function Hello() {
await window.electron.writeReplays(
copyDir,
fileNames,
copyOutput,
copySettings.output,
selectedReplays,
startTimes,
subdir,
copyWriteDisplayNames,
copySettings.writeDisplayNames,
context,
);
setCopySuccess('Success!');
Expand Down Expand Up @@ -1317,17 +1326,12 @@ function Hello() {
hasSelectedReplays={selectedReplays.length > 0}
isCopying={isCopying}
onCopy={onCopy}
output={copyOutput}
setOutput={setCopyOutput}
success={copySuccess}
writeContext={copyWriteContext}
setWriteContext={setCopyWriteContext}
writeDisplayNames={copyWriteDisplayNames}
setWriteDisplayNames={setCopyWriteDisplayNames}
writeFileNames={copyWriteFileNames}
setWriteFileNames={setCopyWriteFileNames}
writeStartTimes={copyWriteStartTimes}
setWriteStartTimes={setCopyWriteStartTimes}
copySettings={copySettings}
setCopySettings={async (newCopySettings: CopySettings) => {
await window.electron.setCopySettings(newCopySettings);
setCopySettings(newCopySettings);
}}
/>
<div ref={copyControlsRef} />
</TopColumn>
Expand Down
70 changes: 36 additions & 34 deletions src/renderer/CopyControls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
Tooltip,
Typography,
} from '@mui/material';
import { Output } from '../common/types';
import { CopySettings, Output } from '../common/types';
import ErrorDialog from './ErrorDialog';
import LabeledCheckbox from './LabeledCheckbox';

Expand All @@ -24,17 +24,9 @@ export default function CopyControls({
hasSelectedReplays,
isCopying,
onCopy,
output,
setOutput,
success,
writeContext,
setWriteContext,
writeDisplayNames,
setWriteDisplayNames,
writeFileNames,
setWriteFileNames,
writeStartTimes,
setWriteStartTimes,
copySettings,
setCopySettings,
}: {
dir: string;
setDir: (dir: string) => void;
Expand All @@ -45,17 +37,9 @@ export default function CopyControls({
hasSelectedReplays: boolean;
isCopying: boolean;
onCopy: () => Promise<void>;
output: Output;
setOutput: (output: Output) => void;
success: string;
writeContext: boolean;
setWriteContext: (writeContext: boolean) => void;
writeDisplayNames: boolean;
setWriteDisplayNames: (writeDisplayNames: boolean) => void;
writeFileNames: boolean;
setWriteFileNames: (writeFileNames: boolean) => void;
writeStartTimes: boolean;
setWriteStartTimes: (writeStartTimes: boolean) => void;
copySettings: CopySettings;
setCopySettings: (newCopySettings: CopySettings) => Promise<void>;
}) {
const chooseDir = async () => {
const newDir = await window.electron.chooseCopyDir();
Expand Down Expand Up @@ -89,10 +73,14 @@ export default function CopyControls({
>
<div>
<LabeledCheckbox
checked={writeContext}
disabled={output === Output.FILES}
checked={copySettings.writeContext}
disabled={copySettings.output === Output.FILES}
label="Write context.json"
set={setWriteContext}
set={(checked: boolean) => {
const newCopySettings = { ...copySettings };
newCopySettings.writeContext = checked;
setCopySettings(newCopySettings);
}}
/>
</div>
</Tooltip>
Expand All @@ -104,9 +92,13 @@ export default function CopyControls({
>
<div>
<LabeledCheckbox
checked={writeDisplayNames}
checked={copySettings.writeDisplayNames}
label="Overwrite Display Names"
set={setWriteDisplayNames}
set={(checked: boolean) => {
const newCopySettings = { ...copySettings };
newCopySettings.writeDisplayNames = checked;
setCopySettings(newCopySettings);
}}
/>
</div>
</Tooltip>
Expand All @@ -116,9 +108,13 @@ export default function CopyControls({
>
<div>
<LabeledCheckbox
checked={writeFileNames}
checked={copySettings.writeFileNames}
label="Overwrite File Names"
set={setWriteFileNames}
set={(checked: boolean) => {
const newCopySettings = { ...copySettings };
newCopySettings.writeFileNames = checked;
setCopySettings(newCopySettings);
}}
/>
</div>
</Tooltip>
Expand All @@ -130,20 +126,26 @@ export default function CopyControls({
>
<div>
<LabeledCheckbox
checked={writeStartTimes}
checked={copySettings.writeStartTimes}
label="Overwrite Start Times"
set={setWriteStartTimes}
set={(checked: boolean) => {
const newCopySettings = { ...copySettings };
newCopySettings.writeStartTimes = checked;
setCopySettings(newCopySettings);
}}
/>
</div>
</Tooltip>
<TextField
label="Output"
onChange={(event) =>
setOutput(parseInt(event.target.value, 10) as Output)
}
onChange={(event) => {
const newCopySettings = { ...copySettings };
newCopySettings.output = parseInt(event.target.value, 10);
setCopySettings(newCopySettings);
}}
select
size="small"
value={output}
value={copySettings.output}
>
<MenuItem value={Output.FILES}>Separate Files</MenuItem>
<MenuItem value={Output.FOLDER}>Make Subfolder</MenuItem>
Expand Down

0 comments on commit fd97e44

Please sign in to comment.