Implement a custom widget for editing paths

This commit is contained in:
Philip Ridout 2017-05-12 22:05:50 +01:00
parent 9eeeb243ea
commit 353b2b3067
15 changed files with 113 additions and 289 deletions

View File

@ -398,7 +398,7 @@ def check_binary_exists(program_path):
""" """
Function that checks whether a binary exists. Function that checks whether a binary exists.
:param program_path:The full path to the binary to check. :param program_path: The full path to the binary to check.
:return: program output to be parsed :return: program output to be parsed
""" """
log.debug('testing program_path: {text}'.format(text=program_path)) log.debug('testing program_path: {text}'.format(text=program_path))

View File

@ -164,7 +164,7 @@ class ThemeXML(object):
jsn = get_text_file_string(json_file) jsn = get_text_file_string(json_file)
jsn = json.loads(jsn) jsn = json.loads(jsn)
self.expand_json(jsn) self.expand_json(jsn)
self.background_filename = None self.background_filename = ''
def expand_json(self, var, prev=None): def expand_json(self, var, prev=None):
""" """

View File

@ -25,13 +25,13 @@ The :mod:`advancedtab` provides an advanced settings facility.
from datetime import datetime, timedelta from datetime import datetime, timedelta
import logging import logging
import os import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import AppLocation, Settings, SlideLimits, UiStrings, translate from openlp.core.common import AppLocation, Settings, SlideLimits, UiStrings, translate
from openlp.core.lib import SettingsTab, build_icon
from openlp.core.common.languagemanager import format_time from openlp.core.common.languagemanager import format_time
from openlp.core.lib import SettingsTab, build_icon
from openlp.core.ui.lib import PathEdit, PathType
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -153,32 +153,18 @@ class AdvancedTab(SettingsTab):
self.data_directory_group_box.setObjectName('data_directory_group_box') self.data_directory_group_box.setObjectName('data_directory_group_box')
self.data_directory_layout = QtWidgets.QFormLayout(self.data_directory_group_box) self.data_directory_layout = QtWidgets.QFormLayout(self.data_directory_group_box)
self.data_directory_layout.setObjectName('data_directory_layout') self.data_directory_layout.setObjectName('data_directory_layout')
self.data_directory_current_label = QtWidgets.QLabel(self.data_directory_group_box)
self.data_directory_current_label.setObjectName('data_directory_current_label')
self.data_directory_label = QtWidgets.QLabel(self.data_directory_group_box)
self.data_directory_label.setObjectName('data_directory_label')
self.data_directory_new_label = QtWidgets.QLabel(self.data_directory_group_box) self.data_directory_new_label = QtWidgets.QLabel(self.data_directory_group_box)
self.data_directory_new_label.setObjectName('data_directory_current_label') self.data_directory_new_label.setObjectName('data_directory_current_label')
self.new_data_directory_edit = QtWidgets.QLineEdit(self.data_directory_group_box) self.data_directory_path_edit = PathEdit(self.data_directory_group_box)
self.new_data_directory_edit.setObjectName('new_data_directory_edit') self.data_directory_path_edit.path_type = PathType.Directories
self.new_data_directory_edit.setReadOnly(True) self.data_directory_path_edit.default_path = AppLocation.get_directory(AppLocation.DataDir)
self.data_directory_layout.addRow(self.data_directory_new_label, self.data_directory_path_edit)
self.new_data_directory_has_files_label = QtWidgets.QLabel(self.data_directory_group_box) self.new_data_directory_has_files_label = QtWidgets.QLabel(self.data_directory_group_box)
self.new_data_directory_has_files_label.setObjectName('new_data_directory_has_files_label') self.new_data_directory_has_files_label.setObjectName('new_data_directory_has_files_label')
self.new_data_directory_has_files_label.setWordWrap(True) self.new_data_directory_has_files_label.setWordWrap(True)
self.data_directory_browse_button = QtWidgets.QToolButton(self.data_directory_group_box)
self.data_directory_browse_button.setObjectName('data_directory_browse_button')
self.data_directory_browse_button.setIcon(build_icon(':/general/general_open.png'))
self.data_directory_default_button = QtWidgets.QToolButton(self.data_directory_group_box)
self.data_directory_default_button.setObjectName('data_directory_default_button')
self.data_directory_default_button.setIcon(build_icon(':/general/general_revert.png'))
self.data_directory_cancel_button = QtWidgets.QToolButton(self.data_directory_group_box) self.data_directory_cancel_button = QtWidgets.QToolButton(self.data_directory_group_box)
self.data_directory_cancel_button.setObjectName('data_directory_cancel_button') self.data_directory_cancel_button.setObjectName('data_directory_cancel_button')
self.data_directory_cancel_button.setIcon(build_icon(':/general/general_delete.png')) self.data_directory_cancel_button.setIcon(build_icon(':/general/general_delete.png'))
self.new_data_directory_label_layout = QtWidgets.QHBoxLayout()
self.new_data_directory_label_layout.setObjectName('new_data_directory_label_layout')
self.new_data_directory_label_layout.addWidget(self.new_data_directory_edit)
self.new_data_directory_label_layout.addWidget(self.data_directory_browse_button)
self.new_data_directory_label_layout.addWidget(self.data_directory_default_button)
self.data_directory_copy_check_layout = QtWidgets.QHBoxLayout() self.data_directory_copy_check_layout = QtWidgets.QHBoxLayout()
self.data_directory_copy_check_layout.setObjectName('data_directory_copy_check_layout') self.data_directory_copy_check_layout.setObjectName('data_directory_copy_check_layout')
self.data_directory_copy_check_box = QtWidgets.QCheckBox(self.data_directory_group_box) self.data_directory_copy_check_box = QtWidgets.QCheckBox(self.data_directory_group_box)
@ -186,8 +172,6 @@ class AdvancedTab(SettingsTab):
self.data_directory_copy_check_layout.addWidget(self.data_directory_copy_check_box) self.data_directory_copy_check_layout.addWidget(self.data_directory_copy_check_box)
self.data_directory_copy_check_layout.addStretch() self.data_directory_copy_check_layout.addStretch()
self.data_directory_copy_check_layout.addWidget(self.data_directory_cancel_button) self.data_directory_copy_check_layout.addWidget(self.data_directory_cancel_button)
self.data_directory_layout.addRow(self.data_directory_current_label, self.data_directory_label)
self.data_directory_layout.addRow(self.data_directory_new_label, self.new_data_directory_label_layout)
self.data_directory_layout.addRow(self.data_directory_copy_check_layout) self.data_directory_layout.addRow(self.data_directory_copy_check_layout)
self.data_directory_layout.addRow(self.new_data_directory_has_files_label) self.data_directory_layout.addRow(self.new_data_directory_has_files_label)
self.left_layout.addWidget(self.data_directory_group_box) self.left_layout.addWidget(self.data_directory_group_box)
@ -239,8 +223,10 @@ class AdvancedTab(SettingsTab):
self.service_name_edit.textChanged.connect(self.update_service_name_example) self.service_name_edit.textChanged.connect(self.update_service_name_example)
self.service_name_revert_button.clicked.connect(self.on_service_name_revert_button_clicked) self.service_name_revert_button.clicked.connect(self.on_service_name_revert_button_clicked)
self.alternate_rows_check_box.toggled.connect(self.on_alternate_rows_check_box_toggled) self.alternate_rows_check_box.toggled.connect(self.on_alternate_rows_check_box_toggled)
self.data_directory_browse_button.clicked.connect(self.on_data_directory_browse_button_clicked)
self.data_directory_default_button.clicked.connect(self.on_data_directory_default_button_clicked)
self.data_directory_path_edit.pathChanged.connect(self.on_data_directory_path_edit_path_changed)
self.data_directory_cancel_button.clicked.connect(self.on_data_directory_cancel_button_clicked) self.data_directory_cancel_button.clicked.connect(self.on_data_directory_cancel_button_clicked)
self.data_directory_copy_check_box.toggled.connect(self.on_data_directory_copy_check_box_toggled) self.data_directory_copy_check_box.toggled.connect(self.on_data_directory_copy_check_box_toggled)
self.end_slide_radio_button.clicked.connect(self.on_end_slide_button_clicked) self.end_slide_radio_button.clicked.connect(self.on_end_slide_button_clicked)
@ -317,12 +303,7 @@ class AdvancedTab(SettingsTab):
self.service_name_example_label.setText(translate('OpenLP.AdvancedTab', 'Example:')) self.service_name_example_label.setText(translate('OpenLP.AdvancedTab', 'Example:'))
self.hide_mouse_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Mouse Cursor')) self.hide_mouse_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Mouse Cursor'))
self.hide_mouse_check_box.setText(translate('OpenLP.AdvancedTab', 'Hide mouse cursor when over display window')) self.hide_mouse_check_box.setText(translate('OpenLP.AdvancedTab', 'Hide mouse cursor when over display window'))
self.data_directory_current_label.setText(translate('OpenLP.AdvancedTab', 'Current path:')) self.data_directory_new_label.setText(translate('OpenLP.AdvancedTab', 'Path:'))
self.data_directory_new_label.setText(translate('OpenLP.AdvancedTab', 'Custom path:'))
self.data_directory_browse_button.setToolTip(translate('OpenLP.AdvancedTab',
'Browse for new data file location.'))
self.data_directory_default_button.setToolTip(
translate('OpenLP.AdvancedTab', 'Set the data location to the default.'))
self.data_directory_cancel_button.setText(translate('OpenLP.AdvancedTab', 'Cancel')) self.data_directory_cancel_button.setText(translate('OpenLP.AdvancedTab', 'Cancel'))
self.data_directory_cancel_button.setToolTip( self.data_directory_cancel_button.setToolTip(
translate('OpenLP.AdvancedTab', 'Cancel OpenLP data directory location change.')) translate('OpenLP.AdvancedTab', 'Cancel OpenLP data directory location change.'))
@ -396,8 +377,7 @@ class AdvancedTab(SettingsTab):
self.new_data_directory_has_files_label.hide() self.new_data_directory_has_files_label.hide()
self.data_directory_cancel_button.hide() self.data_directory_cancel_button.hide()
# Since data location can be changed, make sure the path is present. # Since data location can be changed, make sure the path is present.
self.current_data_path = AppLocation.get_data_path() self.data_directory_path_edit.path = AppLocation.get_data_path()
self.data_directory_label.setText(os.path.abspath(self.current_data_path))
# Don't allow data directory move if running portable. # Don't allow data directory move if running portable.
if settings.value('advanced/is portable'): if settings.value('advanced/is portable'):
self.data_directory_group_box.hide() self.data_directory_group_box.hide()
@ -509,24 +489,10 @@ class AdvancedTab(SettingsTab):
self.service_name_edit.setText(UiStrings().DefaultServiceName) self.service_name_edit.setText(UiStrings().DefaultServiceName)
self.service_name_edit.setFocus() self.service_name_edit.setFocus()
def on_data_directory_browse_button_clicked(self): def on_data_directory_path_edit_path_changed(self, new_data_path):
""" """
Browse for a new data directory location. Browse for a new data directory location.
""" """
old_root_path = str(self.data_directory_label.text())
# Get the new directory location.
new_data_path = QtWidgets.QFileDialog.getExistingDirectory(self, translate('OpenLP.AdvancedTab',
'Select Data Directory Location'),
old_root_path,
options=QtWidgets.QFileDialog.ShowDirsOnly)
# Set the new data path.
if new_data_path:
new_data_path = os.path.normpath(new_data_path)
if self.current_data_path.lower() == new_data_path.lower():
self.on_data_directory_cancel_button_clicked()
return
else:
return
# Make sure they want to change the data. # Make sure they want to change the data.
answer = QtWidgets.QMessageBox.question(self, translate('OpenLP.AdvancedTab', 'Confirm Data Directory Change'), answer = QtWidgets.QMessageBox.question(self, translate('OpenLP.AdvancedTab', 'Confirm Data Directory Change'),
translate('OpenLP.AdvancedTab', 'Are you sure you want to change the ' translate('OpenLP.AdvancedTab', 'Are you sure you want to change the '
@ -537,42 +503,14 @@ class AdvancedTab(SettingsTab):
QtWidgets.QMessageBox.No), QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.No) QtWidgets.QMessageBox.No)
if answer != QtWidgets.QMessageBox.Yes: if answer != QtWidgets.QMessageBox.Yes:
self.data_directory_path_edit.path = AppLocation.get_data_path()
return return
# Check if data already exists here. # Check if data already exists here.
self.check_data_overwrite(new_data_path) self.check_data_overwrite(new_data_path)
# Save the new location. # Save the new location.
self.main_window.set_new_data_path(new_data_path) self.main_window.set_new_data_path(new_data_path)
self.new_data_directory_edit.setText(new_data_path)
self.data_directory_cancel_button.show() self.data_directory_cancel_button.show()
def on_data_directory_default_button_clicked(self):
"""
Re-set the data directory location to the 'default' location.
"""
new_data_path = AppLocation.get_directory(AppLocation.DataDir)
if self.current_data_path.lower() != new_data_path.lower():
# Make sure they want to change the data location back to the
# default.
answer = QtWidgets.QMessageBox.question(self, translate('OpenLP.AdvancedTab', 'Reset Data Directory'),
translate('OpenLP.AdvancedTab', 'Are you sure you want to change '
'the location of the OpenLP data '
'directory to the default location?'
'\n\nThis location will be used '
'after OpenLP is closed.'),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.No)
if answer != QtWidgets.QMessageBox.Yes:
return
self.check_data_overwrite(new_data_path)
# Save the new location.
self.main_window.set_new_data_path(new_data_path)
self.new_data_directory_edit.setText(os.path.abspath(new_data_path))
self.data_directory_cancel_button.show()
else:
# We cancel the change in case user changed their mind.
self.on_data_directory_cancel_button_clicked()
def on_data_directory_copy_check_box_toggled(self): def on_data_directory_copy_check_box_toggled(self):
""" """
Copy existing data when you change your data directory. Copy existing data when you change your data directory.
@ -589,7 +527,6 @@ class AdvancedTab(SettingsTab):
Check if there's already data in the target directory. Check if there's already data in the target directory.
""" """
test_path = os.path.join(data_path, 'songs') test_path = os.path.join(data_path, 'songs')
self.data_directory_copy_check_box.show()
if os.path.exists(test_path): if os.path.exists(test_path):
self.data_exists = True self.data_exists = True
# Check is they want to replace existing data. # Check is they want to replace existing data.
@ -603,6 +540,7 @@ class AdvancedTab(SettingsTab):
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No), QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.No) QtWidgets.QMessageBox.No)
self.data_directory_copy_check_box.show()
if answer == QtWidgets.QMessageBox.Yes: if answer == QtWidgets.QMessageBox.Yes:
self.data_directory_copy_check_box.setChecked(True) self.data_directory_copy_check_box.setChecked(True)
self.new_data_directory_has_files_label.show() self.new_data_directory_has_files_label.show()
@ -618,7 +556,7 @@ class AdvancedTab(SettingsTab):
""" """
Cancel the data directory location change Cancel the data directory location change
""" """
self.new_data_directory_edit.clear() self.data_directory_path_edit.path = AppLocation.get_data_path()
self.data_directory_copy_check_box.setChecked(False) self.data_directory_copy_check_box.setChecked(False)
self.main_window.set_new_data_path(None) self.main_window.set_new_data_path(None)
self.main_window.set_copy_data(False) self.main_window.set_copy_data(False)

