forked from openlp/openlp
375 lines
21 KiB
Python
375 lines
21 KiB
Python
# -*- coding: utf-8 -*-
|
||
|
||
##########################################################################
|
||
# OpenLP - Open Source Lyrics Projection #
|
||
# ---------------------------------------------------------------------- #
|
||
# Copyright (c) 2008-2021 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, either version 3 of the License, or #
|
||
# (at your option) any later version. #
|
||
# #
|
||
# 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, see <https://www.gnu.org/licenses/>. #
|
||
##########################################################################
|
||
"""
|
||
The UI widgets for the first time wizard.
|
||
"""
|
||
from PyQt5 import QtCore, QtGui, QtWidgets
|
||
|
||
from openlp.core.common import clean_button_text, is_macosx
|
||
from openlp.core.common.i18n import translate
|
||
from openlp.core.lib.ui import add_welcome_page
|
||
from openlp.core.ui.icons import UiIcons
|
||
|
||
from openlp.core.display.screens import ScreenList
|
||
from openlp.core.pages import GridLayoutPage
|
||
from openlp.core.widgets.widgets import ScreenSelectionWidget
|
||
|
||
|
||
class FirstTimePage(object):
|
||
"""
|
||
An enumeration class with each of the pages of the wizard.
|
||
"""
|
||
Welcome = 0
|
||
Plugins = 1
|
||
ScreenConfig = 2
|
||
SampleOption = 3
|
||
Download = 4
|
||
NoInternet = 5
|
||
Remote = 6
|
||
Songs = 7
|
||
Bibles = 8
|
||
Themes = 9
|
||
Progress = 10
|
||
|
||
|
||
class RemotePage(GridLayoutPage):
|
||
"""
|
||
A page for the web remote
|
||
"""
|
||
def setup_ui(self):
|
||
"""
|
||
Set up the page
|
||
"""
|
||
self.remote_label = QtWidgets.QLabel(self)
|
||
self.remote_label.setWordWrap(True)
|
||
self.remote_label.setObjectName('remote_label')
|
||
self.layout.addWidget(self.remote_label, 0, 0, 1, 4)
|
||
self.download_checkbox = QtWidgets.QCheckBox(self)
|
||
self.setObjectName('download_checkbox')
|
||
self.layout.addWidget(self.download_checkbox, 1, 1, 1, 3)
|
||
|
||
def retranslate_ui(self):
|
||
"""
|
||
Translate the interface
|
||
"""
|
||
self.remote_label.setText(translate('OpenLP.FirstTimeWizard', 'OpenLP has a web remote, which enables you to '
|
||
'control OpenLP from another computer, phone or tablet on the same network '
|
||
'as the OpenLP computer. OpenLP can download this web remote for you now, '
|
||
'or you can download it later via the remote settings.'))
|
||
self.download_checkbox.setText(translate('OpenLP.FirstTimeWizard', 'Yes, download the remote now'))
|
||
self.setTitle(translate('OpenLP.FirstTimeWizard', 'Web-based Remote Interface'))
|
||
self.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Please confirm if you want to download the web remote.'))
|
||
|
||
@property
|
||
def can_download_remote(self):
|
||
"""
|
||
The get method of a property to determine if the user selected the "Download remote now" checkbox
|
||
"""
|
||
return self.download_checkbox.isChecked()
|
||
|
||
@can_download_remote.setter
|
||
def can_download_remote(self, value):
|
||
if not isinstance(value, bool):
|
||
raise TypeError('Must be a bool')
|
||
self.download_checkbox.setChecked(value)
|
||
|
||
|
||
class ThemeListWidget(QtWidgets.QListWidget):
|
||
"""
|
||
Subclass a QListWidget so we can make it look better when it resizes.
|
||
"""
|
||
def __init__(self, *args, **kwargs):
|
||
super().__init__(*args, **kwargs)
|
||
self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
|
||
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
|
||
self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
|
||
self.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
|
||
self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||
self.setIconSize(QtCore.QSize(133, 100))
|
||
self.setMovement(QtWidgets.QListView.Static)
|
||
self.setFlow(QtWidgets.QListView.LeftToRight)
|
||
self.setProperty("isWrapping", True)
|
||
self.setResizeMode(QtWidgets.QListView.Adjust)
|
||
self.setViewMode(QtWidgets.QListView.IconMode)
|
||
self.setUniformItemSizes(True)
|
||
|
||
def resizeEvent(self, event):
|
||
"""
|
||
Resize the grid so the list looks better when its resized/
|
||
|
||
:param QtGui.QResizeEvent event: Not used
|
||
:return: None
|
||
"""
|
||
super().resizeEvent(event)
|
||
nominal_width = 141 # Icon width of 133 + 4 each side
|
||
max_items_per_row = self.viewport().width() // nominal_width or 1 # or 1 to avoid divide by 0 errors
|
||
col_size = (self.viewport().width() - 1) // max_items_per_row
|
||
self.setGridSize(QtCore.QSize(col_size, 140))
|
||
|
||
|
||
class UiFirstTimeWizard(object):
|
||
"""
|
||
The UI widgets for the first time wizard.
|
||
"""
|
||
def setup_ui(self, first_time_wizard):
|
||
"""
|
||
Set up the UI.
|
||
|
||
:param first_time_wizard: The wizard form
|
||
"""
|
||
first_time_wizard.setObjectName('first_time_wizard')
|
||
first_time_wizard.setWindowIcon(UiIcons().main_icon)
|
||
first_time_wizard.resize(640, 400)
|
||
first_time_wizard.setModal(True)
|
||
first_time_wizard.setOptions(QtWidgets.QWizard.IndependentPages | QtWidgets.QWizard.NoBackButtonOnStartPage |
|
||
QtWidgets.QWizard.NoBackButtonOnLastPage | QtWidgets.QWizard.HaveCustomButton1)
|
||
if is_macosx(): # pragma: nocover
|
||
first_time_wizard.setPixmap(QtWidgets.QWizard.BackgroundPixmap,
|
||
QtGui.QPixmap(':/wizards/openlp-osx-wizard.png'))
|
||
first_time_wizard.resize(634, 386)
|
||
else:
|
||
first_time_wizard.setWizardStyle(QtWidgets.QWizard.ModernStyle)
|
||
add_welcome_page(first_time_wizard, ':/wizards/wizard_firsttime.bmp')
|
||
# The screen config page
|
||
self.screen_page = QtWidgets.QWizardPage()
|
||
self.screen_page.setObjectName('defaults_page')
|
||
self.screen_page_layout = QtWidgets.QFormLayout(self.screen_page)
|
||
self.screen_selection_widget = ScreenSelectionWidget(self, ScreenList())
|
||
self.screen_selection_widget.use_simple_view()
|
||
self.screen_selection_widget.load()
|
||
self.screen_page_layout.addRow(self.screen_selection_widget)
|
||
first_time_wizard.setPage(FirstTimePage.ScreenConfig, self.screen_page)
|
||
# Download Samples page
|
||
self.resource_page = QtWidgets.QWizardPage()
|
||
self.resource_page.setObjectName('resource_page')
|
||
self.resource_page.setFinalPage(True)
|
||
self.resource_layout = QtWidgets.QVBoxLayout(self.resource_page)
|
||
self.resource_layout.setContentsMargins(50, 20, 50, 20)
|
||
self.resource_layout.setObjectName('resource_layout')
|
||
self.resource_label = QtWidgets.QLabel(self.resource_page)
|
||
self.resource_label.setObjectName('resource_label')
|
||
self.resource_label.setWordWrap(True)
|
||
self.resource_layout.addWidget(self.resource_label)
|
||
first_time_wizard.setPage(FirstTimePage.SampleOption, self.resource_page)
|
||
# The download page
|
||
self.download_page = QtWidgets.QWizardPage()
|
||
self.download_page.setObjectName('download_page')
|
||
self.download_layout = QtWidgets.QVBoxLayout(self.download_page)
|
||
self.download_layout.setContentsMargins(48, 48, 48, 48)
|
||
self.download_layout.setObjectName('download_layout')
|
||
self.download_label = QtWidgets.QLabel(self.download_page)
|
||
self.download_label.setObjectName('download_label')
|
||
self.download_layout.addWidget(self.download_label)
|
||
first_time_wizard.setPage(FirstTimePage.Download, self.download_page)
|
||
# The "you don't have an internet connection" page.
|
||
self.no_internet_page = QtWidgets.QWizardPage()
|
||
self.no_internet_page.setObjectName('no_internet_page')
|
||
self.no_internet_page.setFinalPage(True)
|
||
self.no_internet_layout = QtWidgets.QVBoxLayout(self.no_internet_page)
|
||
self.no_internet_layout.setContentsMargins(50, 30, 50, 40)
|
||
self.no_internet_layout.setObjectName('no_internet_layout')
|
||
self.no_internet_label = QtWidgets.QLabel(self.no_internet_page)
|
||
self.no_internet_label.setWordWrap(True)
|
||
self.no_internet_label.setObjectName('no_internet_label')
|
||
self.no_internet_layout.addWidget(self.no_internet_label)
|
||
first_time_wizard.setPage(FirstTimePage.NoInternet, self.no_internet_page)
|
||
# The plugins page
|
||
self.plugin_page = QtWidgets.QWizardPage()
|
||
self.plugin_page.setObjectName('plugin_page')
|
||
self.plugin_layout = QtWidgets.QVBoxLayout(self.plugin_page)
|
||
self.plugin_layout.setContentsMargins(40, 15, 40, 0)
|
||
self.plugin_layout.setObjectName('plugin_layout')
|
||
self.songs_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.songs_check_box.setChecked(True)
|
||
self.songs_check_box.setObjectName('songs_check_box')
|
||
self.plugin_layout.addWidget(self.songs_check_box)
|
||
self.custom_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.custom_check_box.setChecked(True)
|
||
self.custom_check_box.setObjectName('custom_check_box')
|
||
self.plugin_layout.addWidget(self.custom_check_box)
|
||
self.bible_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.bible_check_box.setChecked(True)
|
||
self.bible_check_box.setObjectName('bible_check_box')
|
||
self.plugin_layout.addWidget(self.bible_check_box)
|
||
self.image_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.image_check_box.setChecked(True)
|
||
self.image_check_box.setObjectName('image_check_box')
|
||
self.plugin_layout.addWidget(self.image_check_box)
|
||
self.presentation_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.presentation_check_box.setChecked(True)
|
||
self.presentation_check_box.setObjectName('presentation_check_box')
|
||
self.plugin_layout.addWidget(self.presentation_check_box)
|
||
self.media_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.media_check_box.setChecked(True)
|
||
self.media_check_box.setObjectName('media_check_box')
|
||
self.plugin_layout.addWidget(self.media_check_box)
|
||
self.song_usage_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.song_usage_check_box.setChecked(True)
|
||
self.song_usage_check_box.setObjectName('song_usage_check_box')
|
||
self.plugin_layout.addWidget(self.song_usage_check_box)
|
||
self.alert_check_box = QtWidgets.QCheckBox(self.plugin_page)
|
||
self.alert_check_box.setChecked(True)
|
||
self.alert_check_box.setObjectName('alert_check_box')
|
||
self.plugin_layout.addWidget(self.alert_check_box)
|
||
first_time_wizard.setPage(FirstTimePage.Plugins, self.plugin_page)
|
||
# Web Remote page
|
||
self.remote_page = RemotePage(self)
|
||
first_time_wizard.setPage(FirstTimePage.Remote, self.remote_page)
|
||
# The song samples page
|
||
self.songs_page = QtWidgets.QWizardPage()
|
||
self.songs_page.setObjectName('songs_page')
|
||
self.songs_layout = QtWidgets.QVBoxLayout(self.songs_page)
|
||
self.songs_layout.setContentsMargins(50, 20, 50, 20)
|
||
self.songs_layout.setObjectName('songs_layout')
|
||
self.songs_list_widget = QtWidgets.QListWidget(self.songs_page)
|
||
self.songs_list_widget.setAlternatingRowColors(True)
|
||
self.songs_list_widget.setObjectName('songs_list_widget')
|
||
self.songs_layout.addWidget(self.songs_list_widget)
|
||
first_time_wizard.setPage(FirstTimePage.Songs, self.songs_page)
|
||
# The Bible samples page
|
||
self.bibles_page = QtWidgets.QWizardPage()
|
||
self.bibles_page.setObjectName('bibles_page')
|
||
self.bibles_layout = QtWidgets.QVBoxLayout(self.bibles_page)
|
||
self.bibles_layout.setContentsMargins(50, 20, 50, 20)
|
||
self.bibles_layout.setObjectName('bibles_layout')
|
||
self.bibles_tree_widget = QtWidgets.QTreeWidget(self.bibles_page)
|
||
self.bibles_tree_widget.setAlternatingRowColors(True)
|
||
self.bibles_tree_widget.header().setVisible(False)
|
||
self.bibles_tree_widget.setObjectName('bibles_tree_widget')
|
||
self.bibles_layout.addWidget(self.bibles_tree_widget)
|
||
first_time_wizard.setPage(FirstTimePage.Bibles, self.bibles_page)
|
||
# The theme samples page
|
||
self.themes_page = QtWidgets.QWizardPage()
|
||
self.themes_page.setObjectName('themes_page')
|
||
self.themes_layout = QtWidgets.QVBoxLayout(self.themes_page)
|
||
self.themes_layout.setObjectName('themes_layout')
|
||
self.themes_list_widget = ThemeListWidget(self.themes_page)
|
||
self.themes_layout.addWidget(self.themes_list_widget)
|
||
self.theme_options_layout = QtWidgets.QHBoxLayout()
|
||
self.default_theme_layout = QtWidgets.QHBoxLayout()
|
||
self.theme_label = QtWidgets.QLabel(self.themes_page)
|
||
self.default_theme_layout.addWidget(self.theme_label)
|
||
self.theme_combo_box = QtWidgets.QComboBox(self.themes_page)
|
||
self.theme_combo_box.setEditable(False)
|
||
self.default_theme_layout.addWidget(self.theme_combo_box, stretch=1)
|
||
self.theme_options_layout.addLayout(self.default_theme_layout, stretch=1)
|
||
self.select_buttons_layout = QtWidgets.QHBoxLayout()
|
||
self.themes_select_all_button = QtWidgets.QToolButton(self.themes_page)
|
||
self.themes_select_all_button.setIcon(UiIcons().select_all)
|
||
self.select_buttons_layout.addWidget(self.themes_select_all_button, stretch=1, alignment=QtCore.Qt.AlignRight)
|
||
self.themes_deselect_all_button = QtWidgets.QToolButton(self.themes_page)
|
||
self.themes_deselect_all_button.setIcon(UiIcons().select_none)
|
||
self.select_buttons_layout.addWidget(self.themes_deselect_all_button)
|
||
self.theme_options_layout.addLayout(self.select_buttons_layout, stretch=1)
|
||
self.themes_layout.addLayout(self.theme_options_layout)
|
||
first_time_wizard.setPage(FirstTimePage.Themes, self.themes_page)
|
||
# Progress page
|
||
self.progress_page = QtWidgets.QWizardPage()
|
||
self.progress_page.setObjectName('progress_page')
|
||
self.progress_layout = QtWidgets.QVBoxLayout(self.progress_page)
|
||
self.progress_layout.setContentsMargins(48, 48, 48, 48)
|
||
self.progress_layout.setObjectName('progress_layout')
|
||
self.progress_label = QtWidgets.QLabel(self.progress_page)
|
||
self.progress_label.setObjectName('progress_label')
|
||
self.progress_layout.addWidget(self.progress_label)
|
||
self.progress_bar = QtWidgets.QProgressBar(self.progress_page)
|
||
self.progress_bar.setObjectName('progress_bar')
|
||
self.progress_layout.addWidget(self.progress_bar)
|
||
first_time_wizard.setPage(FirstTimePage.Progress, self.progress_page)
|
||
self.retranslate_ui()
|
||
|
||
def retranslate_ui(self):
|
||
"""
|
||
Translate the UI on the fly
|
||
|
||
:param first_time_wizard: The wizard form
|
||
"""
|
||
self.finish_button_text = clean_button_text(self.buttonText(QtWidgets.QWizard.FinishButton))
|
||
back_button_text = clean_button_text(self.buttonText(QtWidgets.QWizard.BackButton))
|
||
next_button_text = clean_button_text(self.buttonText(QtWidgets.QWizard.NextButton))
|
||
|
||
self.setWindowTitle(translate('OpenLP.FirstTimeWizard', 'First Time Wizard'))
|
||
text = translate('OpenLP.FirstTimeWizard', 'Welcome to the First Time Wizard')
|
||
self.title_label.setText('<span style="font-size:14pt; font-weight:600;">{text}</span>'.format(text=text))
|
||
self.information_label.setText(
|
||
translate('OpenLP.FirstTimeWizard', 'This wizard will help you to configure OpenLP for initial use. '
|
||
'Click the \'{next_button}\' button below to start.'
|
||
).format(next_button=next_button_text))
|
||
self.setButtonText(
|
||
QtWidgets.QWizard.CustomButton1, translate('OpenLP.FirstTimeWizard', 'Internet Settings'))
|
||
self.download_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Downloading Resource Index'))
|
||
self.download_page.setSubTitle(translate('OpenLP.FirstTimeWizard',
|
||
'Please wait while the resource index is downloaded.'))
|
||
self.download_label.setText(translate('OpenLP.FirstTimeWizard',
|
||
'Please wait while OpenLP downloads the resource index file...'))
|
||
self.plugin_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Select parts of the program you wish to use'))
|
||
self.plugin_page.setSubTitle(translate('OpenLP.FirstTimeWizard',
|
||
'You can also change these settings after the Wizard.'))
|
||
self.screen_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Displays'))
|
||
self.screen_page.setSubTitle(translate('OpenLP.FirstTimeWizard',
|
||
'Choose the main display screen for OpenLP.'))
|
||
self.songs_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Songs'))
|
||
self.custom_check_box.setText(
|
||
translate('OpenLP.FirstTimeWizard',
|
||
'Custom Slides – Easier to manage than songs and they have their own list of slides'))
|
||
self.bible_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Bibles – Import and show Bibles'))
|
||
self.image_check_box.setText(translate('OpenLP.FirstTimeWizard',
|
||
'Images – Show images or replace background with them'))
|
||
self.presentation_check_box.setText(translate('OpenLP.FirstTimeWizard',
|
||
'Presentations – Show .ppt, .odp and .pdf files'))
|
||
self.media_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Media – Playback of Audio and Video files'))
|
||
self.song_usage_check_box.setText(translate('OpenLP.FirstTimeWizard', 'Song Usage Monitor'))
|
||
self.alert_check_box.setText(translate('OpenLP.FirstTimeWizard',
|
||
'Alerts – Display informative messages while showing other slides'))
|
||
self.resource_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Resource Data'))
|
||
self.resource_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Can OpenLP download some resource data?'))
|
||
self.resource_label.setText(
|
||
translate('OpenLP.FirstTimeWizard',
|
||
'OpenLP has collected some resources that we have permission to distribute.\n\n'
|
||
'If you would like to download some of these resources click the \'{next_button}\' button, '
|
||
'otherwise click the \'{finish_button}\' button.'
|
||
).format(next_button=next_button_text, finish_button=self.finish_button_text))
|
||
self.no_internet_page.setTitle(translate('OpenLP.FirstTimeWizard', 'No Internet Connection'))
|
||
self.no_internet_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Cannot connect to the internet.'))
|
||
self.no_internet_label.setText(
|
||
translate('OpenLP.FirstTimeWizard',
|
||
'OpenLP could not connect to the internet to get information about the sample data available.\n\n'
|
||
'Please check your internet connection. If your church uses a proxy server click the '
|
||
'\'Internet Settings\' button below and enter the server details there.\n\nClick the '
|
||
'\'{back_button}\' button to try again.\n\nIf you click the \'{finish_button}\' '
|
||
'button you can download the data at a later time by selecting \'Re-run First Time Wizard\' '
|
||
'from the \'Tools\' menu in OpenLP.'
|
||
).format(back_button=back_button_text, finish_button=self.finish_button_text))
|
||
self.songs_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Songs'))
|
||
self.songs_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download public domain songs.'))
|
||
self.bibles_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Bibles'))
|
||
self.bibles_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download free Bibles.'))
|
||
# Themes Page
|
||
self.themes_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Themes'))
|
||
self.themes_page.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select and download sample themes.'))
|
||
self.theme_label.setText(translate('OpenLP.FirstTimeWizard', 'Default theme:'))
|
||
self.themes_select_all_button.setToolTip(translate('OpenLP.FirstTimeWizard', 'Select all'))
|
||
self.themes_deselect_all_button.setToolTip(translate('OpenLP.FirstTimeWizard', 'Deselect all'))
|
||
self.progress_page.setTitle(translate('OpenLP.FirstTimeWizard', 'Downloading and Configuring'))
|
||
self.progress_page.setSubTitle(
|
||
translate('OpenLP.FirstTimeWizard', 'Please wait while resources are downloaded and OpenLP is configured.'))
|