2010-10-03 07:42:02 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
2012-12-29 15:25:29 +00:00
|
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
|
2010-10-03 07:42:02 +00:00
|
|
|
|
|
|
|
###############################################################################
|
|
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
|
|
# --------------------------------------------------------------------------- #
|
2015-12-31 22:46:06 +00:00
|
|
|
# Copyright (c) 2008-2016 OpenLP Developers #
|
2010-10-03 07:42:02 +00:00
|
|
|
# --------------------------------------------------------------------------- #
|
|
|
|
# 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 #
|
2014-05-21 14:47:44 +00:00
|
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
2010-10-03 07:42:02 +00:00
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
|
|
|
# more details. #
|
|
|
|
# #
|
2014-05-21 14:47:44 +00:00
|
|
|
# You should have received a copy of the GNU General Public License along #
|
2010-10-03 07:42:02 +00:00
|
|
|
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
|
|
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
|
|
|
###############################################################################
|
2013-02-01 21:34:23 +00:00
|
|
|
"""
|
|
|
|
The Theme wizard
|
|
|
|
"""
|
2010-10-03 07:42:02 +00:00
|
|
|
import logging
|
2010-11-05 19:20:41 +00:00
|
|
|
import os
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2014-03-16 21:25:23 +00:00
|
|
|
from openlp.core.common import Registry, RegistryProperties, UiStrings, translate
|
2011-02-18 03:15:09 +00:00
|
|
|
from openlp.core.lib.theme import BackgroundType, BackgroundGradientType
|
2013-01-11 00:19:11 +00:00
|
|
|
from openlp.core.lib.ui import critical_error_message_box
|
2011-10-02 07:52:28 +00:00
|
|
|
from openlp.core.ui import ThemeLayoutForm
|
2013-07-11 20:58:15 +00:00
|
|
|
from openlp.core.utils import get_images_filter, is_not_image_file
|
2013-08-31 18:17:38 +00:00
|
|
|
from .themewizard import Ui_ThemeWizard
|
2010-10-03 07:42:02 +00:00
|
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
2013-02-01 21:34:23 +00:00
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
|
2010-10-03 07:42:02 +00:00
|
|
|
"""
|
2011-01-02 22:24:14 +00:00
|
|
|
This is the Theme Import Wizard, which allows easy creation and editing of
|
|
|
|
OpenLP themes.
|
2010-10-03 07:42:02 +00:00
|
|
|
"""
|
2013-08-31 18:17:38 +00:00
|
|
|
log.info('ThemeWizardForm loaded')
|
2010-10-03 07:42:02 +00:00
|
|
|
|
|
|
|
def __init__(self, parent):
|
|
|
|
"""
|
|
|
|
Instantiate the wizard, and run any extra setup we need to.
|
|
|
|
|
2014-03-17 19:05:55 +00:00
|
|
|
:param parent: The QWidget-derived parent of the wizard.
|
2010-10-03 07:42:02 +00:00
|
|
|
"""
|
2013-07-18 14:14:29 +00:00
|
|
|
super(ThemeForm, self).__init__(parent)
|
2015-01-08 22:05:32 +00:00
|
|
|
self._setup()
|
|
|
|
|
|
|
|
def _setup(self):
|
|
|
|
"""
|
|
|
|
Set up the class. This method is mocked out by the tests.
|
|
|
|
"""
|
2010-10-03 07:42:02 +00:00
|
|
|
self.setupUi(self)
|
|
|
|
self.registerFields()
|
2013-12-24 15:55:01 +00:00
|
|
|
self.update_theme_allowed = True
|
2013-08-31 18:17:38 +00:00
|
|
|
self.temp_background_filename = ''
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme_layout_form = ThemeLayoutForm(self)
|
|
|
|
self.background_combo_box.currentIndexChanged.connect(self.on_background_combo_box_current_index_changed)
|
|
|
|
self.gradient_combo_box.currentIndexChanged.connect(self.on_gradient_combo_box_current_index_changed)
|
2014-11-02 19:57:06 +00:00
|
|
|
self.color_button.colorChanged.connect(self.on_color_changed)
|
|
|
|
self.image_color_button.colorChanged.connect(self.on_image_color_changed)
|
2014-11-10 20:48:22 +00:00
|
|
|
self.gradient_start_button.colorChanged.connect(self.on_gradient_start_color_changed)
|
|
|
|
self.gradient_end_button.colorChanged.connect(self.on_gradient_end_color_changed)
|
2013-12-26 17:36:00 +00:00
|
|
|
self.image_browse_button.clicked.connect(self.on_image_browse_button_clicked)
|
|
|
|
self.image_file_edit.editingFinished.connect(self.on_image_file_edit_editing_finished)
|
2014-11-02 19:57:06 +00:00
|
|
|
self.main_color_button.colorChanged.connect(self.on_main_color_changed)
|
|
|
|
self.outline_color_button.colorChanged.connect(self.on_outline_color_changed)
|
|
|
|
self.shadow_color_button.colorChanged.connect(self.on_shadow_color_changed)
|
2013-12-26 17:36:00 +00:00
|
|
|
self.outline_check_box.stateChanged.connect(self.on_outline_check_check_box_state_changed)
|
|
|
|
self.shadow_check_box.stateChanged.connect(self.on_shadow_check_check_box_state_changed)
|
2014-11-02 19:57:06 +00:00
|
|
|
self.footer_color_button.colorChanged.connect(self.on_footer_color_changed)
|
2013-12-26 17:36:00 +00:00
|
|
|
self.customButtonClicked.connect(self.on_custom_1_button_clicked)
|
|
|
|
self.main_position_check_box.stateChanged.connect(self.on_main_position_check_box_state_changed)
|
|
|
|
self.footer_position_check_box.stateChanged.connect(self.on_footer_position_check_box_state_changed)
|
|
|
|
self.currentIdChanged.connect(self.on_current_id_changed)
|
|
|
|
Registry().register_function('theme_line_count', self.update_lines_text)
|
|
|
|
self.main_size_spin_box.valueChanged.connect(self.calculate_lines)
|
|
|
|
self.line_spacing_spin_box.valueChanged.connect(self.calculate_lines)
|
|
|
|
self.outline_size_spin_box.valueChanged.connect(self.calculate_lines)
|
|
|
|
self.shadow_size_spin_box.valueChanged.connect(self.calculate_lines)
|
|
|
|
self.main_font_combo_box.activated.connect(self.calculate_lines)
|
|
|
|
self.footer_font_combo_box.activated.connect(self.update_theme)
|
|
|
|
self.footer_size_spin_box.valueChanged.connect(self.update_theme)
|
2010-11-08 06:11:04 +00:00
|
|
|
|
2014-04-02 07:04:12 +00:00
|
|
|
def set_defaults(self):
|
2010-11-05 19:20:41 +00:00
|
|
|
"""
|
|
|
|
Set up display at start of theme edit.
|
|
|
|
"""
|
|
|
|
self.restart()
|
2013-12-26 17:36:00 +00:00
|
|
|
self.set_background_page_values()
|
|
|
|
self.set_main_area_page_values()
|
|
|
|
self.set_footer_area_page_values()
|
|
|
|
self.set_alignment_page_values()
|
|
|
|
self.set_position_page_values()
|
|
|
|
self.set_preview_page_values()
|
2010-11-05 19:20:41 +00:00
|
|
|
|
|
|
|
def registerFields(self):
|
|
|
|
"""
|
|
|
|
Map field names to screen names,
|
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
self.background_page.registerField('background_type', self.background_combo_box)
|
|
|
|
self.background_page.registerField('color', self.color_button)
|
|
|
|
self.background_page.registerField('gradient_start', self.gradient_start_button)
|
|
|
|
self.background_page.registerField('gradient_end', self.gradient_end_button)
|
|
|
|
self.background_page.registerField('background_image', self.image_file_edit)
|
|
|
|
self.background_page.registerField('gradient', self.gradient_combo_box)
|
|
|
|
self.main_area_page.registerField('main_color_button', self.main_color_button)
|
|
|
|
self.main_area_page.registerField('main_size_spin_box', self.main_size_spin_box)
|
|
|
|
self.main_area_page.registerField('line_spacing_spin_box', self.line_spacing_spin_box)
|
|
|
|
self.main_area_page.registerField('outline_check_box', self.outline_check_box)
|
|
|
|
self.main_area_page.registerField('outline_color_button', self.outline_color_button)
|
|
|
|
self.main_area_page.registerField('outline_size_spin_box', self.outline_size_spin_box)
|
|
|
|
self.main_area_page.registerField('shadow_check_box', self.shadow_check_box)
|
|
|
|
self.main_area_page.registerField('main_bold_check_box', self.main_bold_check_box)
|
|
|
|
self.main_area_page.registerField('main_italics_check_box', self.main_italics_check_box)
|
|
|
|
self.main_area_page.registerField('shadow_color_button', self.shadow_color_button)
|
|
|
|
self.main_area_page.registerField('shadow_size_spin_box', self.shadow_size_spin_box)
|
|
|
|
self.main_area_page.registerField('footer_size_spin_box', self.footer_size_spin_box)
|
|
|
|
self.area_position_page.registerField('main_position_x', self.main_x_spin_box)
|
|
|
|
self.area_position_page.registerField('main_position_y', self.main_y_spin_box)
|
|
|
|
self.area_position_page.registerField('main_position_width', self.main_width_spin_box)
|
|
|
|
self.area_position_page.registerField('main_position_height', self.main_height_spin_box)
|
|
|
|
self.area_position_page.registerField('footer_position_x', self.footer_x_spin_box)
|
|
|
|
self.area_position_page.registerField('footer_position_y', self.footer_y_spin_box)
|
|
|
|
self.area_position_page.registerField('footer_position_width', self.footer_width_spin_box)
|
|
|
|
self.area_position_page.registerField('footer_position_height', self.footer_height_spin_box)
|
|
|
|
self.background_page.registerField('horizontal', self.horizontal_combo_box)
|
|
|
|
self.background_page.registerField('vertical', self.vertical_combo_box)
|
|
|
|
self.background_page.registerField('slide_transition', self.transitions_check_box)
|
|
|
|
self.background_page.registerField('name', self.theme_name_edit)
|
|
|
|
|
|
|
|
def calculate_lines(self):
|
2010-11-23 20:48:55 +00:00
|
|
|
"""
|
|
|
|
Calculate the number of lines on a page by rendering text
|
|
|
|
"""
|
|
|
|
# Do not trigger on start up
|
2013-03-07 08:05:43 +00:00
|
|
|
if self.currentPage != self.welcome_page:
|
2013-12-26 17:36:00 +00:00
|
|
|
self.update_theme()
|
2013-02-01 21:48:06 +00:00
|
|
|
self.theme_manager.generate_image(self.theme, True)
|
2010-11-23 20:48:55 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def update_lines_text(self, lines):
|
2010-11-23 20:48:55 +00:00
|
|
|
"""
|
|
|
|
Updates the lines on a page on the wizard
|
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
self.main_line_count_label.setText(
|
2012-12-29 15:25:29 +00:00
|
|
|
translate('OpenLP.ThemeForm', '(approximately %d lines per slide)') % int(lines))
|
2010-11-23 20:48:55 +00:00
|
|
|
|
2010-12-28 21:24:21 +00:00
|
|
|
def resizeEvent(self, event=None):
|
|
|
|
"""
|
|
|
|
Rescale the theme preview thumbnail on resize events.
|
|
|
|
"""
|
|
|
|
if not event:
|
|
|
|
event = QtGui.QResizeEvent(self.size(), self.size())
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QWizard.resizeEvent(self, event)
|
2016-01-08 21:44:22 +00:00
|
|
|
if hasattr(self, 'preview_page') and self.currentPage() == self.preview_page:
|
2013-12-26 17:36:00 +00:00
|
|
|
frame_width = self.preview_box_label.lineWidth()
|
|
|
|
pixmap_width = self.preview_area.width() - 2 * frame_width
|
|
|
|
pixmap_height = self.preview_area.height() - 2 * frame_width
|
|
|
|
aspect_ratio = float(pixmap_width) / pixmap_height
|
|
|
|
if aspect_ratio < self.display_aspect_ratio:
|
|
|
|
pixmap_height = int(pixmap_width / self.display_aspect_ratio + 0.5)
|
2010-12-28 21:24:21 +00:00
|
|
|
else:
|
2013-12-26 17:36:00 +00:00
|
|
|
pixmap_width = int(pixmap_height * self.display_aspect_ratio + 0.5)
|
|
|
|
self.preview_box_label.setFixedSize(pixmap_width + 2 * frame_width, pixmap_height + 2 * frame_width)
|
2010-12-28 21:24:21 +00:00
|
|
|
|
2012-09-17 21:30:10 +00:00
|
|
|
def validateCurrentPage(self):
|
2013-02-01 21:34:23 +00:00
|
|
|
"""
|
|
|
|
Validate the current page
|
|
|
|
"""
|
2012-09-21 06:42:31 +00:00
|
|
|
background_image = BackgroundType.to_string(BackgroundType.Image)
|
2013-12-26 17:36:00 +00:00
|
|
|
if self.page(self.currentId()) == self.background_page and \
|
2013-07-26 20:17:51 +00:00
|
|
|
self.theme.background_type == background_image and is_not_image_file(self.theme.background_filename):
|
2015-11-07 00:49:40 +00:00
|
|
|
QtWidgets.QMessageBox.critical(self, translate('OpenLP.ThemeWizard', 'Background Image Empty'),
|
|
|
|
translate('OpenLP.ThemeWizard', 'You have not selected a '
|
|
|
|
'background image. Please select one before continuing.'))
|
2012-09-17 21:30:10 +00:00
|
|
|
return False
|
|
|
|
else:
|
|
|
|
return True
|
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_current_id_changed(self, page_id):
|
2010-12-27 21:53:02 +00:00
|
|
|
"""
|
2012-07-06 06:25:21 +00:00
|
|
|
Detects Page changes and updates as appropriate.
|
2010-12-27 21:53:02 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
enabled = self.page(page_id) == self.area_position_page
|
2015-11-07 00:49:40 +00:00
|
|
|
self.setOption(QtWidgets.QWizard.HaveCustomButton1, enabled)
|
2013-12-26 17:36:00 +00:00
|
|
|
if self.page(page_id) == self.preview_page:
|
|
|
|
self.update_theme()
|
2013-02-01 21:48:06 +00:00
|
|
|
frame = self.theme_manager.generate_image(self.theme)
|
2015-11-29 22:48:10 +00:00
|
|
|
frame.setDevicePixelRatio(self.devicePixelRatio())
|
2013-12-26 17:36:00 +00:00
|
|
|
self.preview_box_label.setPixmap(frame)
|
|
|
|
self.display_aspect_ratio = float(frame.width()) / frame.height()
|
2010-12-28 21:24:21 +00:00
|
|
|
self.resizeEvent()
|
2010-12-27 21:53:02 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_custom_1_button_clicked(self, number):
|
2011-10-02 16:38:05 +00:00
|
|
|
"""
|
2011-10-03 16:53:54 +00:00
|
|
|
Generate layout preview and display the form.
|
2011-10-02 16:38:05 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
self.update_theme()
|
2013-02-01 21:48:06 +00:00
|
|
|
width = self.renderer.width
|
|
|
|
height = self.renderer.height
|
2011-09-27 19:37:34 +00:00
|
|
|
pixmap = QtGui.QPixmap(width, height)
|
|
|
|
pixmap.fill(QtCore.Qt.white)
|
|
|
|
paint = QtGui.QPainter(pixmap)
|
2011-09-28 20:43:30 +00:00
|
|
|
paint.setPen(QtGui.QPen(QtCore.Qt.blue, 2))
|
2013-02-01 21:48:06 +00:00
|
|
|
paint.drawRect(self.renderer.get_main_rectangle(self.theme))
|
2011-09-28 20:43:30 +00:00
|
|
|
paint.setPen(QtGui.QPen(QtCore.Qt.red, 2))
|
2013-02-01 21:48:06 +00:00
|
|
|
paint.drawRect(self.renderer.get_footer_rectangle(self.theme))
|
2011-09-27 19:37:34 +00:00
|
|
|
paint.end()
|
2015-11-07 00:49:40 +00:00
|
|
|
self.theme_layout_form.exec(pixmap)
|
2011-10-02 07:52:28 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_outline_check_check_box_state_changed(self, state):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2010-10-16 13:54:57 +00:00
|
|
|
Change state as Outline check box changed
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-24 15:55:01 +00:00
|
|
|
if self.update_theme_allowed:
|
2012-05-19 18:56:28 +00:00
|
|
|
self.theme.font_main_outline = state == QtCore.Qt.Checked
|
2013-12-26 17:36:00 +00:00
|
|
|
self.outline_color_button.setEnabled(self.theme.font_main_outline)
|
|
|
|
self.outline_size_spin_box.setEnabled(self.theme.font_main_outline)
|
|
|
|
self.calculate_lines()
|
2010-10-11 16:14:36 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_shadow_check_check_box_state_changed(self, state):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
|
|
|
Change state as Shadow check box changed
|
|
|
|
"""
|
2013-12-24 15:55:01 +00:00
|
|
|
if self.update_theme_allowed:
|
2011-01-23 08:25:21 +00:00
|
|
|
if state == QtCore.Qt.Checked:
|
|
|
|
self.theme.font_main_shadow = True
|
|
|
|
else:
|
|
|
|
self.theme.font_main_shadow = False
|
2013-12-26 17:36:00 +00:00
|
|
|
self.shadow_color_button.setEnabled(self.theme.font_main_shadow)
|
|
|
|
self.shadow_size_spin_box.setEnabled(self.theme.font_main_shadow)
|
|
|
|
self.calculate_lines()
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_main_position_check_box_state_changed(self, value):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Change state as Main Area _position check box changed
|
2011-01-30 10:27:12 +00:00
|
|
|
NOTE the font_main_override is the inverse of the check box value
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-24 15:55:01 +00:00
|
|
|
if self.update_theme_allowed:
|
2011-01-30 10:27:12 +00:00
|
|
|
self.theme.font_main_override = not (value == QtCore.Qt.Checked)
|
2010-10-16 07:21:24 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_footer_position_check_box_state_changed(self, value):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Change state as Footer Area _position check box changed
|
2011-01-30 10:27:12 +00:00
|
|
|
NOTE the font_footer_override is the inverse of the check box value
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-24 15:55:01 +00:00
|
|
|
if self.update_theme_allowed:
|
2011-01-30 10:27:12 +00:00
|
|
|
self.theme.font_footer_override = not (value == QtCore.Qt.Checked)
|
2010-10-13 19:40:01 +00:00
|
|
|
|
2015-11-07 00:49:40 +00:00
|
|
|
def exec(self, edit=False):
|
2010-10-03 07:42:02 +00:00
|
|
|
"""
|
|
|
|
Run the wizard.
|
|
|
|
"""
|
2013-08-31 18:17:38 +00:00
|
|
|
log.debug('Editing theme %s' % self.theme.theme_name)
|
|
|
|
self.temp_background_filename = ''
|
2013-12-24 15:55:01 +00:00
|
|
|
self.update_theme_allowed = False
|
2014-04-02 07:04:12 +00:00
|
|
|
self.set_defaults()
|
2013-12-24 15:55:01 +00:00
|
|
|
self.update_theme_allowed = True
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme_name_label.setVisible(not edit)
|
|
|
|
self.theme_name_edit.setVisible(not edit)
|
2011-01-09 18:51:06 +00:00
|
|
|
self.edit_mode = edit
|
2010-12-05 18:02:36 +00:00
|
|
|
if edit:
|
2012-12-29 15:25:29 +00:00
|
|
|
self.setWindowTitle(translate('OpenLP.ThemeWizard', 'Edit Theme - %s') % self.theme.theme_name)
|
2010-12-05 18:02:36 +00:00
|
|
|
self.next()
|
2010-12-28 11:18:56 +00:00
|
|
|
else:
|
2011-04-15 21:43:59 +00:00
|
|
|
self.setWindowTitle(UiStrings().NewTheme)
|
2015-11-07 00:49:40 +00:00
|
|
|
return QtWidgets.QWizard.exec(self)
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2013-03-07 12:59:35 +00:00
|
|
|
def initializePage(self, page_id):
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
|
|
|
Set up the pages for Initial run through dialog
|
|
|
|
"""
|
2013-08-31 18:17:38 +00:00
|
|
|
log.debug('initializePage %s' % page_id)
|
2013-12-26 17:36:00 +00:00
|
|
|
wizard_page = self.page(page_id)
|
|
|
|
if wizard_page == self.background_page:
|
|
|
|
self.set_background_page_values()
|
|
|
|
elif wizard_page == self.main_area_page:
|
|
|
|
self.set_main_area_page_values()
|
|
|
|
elif wizard_page == self.footer_area_page:
|
|
|
|
self.set_footer_area_page_values()
|
|
|
|
elif wizard_page == self.alignment_page:
|
|
|
|
self.set_alignment_page_values()
|
|
|
|
elif wizard_page == self.area_position_page:
|
|
|
|
self.set_position_page_values()
|
|
|
|
|
|
|
|
def set_background_page_values(self):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2010-12-28 11:18:56 +00:00
|
|
|
Handle the display and state of the Background page.
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
if self.theme.background_type == BackgroundType.to_string(BackgroundType.Solid):
|
2014-10-23 20:56:09 +00:00
|
|
|
self.color_button.color = self.theme.background_color
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('background_type', 0)
|
2012-12-29 15:25:29 +00:00
|
|
|
elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Gradient):
|
2014-10-23 20:56:09 +00:00
|
|
|
self.gradient_start_button.color = self.theme.background_start_color
|
|
|
|
self.gradient_end_button.color = self.theme.background_end_color
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('background_type', 1)
|
2012-12-29 15:25:29 +00:00
|
|
|
elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Image):
|
2014-10-23 20:56:09 +00:00
|
|
|
self.image_color_button.color = self.theme.background_border_color
|
2013-12-26 17:36:00 +00:00
|
|
|
self.image_file_edit.setText(self.theme.background_filename)
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('background_type', 2)
|
2012-12-29 15:25:29 +00:00
|
|
|
elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Transparent):
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('background_type', 3)
|
2012-12-29 15:25:29 +00:00
|
|
|
if self.theme.background_direction == BackgroundGradientType.to_string(BackgroundGradientType.Horizontal):
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('gradient', 0)
|
2012-12-29 15:25:29 +00:00
|
|
|
elif self.theme.background_direction == BackgroundGradientType.to_string(BackgroundGradientType.Vertical):
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('gradient', 1)
|
2012-12-29 15:25:29 +00:00
|
|
|
elif self.theme.background_direction == BackgroundGradientType.to_string(BackgroundGradientType.Circular):
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('gradient', 2)
|
2012-12-29 15:25:29 +00:00
|
|
|
elif self.theme.background_direction == BackgroundGradientType.to_string(BackgroundGradientType.LeftTop):
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('gradient', 3)
|
2010-10-09 06:48:54 +00:00
|
|
|
else:
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('gradient', 4)
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def set_main_area_page_values(self):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2010-12-28 11:18:56 +00:00
|
|
|
Handle the display and state of the Main Area page.
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
self.main_font_combo_box.setCurrentFont(QtGui.QFont(self.theme.font_main_name))
|
2014-10-23 20:56:09 +00:00
|
|
|
self.main_color_button.color = self.theme.font_main_color
|
2013-12-26 17:36:00 +00:00
|
|
|
self.setField('main_size_spin_box', self.theme.font_main_size)
|
|
|
|
self.setField('line_spacing_spin_box', self.theme.font_main_line_adjustment)
|
|
|
|
self.setField('outline_check_box', self.theme.font_main_outline)
|
2014-10-23 20:56:09 +00:00
|
|
|
self.outline_color_button.color = self.theme.font_main_outline_color
|
2013-12-26 17:36:00 +00:00
|
|
|
self.setField('outline_size_spin_box', self.theme.font_main_outline_size)
|
|
|
|
self.setField('shadow_check_box', self.theme.font_main_shadow)
|
2014-10-23 20:56:09 +00:00
|
|
|
self.shadow_color_button.color = self.theme.font_main_shadow_color
|
2013-12-26 17:36:00 +00:00
|
|
|
self.setField('shadow_size_spin_box', self.theme.font_main_shadow_size)
|
|
|
|
self.setField('main_bold_check_box', self.theme.font_main_bold)
|
|
|
|
self.setField('main_italics_check_box', self.theme.font_main_italics)
|
|
|
|
|
|
|
|
def set_footer_area_page_values(self):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2010-12-28 11:18:56 +00:00
|
|
|
Handle the display and state of the Footer Area page.
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
self.footer_font_combo_box.setCurrentFont(QtGui.QFont(self.theme.font_footer_name))
|
2014-10-23 20:56:09 +00:00
|
|
|
self.footer_color_button.color = self.theme.font_footer_color
|
2013-12-26 17:36:00 +00:00
|
|
|
self.setField('footer_size_spin_box', self.theme.font_footer_size)
|
2010-10-11 16:14:36 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def set_position_page_values(self):
|
2010-10-16 13:54:57 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Handle the display and state of the _position page.
|
2010-10-16 13:54:57 +00:00
|
|
|
"""
|
2010-11-16 17:33:41 +00:00
|
|
|
# Main Area
|
2013-12-26 17:36:00 +00:00
|
|
|
self.main_position_check_box.setChecked(not self.theme.font_main_override)
|
|
|
|
self.setField('main_position_x', self.theme.font_main_x)
|
|
|
|
self.setField('main_position_y', self.theme.font_main_y)
|
|
|
|
self.setField('main_position_height', self.theme.font_main_height)
|
|
|
|
self.setField('main_position_width', self.theme.font_main_width)
|
2010-11-16 17:33:41 +00:00
|
|
|
# Footer
|
2013-12-26 17:36:00 +00:00
|
|
|
self.footer_position_check_box.setChecked(not self.theme.font_footer_override)
|
|
|
|
self.setField('footer_position_x', self.theme.font_footer_x)
|
|
|
|
self.setField('footer_position_y', self.theme.font_footer_y)
|
|
|
|
self.setField('footer_position_height', self.theme.font_footer_height)
|
|
|
|
self.setField('footer_position_width', self.theme.font_footer_width)
|
2010-10-09 10:59:49 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def set_alignment_page_values(self):
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
2010-12-28 11:18:56 +00:00
|
|
|
Handle the display and state of the Alignments page.
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('horizontal', self.theme.display_horizontal_align)
|
|
|
|
self.setField('vertical', self.theme.display_vertical_align)
|
2013-12-26 17:36:00 +00:00
|
|
|
self.setField('slide_transition', self.theme.display_slide_transition)
|
2010-10-17 18:58:42 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def set_preview_page_values(self):
|
2010-12-28 11:18:56 +00:00
|
|
|
"""
|
|
|
|
Handle the display and state of the Preview page.
|
|
|
|
"""
|
2013-08-31 18:17:38 +00:00
|
|
|
self.setField('name', self.theme.theme_name)
|
2010-10-13 19:40:01 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_background_combo_box_current_index_changed(self, index):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
|
|
|
Background style Combo box has changed.
|
|
|
|
"""
|
2011-01-05 16:06:56 +00:00
|
|
|
# do not allow updates when screen is building for the first time.
|
2013-12-24 15:55:01 +00:00
|
|
|
if self.update_theme_allowed:
|
2011-01-05 16:06:56 +00:00
|
|
|
self.theme.background_type = BackgroundType.to_string(index)
|
2012-12-29 15:25:29 +00:00
|
|
|
if self.theme.background_type != BackgroundType.to_string(BackgroundType.Image) and \
|
2013-08-31 18:17:38 +00:00
|
|
|
self.temp_background_filename == '':
|
2011-04-25 07:06:35 +00:00
|
|
|
self.temp_background_filename = self.theme.background_filename
|
2013-08-31 18:17:38 +00:00
|
|
|
self.theme.background_filename = ''
|
2012-12-29 15:25:29 +00:00
|
|
|
if self.theme.background_type == BackgroundType.to_string(BackgroundType.Image) and \
|
2013-08-31 18:17:38 +00:00
|
|
|
self.temp_background_filename != '':
|
2011-04-25 07:06:35 +00:00
|
|
|
self.theme.background_filename = self.temp_background_filename
|
2013-08-31 18:17:38 +00:00
|
|
|
self.temp_background_filename = ''
|
2013-12-26 17:36:00 +00:00
|
|
|
self.set_background_page_values()
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_gradient_combo_box_current_index_changed(self, index):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
|
|
|
Background gradient Combo box has changed.
|
|
|
|
"""
|
2013-12-24 15:55:01 +00:00
|
|
|
if self.update_theme_allowed:
|
2012-12-29 15:25:29 +00:00
|
|
|
self.theme.background_direction = BackgroundGradientType.to_string(index)
|
2013-12-26 17:36:00 +00:00
|
|
|
self.set_background_page_values()
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2014-11-02 19:57:06 +00:00
|
|
|
def on_color_changed(self, color):
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Background / Gradient 1 _color button pushed.
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.background_color = color
|
2010-11-19 22:26:15 +00:00
|
|
|
|
2014-11-02 19:57:06 +00:00
|
|
|
def on_image_color_changed(self, color):
|
2011-08-20 11:45:06 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Background / Gradient 1 _color button pushed.
|
2011-08-20 11:45:06 +00:00
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.background_border_color = color
|
2011-08-20 11:45:06 +00:00
|
|
|
|
2014-11-10 20:48:22 +00:00
|
|
|
def on_gradient_start_color_changed(self, color):
|
2010-11-19 22:26:15 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Gradient 2 _color button pushed.
|
2010-11-19 22:26:15 +00:00
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.background_start_color = color
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2014-11-10 20:48:22 +00:00
|
|
|
def on_gradient_end_color_changed(self, color):
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
Gradient 2 _color button pushed.
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.background_end_color = color
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_image_browse_button_clicked(self):
|
2010-11-08 06:11:04 +00:00
|
|
|
"""
|
|
|
|
Background Image button pushed.
|
|
|
|
"""
|
2010-10-03 07:42:02 +00:00
|
|
|
images_filter = get_images_filter()
|
2014-04-20 12:06:02 +00:00
|
|
|
images_filter = '%s;;%s (*.*)' % (images_filter, UiStrings().AllFiles)
|
2015-11-07 00:49:40 +00:00
|
|
|
filename, filter_used = QtWidgets.QFileDialog.getOpenFileName(
|
|
|
|
self, translate('OpenLP.ThemeWizard', 'Select Image'),
|
|
|
|
self.image_file_edit.text(), images_filter)
|
2010-10-03 07:42:02 +00:00
|
|
|
if filename:
|
2015-01-08 22:05:32 +00:00
|
|
|
self.theme.background_filename = filename
|
2013-12-26 17:36:00 +00:00
|
|
|
self.set_background_page_values()
|
2010-10-03 07:42:02 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def on_image_file_edit_editing_finished(self):
|
2013-07-25 20:11:57 +00:00
|
|
|
"""
|
|
|
|
Background image path edited
|
|
|
|
"""
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme.background_filename = str(self.image_file_edit.text())
|
2013-07-25 20:11:57 +00:00
|
|
|
|
2014-11-02 19:57:06 +00:00
|
|
|
def on_main_color_changed(self, color):
|
2013-02-01 21:34:23 +00:00
|
|
|
"""
|
|
|
|
Set the main colour value
|
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.font_main_color = color
|
2010-10-09 10:59:49 +00:00
|
|
|
|
2014-11-02 19:57:06 +00:00
|
|
|
def on_outline_color_changed(self, color):
|
2013-02-01 21:34:23 +00:00
|
|
|
"""
|
|
|
|
Set the outline colour value
|
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.font_main_outline_color = color
|
2010-10-09 10:59:49 +00:00
|
|
|
|
2014-11-02 19:57:06 +00:00
|
|
|
def on_shadow_color_changed(self, color):
|
2013-02-01 21:34:23 +00:00
|
|
|
"""
|
|
|
|
Set the shadow colour value
|
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.font_main_shadow_color = color
|
2010-10-11 16:14:36 +00:00
|
|
|
|
2014-11-02 19:57:06 +00:00
|
|
|
def on_footer_color_changed(self, color):
|
2013-02-01 21:34:23 +00:00
|
|
|
"""
|
|
|
|
Set the footer colour value
|
|
|
|
"""
|
2014-10-23 20:56:09 +00:00
|
|
|
self.theme.font_footer_color = color
|
2010-10-09 10:59:49 +00:00
|
|
|
|
2013-12-26 17:36:00 +00:00
|
|
|
def update_theme(self):
|
2010-10-16 07:21:24 +00:00
|
|
|
"""
|
|
|
|
Update the theme object from the UI for fields not already updated
|
|
|
|
when the are changed.
|
|
|
|
"""
|
2013-12-24 15:55:01 +00:00
|
|
|
if not self.update_theme_allowed:
|
2010-12-03 20:22:59 +00:00
|
|
|
return
|
2013-12-26 17:36:00 +00:00
|
|
|
log.debug('update_theme')
|
2010-10-13 19:40:01 +00:00
|
|
|
# main page
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme.font_main_name = self.main_font_combo_box.currentFont().family()
|
|
|
|
self.theme.font_main_size = self.field('main_size_spin_box')
|
|
|
|
self.theme.font_main_line_adjustment = self.field('line_spacing_spin_box')
|
|
|
|
self.theme.font_main_outline_size = self.field('outline_size_spin_box')
|
|
|
|
self.theme.font_main_shadow_size = self.field('shadow_size_spin_box')
|
|
|
|
self.theme.font_main_bold = self.field('main_bold_check_box')
|
|
|
|
self.theme.font_main_italics = self.field('main_italics_check_box')
|
2010-10-13 19:40:01 +00:00
|
|
|
# footer page
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme.font_footer_name = self.footer_font_combo_box.currentFont().family()
|
|
|
|
self.theme.font_footer_size = self.field('footer_size_spin_box')
|
2010-10-16 07:21:24 +00:00
|
|
|
# position page
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme.font_main_x = self.field('main_position_x')
|
|
|
|
self.theme.font_main_y = self.field('main_position_y')
|
|
|
|
self.theme.font_main_height = self.field('main_position_height')
|
|
|
|
self.theme.font_main_width = self.field('main_position_width')
|
|
|
|
self.theme.font_footer_x = self.field('footer_position_x')
|
|
|
|
self.theme.font_footer_y = self.field('footer_position_y')
|
|
|
|
self.theme.font_footer_height = self.field('footer_position_height')
|
|
|
|
self.theme.font_footer_width = self.field('footer_position_width')
|
2010-10-17 19:34:10 +00:00
|
|
|
# position page
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme.display_horizontal_align = self.horizontal_combo_box.currentIndex()
|
|
|
|
self.theme.display_vertical_align = self.vertical_combo_box.currentIndex()
|
|
|
|
self.theme.display_slide_transition = self.field('slide_transition')
|
2010-10-09 11:20:47 +00:00
|
|
|
|
2010-11-05 19:20:41 +00:00
|
|
|
def accept(self):
|
|
|
|
"""
|
2012-04-02 00:19:16 +00:00
|
|
|
Lets save the theme as Finish has been triggered
|
2010-11-05 19:20:41 +00:00
|
|
|
"""
|
2010-11-08 06:11:04 +00:00
|
|
|
# Save the theme name
|
2013-08-31 18:17:38 +00:00
|
|
|
self.theme.theme_name = self.field('name')
|
2010-11-18 17:40:20 +00:00
|
|
|
if not self.theme.theme_name:
|
2011-02-02 23:12:31 +00:00
|
|
|
critical_error_message_box(
|
2012-09-17 21:30:10 +00:00
|
|
|
translate('OpenLP.ThemeWizard', 'Theme Name Missing'),
|
2012-12-29 15:25:29 +00:00
|
|
|
translate('OpenLP.ThemeWizard', 'There is no name for this theme. Please enter one.'))
|
2010-11-05 19:20:41 +00:00
|
|
|
return
|
2013-08-31 18:17:38 +00:00
|
|
|
if self.theme.theme_name == '-1' or self.theme.theme_name == 'None':
|
2011-02-02 23:12:31 +00:00
|
|
|
critical_error_message_box(
|
2012-09-17 21:30:10 +00:00
|
|
|
translate('OpenLP.ThemeWizard', 'Theme Name Invalid'),
|
2012-12-29 15:25:29 +00:00
|
|
|
translate('OpenLP.ThemeWizard', 'Invalid theme name. Please enter one.'))
|
2010-11-21 20:45:22 +00:00
|
|
|
return
|
2013-12-26 17:36:00 +00:00
|
|
|
save_from = None
|
|
|
|
save_to = None
|
2012-12-29 15:25:29 +00:00
|
|
|
if self.theme.background_type == BackgroundType.to_string(BackgroundType.Image):
|
2013-08-31 18:17:38 +00:00
|
|
|
filename = os.path.split(str(self.theme.background_filename))[1]
|
2013-12-26 17:36:00 +00:00
|
|
|
save_to = os.path.join(self.path, self.theme.theme_name, filename)
|
|
|
|
save_from = self.theme.background_filename
|
2013-02-01 21:48:06 +00:00
|
|
|
if not self.edit_mode and not self.theme_manager.check_if_theme_exists(self.theme.theme_name):
|
2011-01-09 19:15:40 +00:00
|
|
|
return
|
2013-12-26 17:36:00 +00:00
|
|
|
self.theme_manager.save_theme(self.theme, save_from, save_to)
|
2015-11-07 00:49:40 +00:00
|
|
|
return QtWidgets.QDialog.accept(self)
|