Merge branch 'add-whole-verse-continuous-bible-layout-style' into 'master'

Add "Continuous (whole verses)" bible layout style

See merge request openlp/openlp!454
This commit is contained in:
Tim Bentley 2022-05-12 07:07:44 +00:00
commit eb6691b4fe
6 changed files with 46 additions and 7 deletions

View File

@ -90,6 +90,7 @@ class LayoutStyle(IntEnum):
VersePerSlide = 0
VersePerLine = 1
Continuous = 2
WholeVerseContinuous = 3
@unique

View File

@ -454,6 +454,7 @@ class UiStrings(metaclass=Singleton):
self.ViewMode = translate('OpenLP.Ui', 'View Mode')
self.Video = translate('OpenLP.Ui', 'Video')
self.WebDownloadText = translate('OpenLP.Ui', 'Web Interface, Download and Install Latest Version')
self.WholeVerseContinuous = translate('OpenLP.Ui', 'Continuous (whole verses)')
self.ZeroconfErrorIntro = translate('OpenLP.Ui', 'There was a problem advertising OpenLP\'s remote '
'interface on the network:')
self.ZeroconfGenericError = translate('OpenLP.Ui', 'An unknown error occurred')

View File

@ -617,7 +617,13 @@ class ThemePreviewRenderer(DisplayWindow, LogMixin):
line_end = ' '
# Bibles
if item and item.name == 'bibles':
pages = self._paginate_slide_words(text.split('\n'), line_end)
if item.is_capable(ItemCapabilities.CanWordSplit):
pages = self._paginate_slide_words(text.split('\n'), line_end)
else:
if item.is_capable(ItemCapabilities.NoLineBreaks):
pages = self._paginate_slide(text.split('\n'), "")
else:
pages = self._paginate_slide(text.split('\n'), line_end)
# Songs and Custom
elif item is None or (item and item.is_capable(ItemCapabilities.CanSoftBreak)):
pages = []
@ -705,7 +711,8 @@ class ThemePreviewRenderer(DisplayWindow, LogMixin):
formatted = []
previous_html = ''
previous_raw = ''
separator = '<br>'
# separator = '<br>'
separator = line_end
html_lines = list(map(render_tags, lines))
# Text too long so go to next page.
if not self._text_fits_on_slide(separator.join(html_lines)):

View File

