From 4ef667f56228686651010434db047eefd6005e61 Mon Sep 17 00:00:00 2001 From: Danil Iarosh Date: Fri, 31 Jul 2026 15:55:32 +0300 Subject: [PATCH] Add Tools actions to main QToolBar separated from other actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен QToolBar (Панель инструментов) в главное окно. - На панель инструментов вынесены все действия из меню Инструменты (Новая линия, Новый светодиод, Сгенерировать скрипт, Автоблоки, Против часовой, Кисть). - Действия инструментов отделены от основных действий (Создать, Открыть, Сохранить, Отменить, Повторить) вертикальным разделителем (separator). - Исправлен и обновлен тест test_main_window_has_classic_menu_bar в qa_smoke.py. --- main_window.py | 31 +++++++++++++++++++++++++++++++ qa_smoke.py | 15 +++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/main_window.py b/main_window.py index 6b0940d..e5a60bb 100644 --- a/main_window.py +++ b/main_window.py @@ -28,6 +28,7 @@ from PySide6.QtWidgets import ( QStackedWidget, QTableWidget, QTableWidgetItem, + QToolBar, QToolButton, QTreeWidget, QTreeWidgetItem, @@ -586,6 +587,36 @@ class MainWindow(QMainWindow): splitter.setSizes([SIDEBAR_DEFAULT_WIDTH, 1000]) self.setCentralWidget(splitter) + # Create main toolbar + toolbar = QToolBar("Панель инструментов", self) + toolbar.setObjectName("main_toolbar") + toolbar.setMovable(False) + toolbar.setIconSize(QSize(20, 20)) + toolbar.setToolButtonStyle(Qt.ToolButtonIconOnly) + + # Standard file & edit actions + toolbar.addAction(self.actions["new"]) + toolbar.addAction(self.actions["open"]) + toolbar.addAction(self.actions["save"]) + toolbar.addSeparator() + toolbar.addAction(self.actions["undo"]) + toolbar.addAction(self.actions["redo"]) + + # Vertical separator between standard actions and tools + toolbar.addSeparator() + + # Tools menu actions + toolbar.addAction(self.actions["add_line"]) + toolbar.addAction(self.actions["add_led"]) + toolbar.addAction(self.actions["generate_script"]) + toolbar.addSeparator() + toolbar.addAction(self.actions["auto_blocks"]) + toolbar.addAction(self.actions["counterclockwise"]) + toolbar.addSeparator() + toolbar.addAction(self.actions["brush"]) + + self.addToolBar(toolbar) + def _on_sidebar_content_splitter_moved(self, _pos: int, _index: int) -> None: if self.sidebar_content_splitter is None or self._sidebar_collapsed: return diff --git a/qa_smoke.py b/qa_smoke.py index 23a83ee..515c58e 100644 --- a/qa_smoke.py +++ b/qa_smoke.py @@ -1909,11 +1909,6 @@ def test_canvas_refresh_does_not_accumulate_connection_items() -> None: assert len(canvas.items_by_id) == len(doc.points) -def test_main_window_has_classic_menu_bar() -> None: - if MainWindow is None or QApplication is None: - return - app = QApplication.instance() or QApplication([]) - window = MainWindow() def test_main_window_has_classic_menu_bar() -> None: if MainWindow is None or QApplication is None: return @@ -1923,7 +1918,15 @@ def test_main_window_has_classic_menu_bar() -> None: menu_titles = [action.text() for action in window.menuBar().actions()] assert menu_titles[:4] == ["Файл", "Правка", "Вид", "Инструменты"] - assert QToolBar is None or not window.findChildren(QToolBar) + + if QToolBar is not None: + toolbars = window.findChildren(QToolBar) + assert len(toolbars) == 1 + tb = toolbars[0] + actions = [action.text() for action in tb.actions() if not action.isSeparator()] + assert "Новая линия" in actions + assert "Новый светодиод" in actions + assert "Кисть" in actions window.close()