forked from openlp/openlp
Rework to use a subclassed QLabel to allow dynamic resizing
This commit is contained in:
parent
52c7d89706
commit
20d927b270
@ -43,7 +43,6 @@ from openlp.core.lib import OpenLPToolbar, ItemCapabilities, ServiceItem, ImageS
|
|||||||
ScreenList, build_icon, build_html
|
ScreenList, build_icon, build_html
|
||||||
from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType
|
from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType
|
||||||
from openlp.core.lib.ui import create_action
|
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.utils.actions import ActionList, CategoryOrder
|
||||||
from openlp.core.ui.listpreviewwidget import ListPreviewWidget
|
from openlp.core.ui.listpreviewwidget import ListPreviewWidget
|
||||||
|
|
||||||
@ -119,6 +118,7 @@ class InfoLabel(QtGui.QLabel):
|
|||||||
painter = QtGui.QPainter(self)
|
painter = QtGui.QPainter(self)
|
||||||
metrics = QtGui.QFontMetrics(self.font())
|
metrics = QtGui.QFontMetrics(self.font())
|
||||||
elided = metrics.elidedText(self.text(), QtCore.Qt.ElideRight, self.width())
|
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():
|
if elided == self.text():
|
||||||
alignment = QtCore.Qt.AlignCenter
|
alignment = QtCore.Qt.AlignCenter
|
||||||
else:
|
else:
|
||||||
|
@ -29,12 +29,13 @@
|
|||||||
"""
|
"""
|
||||||
Package to test the openlp.core.ui.slidecontroller package.
|
Package to test the openlp.core.ui.slidecontroller package.
|
||||||
"""
|
"""
|
||||||
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from openlp.core import Registry
|
from openlp.core import Registry
|
||||||
from openlp.core.lib import ServiceItemAction
|
from openlp.core.lib import ServiceItemAction
|
||||||
|
|
||||||
from openlp.core.ui import SlideController
|
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
|
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')
|
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_preview_widget.change_slide.assert_called_once_with(7)
|
||||||
mocked_slide_selected.assert_called_once_with()
|
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')
|
||||||
|
Loading…
Reference in New Issue
Block a user