from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QComboBox, QLabel) from PyQt6.QtCore import pyqtSignal import requests class SamplerManager(QWidget): sampler_changed = pyqtSignal(str) def __init__(self, api_url, parent=None): super().__init__(parent) self.api_url = api_url self.setup_ui() self.load_samplers() def setup_ui(self): self.setStyleSheet(""" QWidget { background-color: transparent; } QLabel { color: #d4d4d4; font-size: 13px; font-weight: 500; margin-right: 8px; } QComboBox { background-color: #252526; color: #d4d4d4; border: 1px solid #3e3e3e; border-radius: 6px; padding: 6px 12px; min-width: 180px; font-size: 13px; } QComboBox:hover { border-color: #565656; } QComboBox:focus { border-color: #007acc; } QComboBox::drop-down { border: none; width: 20px; } QComboBox::down-arrow { image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTggMTFMNCBTTDEyIDUiIHN0cm9rZT0iI2Q0ZDRkNCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+); } QComboBox QAbstractItemView { background-color: #252526; color: #d4d4d4; border: 1px solid #3e3e3e; selection-background-color: #094771; outline: none; } """) layout = QHBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(8) # Метка label = QLabel("Сэмплер:") layout.addWidget(label) # Выпадающий список сэмплеров self.sampler_combo = QComboBox() self.sampler_combo.setFixedHeight(32) self.sampler_combo.currentTextChanged.connect(self.on_sampler_changed) layout.addWidget(self.sampler_combo) layout.addStretch() def load_samplers(self): """Загрузить список доступных сэмплеров""" try: response = requests.get(f"{self.api_url}/sdapi/v1/samplers") if response.status_code == 200: samplers = response.json() current_sampler = self.sampler_combo.currentText() self.sampler_combo.clear() for sampler in samplers: self.sampler_combo.addItem(sampler.get('name', '')) # Восстанавливаем выбранный сэмплер, если он всё ещё доступен index = self.sampler_combo.findText(current_sampler) if index >= 0: self.sampler_combo.setCurrentIndex(index) elif self.sampler_combo.count() > 0: # По умолчанию выбираем Euler a default_index = self.sampler_combo.findText("Euler a") if default_index >= 0: self.sampler_combo.setCurrentIndex(default_index) except Exception as e: print(f"Ошибка при загрузке сэмплеров: {str(e)}") def on_sampler_changed(self, sampler_name): """Обработка смены сэмплера""" self.sampler_changed.emit(sampler_name) def update_api_url(self, new_url): """Обновить URL API""" self.api_url = new_url self.load_samplers() def get_current_sampler(self): """Получить текущий выбранный сэмплер""" return self.sampler_combo.currentText()