View File

@ -27,8 +27,8 @@ import logging
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from openlp.core.common import Registry, Settings, UiStrings, translate, get_images_filter from openlp.core.common import Registry, Settings, UiStrings, translate, get_images_filter
from openlp.core.lib import SettingsTab, ScreenList, build_icon from openlp.core.lib import SettingsTab, ScreenList
from openlp.core.ui.lib.colorbutton import ColorButton from openlp.core.ui.lib import ColorButton, PathEdit
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -172,20 +172,10 @@ class GeneralTab(SettingsTab):
self.logo_layout.setObjectName('logo_layout') self.logo_layout.setObjectName('logo_layout')
self.logo_file_label = QtWidgets.QLabel(self.logo_group_box) self.logo_file_label = QtWidgets.QLabel(self.logo_group_box)
self.logo_file_label.setObjectName('logo_file_label') self.logo_file_label.setObjectName('logo_file_label')
self.logo_file_edit = QtWidgets.QLineEdit(self.logo_group_box) self.logo_file_path_edit = \
self.logo_file_edit.setObjectName('logo_file_edit') PathEdit(self.logo_group_box)
self.logo_browse_button = QtWidgets.QToolButton(self.logo_group_box) self.logo_file_path_edit.default_path = ':/graphics/openlp-splash-screen.png'
self.logo_browse_button.setObjectName('logo_browse_button') self.logo_layout.addRow(self.logo_file_label, self.logo_file_path_edit)
self.logo_browse_button.setIcon(build_icon(':/general/general_open.png'))
self.logo_revert_button = QtWidgets.QToolButton(self.logo_group_box)
self.logo_revert_button.setObjectName('logo_revert_button')
self.logo_revert_button.setIcon(build_icon(':/general/general_revert.png'))
self.logo_file_layout = QtWidgets.QHBoxLayout()
self.logo_file_layout.setObjectName('logo_file_layout')
self.logo_file_layout.addWidget(self.logo_file_edit)
self.logo_file_layout.addWidget(self.logo_browse_button)
self.logo_file_layout.addWidget(self.logo_revert_button)
self.logo_layout.addRow(self.logo_file_label, self.logo_file_layout)
self.logo_color_label = QtWidgets.QLabel(self.logo_group_box) self.logo_color_label = QtWidgets.QLabel(self.logo_group_box)
self.logo_color_label.setObjectName('logo_color_label') self.logo_color_label.setObjectName('logo_color_label')
self.logo_color_button = ColorButton(self.logo_group_box) self.logo_color_button = ColorButton(self.logo_group_box)
@ -196,8 +186,6 @@ class GeneralTab(SettingsTab):
self.logo_layout.addRow(self.logo_hide_on_startup_check_box) self.logo_layout.addRow(self.logo_hide_on_startup_check_box)
self.right_layout.addWidget(self.logo_group_box) self.right_layout.addWidget(self.logo_group_box)
self.logo_color_button.colorChanged.connect(self.on_logo_background_color_changed) self.logo_color_button.colorChanged.connect(self.on_logo_background_color_changed)
self.logo_browse_button.clicked.connect(self.on_logo_browse_button_clicked)
self.logo_revert_button.clicked.connect(self.on_logo_revert_button_clicked)
# Application Settings # Application Settings
self.settings_group_box = QtWidgets.QGroupBox(self.right_column) self.settings_group_box = QtWidgets.QGroupBox(self.right_column)
self.settings_group_box.setObjectName('settings_group_box') self.settings_group_box.setObjectName('settings_group_box')
@ -254,8 +242,6 @@ class GeneralTab(SettingsTab):
self.logo_group_box.setTitle(translate('OpenLP.GeneralTab', 'Logo')) self.logo_group_box.setTitle(translate('OpenLP.GeneralTab', 'Logo'))
self.logo_color_label.setText(UiStrings().BackgroundColorColon) self.logo_color_label.setText(UiStrings().BackgroundColorColon)
self.logo_file_label.setText(translate('OpenLP.GeneralTab', 'Logo file:')) self.logo_file_label.setText(translate('OpenLP.GeneralTab', 'Logo file:'))
self.logo_browse_button.setToolTip(translate('OpenLP.GeneralTab', 'Browse for an image file to display.'))
self.logo_revert_button.setToolTip(translate('OpenLP.GeneralTab', 'Revert to the default OpenLP logo.'))
self.logo_hide_on_startup_check_box.setText(translate('OpenLP.GeneralTab', 'Don\'t show logo on startup')) self.logo_hide_on_startup_check_box.setText(translate('OpenLP.GeneralTab', 'Don\'t show logo on startup'))
self.check_for_updates_check_box.setText(translate('OpenLP.GeneralTab', 'Check for updates to OpenLP')) self.check_for_updates_check_box.setText(translate('OpenLP.GeneralTab', 'Check for updates to OpenLP'))
self.settings_group_box.setTitle(translate('OpenLP.GeneralTab', 'Application Settings')) self.settings_group_box.setTitle(translate('OpenLP.GeneralTab', 'Application Settings'))
@ -282,6 +268,9 @@ class GeneralTab(SettingsTab):
self.audio_group_box.setTitle(translate('OpenLP.GeneralTab', 'Background Audio')) self.audio_group_box.setTitle(translate('OpenLP.GeneralTab', 'Background Audio'))
self.start_paused_check_box.setText(translate('OpenLP.GeneralTab', 'Start background audio paused')) self.start_paused_check_box.setText(translate('OpenLP.GeneralTab', 'Start background audio paused'))
self.repeat_list_check_box.setText(translate('OpenLP.GeneralTab', 'Repeat track list')) self.repeat_list_check_box.setText(translate('OpenLP.GeneralTab', 'Repeat track list'))
self.logo_file_path_edit.dialog_caption = dialog_caption = translate('OpenLP.AdvancedTab', 'Select Logo File')
self.logo_file_path_edit.filters = '{text};;{names} (*.*)'.format(
text=get_images_filter(), names=UiStrings().AllFiles)
def load(self): def load(self):
""" """
@ -304,7 +293,7 @@ class GeneralTab(SettingsTab):
self.auto_open_check_box.setChecked(settings.value('auto open')) self.auto_open_check_box.setChecked(settings.value('auto open'))
self.show_splash_check_box.setChecked(settings.value('show splash')) self.show_splash_check_box.setChecked(settings.value('show splash'))
self.logo_background_color = settings.value('logo background color') self.logo_background_color = settings.value('logo background color')
self.logo_file_edit.setText(settings.value('logo file')) self.logo_file_path_edit.path = settings.value('logo file')
self.logo_hide_on_startup_check_box.setChecked(settings.value('logo hide on startup')) self.logo_hide_on_startup_check_box.setChecked(settings.value('logo hide on startup'))
self.logo_color_button.color = self.logo_background_color self.logo_color_button.color = self.logo_background_color
self.check_for_updates_check_box.setChecked(settings.value('update check')) self.check_for_updates_check_box.setChecked(settings.value('update check'))
@ -338,7 +327,7 @@ class GeneralTab(SettingsTab):
settings.setValue('auto open', self.auto_open_check_box.isChecked()) settings.setValue('auto open', self.auto_open_check_box.isChecked())
settings.setValue('show splash', self.show_splash_check_box.isChecked()) settings.setValue('show splash', self.show_splash_check_box.isChecked())
settings.setValue('logo background color', self.logo_background_color) settings.setValue('logo background color', self.logo_background_color)
settings.setValue('logo file', self.logo_file_edit.text()) settings.setValue('logo file', self.logo_file_path_edit.path)
settings.setValue('logo hide on startup', self.logo_hide_on_startup_check_box.isChecked()) settings.setValue('logo hide on startup', self.logo_hide_on_startup_check_box.isChecked())
settings.setValue('update check', self.check_for_updates_check_box.isChecked()) settings.setValue('update check', self.check_for_updates_check_box.isChecked())
settings.setValue('save prompt', self.save_check_service_check_box.isChecked()) settings.setValue('save prompt', self.save_check_service_check_box.isChecked())
@ -404,25 +393,6 @@ class GeneralTab(SettingsTab):
""" """
self.display_changed = True self.display_changed = True
def on_logo_browse_button_clicked(self):
"""
Select the logo file
"""
file_filters = '{text};;{names} (*.*)'.format(text=get_images_filter(), names=UiStrings().AllFiles)
filename, filter_used = QtWidgets.QFileDialog.getOpenFileName(self,
translate('OpenLP.AdvancedTab', 'Open File'), '',
file_filters)
if filename:
self.logo_file_edit.setText(filename)
self.logo_file_edit.setFocus()
def on_logo_revert_button_clicked(self):
"""
Revert the logo file back to the default setting.
"""
self.logo_file_edit.setText(':/graphics/openlp-splash-screen.png')
self.logo_file_edit.setFocus()
def on_logo_background_color_changed(self, color): def on_logo_background_color_changed(self, color):
""" """
Select the background color for logo. Select the background color for logo.

