You've already forked Nano-Banana-AI-Image-Editor
添加了IFLOW描述文件;
优化 调整了历史记录悬浮窗的显示位置;
This commit is contained in:
@@ -9,7 +9,7 @@ import { useIndexedDBListener } from '../hooks/useIndexedDBListener';
|
||||
import { DayPicker } from 'react-day-picker';
|
||||
import zhCN from 'react-day-picker/dist/locale/zh-CN';
|
||||
|
||||
export const HistoryPanel: React.FC = () => {
|
||||
export const HistoryPanel: React.FC<{ setHoveredImage: (image: {url: string, title: string, width?: number, height?: number} | null) => void }> = ({ setHoveredImage }) => {
|
||||
const {
|
||||
currentProject,
|
||||
canvasImage,
|
||||
@@ -63,9 +63,7 @@ export const HistoryPanel: React.FC = () => {
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
const itemsPerPage = 20; // 减少每页显示的项目数
|
||||
|
||||
// 悬浮预览状态
|
||||
const [hoveredImage, setHoveredImage] = useState<{url: string, title: string, width?: number, height?: number} | null>(null);
|
||||
const [previewPosition, setPreviewPosition] = useState<{x: number, y: number}>({x: 0, y: 0});
|
||||
|
||||
|
||||
const generations = currentProject?.generations || [];
|
||||
const edits = currentProject?.edits || [];
|
||||
@@ -536,49 +534,6 @@ export const HistoryPanel: React.FC = () => {
|
||||
width: img.width,
|
||||
height: img.height
|
||||
});
|
||||
|
||||
// 计算预览位置,确保不超出屏幕边界
|
||||
const previewWidth = 300; // 减小预览窗口大小
|
||||
const previewHeight = 300;
|
||||
const offsetX = 10;
|
||||
const offsetY = 10;
|
||||
|
||||
|
||||
// 获取HistoryPanel的位置
|
||||
const historyPanel = document.querySelector('.w-72.bg-white.p-4');
|
||||
const panelRect = historyPanel ? historyPanel.getBoundingClientRect() : { left: 0, top: 0 };
|
||||
|
||||
// 计算相对于HistoryPanel的位置
|
||||
let x = e.clientX - panelRect.left + offsetX;
|
||||
let y = e.clientY - panelRect.top + offsetY;
|
||||
|
||||
|
||||
|
||||
// 确保预览窗口不会超出右边界
|
||||
if (x + previewWidth > window.innerWidth) {
|
||||
x = window.innerWidth - previewWidth - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出下边界
|
||||
if (y + previewHeight > window.innerHeight) {
|
||||
y = window.innerHeight - previewHeight - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出左边界
|
||||
if (x < 0) {
|
||||
x = 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出上边界
|
||||
if (y < 0) {
|
||||
y = 10;
|
||||
}
|
||||
|
||||
// 添加额外的安全边界检查
|
||||
x = Math.max(10, Math.min(x, window.innerWidth - previewWidth - 10));
|
||||
y = Math.max(10, Math.min(y, window.innerHeight - previewHeight - 10));
|
||||
|
||||
setPreviewPosition({x, y});
|
||||
};
|
||||
img.onerror = (error) => {
|
||||
console.error('图像加载失败:', error);
|
||||
@@ -589,89 +544,12 @@ export const HistoryPanel: React.FC = () => {
|
||||
width: 0,
|
||||
height: 0
|
||||
});
|
||||
|
||||
// 计算预览位置
|
||||
const previewWidth = 300;
|
||||
const previewHeight = 300;
|
||||
const offsetX = 10;
|
||||
const offsetY = 10;
|
||||
|
||||
|
||||
let x = e.clientX + offsetX;
|
||||
let y = e.clientY + offsetY;
|
||||
|
||||
// 确保预览窗口不会超出右边界
|
||||
if (x + previewWidth > window.innerWidth) {
|
||||
x = window.innerWidth - previewWidth - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出下边界
|
||||
if (y + previewHeight > window.innerHeight) {
|
||||
y = window.innerHeight - previewHeight - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出左边界
|
||||
if (x < 0) {
|
||||
x = 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出上边界
|
||||
if (y < 0) {
|
||||
y = 10;
|
||||
}
|
||||
|
||||
// 添加额外的安全边界检查
|
||||
x = Math.max(10, Math.min(x, window.innerWidth - previewWidth - 10));
|
||||
y = Math.max(10, Math.min(y, window.innerHeight - previewHeight - 10));
|
||||
|
||||
setPreviewPosition({x, y});
|
||||
};
|
||||
img.src = imageUrl;
|
||||
}
|
||||
}}
|
||||
onMouseMove={(e) => {
|
||||
// 调整预览位置以避免被遮挡
|
||||
const previewWidth = 300;
|
||||
const previewHeight = 300;
|
||||
const offsetX = 10;
|
||||
const offsetY = 10;
|
||||
|
||||
|
||||
// 获取HistoryPanel的位置
|
||||
const historyPanel = document.querySelector('.w-72.bg-white.p-4');
|
||||
const panelRect = historyPanel ? historyPanel.getBoundingClientRect() : { left: 0, top: 0 };
|
||||
|
||||
// 计算相对于HistoryPanel的位置
|
||||
let x = e.clientX - panelRect.left + offsetX;
|
||||
let y = e.clientY - panelRect.top + offsetY;
|
||||
|
||||
// 确保预览窗口不会超出右边界
|
||||
if (x + previewWidth > (historyPanel ? historyPanel.clientWidth : window.innerWidth)) {
|
||||
x = (historyPanel ? historyPanel.clientWidth : window.innerWidth) - previewWidth - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出下边界
|
||||
if (y + previewHeight > (historyPanel ? historyPanel.clientHeight : window.innerHeight)) {
|
||||
y = (historyPanel ? historyPanel.clientHeight : window.innerHeight) - previewHeight - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出左边界
|
||||
if (x < 0) {
|
||||
x = 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出上边界
|
||||
if (y < 0) {
|
||||
y = 10;
|
||||
}
|
||||
|
||||
// 添加额外的安全边界检查
|
||||
const maxWidth = historyPanel ? historyPanel.clientWidth : window.innerWidth;
|
||||
const maxHeight = historyPanel ? historyPanel.clientHeight : window.innerHeight;
|
||||
x = Math.max(10, Math.min(x, maxWidth - previewWidth - 10));
|
||||
y = Math.max(10, Math.min(y, maxHeight - previewHeight - 10));
|
||||
|
||||
setPreviewPosition({x, y});
|
||||
onMouseMove={() => {
|
||||
// 不需要处理鼠标移动事件,因为预览现在在页面中心显示
|
||||
}}
|
||||
onMouseLeave={() => {
|
||||
setHoveredImage(null);
|
||||
@@ -753,42 +631,6 @@ export const HistoryPanel: React.FC = () => {
|
||||
width: img.width,
|
||||
height: img.height
|
||||
});
|
||||
|
||||
// 计算预览位置,确保不超出屏幕边界
|
||||
const previewWidth = 300;
|
||||
const previewHeight = 300;
|
||||
const offsetX = 10;
|
||||
const offsetY = 10;
|
||||
|
||||
|
||||
let x = e.clientX + offsetX;
|
||||
let y = e.clientY + offsetY;
|
||||
|
||||
// 确保预览窗口不会超出右边界
|
||||
if (x + previewWidth > window.innerWidth) {
|
||||
x = window.innerWidth - previewWidth - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出下边界
|
||||
if (y + previewHeight > window.innerHeight) {
|
||||
y = window.innerHeight - previewHeight - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出左边界
|
||||
if (x < 0) {
|
||||
x = 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出上边界
|
||||
if (y < 0) {
|
||||
y = 10;
|
||||
}
|
||||
|
||||
// 添加额外的安全边界检查
|
||||
x = Math.max(10, Math.min(x, window.innerWidth - previewWidth - 10));
|
||||
y = Math.max(10, Math.min(y, window.innerHeight - previewHeight - 10));
|
||||
|
||||
setPreviewPosition({x, y});
|
||||
};
|
||||
img.onerror = (error) => {
|
||||
console.error('图像加载失败:', error);
|
||||
@@ -799,85 +641,12 @@ export const HistoryPanel: React.FC = () => {
|
||||
width: 0,
|
||||
height: 0
|
||||
});
|
||||
|
||||
// 计算预览位置
|
||||
const previewWidth = 300;
|
||||
const previewHeight = 300;
|
||||
const offsetX = 10;
|
||||
const offsetY = 10;
|
||||
|
||||
// 获取HistoryPanel的位置信息
|
||||
const historyPanel = e.currentTarget.closest('.w-72');
|
||||
const panelRect = historyPanel ? historyPanel.getBoundingClientRect() : { left: 0, top: 0 };
|
||||
|
||||
// 计算相对于整个视窗的位置
|
||||
let x = e.clientX + offsetX;
|
||||
let y = e.clientY + offsetY;
|
||||
|
||||
// 确保预览窗口不会超出右边界
|
||||
if (x + previewWidth > window.innerWidth) {
|
||||
x = window.innerWidth - previewWidth - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出下边界
|
||||
if (y + previewHeight > window.innerHeight) {
|
||||
y = window.innerHeight - previewHeight - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出左边界
|
||||
if (x < 0) {
|
||||
x = 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出上边界
|
||||
if (y < 0) {
|
||||
y = 10;
|
||||
}
|
||||
|
||||
// 添加额外的安全边界检查
|
||||
x = Math.max(10, Math.min(x, window.innerWidth - previewWidth - 10));
|
||||
y = Math.max(10, Math.min(y, window.innerHeight - previewHeight - 10));
|
||||
|
||||
setPreviewPosition({x, y});
|
||||
};
|
||||
img.src = imageUrl;
|
||||
}
|
||||
}}
|
||||
onMouseMove={(e) => {
|
||||
// 调整预览位置以避免被遮挡
|
||||
const previewWidth = 300;
|
||||
const previewHeight = 300;
|
||||
const offsetX = 10;
|
||||
const offsetY = 10;
|
||||
|
||||
let x = e.clientX + offsetX;
|
||||
let y = e.clientY + offsetY;
|
||||
|
||||
// 确保预览窗口不会超出右边界
|
||||
if (x + previewWidth > window.innerWidth) {
|
||||
x = window.innerWidth - previewWidth - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出下边界
|
||||
if (y + previewHeight > window.innerHeight) {
|
||||
y = window.innerHeight - previewHeight - 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出左边界
|
||||
if (x < 0) {
|
||||
x = 10;
|
||||
}
|
||||
|
||||
// 确保预览窗口不会超出上边界
|
||||
if (y < 0) {
|
||||
y = 10;
|
||||
}
|
||||
|
||||
// 添加额外的安全边界检查
|
||||
x = Math.max(10, Math.min(x, window.innerWidth - previewWidth - 10));
|
||||
y = Math.max(10, Math.min(y, window.innerHeight - previewHeight - 10));
|
||||
|
||||
setPreviewPosition({x, y});
|
||||
onMouseMove={() => {
|
||||
// 不需要处理鼠标移动事件,因为预览现在在页面中心显示
|
||||
}}
|
||||
onMouseLeave={() => {
|
||||
setHoveredImage(null);
|
||||
@@ -1188,37 +957,6 @@ export const HistoryPanel: React.FC = () => {
|
||||
title={previewModal.title}
|
||||
description={previewModal.description}
|
||||
/>
|
||||
|
||||
{/* 悬浮预览 */}
|
||||
{hoveredImage && (
|
||||
<div
|
||||
className="absolute z-[9999] shadow-2xl border border-gray-300 rounded-lg overflow-hidden bg-white backdrop-blur-sm pointer-events-none"
|
||||
style={{
|
||||
left: `${previewPosition.x}px`,
|
||||
top: `${previewPosition.y}px`,
|
||||
maxWidth: '200px', // 减小最大宽度
|
||||
maxHeight: '200px'
|
||||
}}
|
||||
>
|
||||
<div className="bg-gray-900 text-white text-xs p-2 truncate font-medium">
|
||||
{hoveredImage.title}
|
||||
</div>
|
||||
<img
|
||||
src={hoveredImage.url}
|
||||
alt="预览"
|
||||
className="w-full h-auto max-h-[150px] object-contain"
|
||||
/>
|
||||
{/* 图像信息 */}
|
||||
<div className="p-2 bg-gray-50 border-t border-gray-200 text-xs">
|
||||
{hoveredImage.width && hoveredImage.height && (
|
||||
<div className="flex justify-between text-gray-600">
|
||||
<span>尺寸:</span>
|
||||
<span className="text-gray-800">{hoveredImage.width} × {hoveredImage.height}</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user