diff --git a/openlp/plugins/remotes/lib/remotetab.py b/openlp/plugins/remotes/lib/remotetab.py
index 76ee65571..af64e401f 100644
--- a/openlp/plugins/remotes/lib/remotetab.py
+++ b/openlp/plugins/remotes/lib/remotetab.py
@@ -144,18 +144,33 @@ class RemoteTab(SettingsTab):
self.android_app_group_box = QtWidgets.QGroupBox(self.right_column)
self.android_app_group_box.setObjectName('android_app_group_box')
self.right_layout.addWidget(self.android_app_group_box)
- self.qr_layout = QtWidgets.QVBoxLayout(self.android_app_group_box)
- self.qr_layout.setObjectName('qr_layout')
- self.qr_code_label = QtWidgets.QLabel(self.android_app_group_box)
- self.qr_code_label.setPixmap(QtGui.QPixmap(':/remotes/android_app_qr.png'))
- self.qr_code_label.setAlignment(QtCore.Qt.AlignCenter)
- self.qr_code_label.setObjectName('qr_code_label')
- self.qr_layout.addWidget(self.qr_code_label)
- self.qr_description_label = QtWidgets.QLabel(self.android_app_group_box)
- self.qr_description_label.setObjectName('qr_description_label')
- self.qr_description_label.setOpenExternalLinks(True)
- self.qr_description_label.setWordWrap(True)
- self.qr_layout.addWidget(self.qr_description_label)
+ self.android_qr_layout = QtWidgets.QVBoxLayout(self.android_app_group_box)
+ self.android_qr_layout.setObjectName('android_qr_layout')
+ self.android_qr_code_label = QtWidgets.QLabel(self.android_app_group_box)
+ self.android_qr_code_label.setPixmap(QtGui.QPixmap(':/remotes/android_app_qr.png'))
+ self.android_qr_code_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.android_qr_code_label.setObjectName('android_qr_code_label')
+ self.android_qr_layout.addWidget(self.android_qr_code_label)
+ self.android_qr_description_label = QtWidgets.QLabel(self.android_app_group_box)
+ self.android_qr_description_label.setObjectName('android_qr_description_label')
+ self.android_qr_description_label.setOpenExternalLinks(True)
+ self.android_qr_description_label.setWordWrap(True)
+ self.android_qr_layout.addWidget(self.android_qr_description_label)
+ self.ios_app_group_box = QtWidgets.QGroupBox(self.right_column)
+ self.ios_app_group_box.setObjectName('ios_app_group_box')
+ self.right_layout.addWidget(self.ios_app_group_box)
+ self.ios_qr_layout = QtWidgets.QVBoxLayout(self.ios_app_group_box)
+ self.ios_qr_layout.setObjectName('ios_qr_layout')
+ self.ios_qr_code_label = QtWidgets.QLabel(self.ios_app_group_box)
+ self.ios_qr_code_label.setPixmap(QtGui.QPixmap(':/remotes/ios_app_qr.png'))
+ self.ios_qr_code_label.setAlignment(QtCore.Qt.AlignCenter)
+ self.ios_qr_code_label.setObjectName('ios_qr_code_label')
+ self.ios_qr_layout.addWidget(self.ios_qr_code_label)
+ self.ios_qr_description_label = QtWidgets.QLabel(self.ios_app_group_box)
+ self.ios_qr_description_label.setObjectName('ios_qr_description_label')
+ self.ios_qr_description_label.setOpenExternalLinks(True)
+ self.ios_qr_description_label.setWordWrap(True)
+ self.ios_qr_layout.addWidget(self.ios_qr_description_label)
self.left_layout.addStretch()
self.right_layout.addStretch()
self.twelve_hour_check_box.stateChanged.connect(self.on_twelve_hour_check_box_changed)
@@ -176,10 +191,15 @@ class RemoteTab(SettingsTab):
self.thumbnails_check_box.setText(translate('RemotePlugin.RemoteTab',
'Show thumbnails of non-text slides in remote and stage view.'))
self.android_app_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'Android App'))
- self.qr_description_label.setText(
+ self.android_qr_description_label.setText(
translate('RemotePlugin.RemoteTab', 'Scan the QR code or click download to install the '
'Android app from Google Play.') %
'https://play.google.com/store/apps/details?id=org.openlp.android2')
+ self.ios_app_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'iOS App'))
+ self.ios_qr_description_label.setText(
+ translate('RemotePlugin.RemoteTab', 'Scan the QR code or click download to install the '
+ 'iOS app from the App Store.') %
+ 'https://itunes.apple.com/app/id1096218725')
self.https_settings_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'HTTPS Server'))
self.https_error_label.setText(
translate('RemotePlugin.RemoteTab', 'Could not find an SSL certificate. The HTTPS server will not be '
diff --git a/resources/images/ios_app_qr.png b/resources/images/ios_app_qr.png
new file mode 100644
index 000000000..c7244fc33
Binary files /dev/null and b/resources/images/ios_app_qr.png differ
diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc
index 370473673..f2619b0c7 100644
--- a/resources/images/openlp-2.qrc
+++ b/resources/images/openlp-2.qrc
@@ -206,5 +206,6 @@
android_app_qr.png
+ ios_app_qr.png
diff --git a/tests/functional/openlp_core_lib/test_htmlbuilder.py b/tests/functional/openlp_core_lib/test_htmlbuilder.py
index 8ca98060d..58841eb90 100644
--- a/tests/functional/openlp_core_lib/test_htmlbuilder.py
+++ b/tests/functional/openlp_core_lib/test_htmlbuilder.py
@@ -197,6 +197,7 @@ FOOTER_CSS_BASE = """
"""
FOOTER_CSS = FOOTER_CSS_BASE % ('nowrap')
FOOTER_CSS_WRAP = FOOTER_CSS_BASE % ('normal')
+FOOTER_CSS_INVALID = ''
class Htmbuilder(TestCase, TestMixin):
@@ -359,6 +360,27 @@ class Htmbuilder(TestCase, TestMixin):
# THEN: Footer should wrap
self.assertEqual(FOOTER_CSS_WRAP, css, 'The footer strings should be equal.')
+ def build_footer_invalid_test(self):
+ """
+ Test the build_footer_css() function
+ """
+ # GIVEN: Create a theme.
+ css = []
+ item = MagicMock()
+ item.theme_data = None
+ item.footer = 'FAIL'
+ height = 1024
+
+ # WHEN: Settings say that footer should wrap
+ css.append(build_footer_css(item, height))
+ item.theme_data = 'TEST'
+ item.footer = None
+ css.append(build_footer_css(item, height))
+
+ # THEN: Footer should wrap
+ self.assertEqual(FOOTER_CSS_INVALID, css[0], 'The footer strings should be blank.')
+ self.assertEqual(FOOTER_CSS_INVALID, css[1], 'The footer strings should be blank.')
+
def webkit_version_test(self):
"""
Test the webkit_version() function