View File

@ -21,6 +21,7 @@
############################################################################### ###############################################################################
from .colorbutton import ColorButton from .colorbutton import ColorButton
from .pathedit import PathEdit, PathType
from .listwidgetwithdnd import ListWidgetWithDnD from .listwidgetwithdnd import ListWidgetWithDnD
from .treewidgetwithdnd import TreeWidgetWithDnD from .treewidgetwithdnd import TreeWidgetWithDnD
from .toolbar import OpenLPToolbar from .toolbar import OpenLPToolbar
@ -30,5 +31,6 @@ from .mediadockmanager import MediaDockManager
from .listpreviewwidget import ListPreviewWidget from .listpreviewwidget import ListPreviewWidget
from .spelltextedit import SpellTextEdit from .spelltextedit import SpellTextEdit
__all__ = ['ColorButton', 'ListPreviewWidget', 'ListWidgetWithDnD', 'OpenLPToolbar', 'OpenLPDockWidget', __all__ = ['ColorButton', 'PathEdit', 'PathType', 'ListPreviewWidget', 'ListWidgetWithDnD', 'OpenLPToolbar',
'OpenLPWizard', 'WizardStrings', 'MediaDockManager', 'ListPreviewWidget', 'SpellTextEdit'] 'OpenLPDockWidget', 'OpenLPWizard', 'WizardStrings', 'MediaDockManager', 'ListPreviewWidget',
'SpellTextEdit']

