diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0ca6968df..0d0cc8eff 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -43,7 +43,6 @@ from openlp.core.lib import OpenLPToolbar, ItemCapabilities, ServiceItem, ImageS ScreenList, build_icon, build_html from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType from openlp.core.lib.ui import create_action -from openlp.core.utils import elide_text from openlp.core.utils.actions import ActionList, CategoryOrder from openlp.core.ui.listpreviewwidget import ListPreviewWidget @@ -119,6 +118,7 @@ class InfoLabel(QtGui.QLabel): painter = QtGui.QPainter(self) metrics = QtGui.QFontMetrics(self.font()) elided = metrics.elidedText(self.text(), QtCore.Qt.ElideRight, self.width()) + # If the text is elided align it left to stop it jittering as the label is resized if elided == self.text(): alignment = QtCore.Qt.AlignCenter else: diff --git a/tests/functional/openlp_core_ui/test_slidecontroller.py b/tests/functional/openlp_core_ui/test_slidecontroller.py index d8663c20c..0137c5096 100644 --- a/tests/functional/openlp_core_ui/test_slidecontroller.py +++ b/tests/functional/openlp_core_ui/test_slidecontroller.py @@ -29,12 +29,13 @@ """ Package to test the openlp.core.ui.slidecontroller package. """ +from PyQt4 import QtCore, QtGui + from unittest import TestCase from openlp.core import Registry from openlp.core.lib import ServiceItemAction - from openlp.core.ui import SlideController -from openlp.core.ui.slidecontroller import WIDE_MENU, NON_TEXT_MENU +from openlp.core.ui.slidecontroller import InfoLabel, WIDE_MENU, NON_TEXT_MENU from tests.interfaces import MagicMock, patch @@ -558,3 +559,81 @@ class TestSlideController(TestCase): self.assertEqual(0, mocked_update_preview.call_count, 'Update preview should not have been called') mocked_preview_widget.change_slide.assert_called_once_with(7) mocked_slide_selected.assert_called_once_with() + +class TestInfoLabel(TestCase): + + def paint_event_text_fits_test(self): + """ + Test the paintEvent method when text fits the label + """ + font = QtGui.QFont() + metrics = QtGui.QFontMetrics(font) + + with patch('openlp.core.ui.slidecontroller.QtGui.QLabel'), \ + patch('openlp.core.ui.slidecontroller.QtGui.QPainter') as mocked_qpainter: + + # GIVEN: An instance of InfoLabel, with mocked text return, width and rect methods + info_label = InfoLabel() + test_string = 'Label Text' + mocked_rect = MagicMock() + mocked_text = MagicMock() + mocked_width = MagicMock() + mocked_text.return_value = test_string + info_label.rect = mocked_rect + info_label.text = mocked_text + info_label.width = mocked_width + + # WHEN: The instance is wider than its text, and the paintEvent method is called + info_label.width.return_value = metrics.boundingRect(test_string).width() + 10 + info_label.paintEvent(MagicMock()) + + # THEN: The text should be drawn centered with the complete test_string + mocked_qpainter().drawText.assert_called_once_with(mocked_rect(), QtCore.Qt.AlignCenter, test_string) + + def paint_event_text_doesnt_fit_test(self): + """ + Test the paintEvent method when text fits the label + """ + font = QtGui.QFont() + metrics = QtGui.QFontMetrics(font) + + with patch('openlp.core.ui.slidecontroller.QtGui.QLabel'), \ + patch('openlp.core.ui.slidecontroller.QtGui.QPainter') as mocked_qpainter: + + # GIVEN: An instance of InfoLabel, with mocked text return, width and rect methods + info_label = InfoLabel() + test_string = 'Label Text' + mocked_rect = MagicMock() + mocked_text = MagicMock() + mocked_width = MagicMock() + mocked_text.return_value = test_string + info_label.rect = mocked_rect + info_label.text = mocked_text + info_label.width = mocked_width + + # WHEN: The instance is narrower than its text, and the paintEvent method is called + label_width = metrics.boundingRect(test_string).width() - 10 + info_label.width.return_value = label_width + info_label.paintEvent(MagicMock()) + + # THEN: The text should be drawn aligned left with an elided test_string + elided_test_string = metrics.elidedText(test_string, QtCore.Qt.ElideRight, label_width) + mocked_qpainter().drawText.assert_called_once_with(mocked_rect(), QtCore.Qt.AlignLeft, elided_test_string) + + def set_text_test(self): + """ + Test the reimplemented setText method + """ + with patch('builtins.super') as mocked_super: + + # GIVEN: An instance of InfoLabel and mocked setToolTip method + info_label = InfoLabel() + set_tool_tip_mock = MagicMock() + info_label.setToolTip = set_tool_tip_mock + + # WHEN: Calling the instance method setText + info_label.setText('Label Text') + + # THEN: The setToolTip and super class setText methods should have been called with the same text + set_tool_tip_mock.assert_called_once_with('Label Text') + mocked_super().setText.assert_called_once_with('Label Text')