136 lines
4.9 KiB
Python
136 lines
4.9 KiB
Python
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)) |