新增 undo 功能
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user