diff --git a/openlp/core/common/__init__.py b/openlp/core/common/__init__.py
index 6a111d97d..1f5ca0c30 100644
--- a/openlp/core/common/__init__.py
+++ b/openlp/core/common/__init__.py
@@ -24,6 +24,7 @@ The :mod:`common` module contains most of the components and libraries that make
OpenLP work.
"""
import hashlib
+
import logging
import os
import re
@@ -31,6 +32,7 @@ import sys
import traceback
from ipaddress import IPv4Address, IPv6Address, AddressValueError
from shutil import which
+from subprocess import check_output, CalledProcessError, STDOUT
from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import QCryptographicHash as QHash
@@ -250,6 +252,9 @@ from .applocation import AppLocation
from .actions import ActionList
from .languagemanager import LanguageManager
+if is_win():
+ from subprocess import STARTUPINFO, STARTF_USESHOWWINDOW
+
def add_actions(target, actions):
"""
@@ -376,3 +381,28 @@ def clean_filename(filename):
if not isinstance(filename, str):
filename = str(filename, 'utf-8')
return INVALID_FILE_CHARS.sub('_', CONTROL_CHARS.sub('', filename))
+
+
+def check_binary_exists(program_path):
+ """
+ Function that checks whether a binary exists.
+
+ :param program_path:The full path to the binary to check.
+ :return: program output to be parsed
+ """
+ log.debug('testing program_path: %s', program_path)
+ try:
+ # Setup startupinfo options for check_output to avoid console popping up on windows
+ if is_win():
+ startupinfo = STARTUPINFO()
+ startupinfo.dwFlags |= STARTF_USESHOWWINDOW
+ else:
+ startupinfo = None
+ runlog = check_output([program_path, '--help'], stderr=STDOUT, startupinfo=startupinfo)
+ except CalledProcessError as e:
+ runlog = e.output
+ except Exception:
+ trace_error_handler(log)
+ runlog = ''
+ log.debug('check_output returned: %s' % runlog)
+ return runlog
diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py
index 5769a3626..a472bb517 100644
--- a/openlp/core/lib/__init__.py
+++ b/openlp/core/lib/__init__.py
@@ -314,12 +314,9 @@ def create_separated_list(string_list):
return translate('OpenLP.core.lib', '%s, %s', 'Locale list separator: start') % (string_list[0], merged)
-from .colorbutton import ColorButton
from .exceptions import ValidationError
from .filedialog import FileDialog
from .screen import ScreenList
-from .listwidgetwithdnd import ListWidgetWithDnD
-from .treewidgetwithdnd import TreeWidgetWithDnD
from .formattingtags import FormattingTags
from .spelltextedit import SpellTextEdit
from .plugin import PluginStatus, StringContent, Plugin
@@ -327,8 +324,6 @@ from .pluginmanager import PluginManager
from .settingstab import SettingsTab
from .serviceitem import ServiceItem, ServiceItemType, ItemCapabilities
from .htmlbuilder import build_html, build_lyrics_format_css, build_lyrics_outline_css
-from .toolbar import OpenLPToolbar
-from .dockwidget import OpenLPDockWidget
from .imagemanager import ImageManager
from .renderer import Renderer
from .mediamanageritem import MediaManagerItem
diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py
index 04df1d38a..5af90c1b7 100644
--- a/openlp/core/lib/mediamanageritem.py
+++ b/openlp/core/lib/mediamanageritem.py
@@ -29,10 +29,11 @@ import re
from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, RegistryProperties, Settings, UiStrings, translate
-from openlp.core.lib import FileDialog, OpenLPToolbar, ServiceItem, StringContent, ListWidgetWithDnD, \
- ServiceItemContext
+from openlp.core.lib import FileDialog, ServiceItem, StringContent, ServiceItemContext
from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import create_widget_action, critical_error_message_box
+from openlp.core.ui.lib.listwidgetwithdnd import ListWidgetWithDnD
+from openlp.core.ui.lib.toolbar import OpenLPToolbar
log = logging.getLogger(__name__)
diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py
index c6777c756..599efd8e7 100644
--- a/openlp/core/ui/__init__.py
+++ b/openlp/core/ui/__init__.py
@@ -113,7 +113,6 @@ from .settingsform import SettingsForm
from .formattingtagform import FormattingTagForm
from .formattingtagcontroller import FormattingTagController
from .shortcutlistform import ShortcutListForm
-from .mediadockmanager import MediaDockManager
from .servicemanager import ServiceManager
from .thememanager import ThemeManager
from .projector.manager import ProjectorManager
@@ -121,7 +120,7 @@ from .projector.tab import ProjectorTab
from .projector.editform import ProjectorEditForm
__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeForm',
- 'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm',
+ 'ThemeManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm',
'Display', 'ServiceNoteForm', 'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay',
'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm',
'FormattingTagForm', 'ShortcutListForm', 'FormattingTagController', 'SingleColumnTableWidget',
diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py
index be2630b35..816e947ba 100644
--- a/openlp/core/ui/generaltab.py
+++ b/openlp/core/ui/generaltab.py
@@ -27,7 +27,8 @@ import logging
from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, Settings, UiStrings, translate, get_images_filter
-from openlp.core.lib import SettingsTab, ScreenList, ColorButton, build_icon
+from openlp.core.lib import SettingsTab, ScreenList, build_icon
+from openlp.core.ui.lib.colorbutton import ColorButton
log = logging.getLogger(__name__)
diff --git a/openlp/core/ui/lib/__init__.py b/openlp/core/ui/lib/__init__.py
index 02bded5b0..6cdeac8a6 100644
--- a/openlp/core/ui/lib/__init__.py
+++ b/openlp/core/ui/lib/__init__.py
@@ -19,3 +19,15 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+
+from .colorbutton import ColorButton
+from .listwidgetwithdnd import ListWidgetWithDnD
+from .treewidgetwithdnd import TreeWidgetWithDnD
+from .toolbar import OpenLPToolbar
+from .dockwidget import OpenLPDockWidget
+from .wizard import OpenLPWizard, WizardStrings
+from .mediadockmanager import MediaDockManager
+from .listpreviewwidget import ListPreviewWidget
+
+__all__ = ['ColorButton', 'ListPreviewWidget', 'ListWidgetWithDnD', 'OpenLPToolbar', 'OpenLPDockWidget',
+ 'OpenLPWizard', 'WizardStrings', 'MediaDockManager', 'ListPreviewWidget']
diff --git a/openlp/core/lib/colorbutton.py b/openlp/core/ui/lib/colorbutton.py
similarity index 100%
rename from openlp/core/lib/colorbutton.py
rename to openlp/core/ui/lib/colorbutton.py
diff --git a/openlp/core/lib/dockwidget.py b/openlp/core/ui/lib/dockwidget.py
similarity index 100%
rename from openlp/core/lib/dockwidget.py
rename to openlp/core/ui/lib/dockwidget.py
diff --git a/openlp/core/ui/listpreviewwidget.py b/openlp/core/ui/lib/listpreviewwidget.py
similarity index 100%
rename from openlp/core/ui/listpreviewwidget.py
rename to openlp/core/ui/lib/listpreviewwidget.py
diff --git a/openlp/core/lib/listwidgetwithdnd.py b/openlp/core/ui/lib/listwidgetwithdnd.py
similarity index 100%
rename from openlp/core/lib/listwidgetwithdnd.py
rename to openlp/core/ui/lib/listwidgetwithdnd.py
diff --git a/openlp/core/ui/mediadockmanager.py b/openlp/core/ui/lib/mediadockmanager.py
similarity index 100%
rename from openlp/core/ui/mediadockmanager.py
rename to openlp/core/ui/lib/mediadockmanager.py
diff --git a/openlp/core/lib/toolbar.py b/openlp/core/ui/lib/toolbar.py
similarity index 100%
rename from openlp/core/lib/toolbar.py
rename to openlp/core/ui/lib/toolbar.py
diff --git a/openlp/core/lib/treewidgetwithdnd.py b/openlp/core/ui/lib/treewidgetwithdnd.py
similarity index 100%
rename from openlp/core/lib/treewidgetwithdnd.py
rename to openlp/core/ui/lib/treewidgetwithdnd.py
diff --git a/openlp/core/ui/wizard.py b/openlp/core/ui/lib/wizard.py
similarity index 100%
rename from openlp/core/ui/wizard.py
rename to openlp/core/ui/lib/wizard.py
diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py
index ac3c19aa4..39e0ac518 100644
--- a/openlp/core/ui/mainwindow.py
+++ b/openlp/core/ui/mainwindow.py
@@ -38,15 +38,17 @@ from openlp.core.common import Registry, RegistryProperties, AppLocation, Langua
check_directory_exists, translate, is_win, is_macosx, add_actions
from openlp.core.common.actions import ActionList, CategoryOrder
from openlp.core.common.versionchecker import get_application_version
-from openlp.core.lib import Renderer, OpenLPDockWidget, PluginManager, ImageManager, PluginStatus, ScreenList, \
- build_icon
+from openlp.core.lib import Renderer, PluginManager, ImageManager, PluginStatus, ScreenList, build_icon
from openlp.core.lib.ui import UiStrings, create_action
from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, ThemeManager, LiveController, PluginForm, \
- MediaDockManager, ShortcutListForm, FormattingTagForm, PreviewController
+ ShortcutListForm, FormattingTagForm, PreviewController
from openlp.core.ui.firsttimeform import FirstTimeForm
from openlp.core.ui.media import MediaController
from openlp.core.ui.printserviceform import PrintServiceForm
from openlp.core.ui.projector.manager import ProjectorManager
+from openlp.core.ui.lib.toolbar import OpenLPToolbar
+from openlp.core.ui.lib.dockwidget import OpenLPDockWidget
+from openlp.core.ui.lib.mediadockmanager import MediaDockManager
log = logging.getLogger(__name__)
diff --git a/openlp/core/ui/media/mediacontroller.py b/openlp/core/ui/media/mediacontroller.py
index cf116e861..021ea5281 100644
--- a/openlp/core/ui/media/mediacontroller.py
+++ b/openlp/core/ui/media/mediacontroller.py
@@ -29,14 +29,16 @@ import datetime
from PyQt5 import QtCore, QtWidgets
from openlp.core.common import OpenLPMixin, Registry, RegistryMixin, RegistryProperties, Settings, UiStrings, translate
-from openlp.core.lib import OpenLPToolbar, ItemCapabilities
+from openlp.core.lib import ItemCapabilities
from openlp.core.lib.ui import critical_error_message_box
-from openlp.core.ui.media import MediaState, MediaInfo, MediaType, get_media_players, set_media_players,\
- parse_optical_path
-from openlp.core.ui.media.vendor.mediainfoWrapper import MediaInfoWrapper
-from openlp.core.ui.media.mediaplayer import MediaPlayer
from openlp.core.common import AppLocation
from openlp.core.ui import DisplayControllerType
+from openlp.core.ui.media.vendor.mediainfoWrapper import MediaInfoWrapper
+from openlp.core.ui.media.mediaplayer import MediaPlayer
+from openlp.core.ui.media import MediaState, MediaInfo, MediaType, get_media_players, set_media_players,\
+ parse_optical_path
+from openlp.core.ui.lib.toolbar import OpenLPToolbar
+from openlp.core.ui.lib.dockwidget import OpenLPDockWidget
log = logging.getLogger(__name__)
@@ -296,7 +298,7 @@ class MediaController(RegistryMixin, OpenLPMixin, RegistryProperties):
tooltip=translate('OpenLP.SlideController', 'Stop playing media.'),
triggers=controller.send_to_plugins)
controller.mediabar.add_toolbar_action('playbackLoop', text='media_playback_loop',
- icon=':/slides/media_playback_stop.png', checked=False,
+ icon=':/media/media_repeat.png', checked=False,
tooltip=translate('OpenLP.SlideController', 'Loop playing media.'),
triggers=controller.send_to_plugins)
controller.position_label = QtWidgets.QLabel()
diff --git a/openlp/core/ui/media/playertab.py b/openlp/core/ui/media/playertab.py
index ed34993ca..1fca21450 100644
--- a/openlp/core/ui/media/playertab.py
+++ b/openlp/core/ui/media/playertab.py
@@ -26,9 +26,10 @@ import platform
from PyQt5 import QtCore, QtWidgets
from openlp.core.common import Registry, Settings, UiStrings, translate
-from openlp.core.lib import ColorButton, SettingsTab
+from openlp.core.lib import SettingsTab
from openlp.core.lib.ui import create_button
from openlp.core.ui.media import get_media_players, set_media_players
+from openlp.core.ui.lib.colorbutton import ColorButton
class MediaQCheckBox(QtWidgets.QCheckBox):
diff --git a/openlp/core/ui/projector/editform.py b/openlp/core/ui/projector/editform.py
index 4b06f486f..4996cc75f 100644
--- a/openlp/core/ui/projector/editform.py
+++ b/openlp/core/ui/projector/editform.py
@@ -182,9 +182,10 @@ class ProjectorEditForm(QDialog, Ui_ProjectorEditForm):
QtWidgets.QMessageBox.warning(self,
translate('OpenLP.ProjectorEdit', 'Duplicate Name'),
translate('OpenLP.ProjectorEdit',
- 'There is already an entry with name "%s" in '
- 'the database as ID "%s".
'
- 'Please enter a different name.' % (name, record.id)))
+ 'There is already an entry with name "{name}" in '
+ 'the database as ID "{record}".
'
+ 'Please enter a different name.'.format(name=name,
+ record=record.id)))
valid = False
return
adx = self.ip_text.text()
@@ -198,17 +199,17 @@ class ProjectorEditForm(QDialog, Ui_ProjectorEditForm):
QtWidgets.QMessageBox.warning(self,
translate('OpenLP.ProjectorWizard', 'Duplicate IP Address'),
translate('OpenLP.ProjectorWizard',
- 'IP address "%s"
is already in the database as ID %s.'
- '
Please Enter a different IP address.' %
- (adx, ip.id)))
+ 'IP address "{ip}"
is already in the database '
+ 'as ID {data}.
Please Enter a different '
+ 'IP address.'.format(ip=adx, data=ip.id)))
valid = False
return
else:
QtWidgets.QMessageBox.warning(self,
translate('OpenLP.ProjectorWizard', 'Invalid IP Address'),
translate('OpenLP.ProjectorWizard',
- 'IP address "%s"
is not a valid IP address.'
- '
Please enter a valid IP address.' % adx))
+ 'IP address "{ip}"
is not a valid IP address.'
+ '
Please enter a valid IP address.'.format(ip=adx)))
valid = False
return
port = int(self.port_text.text())
@@ -219,8 +220,8 @@ class ProjectorEditForm(QDialog, Ui_ProjectorEditForm):
'Port numbers below 1000 are reserved for admin use only, '
'
and port numbers above 32767 are not currently usable.'
'
Please enter a valid port number between '
- ' 1000 and 32767.'
- '
Default PJLink port is %s' % PJLINK_PORT))
+ '1000 and 32767.
'
+ 'Default PJLink port is {port}'.format(port=PJLINK_PORT)))
valid = False
if valid:
self.projector.ip = self.ip_text.text()
diff --git a/openlp/core/ui/projector/manager.py b/openlp/core/ui/projector/manager.py
index fc40ee386..7c56c2916 100644
--- a/openlp/core/ui/projector/manager.py
+++ b/openlp/core/ui/projector/manager.py
@@ -35,7 +35,7 @@ from PyQt5.QtWidgets import QWidget
from openlp.core.common import RegistryProperties, Settings, OpenLPMixin, \
RegistryMixin, translate
-from openlp.core.lib import OpenLPToolbar
+from openlp.core.ui.lib import OpenLPToolbar
from openlp.core.lib.ui import create_widget_action
from openlp.core.lib.projector import DialogSourceStyle
from openlp.core.lib.projector.constants import *
@@ -344,7 +344,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
real_projector = item.data(QtCore.Qt.UserRole)
projector_name = str(item.text())
visible = real_projector.link.status_connect >= S_CONNECTED
- log.debug('(%s) Building menu - visible = %s' % (projector_name, visible))
+ log.debug('({name}) Building menu - visible = {visible}'.format(name=projector_name, visible=visible))
self.delete_action.setVisible(True)
self.edit_action.setVisible(True)
self.connect_action.setVisible(not visible)
@@ -394,7 +394,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
projectordb=self.projectordb,
edit=edit)
source = source_select_form.exec(projector.link)
- log.debug('(%s) source_select_form() returned %s' % (projector.link.ip, source))
+ log.debug('({ip}) source_select_form() returned {data}'.format(ip=projector.link.ip, data=source))
if source is not None and source > 0:
projector.link.set_input_source(str(source))
return
@@ -473,8 +473,9 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
return
projector = list_item.data(QtCore.Qt.UserRole)
msg = QtWidgets.QMessageBox()
- msg.setText(translate('OpenLP.ProjectorManager', 'Delete projector (%s) %s?') % (projector.link.ip,
- projector.link.name))
+ msg.setText(translate('OpenLP.ProjectorManager',
+ 'Delete projector ({ip}) {name}?'.format(ip=projector.link.ip,
+ name=projector.link.name)))
msg.setInformativeText(translate('OpenLP.ProjectorManager', 'Are you sure you want to delete this projector?'))
msg.setStandardButtons(msg.Cancel | msg.Ok)
msg.setDefaultButton(msg.Cancel)
@@ -522,7 +523,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
list_item = None
deleted = self.projectordb.delete_projector(projector.db_item)
for item in self.projector_list:
- log.debug('New projector list - item: %s %s' % (item.link.ip, item.link.name))
+ log.debug('New projector list - item: {ip} {name}'.format(ip=item.link.ip, name=item.link.name))
def on_disconnect_projector(self, opt=None):
"""
@@ -627,53 +628,58 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
"""
lwi = self.projector_list_widget.item(self.projector_list_widget.currentRow())
projector = lwi.data(QtCore.Qt.UserRole)
- message = '%s: %s
' % (translate('OpenLP.ProjectorManager', 'Name'),
- projector.link.name)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'IP'),
- projector.link.ip)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Port'),
- projector.link.port)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Notes'),
- projector.link.notes)
- message = '%s
' % message
+ message = '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Name'),
+ data=projector.link.name)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'IP'),
+ data=projector.link.ip)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Port'),
+ data=projector.link.port)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Notes'),
+ data=projector.link.notes)
+ message += '
'
if projector.link.manufacturer is None:
- message = '%s%s' % (message, translate('OpenLP.ProjectorManager',
- 'Projector information not available at this time.'))
+ message += translate('OpenLP.ProjectorManager', 'Projector information not available at this time.')
else:
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Projector Name'),
- projector.link.pjlink_name)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Manufacturer'),
- projector.link.manufacturer)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Model'),
- projector.link.model)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Other info'),
- projector.link.other_info)
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Power status'),
- ERROR_MSG[projector.link.power])
- message = '%s%s: %s
' % (message, translate('OpenLP.ProjectorManager', 'Shutter is'),
- translate('OpenLP.ProjectorManager', 'Closed')
- if projector.link.shutter else translate('OpenLP', 'Open'))
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager',
+ 'Projector Name'),
+ data=projector.link.pjlink_name)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Manufacturer'),
+ data=projector.link.manufacturer)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Model'),
+ data=projector.link.model)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager',
+ 'Other info'),
+ data=projector.link.other_info)
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Power status'),
+ data=ERROR_MSG[projector.link.power])
+ message += '{title}: {data}
'.format(title=translate('OpenLP.ProjectorManager', 'Shutter is'),
+ data=translate('OpenLP.ProjectorManager', 'Closed')
+ if projector.link.shutter
+ else translate('OpenLP', 'Open'))
message = '%s%s: %s
' % (message,
translate('OpenLP.ProjectorManager', 'Current source input is'),
projector.link.source)
count = 1
for item in projector.link.lamp:
- message = '%s %s %s (%s) %s: %s
' % (message,
- translate('OpenLP.ProjectorManager', 'Lamp'),
- count,
- translate('OpenLP.ProjectorManager', 'On')
- if item['On']
- else translate('OpenLP.ProjectorManager', 'Off'),
- translate('OpenLP.ProjectorManager', 'Hours'),
- item['Hours'])
- count = count + 1
- message = '%s
' % message
+ message += '{title} {count} {status} '.format(title=translate('OpenLP.ProjectorManager',
+ 'Lamp'),
+ count=count,
+ status=translate('OpenLP.ProjectorManager',
+ ' is on')
+ if item['On']
+ else translate('OpenLP.ProjectorManager',
+ 'is off'))
+
+ message += '{title}: {hours}
'.format(title=translate('OpenLP.ProjectorManager', 'Hours'),
+ hours=item['Hours'])
+ count += 1
+ message += '
'
if projector.link.projector_errors is None:
- message = '%s%s' % (message, translate('OpenLP.ProjectorManager', 'No current errors or warnings'))
+ message += translate('OpenLP.ProjectorManager', 'No current errors or warnings')
else:
- message = '%s%s' % (message, translate('OpenLP.ProjectorManager', 'Current errors/warnings'))
+ message += '{data}'.format(data=translate('OpenLP.ProjectorManager', 'Current errors/warnings'))
for (key, val) in projector.link.projector_errors.items():
- message = '%s%s: %s
' % (message, key, ERROR_MSG[val])
+ message += '{key}: {data}
'.format(key=key, data=ERROR_MSG[val])
QtWidgets.QMessageBox.information(self, translate('OpenLP.ProjectorManager', 'Projector Information'), message)
def _add_projector(self, projector):
@@ -743,7 +749,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
if start:
item.link.connect_to_host()
for item in self.projector_list:
- log.debug('New projector list - item: (%s) %s' % (item.link.ip, item.link.name))
+ log.debug('New projector list - item: ({ip}) {name}'.format(ip=item.link.ip, name=item.link.name))
@pyqtSlot(str)
def add_projector_from_wizard(self, ip, opts=None):
@@ -753,7 +759,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
:param ip: IP address of new record item to find
:param opts: Needed by PyQt5
"""
- log.debug('add_projector_from_wizard(ip=%s)' % ip)
+ log.debug('add_projector_from_wizard(ip={ip})'.format(ip=ip))
item = self.projectordb.get_projector_by_ip(ip)
self.add_projector(item)
@@ -764,7 +770,7 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
:param projector: Projector() instance of projector with updated information
"""
- log.debug('edit_projector_from_wizard(ip=%s)' % projector.ip)
+ log.debug('edit_projector_from_wizard(ip={ip})'.format(ip=projector.ip))
self.old_projector.link.name = projector.name
self.old_projector.link.ip = projector.ip
self.old_projector.link.pin = None if projector.pin == '' else projector.pin
@@ -816,7 +822,9 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
else:
status_code = status
message = ERROR_MSG[status] if msg is None else msg
- log.debug('(%s) updateStatus(status=%s) message: "%s"' % (item.link.name, status_code, message))
+ log.debug('({name}) updateStatus(status={status}) message: "{message}"'.format(name=item.link.name,
+ status=status_code,
+ message=message))
if status in STATUS_ICONS:
if item.status == status:
return
@@ -826,14 +834,14 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
status_code = ERROR_STRING[status]
elif status in STATUS_STRING:
status_code = STATUS_STRING[status]
- log.debug('(%s) Updating icon with %s' % (item.link.name, status_code))
+ log.debug('({name}) Updating icon with {code}'.format(name=item.link.name, code=status_code))
item.widget.setIcon(item.icon)
self.update_icons()
def get_toolbar_item(self, name, enabled=False, hidden=False):
item = self.one_toolbar.findChild(QtWidgets.QAction, name)
if item == 0:
- log.debug('No item found with name "%s"' % name)
+ log.debug('No item found with name "{name}"'.format(name=name))
return
item.setVisible(False if hidden else True)
item.setEnabled(True if enabled else False)
@@ -918,11 +926,12 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
:param name: Name from QListWidgetItem
"""
- QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorManager',
- '"%s" Authentication Error' % name),
+ title = '"{name} {message}" '.format(name=name,
+ message=translate('OpenLP.ProjectorManager', 'Authentication Error'))
+ QtWidgets.QMessageBox.warning(self, title,
'
There was an authentication error while trying to connect.'
'
Please verify your PIN setting '
- 'for projector item "%s"' % name)
+ 'for projector item "{name}"'.format(name=name))
@pyqtSlot(str)
def no_authentication_error(self, name):
@@ -932,11 +941,12 @@ class ProjectorManager(OpenLPMixin, RegistryMixin, QWidget, Ui_ProjectorManager,
:param name: Name from QListWidgetItem
"""
- QtWidgets.QMessageBox.warning(self, translate('OpenLP.ProjectorManager',
- '"%s" No Authentication Error' % name),
+ title = '"{name} {message}" '.format(name=name,
+ message=translate('OpenLP.ProjectorManager', 'No Authentication Error'))
+ QtWidgets.QMessageBox.warning(self, title,
'
PIN is set and projector does not require authentication.'
'
Please verify your PIN setting '
- 'for projector item "%s"' % name)
+ 'for projector item "{name}"'.format(name=name))
class ProjectorItem(QObject):
@@ -972,5 +982,5 @@ def not_implemented(function):
QtWidgets.QMessageBox.information(None,
translate('OpenLP.ProjectorManager', 'Not Implemented Yet'),
translate('OpenLP.ProjectorManager',
- 'Function "%s"
has not been implemented yet.'
- '
Please check back again later.' % function))
+ 'Function "{function}"
has not been implemented yet.'
+ '
Please check back again later.'.format(function=function)))
diff --git a/openlp/core/ui/projector/sourceselectform.py b/openlp/core/ui/projector/sourceselectform.py
index 11efcdb08..7d73f6a5a 100644
--- a/openlp/core/ui/projector/sourceselectform.py
+++ b/openlp/core/ui/projector/sourceselectform.py
@@ -115,7 +115,7 @@ def Build_Tab(group, source_key, default, projector, projectordb, edit=False):
if edit:
for key in sourcelist:
item = QLineEdit()
- item.setObjectName('source_key_%s' % key)
+ item.setObjectName('source_key_{key}'.format(key=key))
source_item = projectordb.get_source_by_code(code=key, projector_id=projector.db_item.id)
if source_item is None:
item.setText(PJLINK_DEFAULT_CODES[key])
@@ -161,7 +161,7 @@ def set_button_tooltip(bar):
button.setToolTip(translate('OpenLP.SourceSelectForm',
'Save changes and return to OpenLP'))
else:
- log.debug('No tooltip for button {}'.format(button.text()))
+ log.debug('No tooltip for button {text}'.format(text=button.text()))
class FingerTabBarWidget(QTabBar):
@@ -359,16 +359,20 @@ class SourceSelectTabs(QDialog):
continue
item = self.projectordb.get_source_by_code(code=code, projector_id=projector.id)
if item is None:
- log.debug("(%s) Adding new source text %s: %s" % (projector.ip, code, text))
+ log.debug("({ip}) Adding new source text {code}: {text}".format(ip=projector.ip,
+ code=code,
+ text=text))
item = ProjectorSource(projector_id=projector.id, code=code, text=text)
else:
item.text = text
- log.debug('(%s) Updating source code %s with text="%s"' % (projector.ip, item.code, item.text))
+ log.debug('({ip}) Updating source code {code} with text="{text}"'.format(ip=projector.ip,
+ code=item.code,
+ text=item.text))
self.projectordb.add_source(item)
selected = 0
else:
selected = self.button_group.checkedId()
- log.debug('SourceSelectTabs().accepted() Setting source to %s' % selected)
+ log.debug('SourceSelectTabs().accepted() Setting source to {selected}'.format(selected=selected))
self.done(selected)
@@ -417,7 +421,7 @@ class SourceSelectSingle(QDialog):
if self.edit:
for key in keys:
item = QLineEdit()
- item.setObjectName('source_key_%s' % key)
+ item.setObjectName('source_key_{key}'.format(key=key))
source_item = self.projectordb.get_source_by_code(code=key, projector_id=self.projector.db_item.id)
if source_item is None:
item.setText(PJLINK_DEFAULT_CODES[key])
@@ -498,14 +502,18 @@ class SourceSelectSingle(QDialog):
continue
item = self.projectordb.get_source_by_code(code=code, projector_id=projector.id)
if item is None:
- log.debug("(%s) Adding new source text %s: %s" % (projector.ip, code, text))
+ log.debug("({ip}) Adding new source text {code}: {text}".format(ip=projector.ip,
+ code=code,
+ text=text))
item = ProjectorSource(projector_id=projector.id, code=code, text=text)
else:
item.text = text
- log.debug('(%s) Updating source code %s with text="%s"' % (projector.ip, item.code, item.text))
+ log.debug('({ip}) Updating source code {code} with text="{text}"'.format(ip=projector.ip,
+ code=item.code,
+ text=item.text))
self.projectordb.add_source(item)
selected = 0
else:
selected = self.button_group.checkedId()
- log.debug('SourceSelectDialog().accepted() Setting source to %s' % selected)
+ log.debug('SourceSelectDialog().accepted() Setting source to {selected}'.format(selected=selected))
self.done(selected)
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index 66cbdf1b7..82b489344 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -35,9 +35,10 @@ from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, RegistryProperties, AppLocation, Settings, ThemeLevel, OpenLPMixin, \
RegistryMixin, check_directory_exists, UiStrings, translate, split_filename, delete_file
from openlp.core.common.actions import ActionList, CategoryOrder
-from openlp.core.lib import OpenLPToolbar, ServiceItem, ItemCapabilities, PluginStatus, build_icon
+from openlp.core.lib import ServiceItem, ItemCapabilities, PluginStatus, build_icon
from openlp.core.lib.ui import critical_error_message_box, create_widget_action, find_and_set_in_combo_box
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
+from openlp.core.ui.lib import OpenLPToolbar
from openlp.core.common.languagemanager import format_time
diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py
index 96ce82868..ea2abe5fb 100644
--- a/openlp/core/ui/slidecontroller.py
+++ b/openlp/core/ui/slidecontroller.py
@@ -33,11 +33,14 @@ from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, RegistryProperties, Settings, SlideLimits, UiStrings, translate, \
RegistryMixin, OpenLPMixin
from openlp.core.common.actions import ActionList, CategoryOrder
-from openlp.core.lib import OpenLPToolbar, ItemCapabilities, ServiceItem, ImageSource, ServiceItemAction, \
- ScreenList, build_icon, build_html
+from openlp.core.lib import ItemCapabilities, ServiceItem, ImageSource, ServiceItemAction, ScreenList, build_icon, \
+ build_html
from openlp.core.lib.ui import create_action
+from openlp.core.ui.lib.toolbar import OpenLPToolbar
+from openlp.core.ui.lib.dockwidget import OpenLPDockWidget
+from openlp.core.ui.lib.listpreviewwidget import ListPreviewWidget
from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType
-from openlp.core.ui.listpreviewwidget import ListPreviewWidget
+
# Threshold which has to be trespassed to toggle.
HIDE_MENU_THRESHOLD = 27
diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py
index 20143ddaa..fc231a859 100644
--- a/openlp/core/ui/themeform.py
+++ b/openlp/core/ui/themeform.py
@@ -31,6 +31,7 @@ from openlp.core.common import Registry, RegistryProperties, UiStrings, translat
from openlp.core.lib.theme import BackgroundType, BackgroundGradientType
from openlp.core.lib.ui import critical_error_message_box
from openlp.core.ui import ThemeLayoutForm
+from openlp.core.ui.lib.colorbutton import ColorButton
from .themewizard import Ui_ThemeWizard
log = logging.getLogger(__name__)
diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py
index bb8a1a8a7..32975e9aa 100644
--- a/openlp/core/ui/thememanager.py
+++ b/openlp/core/ui/thememanager.py
@@ -31,11 +31,12 @@ from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, RegistryProperties, AppLocation, Settings, OpenLPMixin, RegistryMixin, \
check_directory_exists, UiStrings, translate, is_win, get_filesystem_encoding, delete_file
-from openlp.core.lib import FileDialog, ImageSource, OpenLPToolbar, ValidationError, get_text_file_string, build_icon, \
+from openlp.core.lib import FileDialog, ImageSource, ValidationError, get_text_file_string, build_icon, \
check_item_selected, create_thumb, validate_thumb
from openlp.core.lib.theme import ThemeXML, BackgroundType
from openlp.core.lib.ui import critical_error_message_box, create_widget_action
from openlp.core.ui import FileRenameForm, ThemeForm
+from openlp.core.ui.lib import OpenLPToolbar
from openlp.core.common.languagemanager import get_locale_key
diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py
index b041a0905..ab8854ef2 100644
--- a/openlp/core/ui/themewizard.py
+++ b/openlp/core/ui/themewizard.py
@@ -25,9 +25,10 @@ The Create/Edit theme wizard
from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import UiStrings, translate, is_macosx
-from openlp.core.lib import build_icon, ColorButton
+from openlp.core.lib import build_icon
from openlp.core.lib.theme import HorizontalType, BackgroundType, BackgroundGradientType
from openlp.core.lib.ui import add_welcome_page, create_valign_selection_widgets
+from openlp.core.ui.lib.colorbutton import ColorButton
class Ui_ThemeWizard(object):
diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py
index 2875493b6..2859a71ce 100644
--- a/openlp/plugins/alerts/lib/alertstab.py
+++ b/openlp/plugins/alerts/lib/alertstab.py
@@ -23,8 +23,9 @@
from PyQt5 import QtGui, QtWidgets
from openlp.core.common import Settings, UiStrings, translate
-from openlp.core.lib import ColorButton, SettingsTab
+from openlp.core.lib import SettingsTab
from openlp.core.lib.ui import create_valign_selection_widgets
+from openlp.core.ui.lib.colorbutton import ColorButton
class AlertsTab(SettingsTab):
diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py
index 27dbea963..45efe0e5f 100644
--- a/openlp/plugins/bibles/forms/bibleimportform.py
+++ b/openlp/plugins/bibles/forms/bibleimportform.py
@@ -31,7 +31,7 @@ from PyQt5 import QtWidgets
from openlp.core.common import AppLocation, Settings, UiStrings, translate, clean_filename
from openlp.core.lib.db import delete_database
from openlp.core.lib.ui import critical_error_message_box
-from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
+from openlp.core.ui.lib.wizard import OpenLPWizard, WizardStrings
from openlp.core.common.languagemanager import get_locale_key
from openlp.plugins.bibles.lib.manager import BibleFormat
from openlp.plugins.bibles.lib.db import BiblesResourcesDB, clean_filename
diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py
index 611e6ead3..11771e9aa 100644
--- a/openlp/plugins/bibles/forms/bibleupgradeform.py
+++ b/openlp/plugins/bibles/forms/bibleupgradeform.py
@@ -32,7 +32,7 @@ from PyQt5 import QtCore, QtWidgets
from openlp.core.common import Registry, AppLocation, UiStrings, Settings, check_directory_exists, translate, \
delete_file
from openlp.core.lib.ui import critical_error_message_box
-from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
+from openlp.core.ui.lib.wizard import OpenLPWizard, WizardStrings
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, BiblesResourcesDB
from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract
diff --git a/openlp/plugins/images/lib/imagetab.py b/openlp/plugins/images/lib/imagetab.py
index 80578dc56..2cc6776b1 100644
--- a/openlp/plugins/images/lib/imagetab.py
+++ b/openlp/plugins/images/lib/imagetab.py
@@ -23,7 +23,8 @@
from PyQt5 import QtWidgets
from openlp.core.common import Settings, UiStrings, translate
-from openlp.core.lib import ColorButton, SettingsTab
+from openlp.core.lib import SettingsTab
+from openlp.core.ui.lib.colorbutton import ColorButton
class ImageTab(SettingsTab):
diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py
index 80a49f81c..d127fba4b 100644
--- a/openlp/plugins/images/lib/mediaitem.py
+++ b/openlp/plugins/images/lib/mediaitem.py
@@ -27,9 +27,10 @@ from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, AppLocation, Settings, UiStrings, check_directory_exists, translate, \
delete_file, get_images_filter
-from openlp.core.lib import ItemCapabilities, MediaManagerItem, ServiceItemContext, StringContent, TreeWidgetWithDnD,\
- build_icon, check_item_selected, create_thumb, validate_thumb
+from openlp.core.lib import ItemCapabilities, MediaManagerItem, ServiceItemContext, StringContent, build_icon, \
+ check_item_selected, create_thumb, validate_thumb
from openlp.core.lib.ui import create_widget_action, critical_error_message_box
+from openlp.core.ui.lib.treewidgetwithdnd import TreeWidgetWithDnD
from openlp.core.common.languagemanager import get_locale_key
from openlp.plugins.images.forms import AddGroupForm, ChooseGroupForm
from openlp.plugins.images.lib.db import ImageFilenames, ImageGroups
diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py
index daeb4dc2c..1d5529084 100644
--- a/openlp/plugins/media/mediaplugin.py
+++ b/openlp/plugins/media/mediaplugin.py
@@ -24,10 +24,13 @@ The Media plugin
"""
import logging
+import os
+import re
+from shutil import which
from PyQt5 import QtCore
-from openlp.core.common import Settings, translate
+from openlp.core.common import AppLocation, Settings, translate, check_binary_exists, is_win
from openlp.core.lib import Plugin, StringContent, build_icon
from openlp.plugins.media.lib import MediaMediaItem, MediaTab
@@ -62,6 +65,15 @@ class MediaPlugin(Plugin):
"""
super().initialise()
+ def check_pre_conditions(self):
+ """
+ Check it we have a valid environment.
+ :return: true or false
+ """
+ log.debug('check_installed Mediainfo')
+ # Use the user defined program if given
+ return process_check_binary('mediainfo')
+
def app_startup(self):
"""
Override app_startup() in order to do nothing
@@ -137,3 +149,21 @@ class MediaPlugin(Plugin):
Add html code to htmlbuilder.
"""
return self.media_controller.get_media_display_html()
+
+
+def process_check_binary(program_path):
+ """
+ Function that checks whether a binary MediaInfo is present
+
+ :param program_path:The full path to the binary to check.
+ :return: If exists or not
+ """
+ program_type = None
+ runlog = check_binary_exists(program_path)
+ print(runlog, type(runlog))
+ # Analyse the output to see it the program is mediainfo
+ for line in runlog.splitlines():
+ decoded_line = line.decode()
+ if re.search('MediaInfo Command line', decoded_line, re.IGNORECASE):
+ return True
+ return False
diff --git a/openlp/plugins/presentations/lib/pdfcontroller.py b/openlp/plugins/presentations/lib/pdfcontroller.py
index dbea84327..48150a9f2 100644
--- a/openlp/plugins/presentations/lib/pdfcontroller.py
+++ b/openlp/plugins/presentations/lib/pdfcontroller.py
@@ -22,13 +22,12 @@
import os
import logging
-from tempfile import NamedTemporaryFile
import re
from shutil import which
-from subprocess import check_output, CalledProcessError, STDOUT
+from subprocess import check_output, CalledProcessError
-from openlp.core.common import AppLocation
-from openlp.core.common import Settings, is_win, trace_error_handler
+from openlp.core.common import AppLocation, check_binary_exists
+from openlp.core.common import Settings, is_win
from openlp.core.lib import ScreenList
from .presentationcontroller import PresentationController, PresentationDocument
@@ -61,7 +60,7 @@ class PdfController(PresentationController):
self.check_installed()
@staticmethod
- def check_binary(program_path):
+ def process_check_binary(program_path):
"""
Function that checks whether a binary is either ghostscript or mudraw or neither.
Is also used from presentationtab.py
@@ -70,22 +69,7 @@ class PdfController(PresentationController):
:return: Type of the binary, 'gs' if ghostscript, 'mudraw' if mudraw, None if invalid.
"""
program_type = None
- runlog = ''
- log.debug('testing program_path: %s', program_path)
- try:
- # Setup startupinfo options for check_output to avoid console popping up on windows
- if is_win():
- startupinfo = STARTUPINFO()
- startupinfo.dwFlags |= STARTF_USESHOWWINDOW
- else:
- startupinfo = None
- runlog = check_output([program_path, '--help'], stderr=STDOUT, startupinfo=startupinfo)
- except CalledProcessError as e:
- runlog = e.output
- except Exception:
- trace_error_handler(log)
- runlog = ''
- log.debug('check_output returned: %s' % runlog)
+ runlog = check_binary_exists(program_path)
# Analyse the output to see it the program is mudraw, ghostscript or neither
for line in runlog.splitlines():
decoded_line = line.decode()
@@ -122,7 +106,7 @@ class PdfController(PresentationController):
# Use the user defined program if given
if Settings().value('presentations/enable_pdf_program'):
pdf_program = Settings().value('presentations/pdf_program')
- program_type = self.check_binary(pdf_program)
+ program_type = self.process_check_binary(pdf_program)
if program_type == 'gs':
self.gsbin = pdf_program
elif program_type == 'mudraw':
diff --git a/openlp/plugins/songs/forms/duplicatesongremovalform.py b/openlp/plugins/songs/forms/duplicatesongremovalform.py
index 0fa4ee670..26de9507f 100644
--- a/openlp/plugins/songs/forms/duplicatesongremovalform.py
+++ b/openlp/plugins/songs/forms/duplicatesongremovalform.py
@@ -30,7 +30,7 @@ import os
from PyQt5 import QtCore, QtWidgets
from openlp.core.common import Registry, RegistryProperties, translate
-from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
+from openlp.core.ui.lib.wizard import OpenLPWizard, WizardStrings
from openlp.plugins.songs.lib import delete_song
from openlp.plugins.songs.lib.db import Song, MediaFile
from openlp.plugins.songs.forms.songreviewwidget import SongReviewWidget
diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py
index ee35ea7e5..ba8e2738a 100644
--- a/openlp/plugins/songs/forms/songexportform.py
+++ b/openlp/plugins/songs/forms/songexportform.py
@@ -30,7 +30,7 @@ from PyQt5 import QtCore, QtWidgets
from openlp.core.common import Registry, UiStrings, translate
from openlp.core.lib import create_separated_list, build_icon
from openlp.core.lib.ui import critical_error_message_box
-from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
+from openlp.core.ui.lib.wizard import OpenLPWizard, WizardStrings
from openlp.plugins.songs.lib.db import Song
from openlp.plugins.songs.lib.openlyricsexport import OpenLyricsExport
diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py
index 9058324fc..7a6af3981 100644
--- a/openlp/plugins/songs/forms/songimportform.py
+++ b/openlp/plugins/songs/forms/songimportform.py
@@ -31,7 +31,7 @@ from PyQt5 import QtCore, QtWidgets
from openlp.core.common import RegistryProperties, Settings, UiStrings, translate
from openlp.core.lib import FileDialog
from openlp.core.lib.ui import critical_error_message_box
-from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
+from openlp.core.ui.lib.wizard import OpenLPWizard, WizardStrings
from openlp.plugins.songs.lib.importer import SongFormat, SongFormatSelect
log = logging.getLogger(__name__)
diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py
index 47f6edb46..7b9101306 100644
--- a/openlp/plugins/songs/lib/importer.py
+++ b/openlp/plugins/songs/lib/importer.py
@@ -26,7 +26,7 @@ import os
import logging
from openlp.core.common import translate, UiStrings, is_win
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from .importers.opensong import OpenSongImport
from .importers.easyslides import EasySlidesImport
from .importers.openlp import OpenLPSongImport
diff --git a/openlp/plugins/songs/lib/importers/foilpresenter.py b/openlp/plugins/songs/lib/importers/foilpresenter.py
index b1b12960a..061f50a9f 100644
--- a/openlp/plugins/songs/lib/importers/foilpresenter.py
+++ b/openlp/plugins/songs/lib/importers/foilpresenter.py
@@ -90,7 +90,7 @@ import os
from lxml import etree, objectify
from openlp.core.lib import translate
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from openlp.plugins.songs.lib import clean_song, VerseType
from openlp.plugins.songs.lib.importers.songimport import SongImport
from openlp.plugins.songs.lib.db import Author, Book, Song, Topic
diff --git a/openlp/plugins/songs/lib/importers/openlp.py b/openlp/plugins/songs/lib/importers/openlp.py
index b914ed1e1..e17fe138f 100644
--- a/openlp/plugins/songs/lib/importers/openlp.py
+++ b/openlp/plugins/songs/lib/importers/openlp.py
@@ -31,7 +31,7 @@ from sqlalchemy.orm.exc import UnmappedClassError
from openlp.core.common import translate
from openlp.core.lib.db import BaseModel
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from openlp.plugins.songs.lib import clean_song
from openlp.plugins.songs.lib.db import Author, Book, Song, Topic, MediaFile
from .songimport import SongImport
diff --git a/openlp/plugins/songs/lib/importers/openlyrics.py b/openlp/plugins/songs/lib/importers/openlyrics.py
index c7bde403a..f60023cdf 100644
--- a/openlp/plugins/songs/lib/importers/openlyrics.py
+++ b/openlp/plugins/songs/lib/importers/openlyrics.py
@@ -29,7 +29,7 @@ import os
from lxml import etree
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from openlp.plugins.songs.lib.importers.songimport import SongImport
from openlp.plugins.songs.lib.ui import SongStrings
from openlp.plugins.songs.lib.openlyricsxml import OpenLyrics, OpenLyricsError
diff --git a/openlp/plugins/songs/lib/importers/powerpraise.py b/openlp/plugins/songs/lib/importers/powerpraise.py
index b93eed0fe..93a360542 100644
--- a/openlp/plugins/songs/lib/importers/powerpraise.py
+++ b/openlp/plugins/songs/lib/importers/powerpraise.py
@@ -27,7 +27,7 @@ Powerpraise song files into the current database.
import os
from lxml import objectify
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from .songimport import SongImport
diff --git a/openlp/plugins/songs/lib/importers/presentationmanager.py b/openlp/plugins/songs/lib/importers/presentationmanager.py
index da31ce953..c26f11312 100644
--- a/openlp/plugins/songs/lib/importers/presentationmanager.py
+++ b/openlp/plugins/songs/lib/importers/presentationmanager.py
@@ -26,10 +26,11 @@ Presentationmanager song files into the current database.
import os
import re
+
import chardet
from lxml import objectify, etree
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from .songimport import SongImport
diff --git a/openlp/plugins/songs/lib/importers/propresenter.py b/openlp/plugins/songs/lib/importers/propresenter.py
index cddf0e52b..55e05a08f 100644
--- a/openlp/plugins/songs/lib/importers/propresenter.py
+++ b/openlp/plugins/songs/lib/importers/propresenter.py
@@ -29,7 +29,7 @@ import base64
import logging
from lxml import objectify
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from openlp.plugins.songs.lib import strip_rtf
from .songimport import SongImport
diff --git a/openlp/plugins/songs/lib/importers/songimport.py b/openlp/plugins/songs/lib/importers/songimport.py
index 54c82da29..835386b26 100644
--- a/openlp/plugins/songs/lib/importers/songimport.py
+++ b/openlp/plugins/songs/lib/importers/songimport.py
@@ -28,7 +28,7 @@ import os
from PyQt5 import QtCore
from openlp.core.common import Registry, AppLocation, check_directory_exists, translate
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from openlp.plugins.songs.lib import clean_song, VerseType
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book, MediaFile
from openlp.plugins.songs.lib.ui import SongStrings
diff --git a/openlp/plugins/songs/lib/importers/songshowplus.py b/openlp/plugins/songs/lib/importers/songshowplus.py
index 4851894ab..d9a205e22 100644
--- a/openlp/plugins/songs/lib/importers/songshowplus.py
+++ b/openlp/plugins/songs/lib/importers/songshowplus.py
@@ -29,7 +29,7 @@ import logging
import re
import struct
-from openlp.core.ui.wizard import WizardStrings
+from openlp.core.ui.lib.wizard import WizardStrings
from openlp.plugins.songs.lib import VerseType, retrieve_windows_encoding
from openlp.plugins.songs.lib.importers.songimport import SongImport
diff --git a/tests/functional/openlp_core_common/test_projector_utilities.py b/tests/functional/openlp_core_common/test_projector_utilities.py
index d29267de0..aebdd7509 100644
--- a/tests/functional/openlp_core_common/test_projector_utilities.py
+++ b/tests/functional/openlp_core_common/test_projector_utilities.py
@@ -23,13 +23,12 @@
Package to test the openlp.core.ui.projector.networkutils package.
"""
-import os
-
from unittest import TestCase
from openlp.core.common import verify_ip_address, md5_hash, qmd5_hash
from tests.resources.projector.data import TEST_PIN, TEST_SALT, TEST_HASH
+
salt = TEST_SALT
pin = TEST_PIN
test_hash = TEST_HASH
diff --git a/tests/functional/openlp_core_lib/test_projector_pjlink1.py b/tests/functional/openlp_core_lib/test_projector_pjlink1.py
index 5cd032314..5d0d26ceb 100644
--- a/tests/functional/openlp_core_lib/test_projector_pjlink1.py
+++ b/tests/functional/openlp_core_lib/test_projector_pjlink1.py
@@ -124,3 +124,30 @@ class TestPJLink(TestCase):
'Lamp power status should have been set to TRUE')
self.assertEquals(pjlink.lamp[0]['Hours'], 22222,
'Lamp hours should have been set to 22222')
+
+ @patch.object(pjlink_test, 'projectorReceivedData')
+ def projector_process_multiple_lamp_test(self, mock_projectorReceivedData):
+ """
+ Test setting multiple lamp on/off and hours
+ """
+ # GIVEN: Test object
+ pjlink = pjlink_test
+
+ # WHEN: Call process_command with lamp data
+ pjlink.process_command('LAMP', '11111 1 22222 0 33333 1')
+
+ # THEN: Lamp should have been set with proper lamp status
+ self.assertEquals(len(pjlink.lamp), 3,
+ 'Projector should have 3 lamps specified')
+ self.assertEquals(pjlink.lamp[0]['On'], True,
+ 'Lamp 1 power status should have been set to TRUE')
+ self.assertEquals(pjlink.lamp[0]['Hours'], 11111,
+ 'Lamp 1 hours should have been set to 11111')
+ self.assertEquals(pjlink.lamp[1]['On'], False,
+ 'Lamp 2 power status should have been set to FALSE')
+ self.assertEquals(pjlink.lamp[1]['Hours'], 22222,
+ 'Lamp 2 hours should have been set to 22222')
+ self.assertEquals(pjlink.lamp[2]['On'], True,
+ 'Lamp 3 power status should have been set to TRUE')
+ self.assertEquals(pjlink.lamp[2]['Hours'], 33333,
+ 'Lamp 3 hours should have been set to 33333')
diff --git a/tests/functional/openlp_core_ui_lib/__init__.py b/tests/functional/openlp_core_ui_lib/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/functional/openlp_core_lib/test_color_button.py b/tests/functional/openlp_core_ui_lib/test_color_button.py
similarity index 90%
rename from tests/functional/openlp_core_lib/test_color_button.py
rename to tests/functional/openlp_core_ui_lib/test_color_button.py
index ea71b3bf9..b65b81448 100644
--- a/tests/functional/openlp_core_lib/test_color_button.py
+++ b/tests/functional/openlp_core_ui_lib/test_color_button.py
@@ -24,7 +24,7 @@ This module contains tests for the openlp.core.lib.filedialog module
"""
from unittest import TestCase
-from openlp.core.lib.colorbutton import ColorButton
+from openlp.core.ui.lib.colorbutton import ColorButton
from tests.functional import MagicMock, call, patch
@@ -33,11 +33,11 @@ class TestColorDialog(TestCase):
Test the :class:`~openlp.core.lib.colorbutton.ColorButton` class
"""
def setUp(self):
- self.change_color_patcher = patch('openlp.core.lib.colorbutton.ColorButton.change_color')
- self.clicked_patcher = patch('openlp.core.lib.colorbutton.ColorButton.clicked')
- self.color_changed_patcher = patch('openlp.core.lib.colorbutton.ColorButton.colorChanged')
- self.qt_gui_patcher = patch('openlp.core.lib.colorbutton.QtWidgets')
- self.translate_patcher = patch('openlp.core.lib.colorbutton.translate', **{'return_value': 'Tool Tip Text'})
+ self.change_color_patcher = patch('openlp.core.ui.lib.colorbutton.ColorButton.change_color')
+ self.clicked_patcher = patch('openlp.core.ui.lib.colorbutton.ColorButton.clicked')
+ self.color_changed_patcher = patch('openlp.core.ui.lib.colorbutton.ColorButton.colorChanged')
+ self.qt_gui_patcher = patch('openlp.core.ui.lib.colorbutton.QtWidgets')
+ self.translate_patcher = patch('openlp.core.ui.lib.colorbutton.translate', **{'return_value': 'Tool Tip Text'})
self.addCleanup(self.change_color_patcher.stop)
self.addCleanup(self.clicked_patcher.stop)
self.addCleanup(self.color_changed_patcher.stop)
@@ -55,7 +55,7 @@ class TestColorDialog(TestCase):
"""
# GIVEN: The ColorButton class, a mocked change_color, setToolTip methods and clicked signal
- with patch('openlp.core.lib.colorbutton.ColorButton.setToolTip') as mocked_set_tool_tip:
+ with patch('openlp.core.ui.lib.colorbutton.ColorButton.setToolTip') as mocked_set_tool_tip:
# WHEN: The ColorButton object is instantiated
widget = ColorButton()
@@ -74,7 +74,7 @@ class TestColorDialog(TestCase):
self.change_color_patcher.stop()
# GIVEN: An instance of the ColorButton object, and a mocked out setStyleSheet
- with patch('openlp.core.lib.colorbutton.ColorButton.setStyleSheet') as mocked_set_style_sheet:
+ with patch('openlp.core.ui.lib.colorbutton.ColorButton.setStyleSheet') as mocked_set_style_sheet:
widget = ColorButton()
# WHEN: Changing the color
@@ -123,7 +123,7 @@ class TestColorDialog(TestCase):
"""
# GIVEN: An instance of ColorButton, with a mocked __init__
- with patch('openlp.core.lib.colorbutton.ColorButton.__init__', **{'return_value': None}):
+ with patch('openlp.core.ui.lib.colorbutton.ColorButton.__init__', **{'return_value': None}):
widget = ColorButton()
# WHEN: Setting the color property
diff --git a/tests/functional/openlp_core_ui/test_listpreviewwidget.py b/tests/functional/openlp_core_ui_lib/test_listpreviewwidget.py
similarity index 87%
rename from tests/functional/openlp_core_ui/test_listpreviewwidget.py
rename to tests/functional/openlp_core_ui_lib/test_listpreviewwidget.py
index e9f99a8eb..0ed88cc88 100644
--- a/tests/functional/openlp_core_ui/test_listpreviewwidget.py
+++ b/tests/functional/openlp_core_ui_lib/test_listpreviewwidget.py
@@ -20,12 +20,12 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
-Package to test the openlp.core.ui.listpreviewwidget package.
+Package to test the openlp.core.ui.lib.listpreviewwidget package.
"""
from unittest import TestCase
from openlp.core.common import Settings
-from openlp.core.ui.listpreviewwidget import ListPreviewWidget
+from openlp.core.ui.lib.listpreviewwidget import ListPreviewWidget
from openlp.core.lib import ServiceItem
from tests.functional import MagicMock, patch, call
@@ -38,13 +38,13 @@ class TestListPreviewWidget(TestCase):
Mock out stuff for all the tests
"""
# Mock self.parent().width()
- self.parent_patcher = patch('openlp.core.ui.listpreviewwidget.ListPreviewWidget.parent')
+ self.parent_patcher = patch('openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.parent')
self.mocked_parent = self.parent_patcher.start()
self.mocked_parent.width.return_value = 100
self.addCleanup(self.parent_patcher.stop)
# Mock Settings().value()
- self.Settings_patcher = patch('openlp.core.ui.listpreviewwidget.Settings')
+ self.Settings_patcher = patch('openlp.core.ui.lib.listpreviewwidget.Settings')
self.mocked_Settings = self.Settings_patcher.start()
self.mocked_Settings_obj = MagicMock()
self.mocked_Settings_obj.value.return_value = None
@@ -52,7 +52,7 @@ class TestListPreviewWidget(TestCase):
self.addCleanup(self.Settings_patcher.stop)
# Mock self.viewport().width()
- self.viewport_patcher = patch('openlp.core.ui.listpreviewwidget.ListPreviewWidget.viewport')
+ self.viewport_patcher = patch('openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.viewport')
self.mocked_viewport = self.viewport_patcher.start()
self.mocked_viewport_obj = MagicMock()
self.mocked_viewport_obj.width.return_value = 200
@@ -72,8 +72,8 @@ class TestListPreviewWidget(TestCase):
self.assertIsNotNone(list_preview_widget, 'The ListPreviewWidget object should not be None')
self.assertEquals(list_preview_widget.screen_ratio, 1, 'Should not be called')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.setRowHeight')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.setRowHeight')
def replace_recalculate_layout_test_text(self, mocked_setRowHeight, mocked_resizeRowsToContents):
"""
Test if "Max height for non-text slides..." enabled, txt slides unchanged in replace_service_item & __recalc...
@@ -104,8 +104,8 @@ class TestListPreviewWidget(TestCase):
self.assertEquals(mocked_resizeRowsToContents.call_count, 2, 'Should be called')
self.assertEquals(mocked_setRowHeight.call_count, 0, 'Should not be called')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.setRowHeight')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.setRowHeight')
def replace_recalculate_layout_test_img(self, mocked_setRowHeight, mocked_resizeRowsToContents):
"""
Test if "Max height for non-text slides..." disabled, img slides unchanged in replace_service_item & __recalc...
@@ -140,8 +140,8 @@ class TestListPreviewWidget(TestCase):
calls = [call(0, 200), call(1, 200), call(0, 400), call(1, 400), call(0, 400), call(1, 400)]
mocked_setRowHeight.assert_has_calls(calls)
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.setRowHeight')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.setRowHeight')
def replace_recalculate_layout_test_img_max(self, mocked_setRowHeight, mocked_resizeRowsToContents):
"""
Test if "Max height for non-text slides..." enabled, img slides resized in replace_service_item & __recalc...
@@ -174,9 +174,9 @@ class TestListPreviewWidget(TestCase):
calls = [call(0, 100), call(1, 100), call(0, 100), call(1, 100)]
mocked_setRowHeight.assert_has_calls(calls)
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.setRowHeight')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.cellWidget')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.setRowHeight')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.cellWidget')
def row_resized_test_text(self, mocked_cellWidget, mocked_setRowHeight, mocked_resizeRowsToContents):
"""
Test if "Max height for non-text slides..." enabled, text-based slides not affected in row_resized.
@@ -208,9 +208,9 @@ class TestListPreviewWidget(TestCase):
# THEN: self.cellWidget(row, 0).children()[1].setMaximumWidth() should not be called
self.assertEquals(mocked_cellWidget_child.setMaximumWidth.call_count, 0, 'Should not be called')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.setRowHeight')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.cellWidget')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.setRowHeight')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.cellWidget')
def row_resized_test_img(self, mocked_cellWidget, mocked_setRowHeight, mocked_resizeRowsToContents):
"""
Test if "Max height for non-text slides..." disabled, image-based slides not affected in row_resized.
@@ -244,9 +244,9 @@ class TestListPreviewWidget(TestCase):
# THEN: self.cellWidget(row, 0).children()[1].setMaximumWidth() should not be called
self.assertEquals(mocked_cellWidget_child.setMaximumWidth.call_count, 0, 'Should not be called')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.setRowHeight')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.cellWidget')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.resizeRowsToContents')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.setRowHeight')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.cellWidget')
def row_resized_test_img_max(self, mocked_cellWidget, mocked_setRowHeight, mocked_resizeRowsToContents):
"""
Test if "Max height for non-text slides..." enabled, image-based slides are scaled in row_resized.
@@ -278,10 +278,10 @@ class TestListPreviewWidget(TestCase):
# THEN: self.cellWidget(row, 0).children()[1].setMaximumWidth() should be called
mocked_cellWidget_child.setMaximumWidth.assert_called_once_with(150)
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.selectRow')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.scrollToItem')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.item')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.slide_count')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.selectRow')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.scrollToItem')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.item')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.slide_count')
def autoscroll_test_setting_invalid(self, mocked_slide_count, mocked_item, mocked_scrollToItem, mocked_selectRow):
"""
Test if 'advanced/autoscrolling' setting None or invalid, that no autoscrolling occurs on change_slide().
@@ -314,10 +314,10 @@ class TestListPreviewWidget(TestCase):
self.assertEquals(mocked_selectRow.call_count, 0, 'Should not be called')
self.assertEquals(mocked_item.call_count, 0, 'Should not be called')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.selectRow')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.scrollToItem')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.item')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.slide_count')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.selectRow')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.scrollToItem')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.item')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.slide_count')
def autoscroll_test_dist_bounds(self, mocked_slide_count, mocked_item, mocked_scrollToItem, mocked_selectRow):
"""
Test if 'advanced/autoscrolling' setting asks to scroll beyond list bounds, that it does not beyond.
@@ -344,10 +344,10 @@ class TestListPreviewWidget(TestCase):
calls = [call(0, 0), call(0, 0)]
mocked_item.assert_has_calls(calls)
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.selectRow')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.scrollToItem')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.item')
- @patch(u'openlp.core.ui.listpreviewwidget.ListPreviewWidget.slide_count')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.selectRow')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.scrollToItem')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.item')
+ @patch(u'openlp.core.ui.lib.listpreviewwidget.ListPreviewWidget.slide_count')
def autoscroll_test_normal(self, mocked_slide_count, mocked_item, mocked_scrollToItem, mocked_selectRow):
"""
Test if 'advanced/autoscrolling' setting valid, autoscrolling called as expected.
diff --git a/tests/functional/openlp_plugins/media/test_mediaplugin.py b/tests/functional/openlp_plugins/media/test_mediaplugin.py
index 1e11de4fa..c49cdbaa4 100644
--- a/tests/functional/openlp_plugins/media/test_mediaplugin.py
+++ b/tests/functional/openlp_plugins/media/test_mediaplugin.py
@@ -25,7 +25,7 @@ Test the media plugin
from unittest import TestCase
from openlp.core import Registry
-from openlp.plugins.media.mediaplugin import MediaPlugin
+from openlp.plugins.media.mediaplugin import MediaPlugin, process_check_binary
from tests.functional import MagicMock, patch
from tests.helpers.testmixin import TestMixin
@@ -63,3 +63,29 @@ class MediaPluginTest(TestCase, TestMixin):
self.assertIsInstance(MediaPlugin.about(), str)
# THEN: about() should return a non-empty string
self.assertNotEquals(len(MediaPlugin.about()), 0)
+
+ @patch('openlp.plugins.media.mediaplugin.check_binary_exists')
+ def process_check_binary_pass_test(self, mocked_checked_binary_exists):
+ """
+ Test that the Process check returns true if found
+ """
+ # GIVEN: A media plugin instance
+ # WHEN: function is called with the correct name
+ mocked_checked_binary_exists.return_value = str.encode('MediaInfo Command line')
+ result = process_check_binary('MediaInfo')
+
+ # THEN: The the result should be True
+ self.assertTrue(result, 'Mediainfo should have been found')
+
+ @patch('openlp.plugins.media.mediaplugin.check_binary_exists')
+ def process_check_binary_fail_test(self, mocked_checked_binary_exists):
+ """
+ Test that the Process check returns false if not found
+ """
+ # GIVEN: A media plugin instance
+ # WHEN: function is called with the wrong name
+ mocked_checked_binary_exists.return_value = str.encode('MediaInfo1 Command line')
+ result = process_check_binary("MediaInfo1")
+
+ # THEN: The the result should be True
+ self.assertFalse(result, "Mediainfo should not have been found")
diff --git a/tests/interfaces/openlp_core_ui/test_listpreviewwidget.py b/tests/interfaces/openlp_core_ui_lib/test_listpreviewwidget.py
similarity index 95%
rename from tests/interfaces/openlp_core_ui/test_listpreviewwidget.py
rename to tests/interfaces/openlp_core_ui_lib/test_listpreviewwidget.py
index b4e5fdbf0..3e0e48e8b 100644
--- a/tests/interfaces/openlp_core_ui/test_listpreviewwidget.py
+++ b/tests/interfaces/openlp_core_ui_lib/test_listpreviewwidget.py
@@ -20,7 +20,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
- Package to test the openlp.core.ui.listpreviewwidget.
+ Package to test the openlp.core.ui.lib.listpreviewwidget.
"""
from unittest import TestCase
@@ -29,7 +29,7 @@ from PyQt5 import QtGui, QtWidgets
from openlp.core.common import Registry
from openlp.core.lib import ServiceItem
-from openlp.core.ui import listpreviewwidget
+from openlp.core.ui.lib import ListWidgetWithDnD, ListPreviewWidget
from tests.interfaces import MagicMock, patch
from tests.utils.osdinteraction import read_service_from_file
from tests.helpers.testmixin import TestMixin
@@ -48,7 +48,7 @@ class TestListPreviewWidget(TestCase, TestMixin):
self.image_manager = MagicMock()
self.image_manager.get_image.return_value = self.image
Registry().register('image_manager', self.image_manager)
- self.preview_widget = listpreviewwidget.ListPreviewWidget(self.main_window, 2)
+ self.preview_widget = ListPreviewWidget(self.main_window, 2)
def tearDown(self):
"""