diff --git a/.bzrignore b/.bzrignore index 272c37e88..2e2e4891f 100644 --- a/.bzrignore +++ b/.bzrignore @@ -43,3 +43,5 @@ __pycache__ .coverage cover *.kdev4 +./.coveragerc +./coverage diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index d8defe322..2c4eafb28 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -24,7 +24,7 @@ The About dialog. """ import webbrowser -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.lib import translate from openlp.core.utils import get_application_version @@ -40,7 +40,8 @@ class AboutForm(QtWidgets.QDialog, UiAboutDialog): """ Do some initialisation stuff """ - super(AboutForm, self).__init__(parent) + super(AboutForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self._setup() def _setup(self): diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index d7ddc9fc4..a4cb39945 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -89,7 +89,8 @@ class ExceptionForm(QtWidgets.QDialog, Ui_ExceptionDialog, RegistryProperties): """ Constructor. """ - super(ExceptionForm, self).__init__() + super(ExceptionForm, self).__init__(None, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.settings_section = 'crashreport' self.report_text = '**OpenLP Bug Report**\n' \ diff --git a/openlp/core/ui/filerenameform.py b/openlp/core/ui/filerenameform.py index d1760ced9..bfe8dc3a6 100644 --- a/openlp/core/ui/filerenameform.py +++ b/openlp/core/ui/filerenameform.py @@ -23,7 +23,7 @@ The file rename dialog. """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from .filerenamedialog import Ui_FileRenameDialog @@ -38,7 +38,8 @@ class FileRenameForm(QtWidgets.QDialog, Ui_FileRenameDialog, RegistryProperties) """ Constructor """ - super(FileRenameForm, self).__init__(Registry().get('main_window')) + super(FileRenameForm, self).__init__(Registry().get('main_window'), + QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint) self._setup() def _setup(self): diff --git a/openlp/core/ui/firsttimelanguageform.py b/openlp/core/ui/firsttimelanguageform.py index 682cf4825..07188ba5f 100644 --- a/openlp/core/ui/firsttimelanguageform.py +++ b/openlp/core/ui/firsttimelanguageform.py @@ -22,7 +22,7 @@ """ The language selection dialog. """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.lib.ui import create_action from openlp.core.utils import LanguageManager @@ -37,7 +37,8 @@ class FirstTimeLanguageForm(QtWidgets.QDialog, Ui_FirstTimeLanguageDialog): """ Constructor """ - super(FirstTimeLanguageForm, self).__init__(parent) + super(FirstTimeLanguageForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.qm_list = LanguageManager.get_qm_list() self.language_combo_box.addItem('Autodetect') diff --git a/openlp/core/ui/formattingtagform.py b/openlp/core/ui/formattingtagform.py index fa53315f1..acee3d56f 100644 --- a/openlp/core/ui/formattingtagform.py +++ b/openlp/core/ui/formattingtagform.py @@ -25,7 +25,7 @@ Custom tags can be defined and saved. The Custom Tag arrays are saved in a json Base Tags cannot be changed. """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import translate from openlp.core.lib import FormattingTags @@ -51,7 +51,8 @@ class FormattingTagForm(QtWidgets.QDialog, Ui_FormattingTagDialog, FormattingTag """ Constructor """ - super(FormattingTagForm, self).__init__(parent) + super(FormattingTagForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self._setup() diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index 7d71e8ff4..03636a6da 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -24,7 +24,7 @@ The actual plugin view form """ import logging -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import RegistryProperties, translate from openlp.core.lib import PluginStatus @@ -41,7 +41,8 @@ class PluginForm(QtWidgets.QDialog, Ui_PluginViewDialog, RegistryProperties): """ Constructor """ - super(PluginForm, self).__init__(parent) + super(PluginForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.active_plugin = None self.programatic_change = False self.setupUi(self) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 69d8dc606..dd5548ea9 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -112,7 +112,8 @@ class PrintServiceForm(QtWidgets.QDialog, Ui_PrintServiceDialog, RegistryPropert """ Constructor """ - super(PrintServiceForm, self).__init__(Registry().get('main_window')) + super(PrintServiceForm, self).__init__(Registry().get('main_window'), + QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint) self.printer = QtPrintSupport.QPrinter() self.print_dialog = QtPrintSupport.QPrintDialog(self.printer, self) self.document = QtGui.QTextDocument() diff --git a/openlp/core/ui/projector/editform.py b/openlp/core/ui/projector/editform.py index 25c5654cb..54c80ae38 100644 --- a/openlp/core/ui/projector/editform.py +++ b/openlp/core/ui/projector/editform.py @@ -144,7 +144,8 @@ class ProjectorEditForm(QDialog, Ui_ProjectorEditForm): editProjector = pyqtSignal(object) def __init__(self, parent=None, projectordb=None): - super(ProjectorEditForm, self).__init__(parent=parent) + super(ProjectorEditForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.projectordb = projectordb self.setupUi(self) self.button_box.accepted.connect(self.accept_me) diff --git a/openlp/core/ui/projector/sourceselectform.py b/openlp/core/ui/projector/sourceselectform.py index bacf7d093..c46a61413 100644 --- a/openlp/core/ui/projector/sourceselectform.py +++ b/openlp/core/ui/projector/sourceselectform.py @@ -236,7 +236,8 @@ class SourceSelectTabs(QDialog): :param projectordb: ProjectorDB session to use """ log.debug('Initializing SourceSelectTabs()') - super(SourceSelectTabs, self).__init__(parent) + super(SourceSelectTabs, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setMinimumWidth(350) self.projectordb = projectordb self.edit = edit @@ -385,7 +386,8 @@ class SourceSelectSingle(QDialog): """ log.debug('Initializing SourceSelectSingle()') self.projectordb = projectordb - super(SourceSelectSingle, self).__init__(parent) + super(SourceSelectSingle, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.edit = edit if self.edit: title = translate('OpenLP.SourceSelectForm', 'Edit Projector Source Text') diff --git a/openlp/core/ui/serviceitemeditform.py b/openlp/core/ui/serviceitemeditform.py index 834d1da95..cb0652ff2 100644 --- a/openlp/core/ui/serviceitemeditform.py +++ b/openlp/core/ui/serviceitemeditform.py @@ -22,7 +22,7 @@ """ The service item edit dialog """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import Registry, RegistryProperties @@ -37,7 +37,8 @@ class ServiceItemEditForm(QtWidgets.QDialog, Ui_ServiceItemEditDialog, RegistryP """ Constructor """ - super(ServiceItemEditForm, self).__init__(Registry().get('main_window')) + super(ServiceItemEditForm, self).__init__(Registry().get('main_window'), + QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.item_list = [] self.list_widget.currentRowChanged.connect(self.on_current_row_changed) diff --git a/openlp/core/ui/servicenoteform.py b/openlp/core/ui/servicenoteform.py index 04da70d15..c62d3fe08 100644 --- a/openlp/core/ui/servicenoteform.py +++ b/openlp/core/ui/servicenoteform.py @@ -22,7 +22,7 @@ """ The :mod:`~openlp.core.ui.servicenoteform` module contains the `ServiceNoteForm` class. """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import Registry, RegistryProperties, translate from openlp.core.lib import SpellTextEdit @@ -37,7 +37,8 @@ class ServiceNoteForm(QtWidgets.QDialog, RegistryProperties): """ Constructor """ - super(ServiceNoteForm, self).__init__(Registry().get('main_window')) + super(ServiceNoteForm, self).__init__(Registry().get('main_window'), + QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint) self.setupUi() self.retranslateUi() diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 64f885500..9e4ec87f0 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -46,7 +46,8 @@ class SettingsForm(QtWidgets.QDialog, Ui_SettingsDialog, RegistryProperties): """ Registry().register('settings_form', self) Registry().register_function('bootstrap_post_set_up', self.bootstrap_post_set_up) - super(SettingsForm, self).__init__(parent) + super(SettingsForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.processes = [] self.setupUi(self) self.setting_list_widget.currentRowChanged.connect(self.list_item_changed) diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 81b09fe53..26b062d5e 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -44,7 +44,8 @@ class ShortcutListForm(QtWidgets.QDialog, Ui_ShortcutListDialog, RegistryPropert """ Constructor """ - super(ShortcutListForm, self).__init__(parent) + super(ShortcutListForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.changed_actions = {} self.action_list = ActionList.get_instance() diff --git a/openlp/core/ui/starttimeform.py b/openlp/core/ui/starttimeform.py index 16e582ff5..41e1efa5f 100644 --- a/openlp/core/ui/starttimeform.py +++ b/openlp/core/ui/starttimeform.py @@ -22,7 +22,7 @@ """ The actual start time form. """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from .starttimedialog import Ui_StartTimeDialog @@ -38,7 +38,8 @@ class StartTimeForm(QtWidgets.QDialog, Ui_StartTimeDialog, RegistryProperties): """ Constructor """ - super(StartTimeForm, self).__init__(Registry().get('main_window')) + super(StartTimeForm, self).__init__(Registry().get('main_window'), + QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint) self.setupUi(self) def exec(self): diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 1c66119c5..593eb4b46 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -36,10 +36,11 @@ class AlertForm(QtWidgets.QDialog, Ui_AlertDialog): """ Initialise the alert form """ + super(AlertForm, self).__init__(Registry().get('main_window'), + QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint) self.manager = plugin.manager self.plugin = plugin self.item_id = None - super(AlertForm, self).__init__(Registry().get('main_window')) self.setupUi(self) self.display_button.clicked.connect(self.on_display_clicked) self.display_close_button.clicked.connect(self.on_display_close_clicked) diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index 9fa117083..66f899af0 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -49,7 +49,8 @@ class BookNameForm(QDialog, Ui_BookNameDialog): """ Constructor """ - super(BookNameForm, self).__init__(parent) + super(BookNameForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.custom_signals() self.book_names = BibleStrings().BookNames diff --git a/openlp/plugins/bibles/forms/editbibleform.py b/openlp/plugins/bibles/forms/editbibleform.py index 0a96b1a0e..d1ca5b241 100644 --- a/openlp/plugins/bibles/forms/editbibleform.py +++ b/openlp/plugins/bibles/forms/editbibleform.py @@ -24,7 +24,7 @@ import logging import os import re -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import RegistryProperties, UiStrings, translate from openlp.core.lib.ui import critical_error_message_box @@ -45,7 +45,8 @@ class EditBibleForm(QtWidgets.QDialog, Ui_EditBibleDialog, RegistryProperties): """ Constructor """ - super(EditBibleForm, self).__init__(parent) + super(EditBibleForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.media_item = media_item self.book_names = BibleStrings().BookNames self.setupUi(self) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index 91d1d074d..040d73fa9 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -26,6 +26,7 @@ Module implementing LanguageForm. import logging from PyQt5.QtWidgets import QDialog +from PyQt5 import QtCore from openlp.core.common import translate from openlp.core.lib.ui import critical_error_message_box @@ -46,7 +47,8 @@ class LanguageForm(QDialog, Ui_LanguageDialog): """ Constructor """ - super(LanguageForm, self).__init__(parent) + super(LanguageForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) def exec(self, bible_name): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 3934ca53c..94937e61b 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -254,6 +254,7 @@ class BibleMediaItem(MediaManagerItem): def on_focus(self): if self.quickTab.isVisible(): self.quick_search_edit.setFocus() + self.quick_search_edit.selectAll() else: self.advanced_book_combo_box.setFocus() diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 6d7731dd6..dfde3126f 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -22,7 +22,7 @@ import logging -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import Registry, translate from openlp.core.lib.ui import critical_error_message_box, find_and_set_in_combo_box @@ -44,7 +44,8 @@ class EditCustomForm(QtWidgets.QDialog, Ui_CustomEditDialog): """ Constructor """ - super(EditCustomForm, self).__init__(parent) + super(EditCustomForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.manager = manager self.media_item = media_item self.setupUi(self) diff --git a/openlp/plugins/custom/forms/editcustomslideform.py b/openlp/plugins/custom/forms/editcustomslideform.py index 9de3875bd..d1c8597d3 100644 --- a/openlp/plugins/custom/forms/editcustomslideform.py +++ b/openlp/plugins/custom/forms/editcustomslideform.py @@ -22,7 +22,7 @@ import logging -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from .editcustomslidedialog import Ui_CustomSlideEditDialog @@ -39,7 +39,8 @@ class EditCustomSlideForm(QtWidgets.QDialog, Ui_CustomSlideEditDialog): """ Constructor """ - super(EditCustomSlideForm, self).__init__(parent) + super(EditCustomSlideForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) # Connecting signals and slots self.insert_button.clicked.connect(self.on_insert_button_clicked) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 812274263..b5b536603 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -190,8 +190,7 @@ class CustomMediaItem(MediaManagerItem): if QtWidgets.QMessageBox.question( self, UiStrings().ConfirmDelete, translate('CustomPlugin.MediaItem', - 'Are you sure you want to delete the %n selected custom slide(s)?', - '', QtCore.QCoreApplication.CodecForTr, len(items)), + 'Are you sure you want to delete the "%d" selected custom slide(s)?') %len(items), QtWidgets.QMessageBox.StandardButtons( QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No: @@ -208,6 +207,7 @@ class CustomMediaItem(MediaManagerItem): Set the focus """ self.search_text_edit.setFocus() + self.search_text_edit.selectAll() def generate_slide_data(self, service_item, item=None, xml_version=False, remote=False, context=ServiceItemContext.Service): diff --git a/openlp/plugins/images/forms/addgroupform.py b/openlp/plugins/images/forms/addgroupform.py index e0021c8a5..9c343cc6b 100644 --- a/openlp/plugins/images/forms/addgroupform.py +++ b/openlp/plugins/images/forms/addgroupform.py @@ -20,7 +20,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import translate from openlp.core.lib.ui import critical_error_message_box @@ -35,7 +35,8 @@ class AddGroupForm(QtWidgets.QDialog, Ui_AddGroupDialog): """ Constructor """ - super(AddGroupForm, self).__init__(parent) + super(AddGroupForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) def exec(self, clear=True, show_top_level_group=False, selected_group=None): diff --git a/openlp/plugins/images/forms/choosegroupform.py b/openlp/plugins/images/forms/choosegroupform.py index ad699afcd..4be34a2e6 100644 --- a/openlp/plugins/images/forms/choosegroupform.py +++ b/openlp/plugins/images/forms/choosegroupform.py @@ -20,7 +20,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.plugins.images.forms.choosegroupdialog import Ui_ChooseGroupDialog @@ -33,7 +33,8 @@ class ChooseGroupForm(QtWidgets.QDialog, Ui_ChooseGroupDialog): """ Constructor """ - super(ChooseGroupForm, self).__init__(parent) + super(ChooseGroupForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) def exec(self, selected_group=None): diff --git a/openlp/plugins/media/forms/mediaclipselectorform.py b/openlp/plugins/media/forms/mediaclipselectorform.py index f94129198..9770ce540 100644 --- a/openlp/plugins/media/forms/mediaclipselectorform.py +++ b/openlp/plugins/media/forms/mediaclipselectorform.py @@ -52,7 +52,8 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro """ Constructor """ - super(MediaClipSelectorForm, self).__init__(parent) + super(MediaClipSelectorForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.vlc_instance = None self.vlc_media_player = None self.vlc_media = None diff --git a/openlp/plugins/songs/forms/authorsform.py b/openlp/plugins/songs/forms/authorsform.py index 878f0dcc8..7e9933ddd 100644 --- a/openlp/plugins/songs/forms/authorsform.py +++ b/openlp/plugins/songs/forms/authorsform.py @@ -20,7 +20,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.lib import translate from openlp.core.lib.ui import critical_error_message_box @@ -35,7 +35,8 @@ class AuthorsForm(QtWidgets.QDialog, Ui_AuthorsDialog): """ Set up the screen and common data """ - super(AuthorsForm, self).__init__(parent) + super(AuthorsForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.auto_display_name = False self.first_name_edit.textEdited.connect(self.on_first_name_edited) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index d598e848b..5286892e3 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -55,7 +55,8 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties): """ Constructor """ - super(EditSongForm, self).__init__(parent) + super(EditSongForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.media_item = media_item self.song = None # can this be automated? @@ -76,7 +77,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties): self.verse_edit_all_button.clicked.connect(self.on_verse_edit_all_button_clicked) self.verse_delete_button.clicked.connect(self.on_verse_delete_button_clicked) self.verse_list_widget.itemClicked.connect(self.on_verse_list_view_clicked) - self.verse_order_edit.textChanged.connect(self.on_verse_order_text_changed) + self.verse_order_edit.textEdited.connect(self.on_verse_order_text_changed) self.theme_add_button.clicked.connect(self.theme_manager.on_add_theme) self.maintenance_button.clicked.connect(self.on_maintenance_button_clicked) self.from_file_button.clicked.connect(self.on_audio_add_from_file_button_clicked) @@ -803,6 +804,8 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties): :param text: The text of the verse order edit (ignored). """ + # First make sure that all letters entered in the verse order field are uppercase + self.verse_order_edit.setText(text.upper()) # Extract all verses which were used in the order. verses_in_order = self._extract_verse_order(self.verse_order_edit.text()) # Find the verses which were not used in the order. diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 0d0c98861..67693344a 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -23,7 +23,7 @@ import re import logging -from PyQt5 import QtGui, QtWidgets +from PyQt5 import QtCore, QtGui, QtWidgets from openlp.plugins.songs.lib import VerseType from .editversedialog import Ui_EditVerseDialog @@ -41,7 +41,8 @@ class EditVerseForm(QtWidgets.QDialog, Ui_EditVerseDialog): """ Constructor """ - super(EditVerseForm, self).__init__(parent) + super(EditVerseForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.has_single_verse = False self.insert_button.clicked.connect(self.on_insert_button_clicked) diff --git a/openlp/plugins/songs/forms/mediafilesform.py b/openlp/plugins/songs/forms/mediafilesform.py index a3d3de7a0..40d52ae0c 100644 --- a/openlp/plugins/songs/forms/mediafilesform.py +++ b/openlp/plugins/songs/forms/mediafilesform.py @@ -37,7 +37,8 @@ class MediaFilesForm(QtWidgets.QDialog, Ui_MediaFilesDialog): log.info('%s MediaFilesForm loaded', __name__) def __init__(self, parent): - super(MediaFilesForm, self).__init__() + super(MediaFilesForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) def populate_files(self, files): diff --git a/openlp/plugins/songs/forms/songbookform.py b/openlp/plugins/songs/forms/songbookform.py index f80165512..015b18ecd 100644 --- a/openlp/plugins/songs/forms/songbookform.py +++ b/openlp/plugins/songs/forms/songbookform.py @@ -23,7 +23,7 @@ This module contains the song book form """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.lib import translate from openlp.core.lib.ui import critical_error_message_box @@ -38,7 +38,8 @@ class SongBookForm(QtWidgets.QDialog, Ui_SongBookDialog): """ Constructor """ - super(SongBookForm, self).__init__(parent) + super(SongBookForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) def exec(self, clear=True): diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index 8e251f0c8..cbede3974 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -44,7 +44,8 @@ class SongMaintenanceForm(QtWidgets.QDialog, Ui_SongMaintenanceDialog, RegistryP """ Constructor """ - super(SongMaintenanceForm, self).__init__(parent) + super(SongMaintenanceForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.manager = manager self.author_form = AuthorsForm(self) diff --git a/openlp/plugins/songs/forms/songselectform.py b/openlp/plugins/songs/forms/songselectform.py index f43e388f5..a61bc0455 100755 --- a/openlp/plugins/songs/forms/songselectform.py +++ b/openlp/plugins/songs/forms/songselectform.py @@ -81,7 +81,8 @@ class SongSelectForm(QtWidgets.QDialog, Ui_SongSelectDialog): """ def __init__(self, parent=None, plugin=None, db_manager=None): - QtWidgets.QDialog.__init__(self, parent) + QtWidgets.QDialog.__init__(self, parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.plugin = plugin self.db_manager = db_manager self.setup_ui(self) diff --git a/openlp/plugins/songs/forms/topicsform.py b/openlp/plugins/songs/forms/topicsform.py index ee379bde1..39ce9c4d4 100644 --- a/openlp/plugins/songs/forms/topicsform.py +++ b/openlp/plugins/songs/forms/topicsform.py @@ -23,7 +23,7 @@ This module contains the topic edit form. """ -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.lib import translate from openlp.core.lib.ui import critical_error_message_box @@ -38,7 +38,8 @@ class TopicsForm(QtWidgets.QDialog, Ui_TopicsDialog): """ Constructor """ - super(TopicsForm, self).__init__(parent) + super(TopicsForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) def exec(self, clear=True): diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 4f23bbfd1..9ac7afad3 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -112,6 +112,7 @@ class SongMediaItem(MediaManagerItem): def on_focus(self): self.search_text_edit.setFocus() + self.search_text_edit.selectAll() def config_update(self): """ @@ -363,8 +364,8 @@ class SongMediaItem(MediaManagerItem): items = self.list_view.selectedIndexes() if QtWidgets.QMessageBox.question( self, UiStrings().ConfirmDelete, - translate('SongsPlugin.MediaItem', 'Are you sure you want to delete the %n selected song(s)?', '', - QtCore.QCoreApplication.CodecForTr, len(items)), + translate('SongsPlugin.MediaItem', + 'Are you sure you want to delete the "%d" selected song(s)?') % len(items), QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No: return diff --git a/openlp/plugins/songusage/forms/songusagedeleteform.py b/openlp/plugins/songusage/forms/songusagedeleteform.py index d0100f82a..fc6d8d057 100644 --- a/openlp/plugins/songusage/forms/songusagedeleteform.py +++ b/openlp/plugins/songusage/forms/songusagedeleteform.py @@ -20,7 +20,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from openlp.core.common import RegistryProperties, translate from openlp.plugins.songusage.lib.db import SongUsageItem @@ -36,7 +36,8 @@ class SongUsageDeleteForm(QtWidgets.QDialog, Ui_SongUsageDeleteDialog, RegistryP Constructor """ self.manager = manager - super(SongUsageDeleteForm, self).__init__(parent) + super(SongUsageDeleteForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.setupUi(self) self.button_box.clicked.connect(self.on_button_box_clicked) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index b298a3ad0..84f85d5d4 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -23,7 +23,7 @@ import logging import os -from PyQt5 import QtWidgets +from PyQt5 import QtCore, QtWidgets from sqlalchemy.sql import and_ from openlp.core.common import RegistryProperties, Settings, check_directory_exists, translate @@ -44,7 +44,8 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP """ Initialise the form """ - super(SongUsageDetailForm, self).__init__(parent) + super(SongUsageDetailForm, self).__init__(parent, QtCore.Qt.WindowSystemMenuHint + | QtCore.Qt.WindowTitleHint) self.plugin = plugin self.setupUi(self) diff --git a/tests/functional/openlp_core_lib/test_mediamanageritem.py b/tests/functional/openlp_core_lib/test_mediamanageritem.py index 848f34233..a3674f591 100644 --- a/tests/functional/openlp_core_lib/test_mediamanageritem.py +++ b/tests/functional/openlp_core_lib/test_mediamanageritem.py @@ -60,6 +60,22 @@ class TestMediaManagerItem(TestCase, TestMixin): # THEN: on_preview_click() should have been called mocked_on_preview_click.assert_called_with() + def required_icons_test(self): + """ + Test the default icons for plugins + """ + # GIVEN: A MediaManagerItem + mmi = MediaManagerItem(None) + # WHEN: Object is created + mmi.required_icons() + # THEN: Default icons should be populated + self.assertFalse(mmi.has_import_icon, 'There should be no import icon by default') + self.assertTrue(mmi.has_new_icon, 'By default a new icon should be present') + self.assertFalse(mmi.has_file_icon, 'There should be no file icon by default') + self.assertTrue(mmi.has_delete_icon, 'By default a delete icon should be present') + self.assertFalse(mmi.add_to_service_item, 'There should be no add_to_service icon by default') + + @patch(u'openlp.core.lib.mediamanageritem.Settings') @patch(u'openlp.core.lib.mediamanageritem.MediaManagerItem.on_live_click') def on_double_clicked_go_live_test(self, mocked_on_live_click, MockedSettings): diff --git a/tests/functional/openlp_plugins/songs/test_songformat.py b/tests/functional/openlp_plugins/songs/test_songformat.py new file mode 100644 index 000000000..eab9760b8 --- /dev/null +++ b/tests/functional/openlp_plugins/songs/test_songformat.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2015 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +This module contains tests for the SongFormat class +""" +from unittest import TestCase + +from openlp.plugins.songs.lib.importer import SongFormat + + +class TestSongFormat(TestCase): + """ + Test the functions in the :class:`SongFormat` class. + """ + + def test_get_format_list(self): + """ + Test that get_format_list() returns all available formats + """ + # GIVEN: The SongFormat class + # WHEN: Retrieving the format list + # THEN: All SongFormats should be returned + self.assertEquals(len(SongFormat.get_format_list()), len(SongFormat.__attributes__), + "The returned SongFormats don't match the stored ones") + + def test_get_attributed_no_attributes(self): + """ + Test that SongFormat.get(song_format) returns all attributes associated with the given song_format + """ + # GIVEN: A SongFormat + # WHEN: Retrieving all attributes of a SongFormat + for song_format in SongFormat.get_format_list(): + # THEN: All attributes associated with the SongFormat should be returned + self.assertEquals(SongFormat.get(song_format), SongFormat.__attributes__[song_format], + "The returned attributes don't match the stored ones") + + def test_get_attributed_single_attribute(self): + """ + Test that SongFormat.get(song_format, attribute) returns only one -and the correct- attribute + """ + # GIVEN: A SongFormat + for song_format in SongFormat.get_format_list(): + # WHEN: Retrieving an attribute that overrides the default values + for attribute in SongFormat.get(song_format).keys(): + # THEN: Return the attribute + self.assertEquals(SongFormat.get(song_format, attribute), SongFormat.get(song_format)[attribute], + "The returned attribute doesn't match the stored one") + # WHEN: Retrieving an attribute that was not overridden + for attribute in SongFormat.__defaults__.keys(): + if attribute not in SongFormat.get(song_format).keys(): + # THEN: Return the default value + self.assertEquals(SongFormat.get(song_format, attribute), SongFormat.__defaults__[attribute], + "The returned attribute does not match the default values stored") + + def test_get_attributed_multiple_attributes(self): + """ + Test that multiple attributes can be retrieved for a song_format + """ + # GIVEN: A SongFormat + # WHEN: Retrieving multiple attributes at the same time + for song_format in SongFormat.get_format_list(): + # THEN: Return all attributes that were specified + self.assertEquals(len(SongFormat.get(song_format, 'canDisable', 'availability')), 2, + "Did not return the correct number of attributes when retrieving multiple attributes at once") + diff --git a/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py b/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py index d540a90c5..bb26533ee 100644 --- a/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py +++ b/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py @@ -142,3 +142,18 @@ class TestEditSongForm(TestCase, TestMixin): 'CCLI label should not be "{}"'.format(UiStrings().CCLINumberLabel)) self.assertEquals(form.ccli_label.text(), UiStrings().CCLISongNumberLabel, 'CCLI label text should be "{}"'.format(UiStrings().CCLISongNumberLabel)) + + def verse_order_lowercase_test(self): + """ + Test that entering a verse order in lowercase automatically converts to uppercase + """ + # GIVEN; Mocked methods + form = self.form + + # WHEN: We enter a verse order in lowercase + form.verse_order_edit.setText('v1 v2 c1 v3 c1 v4 c1') + # Need to manually trigger this method as it is only triggered by manual input + form.on_verse_order_text_changed(form.verse_order_edit.text()) + + # THEN: The verse order should be converted to uppercase + self.assertEqual(form.verse_order_edit.text(), 'V1 V2 C1 V3 C1 V4 C1')