| | """Centralized configuration defaults for scenario controls.""" |
| |
|
| | from __future__ import annotations |
| |
|
| | from dataclasses import dataclass |
| | from typing import Final |
| |
|
| |
|
| | @dataclass(frozen=True) |
| | class SliderDefaults: |
| | """Slider configuration along with a helper to clamp values.""" |
| |
|
| | minimum: float |
| | maximum: float |
| | value: float |
| | step: float |
| |
|
| | def clamp(self, candidate: float) -> float: |
| | """Clamp ``candidate`` to this slider's min/max bounds.""" |
| | return max(self.minimum, min(self.maximum, candidate)) |
| |
|
| |
|
| | SCENARIO_DEFAULTS: Final[dict[str, SliderDefaults]] = { |
| | "fire_count": SliderDefaults(minimum=1, maximum=40, value=20, step=1), |
| | "fire_intensity": SliderDefaults(minimum=0.2, maximum=0.9, value=0.6, step=0.05), |
| | "building_count": SliderDefaults(minimum=1, maximum=35, value=20, step=1), |
| | "max_units": SliderDefaults(minimum=1, maximum=20, value=10, step=1), |
| | } |
| |
|
| |
|
| | def range_text(key: str) -> str: |
| | """ |
| | Return a human-readable ``min-max`` string for any configured scenario slider. |
| | Primarily used in docstrings / README notes to avoid diverging documentation. |
| | """ |
| | defaults = SCENARIO_DEFAULTS[key] |
| | step_value = float(defaults.step) |
| | if step_value.is_integer(): |
| | min_val = int(defaults.minimum) |
| | max_val = int(defaults.maximum) |
| | else: |
| | min_val = defaults.minimum |
| | max_val = defaults.maximum |
| | return f"{min_val}-{max_val}" |
| |
|
| |
|