Skip to content

Commit

Permalink
allow drag-drop working dir
Browse files Browse the repository at this point in the history
closes #2147
  • Loading branch information
mifi committed Sep 29, 2024
1 parent b855e9e commit cc202b4
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 13 deletions.
14 changes: 12 additions & 2 deletions src/renderer/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2281,11 +2281,21 @@ function App() {

focusWindow();

await userOpenFiles(filePaths);
userOpenFiles(filePaths);
}
const element = videoContainerRef.current;
element?.addEventListener('drop', onDrop);
return () => element?.removeEventListener('drop', onDrop);
}, [userOpenFiles, videoContainerRef]);

useEffect(() => {
function onDrop(ev: DragEvent) {
// default drop handler to prevent new electron window from popping up https://github.com/electron/electron/issues/39839
ev.preventDefault();
}
document.body.addEventListener('drop', onDrop);
return () => document.body.removeEventListener('drop', onDrop);
}, [userOpenFiles]);
}, []);

const renderOutFmt = useCallback((style: CSSProperties) => (
<OutputFormatSelect style={style} detectedFileFormat={detectedFileFormat} fileFormat={fileFormat} onOutputFormatUserChange={onOutputFormatUserChange} />
Expand Down
6 changes: 5 additions & 1 deletion src/renderer/src/NoFileLoaded.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@ import { useTranslation, Trans } from 'react-i18next';
import SetCutpointButton from './components/SetCutpointButton';
import SimpleModeButton from './components/SimpleModeButton';
import useUserSettings from './hooks/useUserSettings';
import { StateSegment } from './types';

const electron = window.require('electron');

function NoFileLoaded({ mifiLink, currentCutSeg, onClick, darkMode }: {
mifiLink: unknown, currentCutSeg, onClick: () => void, darkMode?: boolean,
mifiLink: unknown,
currentCutSeg: StateSegment,
onClick: () => void,
darkMode?: boolean,
}) {
const { t } = useTranslation();
const { simpleMode } = useUserSettings();
Expand Down
24 changes: 22 additions & 2 deletions src/renderer/src/TopMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CSSProperties, ReactNode, memo, useCallback } from 'react';
import { CSSProperties, ReactNode, memo, useCallback, useEffect, useRef } from 'react';
import { IoIosSettings } from 'react-icons/io';
import { FaLock, FaUnlock } from 'react-icons/fa';
import { CrossIcon, ListIcon, VolumeUpIcon, VolumeOffIcon } from 'evergreen-ui';
Expand All @@ -13,6 +13,8 @@ import useUserSettings from './hooks/useUserSettings';
import { InverseCutSegment } from './types';


const { stat } = window.require('fs/promises');

const outFmtStyle = { height: 20, maxWidth: 100 };
const exportModeStyle = { flexGrow: 0, flexBasis: 140 };

Expand Down Expand Up @@ -44,7 +46,8 @@ function TopMenu({
clearOutDir: () => void,
}) {
const { t } = useTranslation();
const { customOutDir, changeOutDir, simpleMode, outFormatLocked, setOutFormatLocked } = useUserSettings();
const { customOutDir, changeOutDir, setCustomOutDir, simpleMode, outFormatLocked, setOutFormatLocked } = useUserSettings();
const workingDirButtonRef = useRef<HTMLButtonElement>(null);

const onOutFormatLockedClick = useCallback(() => setOutFormatLocked((v) => (v ? undefined : fileFormat)), [fileFormat, setOutFormatLocked]);

Expand All @@ -55,6 +58,22 @@ function TopMenu({
return <Icon onClick={onOutFormatLockedClick} title={t('Lock/unlock output format')} size={14} style={{ marginRight: 7, marginLeft: 2, color: outFormatLocked ? primaryTextColor : undefined }} />;
}

// Convenience for drag and drop: https://github.com/mifi/lossless-cut/issues/2147
useEffect(() => {
async function onDrop(ev: DragEvent) {
ev.preventDefault();
if (!ev.dataTransfer) return;
const paths = [...ev.dataTransfer.files].map((f) => f.path);
const [firstPath] = paths;
if (paths.length === 1 && firstPath && (await stat(firstPath)).isDirectory()) {
setCustomOutDir(firstPath);
}
}
const element = workingDirButtonRef.current;
element?.addEventListener('drop', onDrop);
return () => element?.removeEventListener('drop', onDrop);
}, [setCustomOutDir]);

return (
<div
className="no-user-select"
Expand Down Expand Up @@ -93,6 +112,7 @@ function TopMenu({
)}

<Button
ref={workingDirButtonRef}
onClick={withBlur(changeOutDir)}
title={customOutDir}
style={{ paddingLeft: showClearWorkingDirButton ? 4 : undefined }}
Expand Down
15 changes: 7 additions & 8 deletions src/renderer/src/components/Button.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { ButtonHTMLAttributes, memo } from 'react';
import { ButtonHTMLAttributes, DetailedHTMLProps, forwardRef } from 'react';

import styles from './Button.module.css';

function Button({ type = 'button', ...props }: ButtonHTMLAttributes<HTMLButtonElement>) {
return (
// eslint-disable-next-line react/jsx-props-no-spreading, react/button-has-type
<button className={styles['button']} type={type} {...props} />
);
}
// eslint-disable-next-line react/display-name
const Button = forwardRef<HTMLButtonElement, DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>>(({ type = 'button', ...props }, ref) => (
// eslint-disable-next-line react/jsx-props-no-spreading, react/button-has-type
<button ref={ref} className={styles['button']} type={type} {...props} />
));

export default memo(Button);
export default Button;

0 comments on commit cc202b4

Please sign in to comment.