View File

@ -39,7 +39,7 @@ class ColorButton(QtWidgets.QPushButton):
""" """
Initialise the ColorButton Initialise the ColorButton
""" """
super(ColorButton, self).__init__() super().__init__(parent)
self.parent = parent self.parent = parent
self.change_color('#ffffff') self.change_color('#ffffff')
self.setToolTip(translate('OpenLP.ColorButton', 'Click to select a color.')) self.setToolTip(translate('OpenLP.ColorButton', 'Click to select a color.'))

View File

@ -69,10 +69,23 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.video_color_button.colorChanged.connect(self.on_video_color_changed) self.video_color_button.colorChanged.connect(self.on_video_color_changed)
self.gradient_start_button.colorChanged.connect(self.on_gradient_start_color_changed) self.gradient_start_button.colorChanged.connect(self.on_gradient_start_color_changed)
self.gradient_end_button.colorChanged.connect(self.on_gradient_end_color_changed) self.gradient_end_button.colorChanged.connect(self.on_gradient_end_color_changed)
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)
self.video_browse_button.clicked.connect(self.on_video_browse_button_clicked) self.image_path_edit.filters = \
self.video_file_edit.editingFinished.connect(self.on_video_file_edit_editing_finished) '{name};;{text} (*.*)'.format(name=get_images_filter(), text=UiStrings().AllFiles)
self.image_path_edit.pathChanged.connect(self.on_image_path_edit_path_changed)
# TODO: Should work
visible_formats = '({name})'.format(name='; '.join(VIDEO_EXT))
actual_formats = '({name})'.format(name=' '.join(VIDEO_EXT))
video_filter = '{trans} {visible} {actual}'.format(trans=translate('OpenLP', 'Video Files'),
visible=visible_formats, actual=actual_formats)
self.video_path_edit.filters = '{video};;{ui} (*.*)'.format(video=video_filter, ui=UiStrings().AllFiles)
self.video_path_edit.pathChanged.connect(self.on_video_path_edit_path_changed)
self.main_color_button.colorChanged.connect(self.on_main_color_changed) self.main_color_button.colorChanged.connect(self.on_main_color_changed)
self.outline_color_button.colorChanged.connect(self.on_outline_color_changed) self.outline_color_button.colorChanged.connect(self.on_outline_color_changed)
self.shadow_color_button.colorChanged.connect(self.on_shadow_color_changed) self.shadow_color_button.colorChanged.connect(self.on_shadow_color_changed)
@ -112,7 +125,8 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.background_page.registerField('color', self.color_button) self.background_page.registerField('color', self.color_button)
self.background_page.registerField('gradient_start', self.gradient_start_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('gradient_end', self.gradient_end_button)
self.background_page.registerField('background_image', self.image_file_edit) self.background_page.registerField('background_image', self.image_path_edit,
'path', self.image_path_edit.pathChanged)
self.background_page.registerField('gradient', self.gradient_combo_box) 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_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('main_size_spin_box', self.main_size_spin_box)
@ -309,11 +323,11 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
self.setField('background_type', 1) self.setField('background_type', 1)
elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Image): elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Image):
self.image_color_button.color = self.theme.background_border_color self.image_color_button.color = self.theme.background_border_color
self.image_file_edit.setText(self.theme.background_filename) self.image_path_edit.path = self.theme.background_filename
self.setField('background_type', 2) self.setField('background_type', 2)
elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Video): elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Video):
self.video_color_button.color = self.theme.background_border_color self.video_color_button.color = self.theme.background_border_color
self.video_file_edit.setText(self.theme.background_filename) self.video_path_edit.path = self.theme.background_filename
self.setField('background_type', 4) self.setField('background_type', 4)
elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Transparent): elif self.theme.background_type == BackgroundType.to_string(BackgroundType.Transparent):
self.setField('background_type', 3) self.setField('background_type', 3)
@ -441,48 +455,20 @@ class ThemeForm(QtWidgets.QWizard, Ui_ThemeWizard, RegistryProperties):
""" """
self.theme.background_end_color = color self.theme.background_end_color = color
def on_image_browse_button_clicked(self): def on_image_path_edit_path_changed(self, filename):
""" """
Background Image button pushed. Background Image button pushed.
""" """
images_filter = get_images_filter() self.theme.background_filename = filename
images_filter = '{name};;{text} (*.*)'.format(name=images_filter, text=UiStrings().AllFiles)
filename, filter_used = QtWidgets.QFileDialog.getOpenFileName(
self, translate('OpenLP.ThemeWizard', 'Select Image'),
self.image_file_edit.text(), images_filter)
if filename:
self.theme.background_filename = filename
self.set_background_page_values() self.set_background_page_values()
def on_image_file_edit_editing_finished(self): def on_video_path_edit_path_changed(self, filename):
"""
Background image path edited
"""
self.theme.background_filename = str(self.image_file_edit.text())
def on_video_browse_button_clicked(self):
""" """
Background video button pushed. Background video button pushed.
""" """
# TODO: Should work self.theme.background_filename = filename
visible_formats = '({name})'.format(name='; '.join(VIDEO_EXT))
actual_formats = '({name})'.format(name=' '.join(VIDEO_EXT))
video_filter = '{trans} {visible} {actual}'.format(trans=translate('OpenLP', 'Video Files'),
visible=visible_formats, actual=actual_formats)
video_filter = '{video};;{ui} (*.*)'.format(video=video_filter, ui=UiStrings().AllFiles)
filename, filter_used = QtWidgets.QFileDialog.getOpenFileName(
self, translate('OpenLP.ThemeWizard', 'Select Video'),
self.video_file_edit.text(), video_filter)
if filename:
self.theme.background_filename = filename
self.set_background_page_values() self.set_background_page_values()
def on_video_file_edit_editing_finished(self):
"""
Background video path edited
"""
self.theme.background_filename = str(self.image_file_edit.text())
def on_main_color_changed(self, color): def on_main_color_changed(self, color):
""" """
Set the main colour value Set the main colour value

