Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/ui/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -465,12 +465,16 @@ function AppShell({
onQuit();
}, [onQuit]);

/** Toggle keyboard focus between the file list and the file filter. */
const toggleFocusArea = useCallback(() => {
setFocusArea((current) => (current === "files" ? "filter" : "files"));
}, []);

const menus = useMemo(
() =>
buildAppMenus({
activeThemeId: activeTheme.id,
canRefreshCurrentInput,
focusFiles: () => setFocusArea("files"),
focusFilter: () => setFocusArea("filter"),
layoutMode,
moveAnnotatedFile,
Expand All @@ -485,6 +489,7 @@ function AppShell({
showLineNumbers,
sidebarVisible,
toggleAgentNotes,
toggleFocusArea,
toggleHelp: () => setShowHelp((current) => !current),
toggleHunkHeaders,
toggleLineNumbers,
Expand All @@ -506,6 +511,7 @@ function AppShell({
showLineNumbers,
sidebarVisible,
toggleAgentNotes,
toggleFocusArea,
toggleHunkHeaders,
toggleLineNumbers,
toggleLineWrap,
Expand Down Expand Up @@ -724,7 +730,7 @@ function AppShell({
}

if (key.name === "tab") {
setFocusArea("files");
toggleFocusArea();
return;
}

Expand All @@ -749,7 +755,7 @@ function AppShell({
}

if (key.name === "tab") {
setFocusArea((current) => (current === "files" ? "filter" : "files"));
toggleFocusArea();
return;
}

Expand Down
2 changes: 1 addition & 1 deletion src/ui/components/chrome/HelpDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export function HelpDialog({
title: "Review",
items: [
["/", "focus file filter"],
["Tab", "swap files / filter focus"],
["Tab", "toggle files/filter focus"],
["F10", "open menus"],
[canRefresh ? "r / q" : "q", canRefresh ? "reload / quit" : "quit"],
],
Expand Down
8 changes: 4 additions & 4 deletions src/ui/lib/appMenus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { THEMES } from "../themes";
export interface BuildAppMenusOptions {
activeThemeId: string;
canRefreshCurrentInput: boolean;
focusFiles: () => void;
focusFilter: () => void;
layoutMode: LayoutMode;
moveAnnotatedFile: (delta: number) => void;
Expand All @@ -20,6 +19,7 @@ export interface BuildAppMenusOptions {
showLineNumbers: boolean;
sidebarVisible: boolean;
toggleAgentNotes: () => void;
toggleFocusArea: () => void;
toggleHelp: () => void;
toggleHunkHeaders: () => void;
toggleLineNumbers: () => void;
Expand All @@ -32,7 +32,6 @@ export interface BuildAppMenusOptions {
export function buildAppMenus({
activeThemeId,
canRefreshCurrentInput,
focusFiles,
focusFilter,
layoutMode,
moveAnnotatedFile,
Expand All @@ -47,6 +46,7 @@ export function buildAppMenus({
showLineNumbers,
sidebarVisible,
toggleAgentNotes,
toggleFocusArea,
toggleHelp,
toggleHunkHeaders,
toggleLineNumbers,
Expand All @@ -64,9 +64,9 @@ export function buildAppMenus({
const fileMenuEntries: MenuEntry[] = [
{
kind: "item",
label: "Focus files",
label: "Toggle files/filter focus",
hint: "Tab",
action: focusFiles,
action: toggleFocusArea,
},
{
kind: "item",
Expand Down
10 changes: 5 additions & 5 deletions test/app-interactions.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -492,15 +492,15 @@ describe("App interactions", () => {
await flush(setup);

let frame = setup.captureCharFrame();
if (!frame.includes("Focus files")) {
if (!frame.includes("Toggle files/filter focus")) {
await act(async () => {
await setup.mockInput.pressKey("F10");
});
await flush(setup);
frame = setup.captureCharFrame();
}

expect(frame).toContain("Focus files");
expect(frame).toContain("Toggle files/filter focus");
expect(frame).toContain("Reload");
expect(frame).toContain("Quit");

Expand Down Expand Up @@ -1085,7 +1085,7 @@ describe("App interactions", () => {
await flush(setup);

let frame = setup.captureCharFrame();
expect(frame).toContain("Focus files");
expect(frame).toContain("Toggle files/filter focus");
expect(frame).not.toContain("Keyboard help");

await act(async () => {
Expand All @@ -1095,15 +1095,15 @@ describe("App interactions", () => {

frame = setup.captureCharFrame();
expect(frame).toContain("Keyboard help");
expect(frame).not.toContain("Focus files");
expect(frame).not.toContain("Toggle files/filter focus");

await act(async () => {
await setup.mockInput.pressArrow("right");
});
await flush(setup);

frame = setup.captureCharFrame();
expect(frame).toContain("Focus files");
expect(frame).toContain("Toggle files/filter focus");
expect(frame).not.toContain("Keyboard help");
} finally {
await act(async () => {
Expand Down
2 changes: 1 addition & 1 deletion test/ui-components.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -868,7 +868,7 @@ describe("UI components", () => {
"l / w / m lines / wrap / metadata",
"Review",
"/ focus file filter",
"Tab swap files / filter focus",
"Tab toggle files/filter focus",
"F10 open menus",
"r / q reload / quit",
] as const;
Expand Down
9 changes: 7 additions & 2 deletions test/ui-lib.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ describe("ui helpers", () => {
const menus = buildAppMenus({
activeThemeId: "graphite",
canRefreshCurrentInput: true,
focusFiles: () => {},
focusFilter: () => {},
layoutMode: "stack",
moveAnnotatedFile: () => {},
Expand All @@ -114,6 +113,7 @@ describe("ui helpers", () => {
showLineNumbers: true,
sidebarVisible: false,
toggleAgentNotes: () => {},
toggleFocusArea: () => {},
toggleHelp: () => {},
toggleHunkHeaders: () => {},
toggleLineNumbers: () => {},
Expand All @@ -126,7 +126,12 @@ describe("ui helpers", () => {
menus.file
.filter((entry): entry is Extract<MenuEntry, { kind: "item" }> => entry.kind === "item")
.map((entry) => entry.label),
).toEqual(["Focus files", "Focus filter", "Reload", "Quit"]);
).toEqual(["Toggle files/filter focus", "Focus filter", "Reload", "Quit"]);
expect(menus.file[0]).toMatchObject({
kind: "item",
label: "Toggle files/filter focus",
hint: "Tab",
});
expect(
menus.view
.filter(
Expand Down
Loading