mirror of https://gitlab.com/openlp/openlp.git
346 lines
15 KiB
Python
346 lines
15 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
##########################################################################
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
# ---------------------------------------------------------------------- #
|
|
# Copyright (c) 2008-2023 OpenLP Developers #
|
|
# ---------------------------------------------------------------------- #
|
|
# This program is free software: you can redistribute it and/or modify #
|
|
# it under the terms of the GNU General Public License as published by #
|
|
# the Free Software Foundation, either version 3 of the License, or #
|
|
# (at your option) any later version. #
|
|
# #
|
|
# This program is distributed in the hope that it will be useful, #
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
# GNU General Public License for more details. #
|
|
# #
|
|
# You should have received a copy of the GNU General Public License #
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
|
##########################################################################
|
|
"""
|
|
The :mod:`~openlp.core.pages.fontselect` module contains the font selection page used in the theme wizard
|
|
"""
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
|
|
from openlp.core.common.i18n import UiStrings, translate
|
|
from openlp.core.pages import GridLayoutPage
|
|
from openlp.core.ui.icons import UiIcons
|
|
from openlp.core.widgets.buttons import ColorButton
|
|
from openlp.core.widgets.labels import FormLabel
|
|
|
|
|
|
class FontSelectPage(GridLayoutPage):
|
|
"""
|
|
A font selection widget
|
|
"""
|
|
Outline = 'outline'
|
|
Shadow = 'shadow'
|
|
LineSpacing = 'line_spacing'
|
|
|
|
font_name_changed = QtCore.pyqtSignal(str)
|
|
font_size_changed = QtCore.pyqtSignal(int)
|
|
font_color_changed = QtCore.pyqtSignal(str)
|
|
is_bold_changed = QtCore.pyqtSignal(bool)
|
|
is_italic_changed = QtCore.pyqtSignal(bool)
|
|
line_spacing_changed = QtCore.pyqtSignal(int)
|
|
is_outline_enabled_changed = QtCore.pyqtSignal(bool)
|
|
outline_color_changed = QtCore.pyqtSignal(str)
|
|
outline_size_changed = QtCore.pyqtSignal(int)
|
|
is_shadow_enabled_changed = QtCore.pyqtSignal(bool)
|
|
shadow_color_changed = QtCore.pyqtSignal(str)
|
|
shadow_size_changed = QtCore.pyqtSignal(int)
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.feature_widgets = {
|
|
FontSelectPage.Outline: [self.outline_groupbox],
|
|
FontSelectPage.Shadow: [self.shadow_groupbox],
|
|
FontSelectPage.LineSpacing: [self.line_spacing_label, self.line_spacing_spinbox]
|
|
}
|
|
|
|
def setup_ui(self):
|
|
# Font name
|
|
self.font_name_label = FormLabel(self)
|
|
self.font_name_label.setObjectName('font_name_label')
|
|
self.layout.addWidget(self.font_name_label, 0, 0)
|
|
self.font_name_combobox = QtWidgets.QFontComboBox(self)
|
|
self.font_name_combobox.setObjectName('font_name_combobox')
|
|
self.layout.addWidget(self.font_name_combobox, 0, 1, 1, 3)
|
|
# Font color
|
|
self.font_color_label = FormLabel(self)
|
|
self.font_color_label.setObjectName('font_color_label')
|
|
self.layout.addWidget(self.font_color_label, 1, 0)
|
|
self.font_color_button = ColorButton(self)
|
|
self.font_color_button.setObjectName('font_color_button')
|
|
self.layout.addWidget(self.font_color_button, 1, 1)
|
|
# Font style
|
|
self.font_style_label = FormLabel(self)
|
|
self.font_style_label.setObjectName('font_style_label')
|
|
self.layout.addWidget(self.font_style_label, 1, 2)
|
|
self.style_layout = QtWidgets.QHBoxLayout()
|
|
self.style_bold_button = QtWidgets.QToolButton(self)
|
|
self.style_bold_button.setCheckable(True)
|
|
self.style_bold_button.setIcon(UiIcons().bold)
|
|
self.style_bold_button.setShortcut(QtGui.QKeySequence(QtGui.QKeySequence.Bold))
|
|
self.style_bold_button.setObjectName('style_bold_button')
|
|
self.style_layout.addWidget(self.style_bold_button)
|
|
self.style_italic_button = QtWidgets.QToolButton(self)
|
|
self.style_italic_button.setCheckable(True)
|
|
self.style_italic_button.setIcon(UiIcons().italic)
|
|
self.style_italic_button.setShortcut(QtGui.QKeySequence(QtGui.QKeySequence.Italic))
|
|
self.style_italic_button.setObjectName('style_italic_button')
|
|
self.style_layout.addWidget(self.style_italic_button)
|
|
self.style_layout.addStretch(1)
|
|
self.layout.addLayout(self.style_layout, 1, 3)
|
|
# Font size
|
|
self.font_size_label = FormLabel(self)
|
|
self.font_size_label.setObjectName('font_size_label')
|
|
self.layout.addWidget(self.font_size_label, 2, 0)
|
|
self.font_size_spinbox = QtWidgets.QSpinBox(self)
|
|
self.font_size_spinbox.setMaximum(999)
|
|
self.font_size_spinbox.setValue(16)
|
|
self.font_size_spinbox.setObjectName('font_size_spinbox')
|
|
self.layout.addWidget(self.font_size_spinbox, 2, 1)
|
|
# Line spacing
|
|
self.line_spacing_label = FormLabel(self)
|
|
self.line_spacing_label.setObjectName('line_spacing_label')
|
|
self.layout.addWidget(self.line_spacing_label, 2, 2)
|
|
self.line_spacing_spinbox = QtWidgets.QSpinBox(self)
|
|
self.line_spacing_spinbox.setMinimum(-250)
|
|
self.line_spacing_spinbox.setMaximum(250)
|
|
self.line_spacing_spinbox.setObjectName('line_spacing_spinbox')
|
|
self.layout.addWidget(self.line_spacing_spinbox, 2, 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)
|
|
# Outline colour
|
|
self.outline_color_label = FormLabel(self.outline_groupbox)
|
|
self.outline_color_label.setObjectName('outline_color_label')
|
|
self.outline_layout.addWidget(self.outline_color_label, 0, 0)
|
|
self.outline_color_button = ColorButton(self.outline_groupbox)
|
|
self.outline_color_button.setObjectName('outline_color_button')
|
|
self.outline_layout.addWidget(self.outline_color_button, 0, 1)
|
|
# Outline size
|
|
self.outline_size_label = FormLabel(self.outline_groupbox)
|
|
self.outline_size_label.setObjectName('outline_size_label')
|
|
self.outline_layout.addWidget(self.outline_size_label, 1, 0)
|
|
self.outline_size_spinbox = QtWidgets.QSpinBox(self.outline_groupbox)
|
|
self.outline_size_spinbox.setMaximum(9999)
|
|
self.outline_size_spinbox.setObjectName('outline_size_spinbox')
|
|
self.outline_layout.addWidget(self.outline_size_spinbox, 1, 1)
|
|
# Shadow
|
|
self.shadow_groupbox = QtWidgets.QGroupBox(self)
|
|
self.shadow_groupbox.setCheckable(True)
|
|
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)
|
|
# Shadow color
|
|
self.shadow_color_label = FormLabel(self.shadow_groupbox)
|
|
self.shadow_color_label.setObjectName('shadow_color_label')
|
|
self.shadow_layout.addWidget(self.shadow_color_label, 0, 0)
|
|
self.shadow_color_button = ColorButton(self.shadow_groupbox)
|
|
self.shadow_color_button.setObjectName('shadow_color_button')
|
|
self.shadow_layout.addWidget(self.shadow_color_button, 0, 1)
|
|
# Shadow size
|
|
self.shadow_size_label = FormLabel(self.shadow_groupbox)
|
|
self.shadow_size_label.setObjectName('shadow_size_label')
|
|
self.shadow_layout.addWidget(self.shadow_size_label, 1, 0)
|
|
self.shadow_size_spinbox = QtWidgets.QSpinBox(self.shadow_groupbox)
|
|
self.shadow_size_spinbox.setMaximum(9999)
|
|
self.shadow_size_spinbox.setObjectName('shadow_size_spinbox')
|
|
self.shadow_layout.addWidget(self.shadow_size_spinbox, 1, 1)
|
|
# Connect all the signals
|
|
self.font_name_combobox.activated.connect(self._on_font_name_changed)
|
|
self.font_color_button.colorChanged.connect(self._on_font_color_changed)
|
|
self.style_bold_button.toggled.connect(self._on_style_bold_toggled)
|
|
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.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)
|
|
self.shadow_groupbox.toggled.connect(self._on_shadow_toggled)
|
|
self.shadow_color_button.colorChanged.connect(self._on_shadow_color_changed)
|
|
self.shadow_size_spinbox.valueChanged.connect(self._on_shadow_size_changed)
|
|
|
|
def retranslate_ui(self):
|
|
self.font_name_label.setText(translate('OpenLP.FontSelectWidget', 'Font:'))
|
|
self.font_color_label.setText(translate('OpenLP.FontSelectWidget', 'Color:'))
|
|
self.font_style_label.setText(translate('OpenLP.FontSelectWidget', 'Style:'))
|
|
self.style_bold_button.setToolTip('{name} ({shortcut})'.format(
|
|
name=translate('OpenLP.FontSelectWidget', 'Bold'),
|
|
shortcut=QtGui.QKeySequence(QtGui.QKeySequence.Bold).toString()
|
|
))
|
|
self.style_italic_button.setToolTip('{name} ({shortcut})'.format(
|
|
name=translate('OpenLP.FontSelectWidget', 'Italic'),
|
|
shortcut=QtGui.QKeySequence(QtGui.QKeySequence.Italic).toString()
|
|
))
|
|
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.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:'))
|
|
self.shadow_groupbox.setTitle(translate('OpenLP.FontSelectWidget', 'Shadow'))
|
|
self.shadow_color_label.setText(translate('OpenLP.FontSelectWidget', 'Color:'))
|
|
self.shadow_size_label.setText(translate('OpenLP.FontSelectWidget', 'Size:'))
|
|
|
|
def _on_font_name_changed(self, name):
|
|
if isinstance(name, str):
|
|
self.font_name_changed.emit(name)
|
|
|
|
def _on_font_color_changed(self, color):
|
|
self.font_color_changed.emit(color)
|
|
|
|
def _on_style_bold_toggled(self, is_bold):
|
|
self.is_bold_changed.emit(is_bold)
|
|
|
|
def _on_style_italic_toggled(self, is_italic):
|
|
self.is_italic_changed.emit(is_italic)
|
|
|
|
def _on_font_size_changed(self, size):
|
|
self.font_size_changed.emit(size)
|
|
|
|
def _on_line_spacing_changed(self, spacing):
|
|
self.line_spacing_changed.emit(spacing)
|
|
|
|
def _on_outline_toggled(self, is_enabled):
|
|
self.is_outline_enabled_changed.emit(is_enabled)
|
|
|
|
def _on_outline_color_changed(self, color):
|
|
self.outline_color_changed.emit(color)
|
|
|
|
def _on_outline_size_changed(self, size):
|
|
self.outline_size_changed.emit(size)
|
|
|
|
def _on_shadow_toggled(self, is_enabled):
|
|
self.is_shadow_enabled_changed.emit(is_enabled)
|
|
|
|
def _on_shadow_color_changed(self, color):
|
|
self.shadow_color_changed.emit(color)
|
|
|
|
def _on_shadow_size_changed(self, size):
|
|
self.shadow_size_changed.emit(size)
|
|
|
|
def enable_features(self, *features):
|
|
"""
|
|
Enable a feature
|
|
"""
|
|
for feature_name in features:
|
|
if feature_name not in self.feature_widgets.keys():
|
|
raise KeyError('No such feature: {feature_name}'.format(feature_name=feature_name))
|
|
for widget in self.feature_widgets[feature_name]:
|
|
widget.show()
|
|
|
|
def disable_features(self, *features):
|
|
"""
|
|
Disable a feature
|
|
"""
|
|
for feature_name in features:
|
|
if feature_name not in self.feature_widgets.keys():
|
|
raise KeyError('No such feature: {feature_name}'.format(feature_name=feature_name))
|
|
for widget in self.feature_widgets[feature_name]:
|
|
widget.hide()
|
|
|
|
@property
|
|
def font_name(self):
|
|
return self.font_name_combobox.currentFont().family()
|
|
|
|
@font_name.setter
|
|
def font_name(self, font):
|
|
self.font_name_combobox.setCurrentFont(QtGui.QFont(font))
|
|
|
|
@property
|
|
def font_color(self):
|
|
return self.font_color_button.color
|
|
|
|
@font_color.setter
|
|
def font_color(self, color):
|
|
self.font_color_button.color = color
|
|
|
|
@property
|
|
def is_bold(self):
|
|
return self.style_bold_button.isChecked()
|
|
|
|
@is_bold.setter
|
|
def is_bold(self, is_bold):
|
|
self.style_bold_button.setChecked(is_bold)
|
|
|
|
@property
|
|
def is_italic(self):
|
|
return self.style_italic_button.isChecked()
|
|
|
|
@is_italic.setter
|
|
def is_italic(self, is_italic):
|
|
self.style_italic_button.setChecked(is_italic)
|
|
|
|
@property
|
|
def font_size(self):
|
|
return self.font_size_spinbox.value()
|
|
|
|
@font_size.setter
|
|
def font_size(self, size):
|
|
self.font_size_spinbox.setValue(size)
|
|
|
|
@property
|
|
def line_spacing(self):
|
|
return self.line_spacing_spinbox.value()
|
|
|
|
@line_spacing.setter
|
|
def line_spacing(self, line_spacing):
|
|
self.line_spacing_spinbox.setValue(line_spacing)
|
|
|
|
@property
|
|
def is_outline_enabled(self):
|
|
return self.outline_groupbox.isChecked()
|
|
|
|
@is_outline_enabled.setter
|
|
def is_outline_enabled(self, is_enabled):
|
|
self.outline_groupbox.setChecked(is_enabled)
|
|
|
|
@property
|
|
def outline_color(self):
|
|
return self.outline_color_button.color
|
|
|
|
@outline_color.setter
|
|
def outline_color(self, color):
|
|
self.outline_color_button.color = color
|
|
|
|
@property
|
|
def outline_size(self):
|
|
return self.outline_size_spinbox.value()
|
|
|
|
@outline_size.setter
|
|
def outline_size(self, size):
|
|
self.outline_size_spinbox.setValue(size)
|
|
|
|
@property
|
|
def is_shadow_enabled(self):
|
|
return self.shadow_groupbox.isChecked()
|
|
|
|
@is_shadow_enabled.setter
|
|
def is_shadow_enabled(self, is_enabled):
|
|
self.shadow_groupbox.setChecked(is_enabled)
|
|
|
|
@property
|
|
def shadow_color(self):
|
|
return self.shadow_color_button.color
|
|
|
|
@shadow_color.setter
|
|
def shadow_color(self, color):
|
|
self.shadow_color_button.color = color
|
|
|
|
@property
|
|
def shadow_size(self):
|
|
return self.shadow_size_spinbox.value()
|
|
|
|
@shadow_size.setter
|
|
def shadow_size(self, size):
|
|
self.shadow_size_spinbox.setValue(size)
|