remove character sorting

This commit is contained in:
Lucas Sköld
2025-06-29 23:44:28 +02:00
parent b2f349b2d0
commit e1c8a5f728
4 changed files with 35 additions and 138 deletions
+11 -77
View File
@@ -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:
+9 -7
View File
@@ -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
}
+15 -13
View File
@@ -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);
-41
View File
@@ -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);