View File

@ -28,7 +28,7 @@ from openlp.core.common import UiStrings, translate, is_macosx
from openlp.core.lib import build_icon from openlp.core.lib import build_icon
from openlp.core.lib.theme import HorizontalType, BackgroundType, BackgroundGradientType from openlp.core.lib.theme import HorizontalType, BackgroundType, BackgroundGradientType
from openlp.core.lib.ui import add_welcome_page, create_valign_selection_widgets from openlp.core.lib.ui import add_welcome_page, create_valign_selection_widgets
from openlp.core.ui.lib.colorbutton import ColorButton from openlp.core.ui.lib import ColorButton, PathEdit
class Ui_ThemeWizard(object): class Ui_ThemeWizard(object):
@ -116,16 +116,9 @@ class Ui_ThemeWizard(object):
self.image_layout.addRow(self.image_color_label, self.image_color_button) self.image_layout.addRow(self.image_color_label, self.image_color_button)
self.image_label = QtWidgets.QLabel(self.image_widget) self.image_label = QtWidgets.QLabel(self.image_widget)
self.image_label.setObjectName('image_label') self.image_label.setObjectName('image_label')
self.image_file_layout = QtWidgets.QHBoxLayout() self.image_path_edit = PathEdit(self.image_widget, show_revert=False)
self.image_file_layout.setObjectName('image_file_layout') self.image_path_edit.dialog_caption = translate('OpenLP.ThemeWizard', 'Select Image')
self.image_file_edit = QtWidgets.QLineEdit(self.image_widget) self.image_layout.addRow(self.image_label, self.image_path_edit)
self.image_file_edit.setObjectName('image_file_edit')
self.image_file_layout.addWidget(self.image_file_edit)
self.image_browse_button = QtWidgets.QToolButton(self.image_widget)
self.image_browse_button.setObjectName('image_browse_button')
self.image_browse_button.setIcon(build_icon(':/general/general_open.png'))
self.image_file_layout.addWidget(self.image_browse_button)
self.image_layout.addRow(self.image_label, self.image_file_layout)
self.image_layout.setItem(2, QtWidgets.QFormLayout.LabelRole, self.spacer) self.image_layout.setItem(2, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.background_stack.addWidget(self.image_widget) self.background_stack.addWidget(self.image_widget)
self.transparent_widget = QtWidgets.QWidget(self.background_page) self.transparent_widget = QtWidgets.QWidget(self.background_page)
@ -147,16 +140,9 @@ class Ui_ThemeWizard(object):
self.video_layout.addRow(self.video_color_label, self.video_color_button) self.video_layout.addRow(self.video_color_label, self.video_color_button)
self.video_label = QtWidgets.QLabel(self.video_widget) self.video_label = QtWidgets.QLabel(self.video_widget)
self.video_label.setObjectName('video_label') self.video_label.setObjectName('video_label')
self.video_file_layout = QtWidgets.QHBoxLayout() self.video_path_edit = PathEdit(self.video_widget, show_revert=False)
self.video_file_layout.setObjectName('video_file_layout') self.video_path_edit.dialog_caption = translate('OpenLP.ThemeWizard', 'Select Video')
self.video_file_edit = QtWidgets.QLineEdit(self.video_widget) self.video_layout.addRow(self.video_label, self.video_path_edit)
self.video_file_edit.setObjectName('video_file_edit')
self.video_file_layout.addWidget(self.video_file_edit)
self.video_browse_button = QtWidgets.QToolButton(self.video_widget)
self.video_browse_button.setObjectName('video_browse_button')
self.video_browse_button.setIcon(build_icon(':/general/general_open.png'))
self.video_file_layout.addWidget(self.video_browse_button)
self.video_layout.addRow(self.video_label, self.video_file_layout)
self.video_layout.setItem(2, QtWidgets.QFormLayout.LabelRole, self.spacer) self.video_layout.setItem(2, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.background_stack.addWidget(self.video_widget) self.background_stack.addWidget(self.video_widget)
theme_wizard.addPage(self.background_page) theme_wizard.addPage(self.background_page)

View File

@ -135,7 +135,6 @@ class BibleImportForm(OpenLPWizard):
Add the bible import specific wizard pages. Add the bible import specific wizard pages.
""" """
# Select Page # Select Page
self.spacers = []
self.select_page = QtWidgets.QWizardPage() self.select_page = QtWidgets.QWizardPage()
self.select_page.setObjectName('SelectPage') self.select_page.setObjectName('SelectPage')
self.select_page_layout = QtWidgets.QVBoxLayout(self.select_page) self.select_page_layout = QtWidgets.QVBoxLayout(self.select_page)
@ -148,8 +147,8 @@ class BibleImportForm(OpenLPWizard):
self.format_combo_box.addItems(['', '', '', '', '', '', '']) self.format_combo_box.addItems(['', '', '', '', '', '', ''])
self.format_combo_box.setObjectName('FormatComboBox') self.format_combo_box.setObjectName('FormatComboBox')
self.format_layout.addRow(self.format_label, self.format_combo_box) self.format_layout.addRow(self.format_label, self.format_combo_box)
self.spacers.append(QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)) self.spacer = QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
self.format_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacers[-1]) self.format_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.select_page_layout.addLayout(self.format_layout) self.select_page_layout.addLayout(self.format_layout)
self.select_stack = QtWidgets.QStackedLayout() self.select_stack = QtWidgets.QStackedLayout()
self.select_stack.setObjectName('SelectStack') self.select_stack.setObjectName('SelectStack')
@ -171,8 +170,7 @@ class BibleImportForm(OpenLPWizard):
self.osis_browse_button.setObjectName('OsisBrowseButton') self.osis_browse_button.setObjectName('OsisBrowseButton')
self.osis_file_layout.addWidget(self.osis_browse_button) self.osis_file_layout.addWidget(self.osis_browse_button)
self.osis_layout.addRow(self.osis_file_label, self.osis_file_layout) self.osis_layout.addRow(self.osis_file_label, self.osis_file_layout)
self.spacers.append(QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)) self.osis_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.osis_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacers[-1])
self.select_stack.addWidget(self.osis_widget) self.select_stack.addWidget(self.osis_widget)
self.csv_widget = QtWidgets.QWidget(self.select_page) self.csv_widget = QtWidgets.QWidget(self.select_page)
self.csv_widget.setObjectName('CsvWidget') self.csv_widget.setObjectName('CsvWidget')
@ -205,8 +203,7 @@ class BibleImportForm(OpenLPWizard):
self.csv_verses_button.setObjectName('CsvVersesButton') self.csv_verses_button.setObjectName('CsvVersesButton')
self.csv_verses_layout.addWidget(self.csv_verses_button) self.csv_verses_layout.addWidget(self.csv_verses_button)
self.csv_layout.addRow(self.csv_verses_label, self.csv_verses_layout) self.csv_layout.addRow(self.csv_verses_label, self.csv_verses_layout)
self.spacers.append(QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)) self.csv_layout.setItem(3, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.csv_layout.setItem(2, QtWidgets.QFormLayout.LabelRole, self.spacers[-1])
self.select_stack.addWidget(self.csv_widget) self.select_stack.addWidget(self.csv_widget)
self.open_song_widget = QtWidgets.QWidget(self.select_page) self.open_song_widget = QtWidgets.QWidget(self.select_page)
self.open_song_widget.setObjectName('OpenSongWidget') self.open_song_widget.setObjectName('OpenSongWidget')
@ -226,8 +223,7 @@ class BibleImportForm(OpenLPWizard):
self.open_song_browse_button.setObjectName('OpenSongBrowseButton') self.open_song_browse_button.setObjectName('OpenSongBrowseButton')
self.open_song_file_layout.addWidget(self.open_song_browse_button) self.open_song_file_layout.addWidget(self.open_song_browse_button)
self.open_song_layout.addRow(self.open_song_file_label, self.open_song_file_layout) self.open_song_layout.addRow(self.open_song_file_label, self.open_song_file_layout)
self.spacers.append(QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)) self.open_song_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.open_song_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacers[-1])
self.select_stack.addWidget(self.open_song_widget) self.select_stack.addWidget(self.open_song_widget)
self.web_tab_widget = QtWidgets.QTabWidget(self.select_page) self.web_tab_widget = QtWidgets.QTabWidget(self.select_page)
self.web_tab_widget.setObjectName('WebTabWidget') self.web_tab_widget.setObjectName('WebTabWidget')
@ -304,8 +300,7 @@ class BibleImportForm(OpenLPWizard):
self.zefania_browse_button.setObjectName('ZefaniaBrowseButton') self.zefania_browse_button.setObjectName('ZefaniaBrowseButton')
self.zefania_file_layout.addWidget(self.zefania_browse_button) self.zefania_file_layout.addWidget(self.zefania_browse_button)
self.zefania_layout.addRow(self.zefania_file_label, self.zefania_file_layout) self.zefania_layout.addRow(self.zefania_file_label, self.zefania_file_layout)
self.spacers.append(QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)) self.zefania_layout.setItem(5, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.zefania_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacers[-1])
self.select_stack.addWidget(self.zefania_widget) self.select_stack.addWidget(self.zefania_widget)
self.sword_widget = QtWidgets.QWidget(self.select_page) self.sword_widget = QtWidgets.QWidget(self.select_page)
self.sword_widget.setObjectName('SwordWidget') self.sword_widget.setObjectName('SwordWidget')
@ -386,8 +381,7 @@ class BibleImportForm(OpenLPWizard):
self.wordproject_browse_button.setObjectName('WordProjectBrowseButton') self.wordproject_browse_button.setObjectName('WordProjectBrowseButton')
self.wordproject_file_layout.addWidget(self.wordproject_browse_button) self.wordproject_file_layout.addWidget(self.wordproject_browse_button)
self.wordproject_layout.addRow(self.wordproject_file_label, self.wordproject_file_layout) self.wordproject_layout.addRow(self.wordproject_file_label, self.wordproject_file_layout)
self.spacers.append(QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)) self.wordproject_layout.setItem(5, QtWidgets.QFormLayout.LabelRole, self.spacer)
self.wordproject_layout.setItem(1, QtWidgets.QFormLayout.LabelRole, self.spacers[-1])
self.select_stack.addWidget(self.wordproject_widget) self.select_stack.addWidget(self.wordproject_widget)
self.select_page_layout.addLayout(self.select_stack) self.select_page_layout.addLayout(self.select_stack)
self.addPage(self.select_page) self.addPage(self.select_page)
@ -505,8 +499,7 @@ class BibleImportForm(OpenLPWizard):
self.csv_verses_label.minimumSizeHint().width(), self.csv_verses_label.minimumSizeHint().width(),
self.open_song_file_label.minimumSizeHint().width(), self.open_song_file_label.minimumSizeHint().width(),
self.zefania_file_label.minimumSizeHint().width()) self.zefania_file_label.minimumSizeHint().width())
for spacer in self.spacers: self.spacer.changeSize(label_width, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
spacer.changeSize(label_width, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
def validateCurrentPage(self): def validateCurrentPage(self):
""" """

View File

@ -25,6 +25,7 @@ from PyQt5 import QtGui, QtWidgets
from openlp.core.common import Settings, UiStrings, translate from openlp.core.common import Settings, UiStrings, translate
from openlp.core.lib import SettingsTab, build_icon from openlp.core.lib import SettingsTab, build_icon
from openlp.core.lib.ui import critical_error_message_box from openlp.core.lib.ui import critical_error_message_box
from openlp.core.ui.lib import PathEdit
from .pdfcontroller import PdfController from .pdfcontroller import PdfController
@ -88,26 +89,15 @@ class PresentationTab(SettingsTab):
self.pdf_program_check_box = QtWidgets.QCheckBox(self.pdf_group_box) self.pdf_program_check_box = QtWidgets.QCheckBox(self.pdf_group_box)
self.pdf_program_check_box.setObjectName('pdf_program_check_box') self.pdf_program_check_box.setObjectName('pdf_program_check_box')
self.pdf_layout.addRow(self.pdf_program_check_box) self.pdf_layout.addRow(self.pdf_program_check_box)
self.pdf_program_path_layout = QtWidgets.QHBoxLayout() self.program_path_edit = PathEdit(self.pdf_group_box)
self.pdf_program_path_layout.setObjectName('pdf_program_path_layout') self.pdf_layout.addRow(self.program_path_edit)
self.pdf_program_path = QtWidgets.QLineEdit(self.pdf_group_box)
self.pdf_program_path.setObjectName('pdf_program_path')
self.pdf_program_path.setReadOnly(True)
self.pdf_program_path.setPalette(self.get_grey_text_palette(True))
self.pdf_program_path_layout.addWidget(self.pdf_program_path)
self.pdf_program_browse_button = QtWidgets.QToolButton(self.pdf_group_box)
self.pdf_program_browse_button.setObjectName('pdf_program_browse_button')
self.pdf_program_browse_button.setIcon(build_icon(':/general/general_open.png'))
self.pdf_program_browse_button.setEnabled(False)
self.pdf_program_path_layout.addWidget(self.pdf_program_browse_button)
self.pdf_layout.addRow(self.pdf_program_path_layout)
self.left_layout.addWidget(self.pdf_group_box) self.left_layout.addWidget(self.pdf_group_box)
self.left_layout.addStretch() self.left_layout.addStretch()
self.right_column.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) self.right_column.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
self.right_layout.addStretch() self.right_layout.addStretch()
# Signals and slots # Signals and slots
self.pdf_program_browse_button.clicked.connect(self.on_pdf_program_browse_button_clicked) self.program_path_edit.pathChanged.connect(self.on_program_path_edit_path_changed)
self.pdf_program_check_box.clicked.connect(self.on_pdf_program_check_box_clicked) self.pdf_program_check_box.clicked.connect(self.program_path_edit.setEnabled)
def retranslateUi(self): def retranslateUi(self):
""" """
@ -132,6 +122,8 @@ class PresentationTab(SettingsTab):
'(This may fix PowerPoint scaling issues in Windows 8 and 10)')) '(This may fix PowerPoint scaling issues in Windows 8 and 10)'))
self.pdf_program_check_box.setText( self.pdf_program_check_box.setText(
translate('PresentationPlugin.PresentationTab', 'Use given full path for mudraw or ghostscript binary:')) translate('PresentationPlugin.PresentationTab', 'Use given full path for mudraw or ghostscript binary:'))
self.program_path_edit.dialog_caption = translate('PresentationPlugin.PresentationTab',
'Select mudraw or ghostscript binary')
def set_controller_text(self, checkbox, controller): def set_controller_text(self, checkbox, controller):
if checkbox.isEnabled(): if checkbox.isEnabled():
@ -161,11 +153,10 @@ class PresentationTab(SettingsTab):
# load pdf-program settings # load pdf-program settings
enable_pdf_program = Settings().value(self.settings_section + '/enable_pdf_program') enable_pdf_program = Settings().value(self.settings_section + '/enable_pdf_program')
self.pdf_program_check_box.setChecked(enable_pdf_program) self.pdf_program_check_box.setChecked(enable_pdf_program)
self.pdf_program_path.setPalette(self.get_grey_text_palette(not enable_pdf_program)) self.program_path_edit.setEnabled(enable_pdf_program)
self.pdf_program_browse_button.setEnabled(enable_pdf_program)
pdf_program = Settings().value(self.settings_section + '/pdf_program') pdf_program = Settings().value(self.settings_section + '/pdf_program')
if pdf_program: if pdf_program:
self.pdf_program_path.setText(pdf_program) self.program_path_edit.path = pdf_program
def save(self): def save(self):
""" """
@ -201,7 +192,7 @@ class PresentationTab(SettingsTab):
Settings().setValue(setting_key, self.ppt_window_check_box.checkState()) Settings().setValue(setting_key, self.ppt_window_check_box.checkState())
changed = True changed = True
# Save pdf-settings # Save pdf-settings
pdf_program = self.pdf_program_path.text() pdf_program = self.program_path_edit.path
enable_pdf_program = self.pdf_program_check_box.checkState() enable_pdf_program = self.pdf_program_check_box.checkState()
# If the given program is blank disable using the program # If the given program is blank disable using the program
if pdf_program == '': if pdf_program == '':
@ -228,42 +219,12 @@ class PresentationTab(SettingsTab):
checkbox.setEnabled(controller.is_available()) checkbox.setEnabled(controller.is_available())
self.set_controller_text(checkbox, controller) self.set_controller_text(checkbox, controller)
def on_pdf_program_browse_button_clicked(self): def on_program_path_edit_path_changed(self, filename):
""" """
Select the mudraw or ghostscript binary that should be used. Select the mudraw or ghostscript binary that should be used.
""" """
filename, filter_used = QtWidgets.QFileDialog.getOpenFileName(
self, translate('PresentationPlugin.PresentationTab', 'Select mudraw or ghostscript binary.'),
self.pdf_program_path.text())
if filename: if filename:
program_type = PdfController.process_check_binary(filename) if not PdfController.process_check_binary(filename):
if not program_type:
critical_error_message_box(UiStrings().Error, critical_error_message_box(UiStrings().Error,
translate('PresentationPlugin.PresentationTab', translate('PresentationPlugin.PresentationTab',
'The program is not ghostscript or mudraw which is required.')) 'The program is not ghostscript or mudraw which is required.'))
else:
self.pdf_program_path.setText(filename)
def on_pdf_program_check_box_clicked(self, checked):
"""
When checkbox for manual entering pdf-program is clicked,
enable or disable the textbox for the programpath and the browse-button.
:param checked: If the box is checked or not.
"""
self.pdf_program_path.setPalette(self.get_grey_text_palette(not checked))
self.pdf_program_browse_button.setEnabled(checked)
def get_grey_text_palette(self, greyed):
"""
Returns a QPalette with greyed out text as used for placeholderText.
:param greyed: Determines whether the palette should be grayed.
:return: The created palette.
"""
palette = QtGui.QPalette()
color = self.palette().color(QtGui.QPalette.Active, QtGui.QPalette.Text)
if greyed:
color.setAlpha(128)
palette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Text, color)
return palette

