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): """