Skip to content

feat(browser): add window-level tabs with a docked tab strip - #375

Open
JoeJoeflyn wants to merge 3 commits into
mainfrom
feat/108-tabs
Open

JoeJoeflyn wants to merge 3 commits into
mainfrom
feat/108-tabs

Conversation

@JoeJoeflyn

@JoeJoeflyn JoeJoeflyn commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

Closes #108 (pane-specific items deferred until #83 lands).

What changed

  • New TabsModel (src/ui/tabs.rs): each tab owns an independent live BrowserView in a shared gtk::Stack, so switching is instant and inactive tabs keep their locations, histories, and selections.
  • Tab strip docks on top of the file viewer (inside the content pane), hidden until a second tab exists; a + header button is always visible. Styling reuses the column-header visual language with semantic @theme_* colors.
  • New tabs open at the current location (Home only as fallback), matching Nautilus/Dolphin.
  • Shortcuts: Ctrl+Shift+T new tab, Ctrl+W close, Ctrl+Tab/Ctrl+Shift+Tab and Ctrl+PgDn/Ctrl+PgUp switch, Ctrl+1Ctrl+9 direct select, Ctrl+S chord group (T/N/P/X/digits) per the issue's proposal, Ctrl+Shift+PgUp/PgDn reorder.
  • Pointer: click to switch, close button, middle-click close, drag to reorder, drop files onto a tab to transfer there.
  • Folder context menu gains "Open in New Tab" (directories, not Trash).
  • Shared chrome routed to the active tab on every use: sidebar places, search results, settings toggles, terminal/refresh actions, rename/location click-away, appearance menu, keyboard navigation. The header breadcrumb swaps to the active tab's location widget on switch.
  • Window destroy clears observers for every tab's browser.

Manual steps

  1. cargo run, press Ctrl+Shift+T or click the header + → tab strip appears above the file list with the current folder's name.
  2. Switch with Ctrl+Tab, Ctrl+2, or by clicking tabs; breadcrumb, sidebar highlight, and keyboard focus follow the active tab.
  3. Right-click a folder → "Open in New Tab" → opens in the background's new active tab.
  4. Drag a tab to reorder; middle-click or Ctrl+W to close; the last tab refuses to close.
  5. Change a settings toggle (e.g. folder peeking) → applies to every tab.
  6. Drop a file onto another tab's label → transfers to that tab's location.

Expected result

Multiple independent workspaces in one window, each keeping its own history and selection, with no observer leaks on close.

Skipped for v1: session persistence (out of scope per #108) and detach-tab-to-window.

N/A — screenshots: tab strip styling reuses existing column-header CSS; behavior is interactive (drag/reorder/drop) and not capturable in a still.
screenrecording-2026-09-06_01-27-23

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add tabs for independent multi-pane workspaces

2 participants