@ -69,7 +69,7 @@ class BiblesTab(SettingsTab):
self.layout_style_label.setObjectName('layout_style_label')
self.layout_style_combo_box = QtWidgets.QComboBox(self.verse_display_group_box)
self.layout_style_combo_box.setObjectName('layout_style_combo_box')
self.layout_style_combo_box.addItems(['', '', ''])
self.layout_style_combo_box.addItems(['', '', '', ''])
self.verse_display_layout.addRow(self.layout_style_label, self.layout_style_combo_box)
self.bible_second_check_box = QtWidgets.QCheckBox(self.verse_display_group_box)
self.bible_second_check_box.setObjectName('bible_second_check_box')
@ -183,6 +183,7 @@ class BiblesTab(SettingsTab):
self.layout_style_combo_box.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide)
self.layout_style_combo_box.setItemText(LayoutStyle.VersePerLine, UiStrings().VersePerLine)
self.layout_style_combo_box.setItemText(LayoutStyle.Continuous, UiStrings().Continuous)
self.layout_style_combo_box.setItemText(LayoutStyle.WholeVerseContinuous, UiStrings().WholeVerseContinuous)
self.display_style_combo_box.setItemText(DisplayStyle.NoBrackets,
translate('BiblesPlugin.BiblesTab', 'No Brackets'))
self.display_style_combo_box.setItemText(DisplayStyle.Round,

View File

@ -198,7 +198,7 @@ class BibleMediaItem(MediaManagerItem):
self.second_combo_box = create_horizontal_adjusting_combo_box(self, 'second_combo_box')
self.general_bible_layout.addRow(translate('BiblesPlugin.MediaItem', 'Second:'), self.second_combo_box)
self.style_combo_box = create_horizontal_adjusting_combo_box(self, 'style_combo_box')
self.style_combo_box.addItems(['', '', ''])
self.style_combo_box.addItems(['', '', '', ''])
self.general_bible_layout.addRow(UiStrings().LayoutStyle, self.style_combo_box)
self.options_tab.setVisible(False)
self.page_layout.addWidget(self.options_tab)
@ -265,6 +265,7 @@ class BibleMediaItem(MediaManagerItem):
self.style_combo_box.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide)
self.style_combo_box.setItemText(LayoutStyle.VersePerLine, UiStrings().VersePerLine)
self.style_combo_box.setItemText(LayoutStyle.Continuous, UiStrings().Continuous)
self.style_combo_box.setItemText(LayoutStyle.WholeVerseContinuous, UiStrings().WholeVerseContinuous)
self.clear_button.setToolTip(translate('BiblesPlugin.MediaItem', 'Clear the results on the current tab.'))
self.save_results_button.setToolTip(
translate('BiblesPlugin.MediaItem', 'Add the search results to the saved list.'))
@ -296,6 +297,9 @@ class BibleMediaItem(MediaManagerItem):
visible = self.settings.value('bibles/second bibles')
self.general_bible_layout.labelForField(self.second_combo_box).setVisible(visible)
self.second_combo_box.setVisible(visible)
layout_style = self.settings.value('bibles/verse layout style')
if layout_style is not None:
self.style_combo_box.setCurrentIndex(layout_style)
def initialise(self):
"""
@ -954,6 +958,8 @@ class BibleMediaItem(MediaManagerItem):
# If we are 'Verse Per Line' then force a new line.
elif self.settings_tab.layout_style == LayoutStyle.VersePerLine:
bible_text = '{bible} {verse}{data[text]}\n'.format(bible=bible_text, verse=verse_text, data=data)
elif self.settings_tab.layout_style == LayoutStyle.WholeVerseContinuous:
bible_text = '{bible} {verse}{data[text]}\n'.format(bible=bible_text, verse=verse_text, data=data)
# We have to be 'Continuous'.
else:
bible_text = '{bible} {verse}{data[text]}'.format(bible=bible_text, verse=verse_text, data=data)
@ -989,9 +995,13 @@ class BibleMediaItem(MediaManagerItem):
if self.settings_tab.layout_style == LayoutStyle.Continuous and not data['second_bible']:
# Split the line but do not replace line breaks in renderer.
service_item.add_capability(ItemCapabilities.NoLineBreaks)
if self.settings_tab.layout_style == LayoutStyle.WholeVerseContinuous:
if not data['second_bible']:
service_item.add_capability(ItemCapabilities.NoLineBreaks)
else:
service_item.add_capability(ItemCapabilities.CanWordSplit)
service_item.add_capability(ItemCapabilities.CanPreview)
service_item.add_capability(ItemCapabilities.CanLoop)
service_item.add_capability(ItemCapabilities.CanWordSplit)
service_item.add_capability(ItemCapabilities.CanEditTitle)
# Service Item: Title
service_item.title = '{verse} {version}'.format(verse=verses.format_verses(), version=verses.format_versions())

View File

@ -250,9 +250,10 @@ def test_config_update_show_second_bible(media_item):
Test the config update method
"""
# GIVEN: An instance of :class:`MediaManagerItem` and mocked out settings class with known values
media_item.settings.value = lambda key: {'bibles/second bibles': True}[key]
media_item.settings.value = lambda key: {'bibles/second bibles': True, 'bibles/verse layout style': 0}[key]
media_item.general_bible_layout = MagicMock()
media_item.second_combo_box = MagicMock()
media_item.style_combo_box = MagicMock()
# WHEN: Calling config_update()
media_item.config_update()
@ -266,9 +267,10 @@ def test_config_update_hide_second_bible(media_item):
Test the config update method
"""
# GIVEN: An instance of :class:`MediaManagerItem` and mocked out settings class with known values
media_item.settings.value = lambda key: {'bibles/second bibles': False}[key]
media_item.settings.value = lambda key: {'bibles/second bibles': False, 'bibles/verse layout style': 0}[key]
media_item.general_bible_layout = MagicMock()
media_item.second_combo_box = MagicMock()
media_item.style_combo_box = MagicMock()
# WHEN: Calling config_update()
media_item.config_update()
@ -277,6 +279,23 @@ def test_config_update_hide_second_bible(media_item):
media_item.second_combo_box.setVisible.assert_called_once_with(False)
def test_config_update_set_layout_style(media_item):
"""
Test the config update method
"""
# GIVEN: An instance of :class:`MediaManagerItem` and mocked out settings class with known values
media_item.settings.value = lambda key: {'bibles/second bibles': True, 'bibles/verse layout style': 1}[key]
media_item.general_bible_layout = MagicMock()
media_item.second_combo_box = MagicMock()
media_item.style_combo_box = MagicMock()
# WHEN: Calling config_update()
media_item.config_update()
# THEN: style_combo_box should set the currentIndex to 1
media_item.style_combo_box.setCurrentIndex(1)
def test_initalise(media_item):
"""
Test the initalise method