|
from __future__ import annotations |
|
|
|
from typing import TYPE_CHECKING |
|
|
|
if TYPE_CHECKING: |
|
import argparse |
|
from dataclasses import dataclass |
|
from typing import Any, Callable |
|
|
|
import torch |
|
from PIL import Image |
|
|
|
@dataclass |
|
class State: |
|
skipped: bool = False |
|
interrupted: bool = False |
|
job: str = "" |
|
job_no: int = 0 |
|
job_count: int = 0 |
|
processing_has_refined_job_count: bool = False |
|
job_timestamp: str = "0" |
|
sampling_step: int = 0 |
|
sampling_steps: int = 0 |
|
current_latent: torch.Tensor | None = None |
|
current_image: Image.Image | None = None |
|
current_image_sampling_step: int = 0 |
|
id_live_preview: int = 0 |
|
textinfo: str | None = None |
|
time_start: float | None = None |
|
need_restart: bool = False |
|
server_start: float | None = None |
|
|
|
@dataclass |
|
class OptionInfo: |
|
default: Any = None |
|
label: str = "" |
|
component: Any = None |
|
component_args: Callable[[], dict] | dict[str, Any] | None = None |
|
onchange: Callable[[], None] | None = None |
|
section: tuple[str, str] | None = None |
|
refresh: Callable[[], None] | None = None |
|
|
|
class Option: |
|
data_labels: dict[str, OptionInfo] |
|
|
|
def __init__(self): |
|
self.data: dict[str, Any] = {} |
|
|
|
def add_option(self, key: str, info: OptionInfo): |
|
pass |
|
|
|
def __getattr__(self, item: str): |
|
if self.data is not None and item in self.data: |
|
return self.data[item] |
|
|
|
if item in self.data_labels: |
|
return self.data_labels[item].default |
|
|
|
return super().__getattribute__(item) |
|
|
|
opts = Option() |
|
cmd_opts = argparse.Namespace() |
|
state = State() |
|
|
|
else: |
|
from modules.shared import OptionInfo, cmd_opts, opts, state |
|
|