Panel and Toolbar enable/disable items in View menu
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication
|
||||||
|
|
||||||
from bedit_gui.controllers.document_controller import DocumentController
|
from bedit_gui.controllers.document_controller import DocumentController
|
||||||
from bedit_gui.controllers.undo_controller import UndoController
|
from bedit_gui.controllers.undo_controller import UndoController
|
||||||
|
from bedit_gui.controllers.view_menu_controller import ViewMenuController
|
||||||
from bedit_gui.controllers.window_state_controller import WindowStateController
|
from bedit_gui.controllers.window_state_controller import WindowStateController
|
||||||
from bedit_gui.documents import Document
|
from bedit_gui.documents import Document
|
||||||
from bedit_gui.views.main_window import MainWindow
|
from bedit_gui.views.main_window import MainWindow
|
||||||
@@ -20,6 +22,7 @@ def main() -> int:
|
|||||||
window = MainWindow()
|
window = MainWindow()
|
||||||
DocumentController(document, window)
|
DocumentController(document, window)
|
||||||
UndoController(document, window)
|
UndoController(document, window)
|
||||||
|
ViewMenuController(window)
|
||||||
window_state_controller = WindowStateController(app, window)
|
window_state_controller = WindowStateController(app, window)
|
||||||
window_state_controller.restore()
|
window_state_controller.restore()
|
||||||
window.showMaximized()
|
window.showMaximized()
|
||||||
|
|||||||
49
src/bedit_gui/controllers/view_menu_controller.py
Normal file
49
src/bedit_gui/controllers/view_menu_controller.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
from PySide6.QtCore import QObject
|
||||||
|
from PySide6.QtWidgets import QDockWidget, QMenu, QToolBar
|
||||||
|
|
||||||
|
from bedit_gui.views.main_window import MainWindow
|
||||||
|
|
||||||
|
|
||||||
|
class ViewMenuController(QObject):
|
||||||
|
"""Populate View submenus with synchronized visibility actions."""
|
||||||
|
|
||||||
|
def __init__(self, window: MainWindow) -> None:
|
||||||
|
super().__init__(window)
|
||||||
|
|
||||||
|
self.panels_menu = QMenu("Panels", window.ui.menuView)
|
||||||
|
self.toolbars_menu = QMenu("Toolbars", window.ui.menuView)
|
||||||
|
|
||||||
|
window.ui.actionPanels.setMenu(self.panels_menu)
|
||||||
|
window.ui.actionToolbars.setMenu(self.toolbars_menu)
|
||||||
|
|
||||||
|
self._populate(
|
||||||
|
self.panels_menu,
|
||||||
|
window.findChildren(QDockWidget),
|
||||||
|
)
|
||||||
|
self._populate(
|
||||||
|
self.toolbars_menu,
|
||||||
|
window.findChildren(QToolBar),
|
||||||
|
)
|
||||||
|
|
||||||
|
def _populate(
|
||||||
|
self,
|
||||||
|
menu: QMenu,
|
||||||
|
widgets: list[QDockWidget] | list[QToolBar],
|
||||||
|
) -> None:
|
||||||
|
for widget in sorted(widgets, key=self._label):
|
||||||
|
action = widget.toggleViewAction()
|
||||||
|
action.setText(self._label(widget))
|
||||||
|
menu.addAction(action)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _label(widget: QDockWidget | QToolBar) -> str:
|
||||||
|
title = widget.windowTitle().strip()
|
||||||
|
if title and title.lower() != "toolbar":
|
||||||
|
return title
|
||||||
|
|
||||||
|
name = re.sub(r"(DockWidget|Widget|ToolBar)$", "", widget.objectName())
|
||||||
|
return re.sub(r"(?<!^)(?=[A-Z])", " ", name).title()
|
||||||
38
tests/unit/test_view_menu_controller.py
Normal file
38
tests/unit/test_view_menu_controller.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from PySide6.QtWidgets import QApplication
|
||||||
|
|
||||||
|
from bedit_gui.controllers.view_menu_controller import ViewMenuController
|
||||||
|
from bedit_gui.views.main_window import MainWindow
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="module")
|
||||||
|
def qt_app() -> QApplication:
|
||||||
|
return QApplication.instance() or QApplication([])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.unit
|
||||||
|
def test_view_submenus_contain_visibility_actions(
|
||||||
|
qt_app: QApplication,
|
||||||
|
) -> None:
|
||||||
|
window = MainWindow()
|
||||||
|
controller = ViewMenuController(window)
|
||||||
|
|
||||||
|
assert window.ui.actionPanels.menu() is controller.panels_menu
|
||||||
|
assert window.ui.actionToolbars.menu() is controller.toolbars_menu
|
||||||
|
assert [action.text() for action in controller.panels_menu.actions()] == [
|
||||||
|
"Document Tree",
|
||||||
|
"Log",
|
||||||
|
]
|
||||||
|
assert [action.text() for action in controller.toolbars_menu.actions()] == [
|
||||||
|
"File",
|
||||||
|
"Undo",
|
||||||
|
]
|
||||||
|
assert all(
|
||||||
|
action.isCheckable()
|
||||||
|
for action in (
|
||||||
|
controller.panels_menu.actions()
|
||||||
|
+ controller.toolbars_menu.actions()
|
||||||
|
)
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user