Merge branch 'new-theme-controls' into 'master'

New theme adjustments: Adding letter spacing to theme main area; adding line and letter spacing to footer

See merge request openlp/openlp!611
This commit is contained in:
Tim Bentley 2023-06-06 15:47:41 +00:00
commit 72ac7dfd5e
8 changed files with 58 additions and 12 deletions

View File

@ -1248,6 +1248,7 @@ var Display = {
mainStyle["font-style"] = !!Display._theme.font_main_italics ? "italic" : "";
mainStyle["font-weight"] = !!Display._theme.font_main_bold ? "bold" : "";
mainStyle["line-height"] = "" + (100 + Display._theme.font_main_line_adjustment) + "%";
mainStyle["letter-spacing"] = "" + (Display._theme.font_main_letter_adjustment) + 'px';
// Using text-align-last because there is a <br> seperating each line
switch (Display._theme.display_horizontal_align) {
case HorizontalAlign.Justify:
@ -1322,6 +1323,8 @@ var Display = {
footerStyle["font-size"] = "" + Display._theme.font_footer_size + "pt";
footerStyle["font-style"] = !!Display._theme.font_footer_italics ? "italic" : "";
footerStyle["font-weight"] = !!Display._theme.font_footer_bold ? "bold" : "";
footerStyle["line-height"] = "" + (100 + Display._theme.font_footer_line_adjustment) + "%";
footerStyle["letter-spacing"] = "" + (Display._theme.font_footer_letter_adjustment) + 'px';
footerStyle["white-space"] = Display._theme.font_footer_wrap ? "normal" : "nowrap";
for (var footerKey in footerStyle) {
if (footerStyle.hasOwnProperty(footerKey)) {

View File

@ -10,12 +10,14 @@
},
"display" :{
"horizontal_align": 0,
"horizontal_align_footer": 0,
"slide_transition": false,
"slide_transition_type": 0,
"slide_transition_speed": 0,
"slide_transition_direction": 0,
"slide_transition_reverse": false,
"vertical_align": 0
"vertical_align": 0,
"vertical_align_footer": 0
},
"font": {
"footer": {
@ -24,6 +26,7 @@
"height": 78,
"italics": false,
"line_adjustment": 0,
"letter_adjustment": 0,
"location": "",
"name": "Arial",
"outline": false,
@ -44,6 +47,7 @@
"height": 690,
"italics": false,
"line_adjustment": 0,
"letter_adjustment": 0,
"location": "",
"name": "Arial",
"outline": false,

View File

@ -285,9 +285,9 @@ class VerticalType(object):
BOOLEAN_LIST = ['bold', 'italics', 'override', 'outline', 'shadow', 'slide_transition', 'slide_transition_reverse']
INTEGER_LIST = ['size', 'line_adjustment', 'x', 'height', 'y', 'width', 'shadow_size', 'outline_size',
'horizontal_align', 'vertical_align', 'wrap_style', 'slide_transition_type', 'slide_transition_speed',
'slide_transition_direction']
INTEGER_LIST = ['size', 'line_adjustment', 'letter_adjustment', 'x', 'height', 'y', 'width', 'shadow_size',
'outline_size', 'horizontal_align', 'vertical_align', 'wrap_style', 'slide_transition_type',
'slide_transition_speed', 'slide_transition_direction']
class Theme(object):

View File

@ -37,6 +37,7 @@ class FontSelectPage(GridLayoutPage):
Outline = 'outline'
Shadow = 'shadow'
LineSpacing = 'line_spacing'
LetterSpacing = 'letter_spacing'
font_name_changed = QtCore.pyqtSignal(str)
font_size_changed = QtCore.pyqtSignal(int)
@ -44,6 +45,7 @@ class FontSelectPage(GridLayoutPage):
is_bold_changed = QtCore.pyqtSignal(bool)
is_italic_changed = QtCore.pyqtSignal(bool)
line_spacing_changed = QtCore.pyqtSignal(int)
letter_spacing_changed = QtCore.pyqtSignal(int)
is_outline_enabled_changed = QtCore.pyqtSignal(bool)
outline_color_changed = QtCore.pyqtSignal(str)
outline_size_changed = QtCore.pyqtSignal(int)
@ -56,7 +58,8 @@ class FontSelectPage(GridLayoutPage):
self.feature_widgets = {
FontSelectPage.Outline: [self.outline_groupbox],
FontSelectPage.Shadow: [self.shadow_groupbox],
FontSelectPage.LineSpacing: [self.line_spacing_label, self.line_spacing_spinbox]
FontSelectPage.LineSpacing: [self.line_spacing_label, self.line_spacing_spinbox],
FontSelectPage.LetterSpacing: [self.letter_spacing_label, self.letter_spacing_spinbox]
}
def setup_ui(self):
@ -111,13 +114,22 @@ class FontSelectPage(GridLayoutPage):
self.line_spacing_spinbox.setMaximum(250)
self.line_spacing_spinbox.setObjectName('line_spacing_spinbox')
self.layout.addWidget(self.line_spacing_spinbox, 2, 3)
# Letter spacing
self.letter_spacing_label = FormLabel(self)
self.letter_spacing_label.setObjectName('letter_spacing_label')
self.layout.addWidget(self.letter_spacing_label, 3, 2)
self.letter_spacing_spinbox = QtWidgets.QDoubleSpinBox(self)
self.letter_spacing_spinbox.setMinimum(-250)
self.letter_spacing_spinbox.setMaximum(250)
self.letter_spacing_spinbox.setObjectName('letter_spacing_spinbox')
self.layout.addWidget(self.letter_spacing_spinbox, 3, 3)
# Outline
self.outline_groupbox = QtWidgets.QGroupBox(self)
self.outline_groupbox.setCheckable(True)
self.outline_groupbox.setChecked(False)
self.outline_groupbox.setObjectName('outline_groupbox')
self.outline_layout = QtWidgets.QGridLayout(self.outline_groupbox)
self.layout.addWidget(self.outline_groupbox, 3, 0, 1, 2)
self.layout.addWidget(self.outline_groupbox, 4, 0, 1, 2)
# Outline colour
self.outline_color_label = FormLabel(self.outline_groupbox)
self.outline_color_label.setObjectName('outline_color_label')
@ -139,7 +151,7 @@ class FontSelectPage(GridLayoutPage):
self.shadow_groupbox.setChecked(False)
self.shadow_groupbox.setObjectName('shadow_groupbox')
self.shadow_layout = QtWidgets.QGridLayout(self.shadow_groupbox)
self.layout.addWidget(self.shadow_groupbox, 3, 2, 1, 2)
self.layout.addWidget(self.shadow_groupbox, 4, 2, 1, 2)
# Shadow color
self.shadow_color_label = FormLabel(self.shadow_groupbox)
self.shadow_color_label.setObjectName('shadow_color_label')
@ -162,6 +174,7 @@ class FontSelectPage(GridLayoutPage):
self.style_italic_button.toggled.connect(self._on_style_italic_toggled)
self.font_size_spinbox.valueChanged.connect(self._on_font_size_changed)
self.line_spacing_spinbox.valueChanged.connect(self._on_line_spacing_changed)
self.letter_spacing_spinbox.valueChanged.connect(self._on_letter_spacing_changed)
self.outline_groupbox.toggled.connect(self._on_outline_toggled)
self.outline_color_button.colorChanged.connect(self._on_outline_color_changed)
self.outline_size_spinbox.valueChanged.connect(self._on_outline_size_changed)
@ -184,6 +197,7 @@ class FontSelectPage(GridLayoutPage):
self.font_size_label.setText(translate('OpenLP.FontSelectWidget', 'Size:'))
self.font_size_spinbox.setSuffix(' {unit}'.format(unit=UiStrings().FontSizePtUnit))
self.line_spacing_label.setText(translate('OpenLP.FontSelectWidget', 'Line Spacing:'))
self.letter_spacing_label.setText(translate('OpenLP.FontSelectWidget', 'Letter Spacing:'))
self.outline_groupbox.setTitle(translate('OpenLP.FontSelectWidget', 'Outline'))
self.outline_color_label.setText(translate('OpenLP.FontSelectWidget', 'Color:'))
self.outline_size_label.setText(translate('OpenLP.FontSelectWidget', 'Size:'))
@ -210,6 +224,9 @@ class FontSelectPage(GridLayoutPage):
def _on_line_spacing_changed(self, spacing):
self.line_spacing_changed.emit(spacing)
def _on_letter_spacing_changed(self, spacing):
self.letter_spacing_changed.emit(spacing)
def _on_outline_toggled(self, is_enabled):
self.is_outline_enabled_changed.emit(is_enabled)
@ -296,6 +313,14 @@ class FontSelectPage(GridLayoutPage):
def line_spacing(self, line_spacing):
self.line_spacing_spinbox.setValue(line_spacing)
@property
def letter_spacing(self):
return self.letter_spacing_spinbox.value()
@letter_spacing.setter
def letter_spacing(self, letter_spacing):
self.letter_spacing_spinbox.setValue(letter_spacing)
@property
def is_outline_enabled(self):
return self.outline_groupbox.isChecked()

View File

@ -70,12 +70,15 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.main_area_page.font_name_changed.connect(self.calculate_lines)
self.main_area_page.font_size_changed.connect(self.calculate_lines)
self.main_area_page.line_spacing_changed.connect(self.calculate_lines)
self.main_area_page.letter_spacing_changed.connect(self.calculate_lines)
self.main_area_page.is_outline_enabled_changed.connect(self.on_outline_toggled)
self.main_area_page.outline_size_changed.connect(self.calculate_lines)
self.main_area_page.is_shadow_enabled_changed.connect(self.on_shadow_toggled)
self.main_area_page.shadow_size_changed.connect(self.calculate_lines)
self.footer_area_page.font_name_changed.connect(self.update_theme)
self.footer_area_page.font_size_changed.connect(self.update_theme)
self.footer_area_page.line_spacing_changed.connect(self.calculate_lines)
self.footer_area_page.letter_spacing_changed.connect(self.calculate_lines)
self.setOption(QtWidgets.QWizard.WizardOption.HaveHelpButton, True)
self.helpRequested.connect(self.provide_help)
@ -284,6 +287,7 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.main_area_page.font_color = self.theme.font_main_color
self.main_area_page.font_size = self.theme.font_main_size
self.main_area_page.line_spacing = self.theme.font_main_line_adjustment
self.main_area_page.letter_spacing = self.theme.font_main_letter_adjustment
self.main_area_page.is_outline_enabled = self.theme.font_main_outline
self.main_area_page.outline_color = self.theme.font_main_outline_color
self.main_area_page.outline_size = self.theme.font_main_outline_size
@ -302,6 +306,8 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.footer_area_page.is_bold = self.theme.font_footer_bold
self.footer_area_page.is_italic = self.theme.font_footer_italics
self.footer_area_page.font_size = self.theme.font_footer_size
self.footer_area_page.line_spacing = self.theme.font_footer_line_adjustment
self.footer_area_page.letter_spacing = self.theme.font_footer_letter_adjustment
def set_position_page_values(self):
"""
@ -372,6 +378,7 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.theme.font_main_color = self.main_area_page.font_color
self.theme.font_main_size = self.main_area_page.font_size
self.theme.font_main_line_adjustment = self.main_area_page.line_spacing
self.theme.font_main_letter_adjustment = self.main_area_page.letter_spacing
self.theme.font_main_outline = self.main_area_page.is_outline_enabled
self.theme.font_main_outline_color = self.main_area_page.outline_color
self.theme.font_main_outline_size = self.main_area_page.outline_size
@ -386,6 +393,8 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.theme.font_footer_size = self.footer_area_page.font_size
self.theme.font_footer_bold = self.footer_area_page.is_bold
self.theme.font_footer_italics = self.footer_area_page.is_italic
self.theme.font_footer_line_adjustment = self.footer_area_page.line_spacing
self.theme.font_footer_letter_adjustment = self.footer_area_page.letter_spacing
# position page (main)
self.theme.font_main_override = not self.area_position_page.use_main_default_location
if self.theme.font_main_override:

View File

@ -70,8 +70,7 @@ class Ui_ThemeWizard(object):
# Footer Area Page
self.footer_area_page = FontSelectPage()
self.footer_area_page.setObjectName('footer_area_page')
self.footer_area_page.disable_features(FontSelectPage.Outline, FontSelectPage.Shadow,
FontSelectPage.LineSpacing)
self.footer_area_page.disable_features(FontSelectPage.Outline, FontSelectPage.Shadow)
theme_wizard.addPage(self.footer_area_page)
# Alignment Page
self.alignment_page = AlignmentTransitionsPage()

View File

@ -365,4 +365,4 @@ def check_theme(theme):
assert 0 == theme.display_vertical_align, 'display_vertical_align should be 0'
assert theme.font_footer_bold is False, 'font_footer_bold should be False'
assert 'Arial' == theme.font_main_name, 'font_main_name should be "Arial"'
assert 53 == len(theme.__dict__), 'The theme should have 53 attributes'
assert 57 == len(theme.__dict__), 'The theme should have 57 attributes'

View File

@ -96,6 +96,7 @@ def test_setup(settings):
theme_form.main_area_page.font_name_changed.connect.assert_called_once_with(theme_form.calculate_lines)
theme_form.main_area_page.font_size_changed.connect.assert_called_once_with(theme_form.calculate_lines)
theme_form.main_area_page.line_spacing_changed.connect.assert_called_once_with(theme_form.calculate_lines)
theme_form.main_area_page.letter_spacing_changed.connect.assert_called_once_with(theme_form.calculate_lines)
theme_form.main_area_page.is_outline_enabled_changed.connect.assert_called_once_with(
theme_form.on_outline_toggled)
theme_form.main_area_page.outline_size_changed.connect.assert_called_once_with(theme_form.calculate_lines)
@ -104,6 +105,8 @@ def test_setup(settings):
theme_form.main_area_page.shadow_size_changed.connect.assert_called_once_with(theme_form.calculate_lines)
theme_form.footer_area_page.font_name_changed.connect.assert_called_once_with(theme_form.update_theme)
theme_form.footer_area_page.font_size_changed.connect.assert_called_once_with(theme_form.update_theme)
theme_form.footer_area_page.line_spacing_changed.connect.assert_called_once_with(theme_form.calculate_lines)
theme_form.footer_area_page.letter_spacing_changed.connect.assert_called_once_with(theme_form.calculate_lines)
@patch('openlp.core.ui.themeform.ThemeForm._setup')
@ -455,9 +458,9 @@ def test_update_theme_static(mocked_setup, settings):
theme_form.main_area_page = MagicMock(font_name='Montserrat', font_color='#f00', font_size=50, line_spacing=12,
is_outline_enabled=True, outline_color='#00f', outline_size=3,
is_shadow_enabled=True, shadow_color='#111', shadow_size=5, is_bold=True,
is_italic=False)
is_italic=False, letter_spacing=2)
theme_form.footer_area_page = MagicMock(font_name='Oxygen', font_color='#fff', font_size=20, is_bold=False,
is_italic=True)
is_italic=True, line_spacing=2, letter_spacing=-1)
theme_form.alignment_page = MagicMock(horizontal_align='left', vertical_align='top', is_transition_enabled=True,
transition_type='fade', transition_speed='normal',
transition_direction='horizontal', is_transition_reverse_enabled=False)
@ -472,6 +475,7 @@ def test_update_theme_static(mocked_setup, settings):
assert theme_form.theme.font_main_color == '#f00'
assert theme_form.theme.font_main_size == 50
assert theme_form.theme.font_main_line_adjustment == 12
assert theme_form.theme.font_main_letter_adjustment == 2
assert theme_form.theme.font_main_outline is True
assert theme_form.theme.font_main_outline_color == '#00f'
assert theme_form.theme.font_main_outline_size == 3
@ -489,6 +493,8 @@ def test_update_theme_static(mocked_setup, settings):
assert theme_form.theme.font_footer_bold is False
assert theme_form.theme.font_footer_italics is True
assert theme_form.theme.font_footer_override is False
assert theme_form.theme.font_footer_line_adjustment == 2
assert theme_form.theme.font_footer_letter_adjustment == -1
theme_form.theme.set_default_footer.assert_called_once_with()
# Alignment
assert theme_form.theme.display_horizontal_align == 'left'