forked from openlp/openlp
Fix slow preview after fetching live image
This commit is contained in:
parent
92d67468e2
commit
a02ca297d6
@ -206,7 +206,6 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
|
||||
self.panel = QtWidgets.QWidget(self.main_window.control_splitter)
|
||||
self.slide_list = {}
|
||||
self.slide_count = 0
|
||||
self.slide_image = None
|
||||
self.controller_width = -1
|
||||
# Layout for holding panel
|
||||
self.panel_layout = QtWidgets.QVBoxLayout(self.panel)
|
||||
@ -1198,38 +1197,35 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties):
|
||||
if self.service_item and self.service_item.is_capable(ItemCapabilities.ProvidesOwnDisplay):
|
||||
if self.is_live:
|
||||
# If live, grab screen-cap of main display now
|
||||
QtCore.QTimer.singleShot(500, self.grab_maindisplay)
|
||||
QtCore.QTimer.singleShot(500, self.display_maindisplay)
|
||||
# but take another in a couple of seconds in case slide change is slow
|
||||
QtCore.QTimer.singleShot(2500, self.grab_maindisplay)
|
||||
QtCore.QTimer.singleShot(2500, self.display_maindisplay)
|
||||
else:
|
||||
# If not live, use the slide's thumbnail/icon instead
|
||||
image_path = Path(self.service_item.get_rendered_frame(self.selected_row))
|
||||
# if self.service_item.is_capable(ItemCapabilities.HasThumbnails):
|
||||
# image = self.image_manager.get_image(image_path, ImageSource.CommandPlugins)
|
||||
# self.slide_image = QtGui.QPixmap.fromImage(image)
|
||||
# else:
|
||||
# self.slide_image = QtGui.QPixmap(image_path)
|
||||
# self.slide_image.setDevicePixelRatio(self.main_window.devicePixelRatio())
|
||||
# self.slide_preview.setPixmap(self.slide_image)
|
||||
self.preview_display.set_single_image('#000', image_path)
|
||||
else:
|
||||
self.preview_display.go_to_slide(self.selected_row)
|
||||
self.slide_count += 1
|
||||
|
||||
def display_maindisplay(self):
|
||||
"""
|
||||
Gets an image of the display screen and updates the preview frame.
|
||||
"""
|
||||
display_image = self.grab_maindisplay()
|
||||
base64_image = image_to_byte(display_image)
|
||||
self.preview_display.set_single_image_data('#000', base64_image)
|
||||
|
||||
def grab_maindisplay(self):
|
||||
"""
|
||||
Creates an image of the current screen and updates the preview frame.
|
||||
Creates an image of the current screen.
|
||||
"""
|
||||
win_id = QtWidgets.QApplication.desktop().winId()
|
||||
screen = QtWidgets.QApplication.primaryScreen()
|
||||
rect = ScreenList().current.display_geometry
|
||||
win_image = screen.grabWindow(win_id, rect.x(), rect.y(), rect.width(), rect.height())
|
||||
win_image.setDevicePixelRatio(self.preview_display.devicePixelRatio())
|
||||
# self.slide_preview.setPixmap(win_image)
|
||||
self.slide_image = win_image
|
||||
base64_image = image_to_byte(win_image)
|
||||
self.preview_display.set_single_image_data('#000', base64_image)
|
||||
return self.slide_image
|
||||
return win_image
|
||||
|
||||
def on_slide_selected_next_action(self, checked):
|
||||
"""
|
||||
|
@ -826,7 +826,7 @@ def test_update_preview_live(mocked_singleShot, mocked_image_manager, registry):
|
||||
slide_controller.screens.current = {'primary': ''}
|
||||
slide_controller.displays = [MagicMock()]
|
||||
slide_controller.display.preview.return_value = QtGui.QImage()
|
||||
slide_controller.grab_maindisplay = MagicMock()
|
||||
slide_controller.display_maindisplay = MagicMock()
|
||||
slide_controller.slide_preview = MagicMock()
|
||||
slide_controller.slide_count = 0
|
||||
|
||||
@ -836,7 +836,7 @@ def test_update_preview_live(mocked_singleShot, mocked_image_manager, registry):
|
||||
# THEN: A screen_grab should have been called
|
||||
assert 0 == slide_controller.slide_preview.setPixmap.call_count, 'setPixmap should not be called'
|
||||
assert 0 == slide_controller.display.preview.call_count, 'display.preview() should not be called'
|
||||
assert 2 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should have been called 2 times'
|
||||
assert 2 == mocked_singleShot.call_count, 'Timer to display_maindisplay should have been called 2 times'
|
||||
assert 0 == mocked_image_manager.get_image.call_count, 'image_manager not be called'
|
||||
|
||||
|
||||
@ -867,7 +867,7 @@ def test_update_preview_pres(mocked_singleShot, mocked_image_manager, registry):
|
||||
slide_controller.screens.current = {'primary': ''}
|
||||
slide_controller.displays = [MagicMock()]
|
||||
slide_controller.display.preview.return_value = QtGui.QImage()
|
||||
slide_controller.grab_maindisplay = MagicMock()
|
||||
slide_controller.display_maindisplay = MagicMock()
|
||||
slide_controller.slide_preview = MagicMock()
|
||||
slide_controller.slide_count = 0
|
||||
slide_controller.preview_display = MagicMock()
|
||||
@ -877,7 +877,7 @@ def test_update_preview_pres(mocked_singleShot, mocked_image_manager, registry):
|
||||
|
||||
# THEN: setPixmap and the image_manager should have been called
|
||||
assert 1 == slide_controller.preview_display.set_single_image.call_count, 'set_single_image should be called'
|
||||
assert 0 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should not be called'
|
||||
assert 0 == mocked_singleShot.call_count, 'Timer to display_maindisplay should not be called'
|
||||
|
||||
|
||||
@patch(u'openlp.core.ui.slidecontroller.SlideController.image_manager')
|
||||
@ -908,7 +908,7 @@ def test_update_preview_media(mocked_singleShot, mocked_image_manager, registry)
|
||||
slide_controller.screens.current = {'primary': ''}
|
||||
slide_controller.displays = [MagicMock()]
|
||||
slide_controller.display.preview.return_value = QtGui.QImage()
|
||||
slide_controller.grab_maindisplay = MagicMock()
|
||||
slide_controller.display_maindisplay = MagicMock()
|
||||
slide_controller.slide_preview = MagicMock()
|
||||
slide_controller.slide_count = 0
|
||||
slide_controller.preview_display = MagicMock()
|
||||
@ -918,7 +918,7 @@ def test_update_preview_media(mocked_singleShot, mocked_image_manager, registry)
|
||||
|
||||
# THEN: setPixmap should have been called
|
||||
assert 1 == slide_controller.preview_display.set_single_image.call_count, 'set_single_image should be called'
|
||||
assert 0 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should not be called'
|
||||
assert 0 == mocked_singleShot.call_count, 'Timer to display_maindisplay should not be called'
|
||||
assert 0 == mocked_image_manager.get_image.call_count, 'image_manager should not be called'
|
||||
|
||||
|
||||
@ -949,7 +949,7 @@ def test_update_preview_image(mocked_singleShot, mocked_image_manager, registry)
|
||||
slide_controller.screens = MagicMock()
|
||||
slide_controller.screens.current = {'primary': ''}
|
||||
slide_controller.displays = [MagicMock()]
|
||||
slide_controller.grab_maindisplay = MagicMock()
|
||||
slide_controller.display_maindisplay = MagicMock()
|
||||
slide_controller.slide_preview = MagicMock()
|
||||
slide_controller.slide_count = 0
|
||||
slide_controller.preview_display = MagicMock()
|
||||
@ -959,10 +959,31 @@ def test_update_preview_image(mocked_singleShot, mocked_image_manager, registry)
|
||||
|
||||
# THEN: setPixmap and display.preview should have been called
|
||||
assert 1 == slide_controller.preview_display.go_to_slide.call_count, 'go_to_slide should be called'
|
||||
assert 0 == mocked_singleShot.call_count, 'Timer to grab_maindisplay should not be called'
|
||||
assert 0 == mocked_singleShot.call_count, 'Timer to display_maindisplay should not be called'
|
||||
assert 0 == mocked_image_manager.get_image.call_count, 'image_manager should not be called'
|
||||
|
||||
|
||||
@patch(u'openlp.core.ui.slidecontroller.image_to_byte')
|
||||
def test_display_maindisplay(mocked_image_to_byte, registry):
|
||||
"""
|
||||
Test the display_maindisplay method
|
||||
Here a string is substituted for what would be a screen capture of the display
|
||||
The `image_to_byte` mocked funtion just adds " bytified" to the string
|
||||
"""
|
||||
# GIVEN: A mocked slide controller, with mocked functions
|
||||
slide_controller = SlideController(None)
|
||||
slide_controller.grab_maindisplay = MagicMock(return_value='placeholder')
|
||||
slide_controller.preview_display = MagicMock()
|
||||
mocked_image_to_byte.side_effect = lambda x: '{} bytified'.format(x)
|
||||
|
||||
# WHEN: display_maindisplay is called
|
||||
slide_controller.display_maindisplay()
|
||||
|
||||
# THEN: Should have grabbed the maindisplay and set to placeholder with a black background
|
||||
slide_controller.grab_maindisplay.assert_called_once()
|
||||
slide_controller.preview_display.set_single_image_data.assert_called_once_with('#000', 'placeholder bytified')
|
||||
|
||||
|
||||
def test_paint_event_text_fits():
|
||||
"""
|
||||
Test the paintEvent method when text fits the label
|
||||
|
Loading…
Reference in New Issue
Block a user