Core: Allow option groups to specify option order (#3393)

* Core: Allow option groups to specify option order

* words hard

* Actually use the earlier built dictionary for faster in checking

Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>

---------

Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com>
This commit is contained in:
Aaron Wagener 2024-11-29 16:37:14 -06:00 committed by GitHub
parent b0a61be9df
commit 46dfc4d4fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 18 additions and 14 deletions

View File

@ -1463,22 +1463,26 @@ it.
def get_option_groups(world: typing.Type[World], visibility_level: Visibility = Visibility.template) -> typing.Dict[ def get_option_groups(world: typing.Type[World], visibility_level: Visibility = Visibility.template) -> typing.Dict[
str, typing.Dict[str, typing.Type[Option[typing.Any]]]]: str, typing.Dict[str, typing.Type[Option[typing.Any]]]]:
"""Generates and returns a dictionary for the option groups of a specified world.""" """Generates and returns a dictionary for the option groups of a specified world."""
option_groups = {option: option_group.name option_to_name = {option: option_name for option_name, option in world.options_dataclass.type_hints.items()}
for option_group in world.web.option_groups
for option in option_group.options} ordered_groups = {group.name: group.options for group in world.web.option_groups}
# add a default option group for uncategorized options to get thrown into # add a default option group for uncategorized options to get thrown into
ordered_groups = ["Game Options"] if "Game Options" not in ordered_groups:
[ordered_groups.append(group) for group in option_groups.values() if group not in ordered_groups] grouped_options = set(option for group in ordered_groups.values() for option in group)
grouped_options = {group: {} for group in ordered_groups} ungrouped_options = [option for option in option_to_name if option not in grouped_options]
for option_name, option in world.options_dataclass.type_hints.items(): # only add the game options group if we have ungrouped options
if visibility_level & option.visibility: if ungrouped_options:
grouped_options[option_groups.get(option, "Game Options")][option_name] = option ordered_groups = {**{"Game Options": ungrouped_options}, **ordered_groups}
# if the world doesn't have any ungrouped options, this group will be empty so just remove it return {
if not grouped_options["Game Options"]: group: {
del grouped_options["Game Options"] option_to_name[option]: option
for option in group_options
return grouped_options if (visibility_level in option.visibility and option in option_to_name)
}
for group, group_options in ordered_groups.items()
}
def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], generate_hidden: bool = True) -> None: def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], generate_hidden: bool = True) -> None: