Save scrollbar visibility to settings

This commit is contained in:
Rebecca Breu 2021-05-14 16:23:03 +02:00
parent f3dd80af4d
commit a6ad6b47fe
4 changed files with 44 additions and 7 deletions

View file

@ -212,6 +212,7 @@ actions = [
'id': 'show_scrollbars',
'text': 'Show &Scrollbars',
'checkable': True,
'settings': 'View/show_scrollbars',
'callback': 'on_action_show_scrollbars',
},
{

View file

@ -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)

View file

@ -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)

View file

@ -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',