View File

@ -25,6 +25,7 @@ from PyQt5 import QtCore, QtWidgets
from openlp.core.common import translate from openlp.core.common import translate
from openlp.core.lib import build_icon from openlp.core.lib import build_icon
from openlp.core.lib.ui import create_button_box from openlp.core.lib.ui import create_button_box
from openlp.core.ui.lib import PathEdit, PathType
class Ui_SongUsageDetailDialog(object): class Ui_SongUsageDetailDialog(object):
@ -68,20 +69,14 @@ class Ui_SongUsageDetailDialog(object):
self.file_horizontal_layout.setSpacing(8) self.file_horizontal_layout.setSpacing(8)
self.file_horizontal_layout.setContentsMargins(8, 8, 8, 8) self.file_horizontal_layout.setContentsMargins(8, 8, 8, 8)
self.file_horizontal_layout.setObjectName('file_horizontal_layout') self.file_horizontal_layout.setObjectName('file_horizontal_layout')
self.file_line_edit = QtWidgets.QLineEdit(self.file_group_box) self.report_path_edit = PathEdit(self.file_group_box, show_revert=False)
self.file_line_edit.setObjectName('file_line_edit') self.report_path_edit.path_type = PathType.Directories
self.file_line_edit.setReadOnly(True) self.file_horizontal_layout.addWidget(self.report_path_edit)
self.file_horizontal_layout.addWidget(self.file_line_edit)
self.save_file_push_button = QtWidgets.QPushButton(self.file_group_box)
self.save_file_push_button.setMaximumWidth(self.save_file_push_button.size().height())
self.save_file_push_button.setIcon(build_icon(':/general/general_open.png'))
self.save_file_push_button.setObjectName('save_file_push_button')
self.file_horizontal_layout.addWidget(self.save_file_push_button)
self.vertical_layout.addWidget(self.file_group_box) self.vertical_layout.addWidget(self.file_group_box)
self.button_box = create_button_box(song_usage_detail_dialog, 'button_box', ['cancel', 'ok']) self.button_box = create_button_box(song_usage_detail_dialog, 'button_box', ['cancel', 'ok'])
self.vertical_layout.addWidget(self.button_box) self.vertical_layout.addWidget(self.button_box)
self.retranslateUi(song_usage_detail_dialog) self.retranslateUi(song_usage_detail_dialog)
self.save_file_push_button.clicked.connect(song_usage_detail_dialog.define_output_location) self.report_path_edit.pathChanged.connect(song_usage_detail_dialog.on_report_path_edit_path_changed)
def retranslateUi(self, song_usage_detail_dialog): def retranslateUi(self, song_usage_detail_dialog):
""" """

