Добавлен модуль готовых промптов: создано окно с категориями промптов, добавлен поиск, реализовано добавление промптов в основное поле ввода
This commit is contained in:
1 parent
29dce906c5
commit
4b16298d05
3 files changed
+223
No files matched your search
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
Reference in new issue
Block a user