enhance(list):增加文件夹聚焦功能。
This commit is contained in:
parent
8024738334
commit
0469f18ef6
|
@ -1,11 +1,12 @@
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { ActionIcon, Flex, Stack, Text, Tooltip } from '@mantine/core';
|
import { ActionIcon, Box, Flex, Stack, Text, Tooltip } from '@mantine/core';
|
||||||
import { notifications } from '@mantine/notifications';
|
import { notifications } from '@mantine/notifications';
|
||||||
import { IconSquareMinus, IconSquarePlus } from '@tabler/icons-react';
|
import { IconEye, IconSquareMinus, IconSquarePlus } from '@tabler/icons-react';
|
||||||
import { invoke } from '@tauri-apps/api';
|
import { invoke } from '@tauri-apps/api';
|
||||||
import EventEmitter from 'events';
|
import EventEmitter from 'events';
|
||||||
import { equals, isEmpty, length, map, not } from 'ramda';
|
import { equals, isEmpty, isNil, length, map, not } from 'ramda';
|
||||||
import { FC, PropsWithChildren, useCallback, useContext, useState } from 'react';
|
import { FC, PropsWithChildren, useCallback, useContext, useState } from 'react';
|
||||||
|
import { useMeasure, useMount } from 'react-use';
|
||||||
import { EventBusContext } from '../EventBus';
|
import { EventBusContext } from '../EventBus';
|
||||||
import { DirItem } from '../models';
|
import { DirItem } from '../models';
|
||||||
import { loadSubDirectories } from '../queries/directories';
|
import { loadSubDirectories } from '../queries/directories';
|
||||||
|
@ -43,6 +44,11 @@ const Branch: FC<PropsWithChildren<{ current: DirItem; expanded: boolean }>> = (
|
||||||
const storeFiles = useFileListStore.use.updateFiles();
|
const storeFiles = useFileListStore.use.updateFiles();
|
||||||
const ebus = useContext<EventEmitter>(EventBusContext);
|
const ebus = useContext<EventEmitter>(EventBusContext);
|
||||||
|
|
||||||
|
useMount(() => {
|
||||||
|
if (isCurrentExpanded) {
|
||||||
|
setSubDirs(selectDirectories(current.id)(useDirTreeStore.getState().directories));
|
||||||
|
}
|
||||||
|
});
|
||||||
const handleExpandAction = useCallback(async () => {
|
const handleExpandAction = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
if (isCurrentExpanded) {
|
if (isCurrentExpanded) {
|
||||||
|
@ -112,9 +118,41 @@ const Branch: FC<PropsWithChildren<{ current: DirItem; expanded: boolean }>> = (
|
||||||
|
|
||||||
export const DirTree: FC = () => {
|
export const DirTree: FC = () => {
|
||||||
const roots = useDirTreeStore(currentRootsSelector());
|
const roots = useDirTreeStore(currentRootsSelector());
|
||||||
|
const { focused, focus, unfocus, selected } = useDirTreeStore();
|
||||||
|
const [viewRef, { width }] = useMeasure();
|
||||||
|
|
||||||
|
const handleFocusAction = useCallback(() => {
|
||||||
|
console.log('[debug]focus action: ', focused, selected);
|
||||||
|
if (isNil(focused) && not(isNil(selected))) {
|
||||||
|
focus(selected);
|
||||||
|
} else {
|
||||||
|
unfocus();
|
||||||
|
}
|
||||||
|
}, [focused, selected]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack w="auto" h="100%" spacing={8} px={4} py={4} sx={{ overflow: 'auto' }}>
|
<Stack
|
||||||
|
w="auto"
|
||||||
|
h="100%"
|
||||||
|
spacing={8}
|
||||||
|
px={4}
|
||||||
|
py={4}
|
||||||
|
pos="relative"
|
||||||
|
sx={{ overflow: 'auto' }}
|
||||||
|
ref={viewRef}
|
||||||
|
>
|
||||||
|
<Box pos="fixed" style={{ transform: `translateX(${width * 0.85}px)` }}>
|
||||||
|
<Tooltip label={isNil(focused) ? '聚焦当前选择的目录' : '解除聚焦'}>
|
||||||
|
<ActionIcon
|
||||||
|
variant="light"
|
||||||
|
color={isNil(focused) ? 'grape' : 'green'}
|
||||||
|
disabled={isNil(selected)}
|
||||||
|
onClick={handleFocusAction}
|
||||||
|
>
|
||||||
|
<IconEye stroke={1.5} size={16} />
|
||||||
|
</ActionIcon>
|
||||||
|
</Tooltip>
|
||||||
|
</Box>
|
||||||
<Tree>
|
<Tree>
|
||||||
{map(
|
{map(
|
||||||
item => (
|
item => (
|
||||||
|
|
|
@ -22,7 +22,7 @@ interface DirsStates {
|
||||||
drives: DirItem[];
|
drives: DirItem[];
|
||||||
directories: DirItem[];
|
directories: DirItem[];
|
||||||
focused?: DirItem;
|
focused?: DirItem;
|
||||||
selected?: DirItem;
|
selected?: string;
|
||||||
expanded: string[];
|
expanded: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ export const useDirTreeStore = createStoreHook<DirsStates & DirsActions>((set, g
|
||||||
},
|
},
|
||||||
focus(specifiedDirId) {
|
focus(specifiedDirId) {
|
||||||
const requestedDir = find(propEq('id', specifiedDirId), get().directories);
|
const requestedDir = find(propEq('id', specifiedDirId), get().directories);
|
||||||
|
console.log('[debug]focus search: ', specifiedDirId, requestedDir);
|
||||||
if (not(isNil(requestedDir))) {
|
if (not(isNil(requestedDir))) {
|
||||||
set(df => {
|
set(df => {
|
||||||
df.focused = requestedDir;
|
df.focused = requestedDir;
|
||||||
|
@ -99,7 +100,7 @@ export const useDirTreeStore = createStoreHook<DirsStates & DirsActions>((set, g
|
||||||
},
|
},
|
||||||
unfocus() {
|
unfocus() {
|
||||||
set(df => {
|
set(df => {
|
||||||
df.focus = undefined;
|
df.focused = undefined;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
selectDirectory(dirId) {
|
selectDirectory(dirId) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user