Commit Graph
2 Commits
Author SHA1 Message Date
maxandClaude Opus 5 2e9a43f78b Fix the pin toggle, stale selection, and project detection in Unity repos
Three problems visible on a real project:

- The inline pin button showed twice on every unpinned row: the `when`
  clauses matched /pinned/ and /unpinned/, and "unpinned" contains "pinned".
  Context values now use unambiguous `pin:on` / `pin:off` tokens, and both
  commands call one togglePin — the pair exists only so the button's icon can
  reflect the current state.
- The list selected the tab you just left. followActiveTab read `isActive`
  from the entry snapshot, and after a refresh the tree has not necessarily
  asked for children yet, so it matched against the previous build. It now
  rebuilds the list and compares against the live active tab.
- Every file in a Unity repo resolved to an arbitrary project. Unity generates
  one .csproj per assembly into the repo root, and the walk took whichever
  readDirectory happened to return first. Matches are now sorted, a project
  file named after its directory wins, and .asmdef — which lives in the
  assembly's own directory and is what actually defines a Unity assembly — is
  a default marker, so it is found before reaching the root.

Palette widened from 8 to 12 hues, since a hash-assigned colour collides more
often than it looks like it should.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 18:24:36 +02:00
maxandClaude Opus 5 7e104450e8 Vertical Tabs: open editors as a project-coloured flat list
For working with the tab bar off, where a side list is the tab bar. VS Code's
Open Editors view already does pinning; what it does not do is colour by
project, and it is a tree rather than a flat list.

- A Tabs view in the Explorer: one row per open editor, no group nodes. A
  TreeDataProvider whose items have no children renders as a list, since
  there is no separate list API.
- Each row's icon is tinted by the project containing the file — the nearest
  .csproj/.fsproj/.vbproj, package.json, Cargo.toml, go.mod, pyproject.toml,
  pom.xml or build.gradle above it, configurable. The colour comes from a
  hash of the project name, so a project keeps its colour across sessions
  rather than depending on the order tabs happened to open in. Eight
  contributed theme colours, all overridable.
- Sort by open order, project (so the colours run in blocks), or file name,
  with pinned tabs lifted to the top.
- Close, close others (keeping pinned), pin/unpin, copy path, reveal.
- The list follows the active editor.

Two API limits shape this, both covered by tests:

- Nothing can activate an arbitrary tab. A file-backed tab is focused by
  re-opening its resource in its own group, which handles text, diffs,
  notebooks and custom editors. Webview tabs have no resource, so they are
  listed and marked as unfocusable instead of pretending.
- Only the *active* editor can be pinned, so pinning another row focuses it
  first.

Commands act on live vscode.Tab objects rather than the row snapshots handed
to them. The first cut compared against a snapshot's isPinned and so silently
did nothing on unpin, and read the provider's cached list, which is empty
until the tree has been rendered.

Also worth recording, both found by the tests: VS Code moves a pinned tab to
the front of its group, so `open` order shows pinned first regardless of the
pinnedFirst setting; and closeAllEditors leaves pinned editors open, so test
cleanup closes through the tab API instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 18:13:42 +02:00