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: 1000px; min-height: 800px; } QTreeWidget { background-color: #1e1e1e; color: #ffffff; border: 1px solid #3b3b3b; border-radius: 4px; padding: 8px; font-size: 14px; } QTreeWidget::item { padding: 6px; min-height: 24px; } 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; min-width: 120px; } 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; font-size: 14px; min-height: 24px; } QLabel { font-size: 14px; } """) 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))