Commit Graph

3 Commits

  • feat(tui2): add multi-click transcript selection (#8471)
    Support multi-click transcript selection using transcript/viewport
    coordinates
    (wrapped visual line index + content column), not terminal buffer
    positions.
    
    Gestures:
    - double click: select word-ish token under cursor
    - triple click: select entire wrapped line
    - quad click: select paragraph (contiguous non-empty wrapped lines)
    - quint+ click: select the entire history cell (all wrapped lines
    belonging to a
      single `HistoryCell`, including blank lines inside the cell)
    
    Selection expansion rebuilds the wrapped transcript view from
    `HistoryCell::display_lines(width)` so boundaries match on-screen
    wrapping during
    scroll/resize/streaming reflow. Click grouping is resilient to minor
    drag jitter
    (some terminals emit tiny Drag events during clicks) and becomes more
    tolerant as
    the sequence progresses so quad/quint clicks are practical.
    
    Tests cover expansion (word/line/paragraph/cell), sequence resets
    (timing, motion,
    line changes, real drags), drag jitter, and behavior on spacer lines
    between
    history cells (paragraph/cell selection prefers the cell above).
  • fix(tui2): start transcript selection on drag (#8466)
    Avoid distracting 1-cell highlights on simple click by tracking an
    anchor on mouse down and only creating a visible selection once the
    mouse is dragged (selection head set).
    
    When dragging while following the bottom during streaming, request a
    scroll lock so the viewport stops moving under the active selection.
    
    Move selection state transitions into transcript_selection helpers
    (returning change/lock outcomes for the caller) and add unit tests for
    the state machine.
  • fix(tui2): copy transcript selection outside viewport (#8449)
    Copy now operates on the full logical selection range (anchor..head),
    not just the visible viewport, so selections that include offscreen
    lines copy the expected text.
    
    Selection extraction is factored into `transcript_selection` to make the
    logic easier to test and reason about. It reconstructs the wrapped
    visual transcript, renders each wrapped line into a 1-row offscreen
    Buffer, and reads the selected cells. This keeps clipboard text aligned
    with what is rendered (gutter, indentation, wrapping).
    
    Additional behavior:
    - Skip continuation cells for wide glyphs (e.g. CJK) so copied text does
    not include spurious spaces like "コ X".
    - Avoid copying right-margin padding spaces.
    
    Manual tested performed:
    - "tell me a story" a few times
    - scroll up, select text, scroll down, copy text
    - confirm copied text is what you expect