enhance(file):加入文件信息扫描功能。

This commit is contained in:
徐涛 2023-03-09 09:55:52 +08:00
parent c98a58b8bf
commit db70eb25d9
3 changed files with 23 additions and 14 deletions

View File

@ -6,6 +6,8 @@ use walkdir::WalkDir;
pub struct FileItem { pub struct FileItem {
pub filename: String, pub filename: String,
pub path: String, pub path: String,
pub height: u32,
pub width: u32,
} }
#[tauri::command] #[tauri::command]
@ -15,6 +17,7 @@ pub fn scan_directory(target: String) -> Result<Vec<FileItem>, String> {
.filter_map(|f| f.ok()) .filter_map(|f| f.ok())
.filter(|f| f.path().is_file()) .filter(|f| f.path().is_file())
.map(|f| { .map(|f| {
let (width, height) = image::image_dimensions(f.path())?;
Ok(FileItem { Ok(FileItem {
filename: f filename: f
.path() .path()
@ -29,6 +32,8 @@ pub fn scan_directory(target: String) -> Result<Vec<FileItem>, String> {
.to_str() .to_str()
.ok_or(anyhow!("不能获取到文件路径。"))? .ok_or(anyhow!("不能获取到文件路径。"))?
.to_string(), .to_string(),
width,
height,
}) })
}) })
.collect::<Result<Vec<FileItem>, anyhow::Error>>() .collect::<Result<Vec<FileItem>, anyhow::Error>>()

View File

@ -2,14 +2,15 @@ import { Box, Stack } from '@mantine/core';
import { useVirtualizer } from '@tanstack/react-virtual'; import { useVirtualizer } from '@tanstack/react-virtual';
import EventEmitter from 'events'; import EventEmitter from 'events';
import { filter, indexOf, isEmpty, length, map, pluck } from 'ramda'; import { filter, indexOf, isEmpty, length, map, pluck } from 'ramda';
import { FC, useContext, useEffect, useLayoutEffect, useMemo, useRef } from 'react'; import { FC, useContext, useLayoutEffect, useMemo, useRef } from 'react';
import { useLifecycles } from 'react-use';
import { EventBusContext } from '../EventBus'; import { EventBusContext } from '../EventBus';
import { useFileListStore } from '../states/files'; import { useFileListStore } from '../states/files';
import { useZoomState } from '../states/zoom'; import { useZoomState } from '../states/zoom';
import { withinRange } from '../utils/offset_func'; import { withinRange } from '../utils/offset_func';
export const ContinuationView: FC = () => { export const ContinuationView: FC = () => {
const files = useFileListStore.use.files(); const { files } = useFileListStore();
const zoom = useZoomState.use.currentZoom(); const zoom = useZoomState.use.currentZoom();
const viewHeight = useZoomState.use.viewHeight(); const viewHeight = useZoomState.use.viewHeight();
const updateActives = useFileListStore.use.updateActiveFiles(); const updateActives = useFileListStore.use.updateActiveFiles();
@ -23,20 +24,21 @@ export const ContinuationView: FC = () => {
}); });
const items = virtualizer.getVirtualItems(); const items = virtualizer.getVirtualItems();
useEffect(() => { useLifecycles(
ebus?.addListener('navigate_offset', ({ filename }) => { () => {
let index = indexOf(filename, pluck('filename', files)); ebus?.addListener('navigate_offset', ({ filename }) => {
virtualizer.scrollToIndex(index); let index = indexOf(filename, pluck('filename', files));
}); virtualizer.scrollToIndex(index);
ebus?.addListener('reset_views', () => { });
virtualizer.scrollToOffset(0); ebus?.addListener('reset_views', () => {
}); virtualizer.scrollToOffset(0);
});
return () => { },
() => {
ebus?.removeAllListeners('navigate_offset'); ebus?.removeAllListeners('navigate_offset');
ebus?.removeAllListeners('reset_views'); ebus?.removeAllListeners('reset_views');
}; }
}, [ebus, files, virtualizer]); );
useLayoutEffect(() => { useLayoutEffect(() => {
let rangeStart = virtualizer.scrollOffset; let rangeStart = virtualizer.scrollOffset;

View File

@ -2,4 +2,6 @@ export type FileItem = {
sort: number; sort: number;
filename: string; filename: string;
path: string; path: string;
width: number;
height: number;
}; };