Time Travel and Branching

pyqt-reactive integrates with ObjectState’s git-like time-travel system. When forms are bound to ObjectState, all user edits are automatically recorded in a DAG-based history.

Overview

ObjectState provides a DAG-based history system (not just a linear undo/redo stack). When you edit form fields, changes are recorded as snapshots. You can:

  • Time Travel: Navigate back and forth through history (like git checkout)

  • Jump to Snapshots: Jump to any point in history by ID

  • Branching: Create alternative timelines for experimentation

  • Atomic Operations: Group multiple changes into a single snapshot

Integration with Forms

When a form is bound to ObjectState:

  1. Automatic Recording: Each field change triggers a snapshot

  2. Dirty Tracking: Unsaved changes are tracked automatically

  3. Time Travel: Navigate to any previous state without losing work

  4. Branching: Create experiment branches to explore alternatives

Example

from pyqt_reactive.forms import ParameterFormManager
from objectstate import ObjectStateRegistry, config_context

@dataclass
class ProcessingConfig:
    threshold: float = 0.5
    iterations: int = 10

# Create form with ObjectState context
with config_context(global_config):
    form = ParameterFormManager(ProcessingConfig)
    form.show()

    # User edits are automatically recorded
    # Time travel available through ObjectStateRegistry
    ObjectStateRegistry.time_travel_back()   # Go one step back
    ObjectStateRegistry.time_travel_forward()  # Go one step forward

    # Create experiment branch
    ObjectStateRegistry.create_branch("experiment_v2")
    # ... make changes ...
    ObjectStateRegistry.switch_branch("main")  # Back to original