Metadata-Version: 2.4
Name: pyqt-reactive
Version: 0.1.24
Summary: React-quality reactive form generation framework for PyQt6
Project-URL: Homepage, https://github.com/OpenHCSDev/pyqt-reactive
Project-URL: Documentation, https://pyqt-reactive.readthedocs.io
Project-URL: Repository, https://github.com/OpenHCSDev/pyqt-reactive
Project-URL: Issues, https://github.com/OpenHCSDev/pyqt-reactive/issues
Author-email: Tristan Simas <tristan.simas@mail.mcgill.ca>
License: MIT
License-File: LICENSE
Keywords: dataclass,forms,gui,pyqt6,reactive,widgets
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Software Development :: User Interfaces
Requires-Python: >=3.11
Requires-Dist: docutils>=0.20
Requires-Dist: magicgui>=0.7.0
Requires-Dist: metaclass-registry>=0.1.5
Requires-Dist: objectstate>=1.0.18
Requires-Dist: psutil>=5.9
Requires-Dist: pygments>=2.15
Requires-Dist: pyqt6>=6.4.0
Requires-Dist: python-introspect>=0.1.5
Requires-Dist: pyzmq>=22.0
Requires-Dist: zmqruntime>=0.1.9
Provides-Extra: dev
Requires-Dist: black>=23.0; extra == 'dev'
Requires-Dist: mypy>=1.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
Requires-Dist: pytest-qt>=4.0; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: ruff>=0.1.0; extra == 'dev'
Provides-Extra: docs
Requires-Dist: sphinx-autodoc-typehints>=1.25; extra == 'docs'
Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
Requires-Dist: sphinx>=7.0; extra == 'docs'
Description-Content-Type: text/markdown

# pyqt-reactive

Reactive, ObjectState-backed forms and reusable application infrastructure for
PyQt6.

[![PyPI version](https://badge.fury.io/py/pyqt-reactive.svg)](https://badge.fury.io/py/pyqt-reactive)
[![Documentation Status](https://readthedocs.org/projects/pyqt-reactive/badge/?version=latest)](https://pyqt-reactive.readthedocs.io/en/latest/)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)

## Quick start

``ParameterFormManager`` renders an existing ``ObjectState``. The state is the
model; the form is a view over it.

```python
from dataclasses import dataclass

from PyQt6.QtWidgets import QApplication
from objectstate import ObjectState, set_base_config_type
from pyqt_reactive.forms.parameter_form_manager import (
    FormManagerConfig,
    ParameterFormManager,
)
from pyqt_reactive.theming import ColorScheme

@dataclass
class ProcessingConfig:
    input_path: str = ""
    num_workers: int = 4
    enable_gpu: bool = False

app = QApplication([])
set_base_config_type(ProcessingConfig)
state = ObjectState(ProcessingConfig(), scope_id="processing")
form = ParameterFormManager(
    state,
    config=FormManagerConfig(color_scheme=ColorScheme()),
)
form.show()
app.exec()
```

Do not pass a dataclass type or instance directly to
``ParameterFormManager``. Create ``ObjectState(instance)`` so edits, dirty
tracking, hierarchy, and cross-window updates share one authority.

## Ownership

pyqt-reactive owns generic widget protocols and strategies, form lifecycle,
field-change dispatch, reusable services and managers, previews, animations,
and window infrastructure. Host applications own domain workflows and adapters.

## Installation

```bash
python -m pip install pyqt-reactive
```

For development:

```bash
git clone https://github.com/OpenHCSDev/PyQT-reactive.git
cd PyQT-reactive
python -m pip install -e ".[dev]"
```

Full documentation: [pyqt-reactive.readthedocs.io](https://pyqt-reactive.readthedocs.io)
