diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 6490d2b8d..6e0f4ad95 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -234,18 +234,22 @@ class ServiceManagerDialog(object): icon=u':/general/general_edit.png', triggers=self.create_custom) self.menu.addSeparator() # Add AutoPlay menu actions - self.auto_play_slides_group = QtGui.QMenu(translate('OpenLP.ServiceManager', '&Auto play slides')) - self.menu.addMenu(self.auto_play_slides_group) - self.auto_play_slides_loop = create_widget_action(self.auto_play_slides_group, + self.auto_play_slides_menu = QtGui.QMenu(translate('OpenLP.ServiceManager', '&Auto play slides')) + self.menu.addMenu(self.auto_play_slides_menu) + auto_play_slides_group = QtGui.QActionGroup(self.auto_play_slides_menu) + auto_play_slides_group.setExclusive(True) + self.auto_play_slides_loop = create_widget_action(self.auto_play_slides_menu, text=translate('OpenLP.ServiceManager', 'Auto play slides &Loop'), checked=False, triggers=self.toggle_auto_play_slides_loop) - self.auto_play_slides_once = create_widget_action(self.auto_play_slides_group, + auto_play_slides_group.addAction(self.auto_play_slides_loop) + self.auto_play_slides_once = create_widget_action(self.auto_play_slides_menu, text=translate('OpenLP.ServiceManager', 'Auto play slides &Once'), checked=False, triggers=self.toggle_auto_play_slides_once) - self.auto_play_slides_group.addSeparator() - self.timed_slide_interval = create_widget_action(self.auto_play_slides_group, + auto_play_slides_group.addAction(self.auto_play_slides_once) + self.auto_play_slides_menu.addSeparator() + self.timed_slide_interval = create_widget_action(self.auto_play_slides_menu, text=translate('OpenLP.ServiceManager', '&Delay between slides'), - checked=False, triggers=self.on_timed_slide_interval) + triggers=self.on_timed_slide_interval) self.menu.addSeparator() self.preview_action = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', 'Show &Preview'), icon=u':/general/general_preview.png', triggers=self.make_preview) @@ -786,7 +790,7 @@ class ServiceManager(QtGui.QWidget, ServiceManagerDialog): self.notes_action.setVisible(True) if service_item[u'service_item'].is_capable(ItemCapabilities.CanLoop) and \ len(service_item[u'service_item'].get_frames()) > 1: - self.auto_play_slides_group.menuAction().setVisible(True) + self.auto_play_slides_menu.menuAction().setVisible(True) self.auto_play_slides_once.setChecked(service_item[u'service_item'].auto_play_slides_once) self.auto_play_slides_loop.setChecked(service_item[u'service_item'].auto_play_slides_loop) self.timed_slide_interval.setChecked(service_item[u'service_item'].timed_slide_interval > 0) @@ -798,7 +802,7 @@ class ServiceManager(QtGui.QWidget, ServiceManagerDialog): translate('OpenLP.ServiceManager', '&Delay between slides') + delay_suffix) # TODO for future: make group explains itself more visually else: - self.auto_play_slides_group.menuAction().setVisible(False) + self.auto_play_slides_menu.menuAction().setVisible(False) if service_item[u'service_item'].is_capable(ItemCapabilities.HasVariableStartTime): self.time_action.setVisible(True) if service_item[u'service_item'].is_capable(ItemCapabilities.CanAutoStartForLive): diff --git a/tests/interfaces/openlp_core_ui/test_servicemanager.py b/tests/interfaces/openlp_core_ui/test_servicemanager.py index 4e309e889..a651ca29c 100644 --- a/tests/interfaces/openlp_core_ui/test_servicemanager.py +++ b/tests/interfaces/openlp_core_ui/test_servicemanager.py @@ -3,11 +3,11 @@ """ from unittest import TestCase -from mock import MagicMock, patch +from mock import MagicMock, Mock, patch from PyQt4 import QtGui -from openlp.core.lib import Registry, ScreenList +from openlp.core.lib import Registry, ScreenList, ServiceItem from openlp.core.ui.mainwindow import MainWindow @@ -42,3 +42,44 @@ class TestServiceManager(TestCase): # THEN the count of items should be zero self.assertEqual(self.service_manager.service_manager_list.topLevelItemCount(), 0, u'The service manager list should be empty ') + + def context_menu_test(self): + """ + Test the context_menu() method. + """ + # GIVEN: A service item added + with patch(u'PyQt4.QtGui.QTreeWidget.itemAt') as mocked_item_at_method, \ + patch(u'PyQt4.QtGui.QWidget.mapToGlobal') as mocked_map_to_global, \ + patch(u'PyQt4.QtGui.QMenu.exec_') as mocked_exec: + mocked_item = MagicMock() + mocked_item.parent.return_value = None + mocked_item_at_method.return_value = mocked_item + # We want 1 to be returned for the position + mocked_item.data.return_value = 1 + # A service item without capabilities. + service_item = ServiceItem() + self.service_manager.service_items = [{u'service_item': service_item}] + q_point = None + # Mocked actions. + self.service_manager.edit_action.setVisible = Mock() + self.service_manager.create_custom_action.setVisible = Mock() + self.service_manager.maintain_action.setVisible = Mock() + self.service_manager.notes_action.setVisible = Mock() + self.service_manager.time_action.setVisible = Mock() + self.service_manager.auto_start_action.setVisible = Mock() + + # WHEN: Show the context menu. + self.service_manager.context_menu(q_point) + + # THEN: The following actions should be not visible. + self.service_manager.edit_action.setVisible.assert_called_once_with(False), \ + u'The action should be set invisible.' + self.service_manager.create_custom_action.setVisible.assert_called_once_with(False), \ + u'The action should be set invisible.' + self.service_manager.maintain_action.setVisible.assert_called_once_with(False), \ + u'The action should be set invisible.' + self.service_manager.notes_action.setVisible.assert_called_with(True), u'The action should be set visible.' + self.service_manager.time_action.setVisible.assert_called_once_with(False), \ + u'The action should be set invisible.' + self.service_manager.auto_start_action.setVisible.assert_called_once_with(False), \ + u'The action should be set invisible.'