Skip to content

feat(panes): Tab per Ziehen als Pane in den sichtbaren Tab einfügen - #523

Merged
iret77 merged 3 commits into
mainfrom
feat/tab-join-as-pane
Oct 8, 2026
Merged

iret77 merged 3 commits into
mainfrom
feat/tab-join-as-pane

Conversation

@iret77

@iret77 iret77 commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Baut auf feat/unified-launch-menu-tab-to-pane auf; bitte nach diesem PR mergen.

Was

Ein Tab lässt sich mit der Maus als Pane in den sichtbaren Tab ziehen. Vorbild sind VS Code und JetBrains: Man zieht einen Tab in den Editorbereich, und eine Drop-Fläche zeigt die Zielposition.

  • Den Tab aus der Tab-Leiste oder dem vertikalen Tab-Panel in den Inhaltsbereich ziehen. Über einem Pane des sichtbaren Tabs markiert eine Fläche im Theme-Akzent die Hälfte (links, rechts, oben, unten), an der er eingefügt wird. Die Richtungslogik ist dieselbe wie beim Ziehen an der Pane-Kopfzeile (calculate_pane_move_direction).
  • Beim Loslassen wandern alle sichtbaren Panes des gezogenen Tabs samt Anordnung als Split dorthin. Sessions, PTYs und Agenten laufen weiter, der leere Quelltab schließt sich, und der Fokus liegt auf dem vorher fokussierten Pane des gezogenen Tabs.
  • Innerhalb der Tab-Leiste bzw. des Panels wird wie bisher umsortiert. Loslassen ohne Drop-Fläche ändert höchstens die Reihenfolge.
  • Die Gegenrichtung gibt es schon: Pane-Kopfzeile auf die Tab-Leiste ziehen.

Umsetzung

  • tab.rs: Die horizontalen Tabs aktivieren bei on_click statt on_mouse_down, wie die vertikalen Tabs. Ohne DragTabsToWindows ist der Tab-Drag nicht mehr auf die horizontale Achse gesperrt, sondern auf das Fenster begrenzt.
  • vertical_tabs.rs: Ebenso wird die senkrechte Sperre durch die Fenstergrenze ersetzt. Gezogen wird dort der ganze Tab mit allen Panes, auch wenn das Panel jedes Pane als eigene Zeile zeigt.
  • tree.rs: PaneLayout beschreibt die sichtbaren Panes; dazu kommt has_hidden_panes_in_use.
  • pane_group: take_panes_for_join und insert_joined_panes. Die Anordnung entsteht neu aus Splits: erst die Geschwister nebeneinander, dann jedes Kind. Reihenfolge und Verschachtelung bleiben erhalten, die Größen starten gleich verteilt. Dateimanager-Overlays wandern über PaneMoveBundle mit. Ein Pane, das nicht neben seinem Nachbarn platziert werden kann, landet am Tabrand und geht nicht verloren.
  • workspace: tab_join_drop_target_at, join_tab_as_pane und das Overlay. Gesperrt sind Tabs mit verborgenen laufenden Panes (Hintergrundjob, Child-Agent, laufender Move) und Tabs mit laufendem provisorischem Daemon- oder Managed-Start, wie beim Fenster-Drag.

Bekannter Kompromiss

Ein Drücken, bei dem sich die Maus mehr als 5 px bewegt, gilt als Drag (Schwelle des Draggable) und aktiviert den Tab beim Loslassen nicht. Bei den vertikalen Tabs ist das schon heute so. Das ist also konsistent und keine Regression.

Verifikation

  • Statisch: rustfmt --check, git diff --check, check-no-new-cjk, check-persistent-hover-state, check-v1-release-readiness --phase-a.
  • Nicht kompiliert: Kompilierung und Tests laufen im ci-batch erst nach Freigabe.
  • Tests: visible_layout_mirrors_nesting_and_skips_hidden_panes, only_running_or_moving_hidden_panes_block_handing_over_a_group und dragging_a_tab_onto_a_pane_joins_its_panes_as_a_split (gleiche PaneIds in Originalreihenfolge, Fokus übernommen, Quelltab geschlossen, sichtbarer Tab ist nie sein eigenes Ziel).
  • Die native Abnahme (Maus-Drag, Overlay in Hell/Dunkel) braucht einen DMG-Build.

Nicht enthalten

  • Ursprüngliche Größenverhältnisse eingefügter Panes bleiben nicht erhalten.
  • Tab-Abriss in neue Fenster: DragTabsToWindows bleibt aus.

iret77 added 3 commits October 6, 2026 12:04
Ein Tab lässt sich aus der Tab-Leiste in den Inhaltsbereich ziehen. Über
einem Pane des sichtbaren Tabs markiert eine Fläche aus Theme-Akzent die
Hälfte, an der er eingefügt wird (gleiche Richtungslogik wie beim
Pane-Kopfzeilen-Drag). Loslassen überführt alle sichtbaren Panes des
gezogenen Tabs samt Anordnung als Split; Sessions, PTYs und Agenten laufen
weiter, der leere Quelltab schließt sich. Ohne Drop-Fläche wird höchstens
umsortiert.

Damit der sichtbare Tab beim Ziehen eines anderen stehen bleibt, aktiviert
die horizontale Tab-Leiste Tabs beim Loslassen statt beim Drücken (wie die
vertikalen Tabs). Tabs mit verborgenen laufenden Panes (Hintergrundjob,
Child-Agent) oder laufendem provisorischem Daemon-Start werden nicht
eingefügt. Fenster-Abriss (DragTabsToWindows) bleibt unverändert.
Das vertikale Tab-Panel sperrt den Tab-Drag ohne DragTabsToWindows nicht
mehr auf die senkrechte Achse, sondern begrenzt ihn auf das Fenster. Über
dem Inhalt greift damit dieselbe Drop-Fläche und dasselbe Einfügen als
Split wie bei der horizontalen Tab-Leiste; im Panel wird weiter
umsortiert. Gezogen wird wie bisher der ganze Tab mit allen Panes.
@iret77
iret77 changed the base branch from feat/unified-launch-menu-tab-to-pane to main October 8, 2026 14:18
@iret77
iret77 merged commit bdba746 into main Oct 8, 2026
1 check passed
@iret77
iret77 deleted the feat/tab-join-as-pane branch October 8, 2026 15:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant