From df447a1ecf8f89e1044212e42e123f788645ce81 Mon Sep 17 00:00:00 2001 From: kromskii2 <146603192+kromskii2@users.noreply.github.com> Date: Sat, 15 Mar 2025 08:38:56 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D1=81=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20API,=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0,?= =?UTF-8?q?=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=B3=D0=BE=D1=80=D1=8F=D1=87=D0=B8=D1=85=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=D0=B8=D1=88.=20=D0=9E=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=20=D1=81=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BC=D0=B5=D0=BD=D1=8E.=20=D0=A1?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D1=8B=20=D0=B4=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BE=D0=BA=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B8=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 39 ++- .../console_window.cpython-310.pyc | Bin 3403 -> 3673 bytes .../__pycache__/model_manager.cpython-310.pyc | Bin 2684 -> 4762 bytes ...negative_prompt_categories.cpython-310.pyc | Bin 3737 -> 3737 bytes .../negative_prompt_window.cpython-310.pyc | Bin 6877 -> 6877 bytes .../prompt_translations.cpython-310.pyc | Bin 10755 -> 10755 bytes .../__pycache__/prompt_window.cpython-310.pyc | Bin 6844 -> 7553 bytes .../sampler_manager.cpython-310.pyc | Bin 2609 -> 4178 bytes .../__pycache__/settings_menu.cpython-310.pyc | Bin 0 -> 8530 bytes .../size_preset_manager.cpython-310.pyc | Bin 3274 -> 3274 bytes .../__pycache__/size_presets.cpython-310.pyc | Bin 308 -> 308 bytes modules/settings_menu.py | 261 ++++++++++++++++++ 12 files changed, 298 insertions(+), 2 deletions(-) create mode 100644 modules/__pycache__/settings_menu.cpython-310.pyc create mode 100644 modules/settings_menu.py diff --git a/main.py b/main.py index 67c98cf..30f371f 100644 --- a/main.py +++ b/main.py @@ -6,9 +6,9 @@ from time import sleep from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QComboBox, QSpinBox, QDoubleSpinBox, QProgressBar, - QScrollArea, QTextEdit, QFileDialog) + QScrollArea, QTextEdit, QFileDialog, QMenuBar, QMenu) from PyQt6.QtCore import Qt, QThread, pyqtSignal, QTimer -from PyQt6.QtGui import QPixmap, QImage +from PyQt6.QtGui import QPixmap, QImage, QAction from PIL import Image from io import BytesIO @@ -19,6 +19,7 @@ from modules.sampler_manager import SamplerManager from modules.prompt_window import PromptWindow from modules.negative_prompt_window import NegativePromptWindow from modules.size_preset_manager import SizePresetManager +from modules.settings_menu import SettingsMenu class GenerationThread(QThread): progress_updated = pyqtSignal(float, str) @@ -68,8 +69,42 @@ class MainWindow(QMainWindow): self.prompt_window = None self.negative_prompt_window = None self.progress_timer = None + + # Создаем меню бар + self.create_menu_bar() + self.init_ui() + def create_menu_bar(self): + """Создание меню бара с настройками""" + menubar = QMenuBar(self) + menubar.setStyleSheet(""" + QMenuBar { + background-color: #2b2b2b; + color: #ffffff; + border-bottom: 1px solid #3b3b3b; + padding: 2px; + } + QMenuBar::item { + background-color: transparent; + padding: 8px 12px; + margin: 0; + border-radius: 4px; + } + QMenuBar::item:selected { + background-color: #3b3b3b; + } + QMenuBar::item:pressed { + background-color: #404040; + } + """) + + # Добавляем меню настроек + settings_menu = SettingsMenu(self) + menubar.addMenu(settings_menu) + + self.setMenuBar(menubar) + def init_ui(self): self.setWindowTitle("Stable Diffusion UI") self.setStyleSheet(""" diff --git a/modules/__pycache__/console_window.cpython-310.pyc b/modules/__pycache__/console_window.cpython-310.pyc index 9fbcccaa24ee180b8c608596be425c9975ffced5..645898d888bd857be23e1c7d5f297034e21a2f68 100644 GIT binary patch delta 872 zcmZ8fOKa3n6wb|aCX;#8S3C6;jI@s0GMzq|wg?to2rWWe1W`&lNvEmPq$YQ;g_LS5 zC@3v*7lI3&g5X9)yXr!8J*s1&NYh@*xCH1G4fbUZX-!6q6_EwymkIg+*5)q;hJn*thbK_Tx?QoY+F|9DfkEK3cy4?0$5H1{C-9rsMROc_tg*8 z?b>a4Z&lyaR%;K-En)TXqhH$_YV~RD9+dCYRso@yNdNwhfctG8AY@d0^}5= zAd!<1$wWS*W8`n-CK@A7^xaS(f!&0;h}~mwAc$e-atS^nWiqV0A2|0kh2{p(F*%{bn+)QdAyT~k`$UKWGK)xE)}{tGNTNmVe(vg@efXF^L_vT delta 575 zcmX|7ziSjh6rS0co!jg$6I62UMNgw99-=Jfl88n`6zn9BTyqv-H@ndbM;7;HQDF}; zCuk8A^9nn;6k@HFg@uTng*jrAH0nQ)Kfua2OK=|Z@xJeU-y4|SvG1OnIF3p1Se2jm z-q|1AZ`u=v^d{cUON5;CNkq3OC6eZ(N4r#NJye%iPF7i;N1B@Dw67~(_(YF%HCc)n zx>?Rvjs6hM%wkrGII2A72dY)1HB1-T9J}$HABgrADONjq@km4#NKL;JY%qAk=ES8? z73{L(bOyeNQE<7%>b?)ZL=~>`i?GAWo5Bz)#erAcgLA^x!znCeW%EKBM6IlIuL&aWo4- zsUiGe`tovsYMCu&75Hs>mBG`&>ueZ5a{KMz`SvHI>xk=vjhYLmj3dx6UW_!|Fq1M_ z>nyc{$4Mreuy0Hak73B9M%7?8wW(k*JG4VRu*?VaHgwI;bInpGmW%NtnR;m5vt%;g z4q9tUscGq9)Y3BwM*l-ubte$!A+w(0vcJ}ZUPa!3v-TcsZaR(Xr1Bh6FrwhJ0u@P> PFFg;^xrYD!(Ru$5dl8oW diff --git a/modules/__pycache__/model_manager.cpython-310.pyc b/modules/__pycache__/model_manager.cpython-310.pyc index b06897365aa36905c2db8ccb9de5c7407d457b9e..a4b83e9b3b71f7274074c81c15ac1bf84cce72a5 100644 GIT binary patch literal 4762 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 delta 19 Zcmca>de@XIpO=@50SG3jZRENv1pqfp1t0(b diff --git a/modules/__pycache__/prompt_translations.cpython-310.pyc b/modules/__pycache__/prompt_translations.cpython-310.pyc index a3a02ec82b62ad2c2aa3fb3301a51f033783c518..b4b5d18e1cec1570bf5262ac53c50cf39483be0c 100644 GIT binary patch delta 19 YcmZn;X%6Aa=jG*M00L>fja)x90W60EasU7T delta 19 ZcmZn;X%6Aa=jG*M0D^sL8@YaJ0st^E1q}cI diff --git a/modules/__pycache__/prompt_window.cpython-310.pyc b/modules/__pycache__/prompt_window.cpython-310.pyc index 9574cb8ed46624f01f24da654e7f46367016f9a4..ebb630536dea3bebefb65a6b8c550f24f5309258 100644 GIT binary patch delta 1705 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 E0LgSnlK=n! diff --git a/modules/__pycache__/settings_menu.cpython-310.pyc b/modules/__pycache__/settings_menu.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee181b24d0433b7dbc8c4818c025a91e153c31c3 GIT binary patch literal 8530 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 C&k?}@ literal 0 HcmV?d00001 diff --git a/modules/__pycache__/size_preset_manager.cpython-310.pyc b/modules/__pycache__/size_preset_manager.cpython-310.pyc index c240caed25773bb710fc08894fc273d300b396fc..7adb455db10b6217b7b25eb90bc267d3f5c6ca76 100644 GIT binary patch delta 19 ZcmX>lc}kKipO=@50SKh^HgX-{0RS!@1T+8u delta 19 ZcmX>lc}kKipO=@50SG>5Z{#|_0{}A(1qJ{B diff --git a/modules/__pycache__/size_presets.cpython-310.pyc b/modules/__pycache__/size_presets.cpython-310.pyc index 331881629afbcb95f6ece6ae571dfa5cc736f7fc..d0d63712197e684874f7db430301a9362dd76130 100644 GIT binary patch delta 19 ZcmdnOw1tT)pO=@50SKh^Hgah(0stn#133Ty delta 19 ZcmdnOw1tT)pO=@50SMk{Z{*Tq1OO|f1PK5D diff --git a/modules/settings_menu.py b/modules/settings_menu.py new file mode 100644 index 0000000..b70f117 --- /dev/null +++ b/modules/settings_menu.py @@ -0,0 +1,261 @@ +from PyQt6.QtWidgets import (QMenu, + QDialog, QVBoxLayout, QHBoxLayout, + QLabel, QLineEdit, QCheckBox, + QPushButton, QComboBox, QSpinBox) +from PyQt6.QtGui import QIcon, QAction, QActionGroup +from PyQt6.QtCore import Qt + +class SettingsMenu(QMenu): + def __init__(self, parent=None): + super().__init__("⚙️ Настройки", parent) + self.setStyleSheet(""" + QMenu { + background-color: #2b2b2b; + border: 1px solid #3b3b3b; + border-radius: 8px; + padding: 5px; + } + QMenu::item { + background-color: transparent; + padding: 8px 25px; + margin: 2px; + border-radius: 4px; + color: #ffffff; + font-size: 13px; + } + QMenu::item:selected { + background-color: #3b3b3b; + } + QMenu::separator { + height: 1px; + background-color: #3b3b3b; + margin: 5px 15px; + } + """) + self.setup_menu() + + def setup_menu(self): + # API настройки + api_action = QAction("🌐 API настройки", self) + api_action.triggered.connect(self.show_api_settings) + + # Настройки интерфейса + ui_action = QAction("🎨 Настройки интерфейса", self) + ui_action.triggered.connect(self.show_ui_settings) + + # Настройки генерации + generation_action = QAction("⚡ Настройки генерации", self) + generation_action.triggered.connect(self.show_generation_settings) + + # Горячие клавиши + hotkeys_action = QAction("⌨️ Горячие клавиши", self) + hotkeys_action.triggered.connect(self.show_hotkeys_settings) + + # Добавляем действия в меню + self.addAction(api_action) + self.addAction(ui_action) + self.addAction(generation_action) + self.addSeparator() + self.addAction(hotkeys_action) + + def show_api_settings(self): + dialog = APISettingsDialog(self.parent()) + dialog.exec() + + def show_ui_settings(self): + dialog = UISettingsDialog(self.parent()) + dialog.exec() + + def show_generation_settings(self): + dialog = GenerationSettingsDialog(self.parent()) + dialog.exec() + + def show_hotkeys_settings(self): + dialog = HotkeysSettingsDialog(self.parent()) + dialog.exec() + +class BaseSettingsDialog(QDialog): + def __init__(self, title, parent=None): + super().__init__(parent) + self.setWindowTitle(title) + self.setup_base_ui() + + def setup_base_ui(self): + self.setStyleSheet(""" + QDialog { + background-color: #2b2b2b; + min-width: 400px; + } + QLabel { + color: #ffffff; + font-size: 13px; + } + QLineEdit, QComboBox, QSpinBox { + background-color: #3b3b3b; + border: 1px solid #555555; + border-radius: 4px; + padding: 5px; + color: #ffffff; + min-width: 200px; + } + QPushButton { + background-color: #0d6efd; + color: white; + border: none; + border-radius: 4px; + padding: 8px 16px; + font-weight: bold; + min-width: 100px; + } + QPushButton:hover { + background-color: #0b5ed7; + } + QCheckBox { + color: #ffffff; + } + """) + + self.layout = QVBoxLayout(self) + self.layout.setSpacing(15) + self.layout.setContentsMargins(20, 20, 20, 20) + +class APISettingsDialog(BaseSettingsDialog): + def __init__(self, parent=None): + super().__init__("🌐 API настройки", parent) + self.setup_ui() + + def setup_ui(self): + # API URL + url_layout = QHBoxLayout() + url_label = QLabel("API URL:") + self.url_input = QLineEdit(self.parent().api_url_input.text()) + url_layout.addWidget(url_label) + url_layout.addWidget(self.url_input) + self.layout.addLayout(url_layout) + + # Кнопки + buttons_layout = QHBoxLayout() + save_button = QPushButton("Сохранить") + save_button.clicked.connect(self.save_settings) + cancel_button = QPushButton("Отмена") + cancel_button.clicked.connect(self.reject) + buttons_layout.addWidget(save_button) + buttons_layout.addWidget(cancel_button) + self.layout.addLayout(buttons_layout) + + def save_settings(self): + self.parent().api_url_input.setText(self.url_input.text()) + self.accept() + +class UISettingsDialog(BaseSettingsDialog): + def __init__(self, parent=None): + super().__init__("🎨 Настройки интерфейса", parent) + self.setup_ui() + + def setup_ui(self): + # Тема + theme_layout = QHBoxLayout() + theme_label = QLabel("Тема:") + self.theme_combo = QComboBox() + self.theme_combo.addItems(["Тёмная", "Светлая"]) + theme_layout.addWidget(theme_label) + theme_layout.addWidget(self.theme_combo) + self.layout.addLayout(theme_layout) + + # Размер шрифта + font_layout = QHBoxLayout() + font_label = QLabel("Размер шрифта:") + self.font_spin = QSpinBox() + self.font_spin.setRange(8, 24) + self.font_spin.setValue(14) + font_layout.addWidget(font_label) + font_layout.addWidget(self.font_spin) + self.layout.addLayout(font_layout) + + # Кнопки + buttons_layout = QHBoxLayout() + save_button = QPushButton("Сохранить") + save_button.clicked.connect(self.save_settings) + cancel_button = QPushButton("Отмена") + cancel_button.clicked.connect(self.reject) + buttons_layout.addWidget(save_button) + buttons_layout.addWidget(cancel_button) + self.layout.addLayout(buttons_layout) + + def save_settings(self): + # TODO: Применить настройки интерфейса + self.accept() + +class GenerationSettingsDialog(BaseSettingsDialog): + def __init__(self, parent=None): + super().__init__("⚡ Настройки генерации", parent) + self.setup_ui() + + def setup_ui(self): + # Качество по умолчанию + quality_layout = QHBoxLayout() + quality_label = QLabel("Качество по умолчанию:") + self.quality_combo = QComboBox() + self.quality_combo.addItems(["Низкое", "Среднее", "Высокое"]) + quality_layout.addWidget(quality_label) + quality_layout.addWidget(self.quality_combo) + self.layout.addLayout(quality_layout) + + # Размер по умолчанию + size_layout = QHBoxLayout() + size_label = QLabel("Размер по умолчанию:") + self.size_combo = QComboBox() + self.size_combo.addItems(["512x512", "768x512", "512x768"]) + size_layout.addWidget(size_label) + size_layout.addWidget(self.size_combo) + self.layout.addLayout(size_layout) + + # Кнопки + buttons_layout = QHBoxLayout() + save_button = QPushButton("Сохранить") + save_button.clicked.connect(self.save_settings) + cancel_button = QPushButton("Отмена") + cancel_button.clicked.connect(self.reject) + buttons_layout.addWidget(save_button) + buttons_layout.addWidget(cancel_button) + self.layout.addLayout(buttons_layout) + + def save_settings(self): + # TODO: Применить настройки генерации + self.accept() + +class HotkeysSettingsDialog(BaseSettingsDialog): + def __init__(self, parent=None): + super().__init__("⌨️ Горячие клавиши", parent) + self.setup_ui() + + def setup_ui(self): + # Генерация + generate_layout = QHBoxLayout() + generate_label = QLabel("Генерация:") + self.generate_input = QLineEdit("Ctrl+G") + generate_layout.addWidget(generate_label) + generate_layout.addWidget(self.generate_input) + self.layout.addLayout(generate_layout) + + # Открыть консоль + console_layout = QHBoxLayout() + console_label = QLabel("Открыть консоль:") + self.console_input = QLineEdit("Ctrl+`") + console_layout.addWidget(console_label) + console_layout.addWidget(self.console_input) + self.layout.addLayout(console_layout) + + # Кнопки + buttons_layout = QHBoxLayout() + save_button = QPushButton("Сохранить") + save_button.clicked.connect(self.save_settings) + cancel_button = QPushButton("Отмена") + cancel_button.clicked.connect(self.reject) + buttons_layout.addWidget(save_button) + buttons_layout.addWidget(cancel_button) + self.layout.addLayout(buttons_layout) + + def save_settings(self): + # TODO: Применить настройки горячих клавиш + self.accept() \ No newline at end of file