diff --git a/beeref/actions/actions.py b/beeref/actions/actions.py index ccf8614..9f047ce 100644 --- a/beeref/actions/actions.py +++ b/beeref/actions/actions.py @@ -212,6 +212,7 @@ actions = [ 'id': 'show_scrollbars', 'text': 'Show &Scrollbars', 'checkable': True, + 'settings': 'View/show_scrollbars', 'callback': 'on_action_show_scrollbars', }, { diff --git a/beeref/actions/mixin.py b/beeref/actions/mixin.py index 0d55cfd..35db186 100644 --- a/beeref/actions/mixin.py +++ b/beeref/actions/mixin.py @@ -49,18 +49,32 @@ class ActionsMixin: self.bee_actions = {} self.bee_actiongroups = defaultdict(list) + def _store_checkable_setting(self, key, value): + self.settings.setValue(key, value) + + def _init_action_checkable(self, actiondef, qaction): + qaction.setCheckable(True) + callback = getattr(self, actiondef['callback']) + qaction.toggled.connect(callback) + settings_key = actiondef.get('settings') + if settings_key: + val = self.settings.value(settings_key, False, type=bool) + qaction.setChecked(val) + callback(val) + qaction.toggled.connect( + partial(self._store_checkable_setting, settings_key)) + def _create_actions(self): for action in actions: qaction = QtGui.QAction(action['text'], self) if 'shortcuts' in action: qaction.setShortcuts(action['shortcuts']) if action.get('checkable', False): - qaction.toggled.connect(getattr(self, action['callback'])) + self._init_action_checkable(action, qaction) else: qaction.triggered.connect(getattr(self, action['callback'])) self.addAction(qaction) qaction.setEnabled(action.get('enabled', True)) - qaction.setCheckable(action.get('checkable', False)) self.bee_actions[action['id']] = qaction if 'group' in action: self.bee_actiongroups[action['group']].append(qaction) diff --git a/beeref/view.py b/beeref/view.py index 8ed88bc..791a903 100644 --- a/beeref/view.py +++ b/beeref/view.py @@ -52,10 +52,6 @@ class BeeGraphicsView(QtWidgets.QGraphicsView, ActionsMixin): self.scene = BeeGraphicsScene(self.undo_stack) self.filename = None - self.setHorizontalScrollBarPolicy( - Qt.ScrollBarPolicy.ScrollBarAlwaysOff) - self.setVerticalScrollBarPolicy( - Qt.ScrollBarPolicy.ScrollBarAlwaysOff) self.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) self.setAcceptDrops(True) diff --git a/tests/actions/test_mixin.py b/tests/actions/test_mixin.py index 8af9cbf..f56027c 100644 --- a/tests/actions/test_mixin.py +++ b/tests/actions/test_mixin.py @@ -1,5 +1,5 @@ import os.path -from unittest.mock import patch +from unittest.mock import patch, MagicMock from PyQt6 import QtWidgets @@ -9,6 +9,8 @@ from ..base import BeeTestCase class FooWidget(QtWidgets.QWidget, ActionsMixin): + settings = MagicMock + def on_foo(self): pass @@ -71,8 +73,32 @@ class ActionsMixinTestCase(BeeTestCase): qaction = self.widget.actions()[0] assert qaction.text() == '&Foo' assert qaction.isEnabled() is True + assert qaction.isChecked() is False assert self.widget.bee_actions['foo'] == qaction + @patch.object(FooWidget, 'on_foo') + @patch.object(FooWidget, 'settings') + @patch('PyQt6.QtGui.QAction.toggled') + def test_create_actions_checkable_with_settings( + self, toggle_mock, settings_mock, callback_mock): + self.actions_mock.__iter__.return_value = [{ + 'id': 'foo', + 'text': '&Foo', + 'checkable': True, + 'callback': 'on_foo', + 'settings': 'foo/bar', + }] + + self.menu_mock.__iter__.return_value = ['foo'] + settings_mock.value.return_value = True + self.widget.build_menu_and_actions() + settings_mock.value.assert_called_once_with( + 'foo/bar', False, type=bool) + qaction = self.widget.actions()[0] + assert qaction.isChecked() is True + assert toggle_mock.connect.call_count == 2 + callback_mock.assert_called_once_with(True) + def test_create_actions_enabled_false(self): self.actions_mock.__iter__.return_value = [{ 'id': 'foo',