diff --git a/src/character_select.py b/src/character_select.py index 6fb24ad..3320e45 100644 --- a/src/character_select.py +++ b/src/character_select.py @@ -1,4 +1,3 @@ -import json import os import random @@ -15,24 +14,13 @@ class CharacterSelectNode: Node that lets a user select a character and then returns the character and character prompt """ - character_dict = {} - final_character_dict = {} - final_characters = [] - cached_sorting_setting = ConfigReader.get_setting("sn0w.CharacterSettings.SortCharactersBy", "alphabetical") cached_default_character_setting = ConfigReader.get_setting( "sn0w.CharacterSettings.DisableDefaultCharacters", False ) + character_dict = {} last_character = "" - favorites = ConfigReader.get_setting("SyntaxHighlighting.favorites", []) - logger = Logger() - @classmethod - def initialize(cls): - dir_path = cls.get_base_dir() - - cls.load_characters(dir_path) - @classmethod def get_base_dir(cls): dir_path = os.path.dirname(os.path.realpath(__file__)) @@ -40,67 +28,15 @@ class CharacterSelectNode: dir_path = os.path.dirname(dir_path) return dir_path - @classmethod - def check_initialize(cls): - if not cls.final_characters or cls.cached_default_character_setting != ConfigReader.get_setting( - "sn0w.CharacterSettings.DisableDefaultCharacters", False - ): - cls.cached_default_character_setting = ConfigReader.get_setting( - "sn0w.CharacterSettings.DisableDefaultCharacters", False - ) - cls.initialize() - elif cls.cached_sorting_setting != ConfigReader.get_setting( - "sn0w.CharacterSettings.SortCharactersBy", "alphabetical" - ): - cls.sort_characters() - - @classmethod - def load_characters(cls, dir_path): - include_default = not cls.cached_default_character_setting - cls.character_dict = CharacterLoader.get_character_dict(dir_path, include_default) - cls.sort_characters(True) - - @staticmethod - def extract_series_name(character_name): - return CharacterLoader.extract_series_name(character_name) - - @classmethod - def sort_characters(cls, force_sort=False): - current_sorting_setting = ConfigReader.get_setting("sn0w.CharacterSettings.SortCharactersBy", "alphabetical") - if current_sorting_setting != cls.cached_sorting_setting or force_sort: - if current_sorting_setting == "series": - cls.final_character_dict = { - name: cls.character_dict[name] for name in sorted(cls.character_dict, key=cls.extract_series_name) - } - if current_sorting_setting == "alphabetical": - cls.final_character_dict = {name: cls.character_dict[name] for name in sorted(cls.character_dict)} - - cls.cached_sorting_setting = current_sorting_setting - - favorite_names = [] - non_favorite_names = [] - - for name in cls.final_character_dict.keys(): - if name in cls.favorites: - favorite_names.append(name) - else: - non_favorite_names.append(name) - - ordered_characters = {} - for fav_name in favorite_names: - ordered_characters[fav_name] = cls.final_character_dict[fav_name] - - for name in non_favorite_names: - ordered_characters[name] = cls.final_character_dict[name] - - cls.final_characters = list(ordered_characters.keys()) - @classmethod def INPUT_TYPES(cls): - cls.check_initialize() dir_path = cls.get_base_dir() - filtered_character_names = CharacterLoader.get_filtered_character_list(dir_path, cls.final_character_dict) - character_names = ["None"] + filtered_character_names + ["SN0W_CHARACTER_SELECTOR"] + filtered_character_names = CharacterLoader.get_filtered_character_dict( + dir_path, + include_default=not ConfigReader.get_setting("sn0w.CharacterSettings.DisableDefaultCharacters", False), + ) + cls.character_dict = filtered_character_names + character_names = ["None"] + list(filtered_character_names.keys()) + ["SN0W_CHARACTER_SELECTOR"] return { "required": { "character": (character_names,), @@ -129,7 +65,7 @@ class CharacterSelectNode: elif character == "None" or character == "SN0W_CHARACTER_SELECTOR": return ("", "") else: - char_item = self.final_character_dict.get(character) + char_item = self.character_dict.get(character) self.last_character = char_item character_name = "" @@ -152,8 +88,8 @@ class CharacterSelectNode: # Fetching the exclusion settings exclude_characters = ConfigReader.get_setting("sn0w.CharacterSettings.ExcludedRandomCharacters", False) if exclude_characters is False: - random_character_name = random.choice(list(self.final_character_dict.keys())) - char_item = self.final_character_dict[random_character_name] + random_character_name = random.choice(list(self.character_dict.keys())) + char_item = self.character_dict[random_character_name] self.logger.log("Random Character: " + str(char_item["name"]), "INFORMATIONAL") return char_item @@ -163,9 +99,7 @@ class CharacterSelectNode: return "" # Filter the characters by excluding the ones in the exclusion list - filtered_characters = { - name: char for name, char in self.final_character_dict.items() if name in favourite_characters - } + filtered_characters = {name: char for name, char in self.character_dict.items() if name in favourite_characters} # Choosing a random character from the filtered list if filtered_characters: diff --git a/src/generate_all_character_images.py b/src/generate_all_character_images.py index 7e0bfbe..4a0e73c 100644 --- a/src/generate_all_character_images.py +++ b/src/generate_all_character_images.py @@ -45,7 +45,9 @@ class GenerateCharactersNode: if series: series_list_with_counts.append(f"{series} ({count})") - cls.series_list = ["All"] + series_list_with_counts + # Calculate total count for "All" option + total_count = len(cls.character_dict) + cls.series_list = [f"All ({total_count})"] + series_list_with_counts return cls.character_dict @classmethod @@ -129,14 +131,14 @@ class GenerateCharactersNode: existing_filenames = self.load_existing_images() orig_positive = kwargs.get("positive", "") + match = re.match(r"^(.*?)\s*\(\d+\)$", series_filter) + if match: + selected_series = match.group(1).strip() + else: + selected_series = series_filter # Filter characters by series if not "All" - if series_filter != "All": - match = re.match(r"^(.*?)\s*\(\d+\)$", series_filter) - if match: - selected_series = match.group(1).strip() - else: - selected_series = series_filter + if selected_series != "All": character_dict = { name: char for name, char in character_dict.items() if char.get("series", "") == selected_series } diff --git a/web/js/characterNode.js b/web/js/characterNode.js index 7b9ee12..8a6ade2 100644 --- a/web/js/characterNode.js +++ b/web/js/characterNode.js @@ -123,20 +123,22 @@ app.registerExtension({ const hierarchicalValues = [createMenuItem("None")]; - Object.keys(seriesGroups).forEach((seriesName) => { - const submenuOptions = seriesGroups[seriesName].map((characterName) => ({ - content: characterName, - callback: newCallback, - toString: () => characterName, - })); - - hierarchicalValues.push( - createMenuItem(seriesName, true, { - options: submenuOptions, + Object.keys(seriesGroups) + .sort() + .forEach((seriesName) => { + const submenuOptions = seriesGroups[seriesName].map((characterName) => ({ + content: characterName, callback: newCallback, - }) - ); - }); + toString: () => characterName, + })); + + hierarchicalValues.push( + createMenuItem(seriesName, true, { + options: submenuOptions, + callback: newCallback, + }) + ); + }); options.callback = undefined; existingContextMenu.call(this, hierarchicalValues, options); diff --git a/web/js/sortCharactersBy.js b/web/js/sortCharactersBy.js deleted file mode 100644 index 4131d8b..0000000 --- a/web/js/sortCharactersBy.js +++ /dev/null @@ -1,41 +0,0 @@ -import { SettingUtils } from './sn0w.js'; -import { app } from '../../../scripts/app.js'; -import { api } from '../../../scripts/api.js'; - -const settingUtils = new SettingUtils(); - -function updateSorting(graphCanvas) { - api.fetchApi(`${SettingUtils.API_PREFIX}/update_characters`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - }); - setTimeout(() => { - settingUtils.refreshComboInSingleNode(graphCanvas, 'Character Selector'); - }, 50); -} - -const id = 'sn0w.CharacterSettings.SortCharactersBy'; -const settingDefinition = { - id, - name: 'Sort Characters By', - defaultValue: 'alphabetical', - options: [ - { text: 'Alphabetical', value: 'alphabetical' }, - { text: 'Series', value: 'series' }, - ], - type: 'combo', - onChange: () => updateSorting(app), -}; - -let setting; - -const extension = { - name: id, - init() { - setting = app.ui.settings.addSetting(settingDefinition); - }, -}; - -app.registerExtension(extension);