View File

@ -54,25 +54,20 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP
""" """
self.from_date_calendar.setSelectedDate(Settings().value(self.plugin.settings_section + '/from date')) self.from_date_calendar.setSelectedDate(Settings().value(self.plugin.settings_section + '/from date'))
self.to_date_calendar.setSelectedDate(Settings().value(self.plugin.settings_section + '/to date')) self.to_date_calendar.setSelectedDate(Settings().value(self.plugin.settings_section + '/to date'))
self.file_line_edit.setText(Settings().value(self.plugin.settings_section + '/last directory export')) self.report_path_edit.path = Settings().value(self.plugin.settings_section + '/last directory export')
def define_output_location(self): def on_report_path_edit_path_changed(self, file_path):
""" """
Triggered when the Directory selection button is clicked Triggered when the Directory selection button is clicked
""" """
path = QtWidgets.QFileDialog.getExistingDirectory( Settings().setValue(self.plugin.settings_section + '/last directory export', file_path)
self, translate('SongUsagePlugin.SongUsageDetailForm', 'Output File Location'),
Settings().value(self.plugin.settings_section + '/last directory export'))
if path:
Settings().setValue(self.plugin.settings_section + '/last directory export', path)
self.file_line_edit.setText(path)
def accept(self): def accept(self):
""" """
Ok was triggered so lets save the data and run the report Ok was triggered so lets save the data and run the report
""" """
log.debug('accept') log.debug('accept')
path = self.file_line_edit.text() path = self.report_path_edit.path
if not path: if not path:
self.main_window.error_message( self.main_window.error_message(
translate('SongUsagePlugin.SongUsageDetailForm', 'Output Path Not Selected'), translate('SongUsagePlugin.SongUsageDetailForm', 'Output Path Not Selected'),

View File

@ -50,10 +50,10 @@ class TestThemeManager(TestCase):
instance = ThemeForm(None) instance = ThemeForm(None)
mocked_image_file_edit = MagicMock() mocked_image_file_edit = MagicMock()
mocked_image_file_edit.text.return_value = '/original_path/file.ext' mocked_image_file_edit.text.return_value = '/original_path/file.ext'
instance.image_file_edit = mocked_image_file_edit instance.image_path_edit = mocked_image_file_edit
# WHEN: on_image_browse_button is clicked # WHEN: on_image_browse_button is clicked
instance.on_image_browse_button_clicked() instance.on_image_path_edit_path_changed()
# THEN: The QFileDialog getOpenFileName and set_background_page_values moethods should have been called # THEN: The QFileDialog getOpenFileName and set_background_page_values moethods should have been called
# with known arguments # with known arguments
@ -77,11 +77,11 @@ class TestThemeManager(TestCase):
instance = ThemeForm(None) instance = ThemeForm(None)
mocked_image_file_edit = MagicMock() mocked_image_file_edit = MagicMock()
mocked_image_file_edit.text.return_value = '/original_path/file.ext' mocked_image_file_edit.text.return_value = '/original_path/file.ext'
instance.image_file_edit = mocked_image_file_edit instance.image_path_edit = mocked_image_file_edit
instance.theme = MagicMock() instance.theme = MagicMock()
# WHEN: on_image_browse_button is clicked # WHEN: on_image_browse_button is clicked
instance.on_image_browse_button_clicked() instance.on_image_path_edit_path_changed()
# THEN: The QFileDialog getOpenFileName and set_background_page_values moethods should have been called # THEN: The QFileDialog getOpenFileName and set_background_page_values moethods should have been called
# with known arguments and theme.background_filename should be set # with known arguments and theme.background_filename should be set

View File

@ -20,11 +20,11 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
""" """
This module contains tests for the openlp.core.lib.filedialog module This module contains tests for the openlp.core.ui.lib.colorbutton module
""" """
from unittest import TestCase from unittest import TestCase
from openlp.core.ui.lib.colorbutton import ColorButton from openlp.core.ui.lib import ColorButton
from tests.functional import MagicMock, call, patch from tests.functional import MagicMock, call, patch
@ -148,11 +148,10 @@ class TestColorDialog(TestCase):
widget.on_clicked() widget.on_clicked()
# THEN: change_color should not have been called and the colorChanged signal should not have been emitted # THEN: change_color should not have been called and the colorChanged signal should not have been emitted
self.assertEqual( self.assertFalse(self.mocked_change_color.called,
self.mocked_change_color.call_count, 0, 'change_color should not have been called with an invalid color') 'change_color should not have been called with an invalid color')
self.assertEqual( self.assertFalse(self.mocked_color_changed.emit.called,
self.mocked_color_changed.emit.call_count, 0, 'colorChange signal should not have been emitted with an invalid color')
'colorChange signal should not have been emitted with an invalid color')
def test_on_clicked_same_color(self): def test_on_clicked_same_color(self):
""" """
@ -171,12 +170,10 @@ class TestColorDialog(TestCase):
widget.on_clicked() widget.on_clicked()
# THEN: change_color should not have been called and the colorChanged signal should not have been emitted # THEN: change_color should not have been called and the colorChanged signal should not have been emitted
self.assertEqual( self.assertFalse(self.mocked_change_color.called,
self.mocked_change_color.call_count, 0, 'change_color should not have been called when the color has not changed')
'change_color should not have been called when the color has not changed') self.assertFalse(self.mocked_color_changed.emit.called,
self.assertEqual( 'colorChange signal should not have been emitted when the color has not changed')
self.mocked_color_changed.emit.call_count, 0,
'colorChange signal should not have been emitted when the color has not changed')
def test_on_clicked_new_color(self): def test_on_clicked_new_color(self):
""" """

View File

@ -28,11 +28,12 @@ from unittest.mock import MagicMock, patch
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from openlp.core.common import Registry from openlp.core.common import Registry
from openlp.plugins.bibles.forms import bibleimportform from openlp.plugins.bibles.forms.bibleimportform import BibleImportForm, PYSWORD_AVAILABLE
from tests.helpers.testmixin import TestMixin from tests.helpers.testmixin import TestMixin
@skip('One of the QFormLayouts in the BibleImportForm is causing a segfault')
class TestBibleImportForm(TestCase, TestMixin): class TestBibleImportForm(TestCase, TestMixin):
""" """
Test the BibleImportForm class Test the BibleImportForm class
@ -46,9 +47,9 @@ class TestBibleImportForm(TestCase, TestMixin):
self.setup_application() self.setup_application()
self.main_window = QtWidgets.QMainWindow() self.main_window = QtWidgets.QMainWindow()
Registry().register('main_window', self.main_window) Registry().register('main_window', self.main_window)
bibleimportform.PYSWORD_AVAILABLE = False PYSWORD_AVAILABLE = False
self.mocked_manager = MagicMock() self.mocked_manager = MagicMock()
self.form = bibleimportform.BibleImportForm(self.main_window, self.mocked_manager, MagicMock()) self.form = BibleImportForm(self.main_window, self.mocked_manager, MagicMock())
def tearDown(self): def tearDown(self):
""" """