From 18e3969746fd691c9b57808690eb8d03f584ad6d Mon Sep 17 00:00:00 2001 From: Mateus Meyer Jiacomelli Date: Mon, 12 Dec 2022 08:04:28 +0000 Subject: [PATCH] Fixing Themes hot reload when using ServiceItem context menu (Song theme level) --- openlp/core/ui/servicemanager.py | 10 +++- openlp/core/ui/slidecontroller.py | 13 ++--- tests/openlp_core/ui/test_slidecontroller.py | 56 ++------------------ 3 files changed, 19 insertions(+), 60 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 2ebbf5c79..30d7d0bf4 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -1777,8 +1777,14 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi if not theme: theme = None item = self.find_service_item()[0] - self.service_items[item]['service_item'].update_theme(theme) - self.regenerate_service_items(True) + service_item = self.service_items[item]['service_item'] + # Needs to be checked before updating theme on service, as it generates a new identifier + is_selected_item_live = self.live_controller.service_item and \ + service_item.unique_identifier == self.live_controller.service_item.unique_identifier + service_item.update_theme(theme) + # self.regenerate_service_items(True) + if self.settings.value('themes/hot reload') and is_selected_item_live: + self.live_controller.refresh_service_item(service_item) def on_make_live_action_triggered(self, checked): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 41aaf5203..0718fa028 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -833,14 +833,15 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): # See bug #791050 self.toolbar.show() - def refresh_service_item(self): + def refresh_service_item(self, service_item=None): """ - Method to update the service item if the screen has changed + Method to update the current service item """ - if self.service_item.is_text() or self.service_item.is_image(): - item = self.service_item - item.render() - self._process_item(item, self.selected_row) + selected_row = self.selected_row + if not service_item: + service_item = self.service_item + self._process_item(service_item, selected_row, True) + self.slide_selected() def add_service_item(self, item): """ diff --git a/tests/openlp_core/ui/test_slidecontroller.py b/tests/openlp_core/ui/test_slidecontroller.py index f36331890..4e7bd9e36 100644 --- a/tests/openlp_core/ui/test_slidecontroller.py +++ b/tests/openlp_core/ui/test_slidecontroller.py @@ -567,67 +567,19 @@ def test_refresh_service_item_text(settings): mocked_service_item.is_text.return_value = True mocked_service_item.is_image.return_value = False mocked_process_item = MagicMock() + mocked_slide_selected = MagicMock() slide_controller = SlideController(None) slide_controller.service_item = mocked_service_item slide_controller._process_item = mocked_process_item + slide_controller.slide_selected = mocked_slide_selected slide_controller.selected_row = 5 # WHEN: The refresh_service_item method() is called slide_controller.refresh_service_item() # THEN: The item should be re-processed - mocked_service_item.is_text.assert_called_once_with() - assert 0 == mocked_service_item.is_image.call_count, 'is_image should not have been called' - mocked_service_item.render.assert_called_once_with() - mocked_process_item.assert_called_once_with(mocked_service_item, 5) - - -def test_refresh_service_item_image(settings): - """ - Test that the refresh_service_item() method refreshes a image service item - """ - # GIVEN: A mock service item and a fresh slide controller - mocked_service_item = MagicMock() - mocked_service_item.is_text.return_value = False - mocked_service_item.is_image.return_value = True - mocked_process_item = MagicMock() - slide_controller = SlideController(None) - slide_controller.service_item = mocked_service_item - slide_controller._process_item = mocked_process_item - slide_controller.selected_row = 5 - - # WHEN: The refresh_service_item method() is called - slide_controller.refresh_service_item() - - # THEN: The item should be re-processed - mocked_service_item.is_text.assert_called_once_with() - mocked_service_item.is_image.assert_called_once_with() - mocked_service_item.render.assert_called_once_with() - mocked_process_item.assert_called_once_with(mocked_service_item, 5) - - -def test_refresh_service_item_not_image_or_text(settings): - """ - Test that the refresh_service_item() method does not refresh a service item if it's neither text or an image - """ - # GIVEN: A mock service item and a fresh slide controller - mocked_service_item = MagicMock() - mocked_service_item.is_text.return_value = False - mocked_service_item.is_image.return_value = False - mocked_process_item = MagicMock() - slide_controller = SlideController(None) - slide_controller.service_item = mocked_service_item - slide_controller._process_item = mocked_process_item - slide_controller.selected_row = 5 - - # WHEN: The refresh_service_item method() is called - slide_controller.refresh_service_item() - - # THEN: The item should be re-processed - mocked_service_item.is_text.assert_called_once_with() - mocked_service_item.is_image.assert_called_once_with() - assert 0 == mocked_service_item.render.call_count, 'The render() method should not have been called' - assert 0 == mocked_process_item.call_count, 'The mocked_process_item() method should not have been called' + slide_controller._process_item.assert_called_once_with(mocked_service_item, 5, True) + slide_controller.slide_selected.assert_called_once() def test_add_service_item_with_song_edit(settings):