新增 undo 功能

This commit is contained in:
eafonyang
2026-08-14 16:40:47 +08:00
parent 4a67622d9b
commit 8ca8128e2b
4 changed files with 23 additions and 20 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
> This document records feature updates and bug fixes for the Luxsin X9 controller. A new entry is appended here after each release. > This document records feature updates and bug fixes for the Luxsin X9 controller. A new entry is appended here after each release.
## 2026.08.06 ## v2026.08.06
### New Features ### New Features
- Added a "What's New" entry on the home page, allowing you to view release notes online. - Added a "What's New" entry on the home page, allowing you to view release notes online.
+2 -6
View File
@@ -87,7 +87,6 @@ import { ShareDialog } from "./eq/components/ShareDialog";
import { BrandDrawer } from "./eq/components/BrandDrawer"; import { BrandDrawer } from "./eq/components/BrandDrawer";
import { PeqOverwriteConfirmDialog } from "./eq/components/PeqOverwriteConfirmDialog"; import { PeqOverwriteConfirmDialog } from "./eq/components/PeqOverwriteConfirmDialog";
import { PeqPresetManageDialog } from "./eq/components/PeqPresetManageDialog"; import { PeqPresetManageDialog } from "./eq/components/PeqPresetManageDialog";
import { PeqUndoButton } from "./eq/components/PeqUndoButton";
import { useRawCurve } from "./eq/hooks/useRawCurve"; import { useRawCurve } from "./eq/hooks/useRawCurve";
import { import {
usePeqUndoHistory, usePeqUndoHistory,
@@ -1795,11 +1794,6 @@ export default function EQPage() {
)} )}
</div> </div>
<div className="flex shrink-0 items-center gap-2"> <div className="flex shrink-0 items-center gap-2">
<PeqUndoButton
disabled={!canUndo}
label={eqUi.undo ?? "Undo"}
onClick={handleUndo}
/>
<button <button
className="w-9 h-9 rounded-full flex items-center justify-center text-white/60 active:text-white transition-colors" className="w-9 h-9 rounded-full flex items-center justify-center text-white/60 active:text-white transition-colors"
style={{ style={{
@@ -1844,6 +1838,8 @@ export default function EQPage() {
abMode={abMode} abMode={abMode}
onAbToggle={handleAbToggle} onAbToggle={handleAbToggle}
onCopyAndSwitchTo={handleCopyAndSwitchTo} onCopyAndSwitchTo={handleCopyAndSwitchTo}
canUndo={canUndo}
onUndo={handleUndo}
onApplyB={() => void handleApplyB()} onApplyB={() => void handleApplyB()}
onSaveB={openSaveBDialog} onSaveB={openSaveBDialog}
onBandDrag={(idx, patch) => onBandDrag={(idx, patch) =>
@@ -7,6 +7,7 @@ import {
} from "@/lib/peqAudio"; } from "@/lib/peqAudio";
import type { PeqEqUi } from "../constants"; import type { PeqEqUi } from "../constants";
import { eqInterp } from "../utils"; import { eqInterp } from "../utils";
import { PeqUndoButton } from "./PeqUndoButton";
/* ── Legend indicator ── */ /* ── Legend indicator ── */
function LegendCurveIndicator({ function LegendCurveIndicator({
@@ -37,6 +38,8 @@ export function FreqChart({
abMode, abMode,
onAbToggle, onAbToggle,
onCopyAndSwitchTo, onCopyAndSwitchTo,
canUndo,
onUndo,
onApplyB, onApplyB,
onSaveB, onSaveB,
onBandDrag, onBandDrag,
@@ -52,6 +55,8 @@ export function FreqChart({
abMode: "A" | "B"; abMode: "A" | "B";
onAbToggle: (m: "A" | "B") => void; onAbToggle: (m: "A" | "B") => void;
onCopyAndSwitchTo: (to: "A" | "B") => void; onCopyAndSwitchTo: (to: "A" | "B") => void;
canUndo: boolean;
onUndo: () => void;
onApplyB: () => void; onApplyB: () => void;
onSaveB: () => void; onSaveB: () => void;
onBandDrag: (idx: number, patch: Partial<{ freq: number; gain: number }>) => void; onBandDrag: (idx: number, patch: Partial<{ freq: number; gain: number }>) => void;
@@ -295,6 +300,11 @@ export function FreqChart({
}}> }}>
{copyButtonText} {copyButtonText}
</button> </button>
<PeqUndoButton
disabled={!canUndo}
label={eqUi.undo ?? "Undo"}
onClick={onUndo}
/>
</div> </div>
<div className="ml-auto flex shrink-0 items-center gap-2"> <div className="ml-auto flex shrink-0 items-center gap-2">
<button <button
@@ -1,4 +1,3 @@
import { Undo2 } from "lucide-react";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
type PeqUndoButtonProps = { type PeqUndoButtonProps = {
@@ -8,6 +7,11 @@ type PeqUndoButtonProps = {
className?: string; className?: string;
}; };
const pillStyle = {
background: "rgba(44,44,46,0.7)",
border: "1px solid rgba(255,255,255,0.08)",
} as const;
/** /**
* EQ page undo control — disabled when the undo stack is empty. * EQ page undo control — disabled when the undo stack is empty.
*/ */
@@ -25,22 +29,15 @@ export function PeqUndoButton({
title={label} title={label}
onClick={onClick} onClick={onClick}
className={cn( className={cn(
"w-9 h-9 rounded-full flex items-center justify-center transition-colors active:scale-95", "px-3 py-1 rounded-[8px] text-[11px] transition-colors",
disabled disabled
? "text-white/25 cursor-not-allowed" ? "text-white/25 cursor-not-allowed opacity-50"
: "text-white/70 active:text-white", : "text-white/50 active:text-white",
className, className,
)} )}
style={{ style={pillStyle}
background: disabled
? "rgba(44,44,46,0.45)"
: "rgba(44,44,46,0.8)",
border: disabled
? "1px solid rgba(255,255,255,0.06)"
: "1px solid rgba(255,255,255,0.1)",
}}
> >
<Undo2 size={18} /> {label}
</button> </button>
); );
} }