Добавлен модуль готовых промптов: создано окно с категориями промптов, добавлен поиск, реализовано добавление промптов в основное поле ввода

This commit is contained in:
kromskii2 committed 2025-03-14 19:34:01 +07:00
1 parent 29dce906c5
commit 4b16298d05
3 files changed
+223

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
PROMPT_CATEGORIES = {
"Персонажи": {
"Девушки": [
"1girl", "2girls", "3girls", "girl", "solo", "multiple_girls",
"little_girl", "loli", "kawaii", "mesugaki", "adorable_girl",
"bishoujo", "gyaru", "sisters", "ojousama", "female",
"mature_female", "female_pervert", "milf", "otoko_no_ko"
],
"Мальчики": [
"1boy", "2boys", "3boys", "boy", "little_boy", "shota",
"male", "mature"
],
"Профессии": [
"lifeguard", "boxer", "scientist", "athletes", "office lady",
"monk", "crobat", "nun", "nurse", "stewardess", "student",
"waitress", "teacher", "racer", "police", "soldier",
"cheerleader", "actor", "actress", "spy", "agent", "assassin",
"poet", "samurai", "dancing girl", "motorcyclist", "hacker",
"magician", "detective", "doll", "maid", "pilot", "diver",
"bar censor", "missionary", "firefighter", "goalkeeper", "chef",
"astronaut", "cashier", "mailman", "barista", "the hermit",
"makihitsuji", "office_lady", "race_queen", "queen", "doctor",
"knight", "housemaid", "dancer", "ballerina", "gym_leader",
"trap", "priest", "cleric", "wa_maid"
]
},
"Жанры": {
"Аниме и манга": [
"yaoi", "yuri", "harem", "idol", "neon genesis evangelion",
"hatsune miku", "doraemon", "saint seiya", "gojou satoru",
"mazinger", "crayon shin-chan", "slam dunk", "sun wukong"
],
"Супергерои": [
"avengers", "captain america", "spider-man", "santa alter"
],
"Фэнтези": [
"witch", "miko", "ninja", "vampire", "knight", "magical_girl",
"orc", "druid", "elf", "fairy", "furry", "mermaid",
"kamen rider", "magister", "monster_girl"
],
"Кемоно": [
"cat_girl", "dog_girl", "fox_girl", "kitsune", "kyuubi",
"raccoon_girl", "wolf_girl", "bunny_girl", "horse_girl",
"cow_girl", "dragon_girl", "centaur", "slime_musume",
"spider_girl", "dominatrix", "sailor_senshi"
],
"Футуристика": [
"mecha", "mecha_musume", "humanoid_robot_", "cyborg"
],
"Мифология": [
"angel", "devil", "dark_elf", "imp", "succubus",
"giantess", "minigirl", "monster", "no humans"
]
},
"Возраст": {
"Дети": [
"toddler", "kindergartener", "child", "underage",
"teenager", "teen", "early teen"
],
"Взрослые": [
"adult", "elder", "old", "loli", "shota"
]
}
}
+136
View File
@@ -0,0 +1,136 @@
from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QTreeWidget,
QTreeWidgetItem, QPushButton, QLineEdit, QLabel)
from PyQt6.QtCore import Qt, pyqtSignal
from .prompt_categories import PROMPT_CATEGORIES
class PromptWindow(QDialog):
prompt_selected = pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("Готовые промпты")
self.setModal(False)
self.setup_ui()
self.load_categories()
def setup_ui(self):
self.setStyleSheet("""
QDialog {
background-color: #2b2b2b;
min-width: 800px;
min-height: 600px;
}
QTreeWidget {
background-color: #1e1e1e;
color: #ffffff;
border: 1px solid #3b3b3b;
border-radius: 4px;
padding: 8px;
}
QTreeWidget::item {
padding: 4px;
}
QTreeWidget::item:selected {
background-color: #0d6efd;
color: white;
}
QPushButton {
background-color: #0d6efd;
color: white;
border: none;
border-radius: 4px;
padding: 8px 16px;
font-weight: bold;
}
QPushButton:hover {
background-color: #0b5ed7;
}
QPushButton:pressed {
background-color: #0a58ca;
}
QLineEdit {
background-color: #3b3b3b;
color: white;
border: 1px solid #555555;
border-radius: 4px;
padding: 8px;
}
""")
layout = QVBoxLayout(self)
# Поиск
search_layout = QHBoxLayout()
search_label = QLabel("Поиск:")
self.search_input = QLineEdit()
self.search_input.textChanged.connect(self.filter_prompts)
search_layout.addWidget(search_label)
search_layout.addWidget(self.search_input)
layout.addLayout(search_layout)
# Дерево категорий
self.tree = QTreeWidget()
self.tree.setHeaderLabels(["Категории и промпты"])
self.tree.itemDoubleClicked.connect(self.on_item_double_clicked)
layout.addWidget(self.tree)
# Кнопки
buttons_layout = QHBoxLayout()
add_button = QPushButton("Добавить выбранное")
add_button.clicked.connect(self.add_selected)
close_button = QPushButton("Закрыть")
close_button.clicked.connect(self.close)
buttons_layout.addWidget(add_button)
buttons_layout.addWidget(close_button)
layout.addLayout(buttons_layout)
def load_categories(self):
"""Загрузка категорий и промптов в дерево"""
for category, subcategories in PROMPT_CATEGORIES.items():
category_item = QTreeWidgetItem([category])
self.tree.addTopLevelItem(category_item)
for subcategory, prompts in subcategories.items():
subcategory_item = QTreeWidgetItem([subcategory])
category_item.addChild(subcategory_item)
for prompt in prompts:
prompt_item = QTreeWidgetItem([prompt])
subcategory_item.addChild(prompt_item)
self.tree.expandAll()
def filter_prompts(self, text):
"""Фильтрация промптов по поисковому запросу"""
text = text.lower()
self.tree.clear()
self.load_categories()
if not text:
return
def filter_items(item):
if item.childCount() == 0: # Это промпт
return text in item.text(0).lower()
else: # Это категория
has_visible_children = False
for i in range(item.childCount()):
if filter_items(item.child(i)):
has_visible_children = True
if not has_visible_children:
item.parent().removeChild(item)
return has_visible_children
for i in range(self.tree.topLevelItemCount()):
filter_items(self.tree.topLevelItem(i))
def on_item_double_clicked(self, item):
"""Обработка двойного клика по элементу"""
if item.childCount() == 0: # Если это промпт
self.prompt_selected.emit(item.text(0))
def add_selected(self):
"""Добавление выбранного промпта"""
selected_items = self.tree.selectedItems()
if selected_items and selected_items[0].childCount() == 0:
self.prompt_selected.emit(selected_items[0].text(0))