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
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@ All notable changes to qtviz are documented here. The format follows

### Added

- **Inset axes ([D152]–[D154], `design/inset-axes.md`):** `qv.Inset(child,
rect=(x0, y0, w, h), label=…, indicate=…)` — a child surface floating on a
parent, composed like an annotation: `overview * qv.Inset(zoom,
rect=(0.55, 0.55, 0.4, 0.4), label="zoom")`. `rect` is axes-fraction of
the parent's plot area; the child is a full surface (own title, lims,
scales via `.opts()`). On `Inset`, `label=` is the **pane label** (an
inset has no legend entry — it is chrome, like annotations): a labeled
inset is a pane, so its zoom window survives rebuilds and backend
switches via `LayoutState`, `view.pane("zoom").set_range(…)` drives it,
events from inside it carry `pane="zoom"`, and `pane.export(…)` writes
just the inset. `indicate=True` draws the parent-side rectangle marking
the child's declared x/y window. Rendered natively on pyqtgraph and
matplotlib; the webengine backend warns and skips insets for now (the
parent renders normally).

- **Structured axis sharing ([D146]):** `link_x`/`link_y` widen from bools to
`bool | "col" | "row"` — `True` links all panes (unchanged), `"col"`/`"row"`
link within each grid column/row, with spanning panes merging groups
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Test markers: `tier1` (pure core, no QApplication), `tier2` (Qt event loop + bac
Layering (strict, one-directional — core never imports a concrete backend):

- **`src/qtviz/core/`** — the spec's abstractions: `Element` (immutable, value-hashed, Qt-free declarative data), the **Mark IR** ([D121]/[D122]: `marks.py` — 9 typed drawing primitives in linear data space; `lowering.py` — `Element.lower(ctx) -> Lowered`), `Backend` protocol + `RenderContext`/`RenderHandle`/`ViewState` (`core/backend.py`), composition via operators (`a * b` → `Overlay`, `a + b` → `Layout`, in `compose.py`) with `.opts()` surface sugar ([D133]), `View` + `show()` (`core/view.py`), `Theme`/`Palette`/`Color`/`Norm`, typed events on an `EventBus`, `Capabilities` and backend negotiation, threading discipline.
- **`src/qtviz/elements/`** — the 28 element classes. Pure data constructors; a **tail of 14 lowers** (Quiver, Streamlines, Stem, Spread, Ecdf + the 9 annotations: one `lower()` in core, zero backend edits) and **14 stay native** (Scatter, Curve, Bars, Histogram, Area, BoxPlot, Violin, Image, Heatmap, Mesh, Contour, ErrorBars, Pie, RawFigure — engine idioms a lowering would visibly change; rationale in the 2.0 doc §8).
- **`src/qtviz/elements/`** — the 29 element classes. Pure data constructors; a **tail of 14 lowers** (Quiver, Streamlines, Stem, Spread, Ecdf + the 9 annotations: one `lower()` in core, zero backend edits), **14 stay native** (Scatter, Curve, Bars, Histogram, Area, BoxPlot, Violin, Image, Heatmap, Mesh, Contour, ErrorBars, Pie, RawFigure — engine idioms a lowering would visibly change; rationale in the 2.0 doc §8), and **Inset** ([D152]) is structural — a child surface drawn in the backends' surface loop, its labeled pane riding the [D147] machinery.
- **`src/qtviz/data/`** — container-agnostic data layer. `DataRef` (tabular vs gridded), a priority-ordered adapter registry (dict/NumPy/pandas/Arrow eager; dask/xarray/zarr lazy), channel **accessors** (column name, serializable `Expression` via `col()`/`lit()`, callable, or raw array — **every channel keyword takes the full union, never just column names**), streaming sources, viewport regridding. `resolve_node` dispatches on `Element.DATA_KIND`; big-data side-channels ride the typed `_aux` slot (`RasterAux`/`GridAux`, [D124]).
- **`src/qtviz/backends/{pyqtgraph,matplotlib,webengine}/`** — each implements the `Backend` protocol and registers through the **`qtviz.backends` entry-point group** ([D125]; a third-party backend needs zero qtviz edits). Each has a `_marks.py` adapter (~8 drawers, written once) for lowered elements — the pyqtgraph adapter is the one place its log pretransform lives — plus native renderers for the head elements; **a registered native renderer wins over lowering** (the fast-path override). Each maps `ViewState` to/from native ranges so pan/zoom/selection survive backend switches. The webengine backend hosts a Qt↔JS bridge (`core/`) with library extensions (`ext/`); `_runtime.py` files there are JavaScript embedded as Python strings (ruff E501 ignored, excluded from coverage).
- **`src/qtviz/adapter/`** (holoviews/hvplot ingestion) and **`src/qtviz/ext/`** (datashader: large data → screen-resolution rasters that re-aggregate on zoom).
Expand Down
Loading
Loading