A Project (body). Represents the editor contents of a scratch project
| 15 | |
| 16 | |
| 17 | class Project(base.JSONExtractable): |
| 18 | """ |
| 19 | A Project (body). Represents the editor contents of a scratch project |
| 20 | """ |
| 21 | |
| 22 | def __init__( |
| 23 | self, |
| 24 | _name: Optional[str] = None, |
| 25 | _meta: Optional[meta.Meta] = None, |
| 26 | _extensions: Iterable[extension.Extension] = (), |
| 27 | _monitors: Iterable[monitor.Monitor] = (), |
| 28 | _sprites: Iterable[sprite.Sprite] = (), |
| 29 | *, |
| 30 | _asset_data: Optional[list[asset.AssetFile]] = None, |
| 31 | _session: Optional[session.Session] = None, |
| 32 | ): |
| 33 | # Defaulting for list parameters |
| 34 | if _meta is None: |
| 35 | _meta = meta.Meta() |
| 36 | if _asset_data is None: |
| 37 | _asset_data = [] |
| 38 | |
| 39 | self._session = _session |
| 40 | |
| 41 | self.name = _name |
| 42 | |
| 43 | self.meta = _meta |
| 44 | self.extensions: list[extension.Extension] = list(_extensions) |
| 45 | self.monitors = list(_monitors) |
| 46 | self.sprites = list(_sprites) |
| 47 | |
| 48 | self.asset_data = _asset_data |
| 49 | |
| 50 | self._tw_config_comment = None |
| 51 | |
| 52 | # Link subcomponents |
| 53 | for iterable in (self.monitors, self.sprites): |
| 54 | for _subcomponent in iterable: |
| 55 | _subcomponent.project = self |
| 56 | |
| 57 | # Link sprites |
| 58 | _stage_count = 0 |
| 59 | |
| 60 | for _sprite in self.sprites: |
| 61 | if _sprite.is_stage: |
| 62 | _stage_count += 1 |
| 63 | |
| 64 | _sprite.link_subcomponents() |
| 65 | |
| 66 | # Link monitors |
| 67 | for _monitor in self.monitors: |
| 68 | _monitor.link_using_project() |
| 69 | |
| 70 | if _stage_count != 1: |
| 71 | raise exceptions.InvalidStageCount(f"Project {self}") |
| 72 | |
| 73 | def __repr__(self): |
| 74 | _ret = "Project<" |