forked from openlp/openlp
Minor fixes, and changes
This commit is contained in:
parent
28da80ecf9
commit
9c35b7dcdc
@ -45,7 +45,7 @@ log = logging.getLogger(__name__ + '.__init__')
|
|||||||
FIRST_CAMEL_REGEX = re.compile('(.)([A-Z][a-z]+)')
|
FIRST_CAMEL_REGEX = re.compile('(.)([A-Z][a-z]+)')
|
||||||
SECOND_CAMEL_REGEX = re.compile('([a-z0-9])([A-Z])')
|
SECOND_CAMEL_REGEX = re.compile('([a-z0-9])([A-Z])')
|
||||||
CONTROL_CHARS = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]')
|
CONTROL_CHARS = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]')
|
||||||
INVALID_FILE_CHARS = re.compile(r'[\\/:\*\?"<>\|\+\[\]%]')
|
INVALID_FILE_CHARS = re.compile(r'[\\/:*?"<>|+\[\]%]')
|
||||||
IMAGES_FILTER = None
|
IMAGES_FILTER = None
|
||||||
REPLACMENT_CHARS_MAP = str.maketrans({'\u2018': '\'', '\u2019': '\'', '\u201c': '"', '\u201d': '"', '\u2026': '...',
|
REPLACMENT_CHARS_MAP = str.maketrans({'\u2018': '\'', '\u2019': '\'', '\u201c': '"', '\u201d': '"', '\u2026': '...',
|
||||||
'\u2013': '-', '\u2014': '-', '\v': '\n\n', '\f': '\n\n'})
|
'\u2013': '-', '\u2014': '-', '\v': '\n\n', '\f': '\n\n'})
|
||||||
@ -112,21 +112,21 @@ def trace_error_handler(logger):
|
|||||||
logger.error(log_string)
|
logger.error(log_string)
|
||||||
|
|
||||||
|
|
||||||
def extension_loader(glob_pattern, excluded_files=[]):
|
def extension_loader(glob_pattern, excluded_files=None):
|
||||||
"""
|
"""
|
||||||
A utility function to find and load OpenLP extensions, such as plugins, presentation and media controllers and
|
A utility function to find and load OpenLP extensions, such as plugins, presentation and media controllers and
|
||||||
importers.
|
importers.
|
||||||
|
|
||||||
:param str glob_pattern: A glob pattern used to find the extension(s) to be imported. Should be relative to the
|
:param str glob_pattern: A glob pattern used to find the extension(s) to be imported. Should be relative to the
|
||||||
application directory. i.e. plugins/*/*plugin.py
|
application directory. i.e. plugins/*/*plugin.py
|
||||||
:param list[str] excluded_files: A list of file names to exclude that the glob pattern may find.
|
:param list[str] | None excluded_files: A list of file names to exclude that the glob pattern may find.
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
from openlp.core.common.applocation import AppLocation
|
from openlp.core.common.applocation import AppLocation
|
||||||
app_dir = AppLocation.get_directory(AppLocation.AppDir)
|
app_dir = AppLocation.get_directory(AppLocation.AppDir)
|
||||||
for extension_path in app_dir.glob(glob_pattern):
|
for extension_path in app_dir.glob(glob_pattern):
|
||||||
extension_path = extension_path.relative_to(app_dir)
|
extension_path = extension_path.relative_to(app_dir)
|
||||||
if extension_path.name in excluded_files:
|
if extension_path.name in (excluded_files or []):
|
||||||
continue
|
continue
|
||||||
log.debug('Attempting to import %s', extension_path)
|
log.debug('Attempting to import %s', extension_path)
|
||||||
module_name = path_to_module(extension_path)
|
module_name = path_to_module(extension_path)
|
||||||
|
@ -338,8 +338,8 @@ class UiStrings(object):
|
|||||||
Override the default object creation method to return a single instance.
|
Override the default object creation method to return a single instance.
|
||||||
"""
|
"""
|
||||||
if not cls.__instance__:
|
if not cls.__instance__:
|
||||||
cls.__instance__ = object.__new__(cls)
|
cls.__instance__ = super().__new__(cls)
|
||||||
cls.load(cls)
|
cls.__instance__.load()
|
||||||
return cls.__instance__
|
return cls.__instance__
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
@ -503,7 +503,7 @@ def format_time(text, local_time):
|
|||||||
"""
|
"""
|
||||||
return local_time.strftime(match.group())
|
return local_time.strftime(match.group())
|
||||||
|
|
||||||
return re.sub(r'\%[a-zA-Z]', match_formatting, text)
|
return re.sub(r'%[a-zA-Z]', match_formatting, text)
|
||||||
|
|
||||||
|
|
||||||
def get_locale_key(string, numeric=False):
|
def get_locale_key(string, numeric=False):
|
||||||
|
@ -265,7 +265,7 @@ def upgrade_db(url, upgrade):
|
|||||||
"""
|
"""
|
||||||
if not database_exists(url):
|
if not database_exists(url):
|
||||||
log.warning("Database {db} doesn't exist - skipping upgrade checks".format(db=url))
|
log.warning("Database {db} doesn't exist - skipping upgrade checks".format(db=url))
|
||||||
return (0, 0)
|
return 0, 0
|
||||||
|
|
||||||
log.debug('Checking upgrades for DB {db}'.format(db=url))
|
log.debug('Checking upgrades for DB {db}'.format(db=url))
|
||||||
|
|
||||||
|
@ -59,97 +59,98 @@ class FormattingTags(object):
|
|||||||
"""
|
"""
|
||||||
temporary_tags = [tag for tag in FormattingTags.html_expands if tag.get('temporary')]
|
temporary_tags = [tag for tag in FormattingTags.html_expands if tag.get('temporary')]
|
||||||
FormattingTags.html_expands = []
|
FormattingTags.html_expands = []
|
||||||
base_tags = []
|
base_tags = [
|
||||||
# Append the base tags.
|
{
|
||||||
base_tags.append({
|
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Red'),
|
'desc': translate('OpenLP.FormattingTags', 'Red'),
|
||||||
'start tag': '{r}',
|
'start tag': '{r}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:red">',
|
'start html': '<span style="-webkit-text-fill-color:red">',
|
||||||
'end tag': '{/r}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/r}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Black'),
|
'desc': translate('OpenLP.FormattingTags', 'Black'),
|
||||||
'start tag': '{b}',
|
'start tag': '{b}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:black">',
|
'start html': '<span style="-webkit-text-fill-color:black">',
|
||||||
'end tag': '{/b}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/b}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Blue'),
|
'desc': translate('OpenLP.FormattingTags', 'Blue'),
|
||||||
'start tag': '{bl}',
|
'start tag': '{bl}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:blue">',
|
'start html': '<span style="-webkit-text-fill-color:blue">',
|
||||||
'end tag': '{/bl}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/bl}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Yellow'),
|
'desc': translate('OpenLP.FormattingTags', 'Yellow'),
|
||||||
'start tag': '{y}',
|
'start tag': '{y}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:yellow">',
|
'start html': '<span style="-webkit-text-fill-color:yellow">',
|
||||||
'end tag': '{/y}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/y}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Green'),
|
'desc': translate('OpenLP.FormattingTags', 'Green'),
|
||||||
'start tag': '{g}',
|
'start tag': '{g}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:green">',
|
'start html': '<span style="-webkit-text-fill-color:green">',
|
||||||
'end tag': '{/g}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/g}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Pink'),
|
'desc': translate('OpenLP.FormattingTags', 'Pink'),
|
||||||
'start tag': '{pk}',
|
'start tag': '{pk}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:#FFC0CB">',
|
'start html': '<span style="-webkit-text-fill-color:#FFC0CB">',
|
||||||
'end tag': '{/pk}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/pk}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Orange'),
|
'desc': translate('OpenLP.FormattingTags', 'Orange'),
|
||||||
'start tag': '{o}',
|
'start tag': '{o}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:#FFA500">',
|
'start html': '<span style="-webkit-text-fill-color:#FFA500">',
|
||||||
'end tag': '{/o}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/o}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Purple'),
|
'desc': translate('OpenLP.FormattingTags', 'Purple'),
|
||||||
'start tag': '{pp}',
|
'start tag': '{pp}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:#800080">',
|
'start html': '<span style="-webkit-text-fill-color:#800080">',
|
||||||
'end tag': '{/pp}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/pp}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'White'),
|
'desc': translate('OpenLP.FormattingTags', 'White'),
|
||||||
'start tag': '{w}',
|
'start tag': '{w}',
|
||||||
'start html': '<span style="-webkit-text-fill-color:white">',
|
'start html': '<span style="-webkit-text-fill-color:white">',
|
||||||
'end tag': '{/w}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/w}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Superscript'),
|
'desc': translate('OpenLP.FormattingTags', 'Superscript'),
|
||||||
'start tag': '{su}', 'start html': '<sup>',
|
'start tag': '{su}', 'start html': '<sup>',
|
||||||
'end tag': '{/su}', 'end html': '</sup>', 'protected': True,
|
'end tag': '{/su}', 'end html': '</sup>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Subscript'),
|
'desc': translate('OpenLP.FormattingTags', 'Subscript'),
|
||||||
'start tag': '{sb}', 'start html': '<sub>',
|
'start tag': '{sb}', 'start html': '<sub>',
|
||||||
'end tag': '{/sb}', 'end html': '</sub>', 'protected': True,
|
'end tag': '{/sb}', 'end html': '</sub>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Paragraph'),
|
'desc': translate('OpenLP.FormattingTags', 'Paragraph'),
|
||||||
'start tag': '{p}', 'start html': '<p>', 'end tag': '{/p}',
|
'start tag': '{p}', 'start html': '<p>', 'end tag': '{/p}',
|
||||||
'end html': '</p>', 'protected': True,
|
'end html': '</p>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Bold'),
|
'desc': translate('OpenLP.FormattingTags', 'Bold'),
|
||||||
'start tag': '{st}', 'start html': '<strong>',
|
'start tag': '{st}', 'start html': '<strong>',
|
||||||
'end tag': '{/st}', 'end html': '</strong>',
|
'end tag': '{/st}', 'end html': '</strong>',
|
||||||
'protected': True, 'temporary': False})
|
'protected': True, 'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Italics'),
|
'desc': translate('OpenLP.FormattingTags', 'Italics'),
|
||||||
'start tag': '{it}', 'start html': '<em>', 'end tag': '{/it}',
|
'start tag': '{it}', 'start html': '<em>', 'end tag': '{/it}',
|
||||||
'end html': '</em>', 'protected': True, 'temporary': False})
|
'end html': '</em>', 'protected': True, 'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Underline'),
|
'desc': translate('OpenLP.FormattingTags', 'Underline'),
|
||||||
'start tag': '{u}',
|
'start tag': '{u}',
|
||||||
'start html': '<span style="text-decoration: underline;">',
|
'start html': '<span style="text-decoration: underline;">',
|
||||||
'end tag': '{/u}', 'end html': '</span>', 'protected': True,
|
'end tag': '{/u}', 'end html': '</span>', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
base_tags.append({
|
}, {
|
||||||
'desc': translate('OpenLP.FormattingTags', 'Break'),
|
'desc': translate('OpenLP.FormattingTags', 'Break'),
|
||||||
'start tag': '{br}', 'start html': '<br>', 'end tag': '',
|
'start tag': '{br}', 'start html': '<br>', 'end tag': '',
|
||||||
'end html': '', 'protected': True,
|
'end html': '', 'protected': True,
|
||||||
'temporary': False})
|
'temporary': False
|
||||||
|
}]
|
||||||
|
# Append the base tags.
|
||||||
FormattingTags.add_html_tags(base_tags)
|
FormattingTags.add_html_tags(base_tags)
|
||||||
FormattingTags.add_html_tags(temporary_tags)
|
FormattingTags.add_html_tags(temporary_tags)
|
||||||
user_expands_string = str(Settings().value('formattingTags/html_tags'))
|
user_expands_string = str(Settings().value('formattingTags/html_tags'))
|
||||||
|
@ -344,14 +344,14 @@ class ProjectorManager(QtWidgets.QWidget, RegistryBase, UiProjectorManager, LogM
|
|||||||
"""
|
"""
|
||||||
log.debug('Checking for UDP port {port} listener deletion'.format(port=port))
|
log.debug('Checking for UDP port {port} listener deletion'.format(port=port))
|
||||||
if port not in self.pjlink_udp:
|
if port not in self.pjlink_udp:
|
||||||
log.warn('UDP listener for port {port} not there - skipping delete'.format(port=port))
|
log.warning('UDP listener for port {port} not there - skipping delete'.format(port=port))
|
||||||
return
|
return
|
||||||
keep_port = False
|
keep_port = False
|
||||||
for item in self.projector_list:
|
for item in self.projector_list:
|
||||||
if port == item.link.port:
|
if port == item.link.port:
|
||||||
keep_port = True
|
keep_port = True
|
||||||
if keep_port:
|
if keep_port:
|
||||||
log.warn('UDP listener for port {port} needed for other projectors - skipping delete'.format(port=port))
|
log.warning('UDP listener for port {port} needed for other projectors - skipping delete'.format(port=port))
|
||||||
return
|
return
|
||||||
Registry().execute('udp_broadcast_remove', port=port)
|
Registry().execute('udp_broadcast_remove', port=port)
|
||||||
del self.pjlink_udp[port]
|
del self.pjlink_udp[port]
|
||||||
|
@ -552,7 +552,7 @@ class PJLink(QtNetwork.QTcpSocket):
|
|||||||
data = data_in.strip()
|
data = data_in.strip()
|
||||||
self.receive_data_signal()
|
self.receive_data_signal()
|
||||||
# Initial packet checks
|
# Initial packet checks
|
||||||
if (len(data) < 7):
|
if len(data) < 7:
|
||||||
self._trash_buffer(msg='get_data(): Invalid packet - length')
|
self._trash_buffer(msg='get_data(): Invalid packet - length')
|
||||||
return
|
return
|
||||||
elif len(data) > self.max_size:
|
elif len(data) > self.max_size:
|
||||||
|
@ -177,7 +177,7 @@ class FingerTabBarWidget(QtWidgets.QTabBar):
|
|||||||
:param height: Remove default height parameter in kwargs
|
:param height: Remove default height parameter in kwargs
|
||||||
"""
|
"""
|
||||||
self.tabSize = QtCore.QSize(kwargs.pop('width', 100), kwargs.pop('height', 25))
|
self.tabSize = QtCore.QSize(kwargs.pop('width', 100), kwargs.pop('height', 25))
|
||||||
QtWidgets.QTabBar.__init__(self, parent, *args, **kwargs)
|
super().__init__(parent)
|
||||||
|
|
||||||
def paintEvent(self, event):
|
def paintEvent(self, event):
|
||||||
"""
|
"""
|
||||||
@ -215,11 +215,11 @@ class FingerTabWidget(QtWidgets.QTabWidget):
|
|||||||
Based on thread discussion
|
Based on thread discussion
|
||||||
http://www.riverbankcomputing.com/pipermail/pyqt/2005-December/011724.html
|
http://www.riverbankcomputing.com/pipermail/pyqt/2005-December/011724.html
|
||||||
"""
|
"""
|
||||||
def __init__(self, parent, *args):
|
def __init__(self, parent):
|
||||||
"""
|
"""
|
||||||
Initialize FingerTabWidget instance
|
Initialize FingerTabWidget instance
|
||||||
"""
|
"""
|
||||||
QtWidgets.QTabWidget.__init__(self, parent, *args)
|
super().__init__(parent)
|
||||||
self.setTabBar(FingerTabBarWidget(self))
|
self.setTabBar(FingerTabBarWidget(self))
|
||||||
|
|
||||||
|
|
||||||
|
@ -93,4 +93,4 @@ class SingleColumnTableWidget(QtWidgets.QTableWidget):
|
|||||||
self.resizeRowsToContents()
|
self.resizeRowsToContents()
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['SingleColumnTableWidget', 'DisplayControllerType']
|
__all__ = ['AlertLocation', 'DisplayControllerType', 'HideMode', 'SingleColumnTableWidget']
|
||||||
|
@ -40,7 +40,7 @@ class FormattingTagController(object):
|
|||||||
"""
|
"""
|
||||||
self.html_tag_regex = re.compile(
|
self.html_tag_regex = re.compile(
|
||||||
r'<(?:(?P<close>/(?=[^\s/>]+>))?'
|
r'<(?:(?P<close>/(?=[^\s/>]+>))?'
|
||||||
r'(?P<tag>[^\s/!\?>]+)(?:\s+[^\s=]+="[^"]*")*\s*(?P<empty>/)?'
|
r'(?P<tag>[^\s/!?>]+)(?:\s+[^\s=]+="[^"]*")*\s*(?P<empty>/)?'
|
||||||
r'|(?P<cdata>!\[CDATA\[(?:(?!\]\]>).)*\]\])'
|
r'|(?P<cdata>!\[CDATA\[(?:(?!\]\]>).)*\]\])'
|
||||||
r'|(?P<procinst>\?(?:(?!\?>).)*\?)'
|
r'|(?P<procinst>\?(?:(?!\?>).)*\?)'
|
||||||
r'|(?P<comment>!--(?:(?!-->).)*--))>')
|
r'|(?P<comment>!--(?:(?!-->).)*--))>')
|
||||||
|
@ -45,8 +45,8 @@ class UiIcons(object):
|
|||||||
Override the default object creation method to return a single instance.
|
Override the default object creation method to return a single instance.
|
||||||
"""
|
"""
|
||||||
if not cls.__instance__:
|
if not cls.__instance__:
|
||||||
cls.__instance__ = object.__new__(cls)
|
cls.__instance__ = super().__new__(cls)
|
||||||
cls.load(cls)
|
cls.__instance__.load()
|
||||||
return cls.__instance__
|
return cls.__instance__
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
@ -164,7 +164,7 @@ class UiIcons(object):
|
|||||||
'video': {'icon': 'fa.file-video-o'},
|
'video': {'icon': 'fa.file-video-o'},
|
||||||
'volunteer': {'icon': 'fa.group'}
|
'volunteer': {'icon': 'fa.group'}
|
||||||
}
|
}
|
||||||
self.load_icons(self, icon_list)
|
self.load_icons(icon_list)
|
||||||
|
|
||||||
def load_icons(self, icon_list):
|
def load_icons(self, icon_list):
|
||||||
"""
|
"""
|
||||||
|
@ -101,7 +101,7 @@ class Ui_ShortcutListDialog(object):
|
|||||||
self.primary_push_button = CaptureShortcutButton(shortcutListDialog)
|
self.primary_push_button = CaptureShortcutButton(shortcutListDialog)
|
||||||
self.primary_push_button.setObjectName('primary_push_button')
|
self.primary_push_button.setObjectName('primary_push_button')
|
||||||
self.primary_push_button.setMinimumSize(QtCore.QSize(84, 0))
|
self.primary_push_button.setMinimumSize(QtCore.QSize(84, 0))
|
||||||
self.primary_push_button.setIcon(UiIcons.shortcuts)
|
self.primary_push_button.setIcon(UiIcons().shortcuts)
|
||||||
self.primary_layout.addWidget(self.primary_push_button)
|
self.primary_layout.addWidget(self.primary_push_button)
|
||||||
self.clear_primary_button = QtWidgets.QToolButton(shortcutListDialog)
|
self.clear_primary_button = QtWidgets.QToolButton(shortcutListDialog)
|
||||||
self.clear_primary_button.setObjectName('clear_primary_button')
|
self.clear_primary_button.setObjectName('clear_primary_button')
|
||||||
|
@ -34,7 +34,7 @@ from openlp.core.common.settings import Settings
|
|||||||
from openlp.core.ui.shortcutlistdialog import Ui_ShortcutListDialog
|
from openlp.core.ui.shortcutlistdialog import Ui_ShortcutListDialog
|
||||||
|
|
||||||
|
|
||||||
REMOVE_AMPERSAND = re.compile(r'&{1}')
|
REMOVE_AMPERSAND = re.compile(r'&')
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
|
|||||||
An empty ``ServiceItem`` is used by default. replace_service_manager_item() needs to be called to make this
|
An empty ``ServiceItem`` is used by default. replace_service_manager_item() needs to be called to make this
|
||||||
widget display something.
|
widget display something.
|
||||||
"""
|
"""
|
||||||
super(QtWidgets.QTableWidget, self).__init__(parent)
|
super().__init__(parent)
|
||||||
self._setup(screen_ratio)
|
self._setup(screen_ratio)
|
||||||
|
|
||||||
def _setup(self, screen_ratio):
|
def _setup(self, screen_ratio):
|
||||||
@ -124,7 +124,7 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
|
|||||||
max_img_row_height = Settings().value('advanced/slide max height')
|
max_img_row_height = Settings().value('advanced/slide max height')
|
||||||
# Adjust for row height cap if in use.
|
# Adjust for row height cap if in use.
|
||||||
if isinstance(max_img_row_height, int):
|
if isinstance(max_img_row_height, int):
|
||||||
if max_img_row_height > 0 and height > max_img_row_height:
|
if 0 < max_img_row_height < height:
|
||||||
height = max_img_row_height
|
height = max_img_row_height
|
||||||
elif max_img_row_height < 0:
|
elif max_img_row_height < 0:
|
||||||
# If auto setting, show that number of slides, or if the resulting slides too small, 100px.
|
# If auto setting, show that number of slides, or if the resulting slides too small, 100px.
|
||||||
@ -219,7 +219,7 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
|
|||||||
slide_height = width // self.screen_ratio
|
slide_height = width // self.screen_ratio
|
||||||
max_img_row_height = Settings().value('advanced/slide max height')
|
max_img_row_height = Settings().value('advanced/slide max height')
|
||||||
if isinstance(max_img_row_height, int):
|
if isinstance(max_img_row_height, int):
|
||||||
if max_img_row_height > 0 and slide_height > max_img_row_height:
|
if 0 < max_img_row_height < slide_height:
|
||||||
slide_height = max_img_row_height
|
slide_height = max_img_row_height
|
||||||
elif max_img_row_height < 0:
|
elif max_img_row_height < 0:
|
||||||
# If auto setting, show that number of slides, or if the resulting slides too small, 100px.
|
# If auto setting, show that number of slides, or if the resulting slides too small, 100px.
|
||||||
|
@ -194,11 +194,11 @@ class ScreenButton(QtWidgets.QPushButton):
|
|||||||
|
|
||||||
|
|
||||||
class ScreenSelectionWidget(QtWidgets.QWidget):
|
class ScreenSelectionWidget(QtWidgets.QWidget):
|
||||||
def __init__(self, parent=None, screens=[]):
|
def __init__(self, parent=None, screens=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.current_screen = None
|
self.current_screen = None
|
||||||
self.identify_labels = []
|
self.identify_labels = []
|
||||||
self.screens = screens
|
self.screens = screens or []
|
||||||
self.timer = QtCore.QTimer()
|
self.timer = QtCore.QTimer()
|
||||||
self.timer.setSingleShot(True)
|
self.timer.setSingleShot(True)
|
||||||
self.timer.setInterval(3000)
|
self.timer.setInterval(3000)
|
||||||
|
@ -401,4 +401,4 @@ class BibleManager(LogMixin, RegistryProperties):
|
|||||||
self.db_cache[bible].finalise()
|
self.db_cache[bible].finalise()
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['BibleFormat']
|
__all__ = ['BibleFormat', 'BibleManager']
|
||||||
|
@ -109,7 +109,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
:param kwargs: Keyword arguments to pass to the super method. (dict)
|
:param kwargs: Keyword arguments to pass to the super method. (dict)
|
||||||
"""
|
"""
|
||||||
self.clear_icon = UiIcons().square
|
self.clear_icon = UiIcons().square
|
||||||
self.save_results_icon = UiIcons.save
|
self.save_results_icon = UiIcons().save
|
||||||
self.sort_icon = UiIcons().sort
|
self.sort_icon = UiIcons().sort
|
||||||
self.bible = None
|
self.bible = None
|
||||||
self.second_bible = None
|
self.second_bible = None
|
||||||
|
@ -55,7 +55,7 @@ if is_win():
|
|||||||
class SlideShowListenerImport(XSlideShowListenerObj.__class__):
|
class SlideShowListenerImport(XSlideShowListenerObj.__class__):
|
||||||
pass
|
pass
|
||||||
except (AttributeError, pywintypes.com_error):
|
except (AttributeError, pywintypes.com_error):
|
||||||
class SlideShowListenerImport():
|
class SlideShowListenerImport(object):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Declare an empty exception to match the exception imported from UNO
|
# Declare an empty exception to match the exception imported from UNO
|
||||||
@ -76,7 +76,7 @@ else:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
uno_available = False
|
uno_available = False
|
||||||
|
|
||||||
class SlideShowListenerImport():
|
class SlideShowListenerImport(object):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -233,9 +233,7 @@ class ImpressController(PresentationController):
|
|||||||
self.conf_provider = self.manager.createInstanceWithContext(
|
self.conf_provider = self.manager.createInstanceWithContext(
|
||||||
'com.sun.star.configuration.ConfigurationProvider', uno.getComponentContext())
|
'com.sun.star.configuration.ConfigurationProvider', uno.getComponentContext())
|
||||||
# Setup lookup properties to get Impress settings
|
# Setup lookup properties to get Impress settings
|
||||||
properties = []
|
properties = tuple(self.create_property('nodepath', 'org.openoffice.Office.Impress'))
|
||||||
properties.append(self.create_property('nodepath', 'org.openoffice.Office.Impress'))
|
|
||||||
properties = tuple(properties)
|
|
||||||
try:
|
try:
|
||||||
# Get an updateable configuration view
|
# Get an updateable configuration view
|
||||||
impress_conf_props = self.conf_provider.createInstanceWithArguments(
|
impress_conf_props = self.conf_provider.createInstanceWithArguments(
|
||||||
@ -311,9 +309,7 @@ class ImpressDocument(PresentationDocument):
|
|||||||
if desktop is None:
|
if desktop is None:
|
||||||
return False
|
return False
|
||||||
self.desktop = desktop
|
self.desktop = desktop
|
||||||
properties = []
|
properties = tuple(self.controller.create_property('Hidden', True))
|
||||||
properties.append(self.controller.create_property('Hidden', True))
|
|
||||||
properties = tuple(properties)
|
|
||||||
try:
|
try:
|
||||||
self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
||||||
except Exception:
|
except Exception:
|
||||||
@ -338,9 +334,7 @@ class ImpressDocument(PresentationDocument):
|
|||||||
return
|
return
|
||||||
temp_folder_path = self.get_temp_folder()
|
temp_folder_path = self.get_temp_folder()
|
||||||
thumb_dir_url = temp_folder_path.as_uri()
|
thumb_dir_url = temp_folder_path.as_uri()
|
||||||
properties = []
|
properties = tuple(self.controller.create_property('FilterName', 'impress_png_Export'))
|
||||||
properties.append(self.controller.create_property('FilterName', 'impress_png_Export'))
|
|
||||||
properties = tuple(properties)
|
|
||||||
doc = self.document
|
doc = self.document
|
||||||
pages = doc.getDrawPages()
|
pages = doc.getDrawPages()
|
||||||
if not pages:
|
if not pages:
|
||||||
|
@ -615,14 +615,16 @@ def transpose_chord(chord, transpose_value, notation):
|
|||||||
:return: The transposed chord.
|
:return: The transposed chord.
|
||||||
"""
|
"""
|
||||||
# See https://en.wikipedia.org/wiki/Musical_note#12-tone_chromatic_scale
|
# See https://en.wikipedia.org/wiki/Musical_note#12-tone_chromatic_scale
|
||||||
notes_sharp_notation = {}
|
notes_sharp_notation = {
|
||||||
notes_flat_notation = {}
|
'german': ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'H'],
|
||||||
notes_sharp_notation['german'] = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'H']
|
'english': ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'],
|
||||||
notes_flat_notation['german'] = ['C', 'Db', 'D', 'Eb', 'Fb', 'F', 'Gb', 'G', 'Ab', 'A', 'B', 'H']
|
'neo-latin': ['Do', 'Do#', 'Re', 'Re#', 'Mi', 'Fa', 'Fa#', 'Sol', 'Sol#', 'La', 'La#', 'Si']
|
||||||
notes_sharp_notation['english'] = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']
|
}
|
||||||
notes_flat_notation['english'] = ['C', 'Db', 'D', 'Eb', 'Fb', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B']
|
notes_flat_notation = {
|
||||||
notes_sharp_notation['neo-latin'] = ['Do', 'Do#', 'Re', 'Re#', 'Mi', 'Fa', 'Fa#', 'Sol', 'Sol#', 'La', 'La#', 'Si']
|
'german': ['C', 'Db', 'D', 'Eb', 'Fb', 'F', 'Gb', 'G', 'Ab', 'A', 'B', 'H'],
|
||||||
notes_flat_notation['neo-latin'] = ['Do', 'Reb', 'Re', 'Mib', 'Fab', 'Fa', 'Solb', 'Sol', 'Lab', 'La', 'Sib', 'Si']
|
'english': ['C', 'Db', 'D', 'Eb', 'Fb', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'],
|
||||||
|
'neo-latin': ['Do', 'Reb', 'Re', 'Mib', 'Fab', 'Fa', 'Solb', 'Sol', 'Lab', 'La', 'Sib', 'Si']
|
||||||
|
}
|
||||||
chord_split = chord.replace('♭', 'b').split('/')
|
chord_split = chord.replace('♭', 'b').split('/')
|
||||||
transposed_chord = ''
|
transposed_chord = ''
|
||||||
last_chord = ''
|
last_chord = ''
|
||||||
|
@ -118,8 +118,8 @@ class EasyWorshipSongImport(SongImport):
|
|||||||
# 40/48/56 Entry count int32le 4 Number of items in the schedule
|
# 40/48/56 Entry count int32le 4 Number of items in the schedule
|
||||||
# 44/52/60 Entry length int16le 2 Length of schedule entries: 0x0718 = 1816
|
# 44/52/60 Entry length int16le 2 Length of schedule entries: 0x0718 = 1816
|
||||||
# Get file version
|
# Get file version
|
||||||
type, = struct.unpack('<38s', self.ews_file.read(38))
|
file_type, = struct.unpack('<38s', self.ews_file.read(38))
|
||||||
version = type.decode()[-3:]
|
version = file_type.decode()[-3:]
|
||||||
# Set fileposition based on filetype/version
|
# Set fileposition based on filetype/version
|
||||||
file_pos = 0
|
file_pos = 0
|
||||||
if version == ' 5':
|
if version == ' 5':
|
||||||
|
@ -302,7 +302,7 @@ class FoilPresenter(object):
|
|||||||
break
|
break
|
||||||
author_temp = []
|
author_temp = []
|
||||||
for author in strings:
|
for author in strings:
|
||||||
temp = re.split(r',(?=\D{2})|(?<=\D),|\/(?=\D{3,})|(?<=\D);', author)
|
temp = re.split(r',(?=\D{2})|(?<=\D),|/(?=\D{3,})|(?<=\D);', author)
|
||||||
for tempx in temp:
|
for tempx in temp:
|
||||||
author_temp.append(tempx)
|
author_temp.append(tempx)
|
||||||
for author in author_temp:
|
for author in author_temp:
|
||||||
|
@ -145,9 +145,7 @@ class OpenOfficeImport(SongImport):
|
|||||||
"""
|
"""
|
||||||
self.file_path = file_path
|
self.file_path = file_path
|
||||||
url = file_path.as_uri()
|
url = file_path.as_uri()
|
||||||
properties = []
|
properties = tuple(self.create_property('Hidden', True))
|
||||||
properties.append(self.create_property('Hidden', True))
|
|
||||||
properties = tuple(properties)
|
|
||||||
try:
|
try:
|
||||||
self.document = self.desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
self.document = self.desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
||||||
if not self.document.supportsService("com.sun.star.presentation.PresentationDocument") and not \
|
if not self.document.supportsService("com.sun.star.presentation.PresentationDocument") and not \
|
||||||
|
@ -136,8 +136,8 @@ class OPSProImport(SongImport):
|
|||||||
verse_text = re.sub(r'^\d+\r\n', '', verse_text)
|
verse_text = re.sub(r'^\d+\r\n', '', verse_text)
|
||||||
verse_def = 'v' + verse_number.group(1)
|
verse_def = 'v' + verse_number.group(1)
|
||||||
# Detect verse tags
|
# Detect verse tags
|
||||||
elif re.match(r'^.+?\:\r\n', verse_text):
|
elif re.match(r'^.+?:\r\n', verse_text):
|
||||||
tag_match = re.match(r'^(.+?)\:\r\n(.*)', verse_text, flags=re.DOTALL)
|
tag_match = re.match(r'^(.+?):\r\n(.*)', verse_text, flags=re.DOTALL)
|
||||||
tag = tag_match.group(1).lower()
|
tag = tag_match.group(1).lower()
|
||||||
tag = tag.split(' ')[0]
|
tag = tag.split(' ')[0]
|
||||||
verse_text = tag_match.group(2)
|
verse_text = tag_match.group(2)
|
||||||
|
@ -80,7 +80,7 @@ class ProPresenterImport(SongImport):
|
|||||||
self.parse_author(author)
|
self.parse_author(author)
|
||||||
|
|
||||||
# ProPresenter 4
|
# ProPresenter 4
|
||||||
if(self.version >= 400 and self.version < 500):
|
if 400 <= self.version < 500:
|
||||||
self.copyright = root.get('CCLICopyrightInfo')
|
self.copyright = root.get('CCLICopyrightInfo')
|
||||||
self.ccli_number = root.get('CCLILicenseNumber')
|
self.ccli_number = root.get('CCLILicenseNumber')
|
||||||
count = 0
|
count = 0
|
||||||
@ -95,7 +95,7 @@ class ProPresenterImport(SongImport):
|
|||||||
self.add_verse(words, "v{count}".format(count=count))
|
self.add_verse(words, "v{count}".format(count=count))
|
||||||
|
|
||||||
# ProPresenter 5
|
# ProPresenter 5
|
||||||
elif(self.version >= 500 and self.version < 600):
|
elif 500 <= self.version < 600:
|
||||||
self.copyright = root.get('CCLICopyrightInfo')
|
self.copyright = root.get('CCLICopyrightInfo')
|
||||||
self.ccli_number = root.get('CCLILicenseNumber')
|
self.ccli_number = root.get('CCLILicenseNumber')
|
||||||
count = 0
|
count = 0
|
||||||
@ -111,7 +111,7 @@ class ProPresenterImport(SongImport):
|
|||||||
self.add_verse(words, "v{count:d}".format(count=count))
|
self.add_verse(words, "v{count:d}".format(count=count))
|
||||||
|
|
||||||
# ProPresenter 6
|
# ProPresenter 6
|
||||||
elif(self.version >= 600 and self.version < 700):
|
elif 600 <= self.version < 700:
|
||||||
self.copyright = root.get('CCLICopyrightYear')
|
self.copyright = root.get('CCLICopyrightYear')
|
||||||
self.ccli_number = root.get('CCLISongNumber')
|
self.ccli_number = root.get('CCLISongNumber')
|
||||||
count = 0
|
count = 0
|
||||||
@ -128,7 +128,7 @@ class ProPresenterImport(SongImport):
|
|||||||
b64Data = contents.text
|
b64Data = contents.text
|
||||||
data = base64.standard_b64decode(b64Data)
|
data = base64.standard_b64decode(b64Data)
|
||||||
words = None
|
words = None
|
||||||
if(contents.get('rvXMLIvarName') == "RTFData"):
|
if contents.get('rvXMLIvarName') == "RTFData":
|
||||||
words, encoding = strip_rtf(data.decode())
|
words, encoding = strip_rtf(data.decode())
|
||||||
break
|
break
|
||||||
if words:
|
if words:
|
||||||
|
@ -75,7 +75,7 @@ class VideoPsalmImport(SongImport):
|
|||||||
c = next(file_content_it)
|
c = next(file_content_it)
|
||||||
processed_content += '"' + c
|
processed_content += '"' + c
|
||||||
# Remove control characters
|
# Remove control characters
|
||||||
elif (c < chr(32)):
|
elif c < chr(32):
|
||||||
processed_content += ' '
|
processed_content += ' '
|
||||||
# Handle escaped characters
|
# Handle escaped characters
|
||||||
elif c == '\\':
|
elif c == '\\':
|
||||||
|
@ -221,7 +221,7 @@ class OpenLyrics(object):
|
|||||||
"""
|
"""
|
||||||
IMPLEMENTED_VERSION = '0.8'
|
IMPLEMENTED_VERSION = '0.8'
|
||||||
START_TAGS_REGEX = re.compile(r'\{(\w+)\}')
|
START_TAGS_REGEX = re.compile(r'\{(\w+)\}')
|
||||||
END_TAGS_REGEX = re.compile(r'\{\/(\w+)\}')
|
END_TAGS_REGEX = re.compile(r'\{/(\w+)\}')
|
||||||
VERSE_TAG_SPLITTER = re.compile('([a-zA-Z]+)([0-9]*)([a-zA-Z]?)')
|
VERSE_TAG_SPLITTER = re.compile('([a-zA-Z]+)([0-9]*)([a-zA-Z]?)')
|
||||||
|
|
||||||
def __init__(self, manager):
|
def __init__(self, manager):
|
||||||
|
@ -32,7 +32,7 @@ from PyQt5 import QtGui
|
|||||||
|
|
||||||
from openlp.core.common.registry import Registry
|
from openlp.core.common.registry import Registry
|
||||||
from openlp.core.display.screens import ScreenList
|
from openlp.core.display.screens import ScreenList
|
||||||
from openlp.core.lib.imagemanager import ImageManager, ImageWorker, Priority, PriorityQueue
|
from openlp.core.lib.imagemanager import Image, ImageManager, ImageWorker, Priority, PriorityQueue
|
||||||
from tests.helpers.testmixin import TestMixin
|
from tests.helpers.testmixin import TestMixin
|
||||||
from tests.utils.constants import RESOURCE_PATH
|
from tests.utils.constants import RESOURCE_PATH
|
||||||
|
|
||||||
|
@ -25,7 +25,78 @@ Package to test the openlp.core.lib.theme package.
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
|
|
||||||
from openlp.core.lib.theme import Theme
|
from openlp.core.lib.theme import BackgroundType
|
||||||
|
|
||||||
|
|
||||||
|
class TestBackgroundType(TestCase):
|
||||||
|
"""
|
||||||
|
Test the BackgroundType enum methods.
|
||||||
|
"""
|
||||||
|
def test_solid_to_string(self):
|
||||||
|
"""
|
||||||
|
Test the to_string method of :class:`BackgroundType`
|
||||||
|
"""
|
||||||
|
# GIVEN: A BackgroundType member
|
||||||
|
background_type = BackgroundType.Solid
|
||||||
|
|
||||||
|
# WHEN: Calling BackgroundType.to_string
|
||||||
|
# THEN: The string equivalent should have been returned
|
||||||
|
assert BackgroundType.to_string(background_type) == 'solid'
|
||||||
|
|
||||||
|
def test_gradient_to_string(self):
|
||||||
|
"""
|
||||||
|
Test the to_string method of :class:`BackgroundType`
|
||||||
|
"""
|
||||||
|
# GIVEN: A BackgroundType member
|
||||||
|
background_type = BackgroundType.Gradient
|
||||||
|
|
||||||
|
# WHEN: Calling BackgroundType.to_string
|
||||||
|
# THEN: The string equivalent should have been returned
|
||||||
|
assert BackgroundType.to_string(background_type) == 'gradient'
|
||||||
|
|
||||||
|
def test_image_to_string(self):
|
||||||
|
"""
|
||||||
|
Test the to_string method of :class:`BackgroundType`
|
||||||
|
"""
|
||||||
|
# GIVEN: A BackgroundType member
|
||||||
|
background_type = BackgroundType.Image
|
||||||
|
|
||||||
|
# WHEN: Calling BackgroundType.to_string
|
||||||
|
# THEN: The string equivalent should have been returned
|
||||||
|
assert BackgroundType.to_string(background_type) == 'image'
|
||||||
|
|
||||||
|
def test_transparent_to_string(self):
|
||||||
|
"""
|
||||||
|
Test the to_string method of :class:`BackgroundType`
|
||||||
|
"""
|
||||||
|
# GIVEN: A BackgroundType member
|
||||||
|
background_type = BackgroundType.Transparent
|
||||||
|
|
||||||
|
# WHEN: Calling BackgroundType.to_string
|
||||||
|
# THEN: The string equivalent should have been returned
|
||||||
|
assert BackgroundType.to_string(background_type) == 'transparent'
|
||||||
|
|
||||||
|
def test_video_to_string(self):
|
||||||
|
"""
|
||||||
|
Test the to_string method of :class:`BackgroundType`
|
||||||
|
"""
|
||||||
|
# GIVEN: A BackgroundType member
|
||||||
|
background_type = BackgroundType.Video
|
||||||
|
|
||||||
|
# WHEN: Calling BackgroundType.to_string
|
||||||
|
# THEN: The string equivalent should have been returned
|
||||||
|
assert BackgroundType.to_string(background_type) == 'video'
|
||||||
|
|
||||||
|
def test_stream_to_string(self):
|
||||||
|
"""
|
||||||
|
Test the to_string method of :class:`BackgroundType`
|
||||||
|
"""
|
||||||
|
# GIVEN: A BackgroundType member
|
||||||
|
background_type = BackgroundType.Stream
|
||||||
|
|
||||||
|
# WHEN: Calling BackgroundType.to_string
|
||||||
|
# THEN: The string equivalent should have been returned
|
||||||
|
assert BackgroundType.to_string(background_type) == 'stream'
|
||||||
|
|
||||||
|
|
||||||
class TestTheme(TestCase):
|
class TestTheme(TestCase):
|
||||||
|
Loading…
Reference in New Issue
Block a user