forked from openlp/openlp
Provides the ability to change the data path storing the config files and databases.
bzr-revno: 1985
This commit is contained in:
commit
24bcc54d68
@ -31,10 +31,15 @@ from datetime import datetime, timedelta
|
|||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
from openlp.core.lib import SettingsTab, translate, build_icon, Receiver
|
from openlp.core.lib import SettingsTab, translate, build_icon, Receiver
|
||||||
from openlp.core.lib.ui import UiStrings
|
from openlp.core.lib.ui import UiStrings
|
||||||
|
from openlp.core.utils import get_images_filter, AppLocation
|
||||||
from openlp.core.lib import SlideLimits
|
from openlp.core.lib import SlideLimits
|
||||||
from openlp.core.utils import get_images_filter
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
class AdvancedTab(SettingsTab):
|
class AdvancedTab(SettingsTab):
|
||||||
"""
|
"""
|
||||||
@ -59,6 +64,7 @@ class AdvancedTab(SettingsTab):
|
|||||||
'#strftime-strptime-behavior for more information.'))
|
'#strftime-strptime-behavior for more information.'))
|
||||||
self.defaultImage = u':/graphics/openlp-splash-screen.png'
|
self.defaultImage = u':/graphics/openlp-splash-screen.png'
|
||||||
self.defaultColor = u'#ffffff'
|
self.defaultColor = u'#ffffff'
|
||||||
|
self.dataExists = False
|
||||||
self.iconPath = u':/system/system_settings.png'
|
self.iconPath = u':/system/system_settings.png'
|
||||||
advanced_translated = translate('OpenLP.AdvancedTab', 'Advanced')
|
advanced_translated = translate('OpenLP.AdvancedTab', 'Advanced')
|
||||||
SettingsTab.__init__(self, parent, u'Advanced', advanced_translated)
|
SettingsTab.__init__(self, parent, u'Advanced', advanced_translated)
|
||||||
@ -151,6 +157,71 @@ class AdvancedTab(SettingsTab):
|
|||||||
self.serviceNameLayout.addRow(self.serviceNameExampleLabel,
|
self.serviceNameLayout.addRow(self.serviceNameExampleLabel,
|
||||||
self.serviceNameExample)
|
self.serviceNameExample)
|
||||||
self.leftLayout.addWidget(self.serviceNameGroupBox)
|
self.leftLayout.addWidget(self.serviceNameGroupBox)
|
||||||
|
# Data Directory
|
||||||
|
self.dataDirectoryGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||||
|
self.dataDirectoryGroupBox.setObjectName(u'dataDirectoryGroupBox')
|
||||||
|
self.dataDirectoryLayout = QtGui.QFormLayout(self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryLayout.setObjectName(u'dataDirectoryLayout')
|
||||||
|
self.dataDirectoryCurrentLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryCurrentLabel.setObjectName(
|
||||||
|
u'dataDirectoryCurrentLabel')
|
||||||
|
self.dataDirectoryLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryLabel.setObjectName(u'dataDirectoryLabel')
|
||||||
|
self.dataDirectoryNewLabel = QtGui.QLabel(self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryNewLabel.setObjectName(u'dataDirectoryCurrentLabel')
|
||||||
|
self.newDataDirectoryEdit = QtGui.QLineEdit(self.dataDirectoryGroupBox)
|
||||||
|
self.newDataDirectoryEdit.setObjectName(u'newDataDirectoryEdit')
|
||||||
|
self.newDataDirectoryEdit.setReadOnly(True)
|
||||||
|
self.newDataDirectoryHasFilesLabel = QtGui.QLabel(
|
||||||
|
self.dataDirectoryGroupBox)
|
||||||
|
self.newDataDirectoryHasFilesLabel.setObjectName(
|
||||||
|
u'newDataDirectoryHasFilesLabel')
|
||||||
|
self.newDataDirectoryHasFilesLabel.setWordWrap(True)
|
||||||
|
self.dataDirectoryBrowseButton = QtGui.QToolButton(
|
||||||
|
self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryBrowseButton.setObjectName(
|
||||||
|
u'dataDirectoryBrowseButton')
|
||||||
|
self.dataDirectoryBrowseButton.setIcon(
|
||||||
|
build_icon(u':/general/general_open.png'))
|
||||||
|
self.dataDirectoryDefaultButton = QtGui.QToolButton(
|
||||||
|
self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryDefaultButton.setObjectName(
|
||||||
|
u'dataDirectoryDefaultButton')
|
||||||
|
self.dataDirectoryDefaultButton.setIcon(
|
||||||
|
build_icon(u':/general/general_revert.png'))
|
||||||
|
self.dataDirectoryCancelButton = QtGui.QToolButton(
|
||||||
|
self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryCancelButton.setObjectName(
|
||||||
|
u'dataDirectoryCancelButton')
|
||||||
|
self.dataDirectoryCancelButton.setIcon(
|
||||||
|
build_icon(u':/general/general_delete.png'))
|
||||||
|
self.newDataDirectoryLabelHBox = QtGui.QHBoxLayout()
|
||||||
|
self.newDataDirectoryLabelHBox.setObjectName(
|
||||||
|
u'newDataDirectoryLabelHBox')
|
||||||
|
self.newDataDirectoryLabelHBox.addWidget(self.newDataDirectoryEdit)
|
||||||
|
self.newDataDirectoryLabelHBox.addWidget(
|
||||||
|
self.dataDirectoryBrowseButton)
|
||||||
|
self.newDataDirectoryLabelHBox.addWidget(
|
||||||
|
self.dataDirectoryDefaultButton)
|
||||||
|
self.dataDirectoryCopyCheckHBox = QtGui.QHBoxLayout()
|
||||||
|
self.dataDirectoryCopyCheckHBox.setObjectName(
|
||||||
|
u'dataDirectoryCopyCheckHBox')
|
||||||
|
self.dataDirectoryCopyCheckBox = QtGui.QCheckBox(
|
||||||
|
self.dataDirectoryGroupBox)
|
||||||
|
self.dataDirectoryCopyCheckBox.setObjectName(
|
||||||
|
u'dataDirectoryCopyCheckBox')
|
||||||
|
self.dataDirectoryCopyCheckHBox.addWidget(
|
||||||
|
self.dataDirectoryCopyCheckBox)
|
||||||
|
self.dataDirectoryCopyCheckHBox.addStretch()
|
||||||
|
self.dataDirectoryCopyCheckHBox.addWidget(
|
||||||
|
self.dataDirectoryCancelButton)
|
||||||
|
self.dataDirectoryLayout.addRow(self.dataDirectoryCurrentLabel,
|
||||||
|
self.dataDirectoryLabel)
|
||||||
|
self.dataDirectoryLayout.addRow(self.dataDirectoryNewLabel,
|
||||||
|
self.newDataDirectoryLabelHBox)
|
||||||
|
self.dataDirectoryLayout.addRow(self.dataDirectoryCopyCheckHBox)
|
||||||
|
self.dataDirectoryLayout.addRow(self.newDataDirectoryHasFilesLabel)
|
||||||
|
self.leftLayout.addWidget(self.dataDirectoryGroupBox)
|
||||||
self.leftLayout.addStretch()
|
self.leftLayout.addStretch()
|
||||||
# Default Image
|
# Default Image
|
||||||
self.defaultImageGroupBox = QtGui.QGroupBox(self.rightColumn)
|
self.defaultImageGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||||
@ -219,7 +290,6 @@ class AdvancedTab(SettingsTab):
|
|||||||
self.x11Layout.addWidget(self.x11BypassCheckBox)
|
self.x11Layout.addWidget(self.x11BypassCheckBox)
|
||||||
self.rightLayout.addWidget(self.x11GroupBox)
|
self.rightLayout.addWidget(self.x11GroupBox)
|
||||||
self.rightLayout.addStretch()
|
self.rightLayout.addStretch()
|
||||||
|
|
||||||
self.shouldUpdateServiceNameExample = False
|
self.shouldUpdateServiceNameExample = False
|
||||||
QtCore.QObject.connect(self.serviceNameCheckBox,
|
QtCore.QObject.connect(self.serviceNameCheckBox,
|
||||||
QtCore.SIGNAL(u'toggled(bool)'), self.serviceNameCheckBoxToggled)
|
QtCore.SIGNAL(u'toggled(bool)'), self.serviceNameCheckBoxToggled)
|
||||||
@ -243,6 +313,18 @@ class AdvancedTab(SettingsTab):
|
|||||||
QtCore.SIGNAL(u'clicked()'), self.onDefaultRevertButtonClicked)
|
QtCore.SIGNAL(u'clicked()'), self.onDefaultRevertButtonClicked)
|
||||||
QtCore.QObject.connect(self.x11BypassCheckBox,
|
QtCore.QObject.connect(self.x11BypassCheckBox,
|
||||||
QtCore.SIGNAL(u'toggled(bool)'), self.onX11BypassCheckBoxToggled)
|
QtCore.SIGNAL(u'toggled(bool)'), self.onX11BypassCheckBoxToggled)
|
||||||
|
QtCore.QObject.connect(self.dataDirectoryBrowseButton,
|
||||||
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
|
self.onDataDirectoryBrowseButtonClicked)
|
||||||
|
QtCore.QObject.connect(self.dataDirectoryDefaultButton,
|
||||||
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
|
self.onDataDirectoryDefaultButtonClicked)
|
||||||
|
QtCore.QObject.connect(self.dataDirectoryCancelButton,
|
||||||
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
|
self.onDataDirectoryCancelButtonClicked)
|
||||||
|
QtCore.QObject.connect(self.dataDirectoryCopyCheckBox,
|
||||||
|
QtCore.SIGNAL(u'toggled(bool)'),
|
||||||
|
self.onDataDirectoryCopyCheckBoxToggled)
|
||||||
QtCore.QObject.connect(self.endSlideRadioButton,
|
QtCore.QObject.connect(self.endSlideRadioButton,
|
||||||
QtCore.SIGNAL(u'clicked()'), self.onEndSlideButtonClicked)
|
QtCore.SIGNAL(u'clicked()'), self.onEndSlideButtonClicked)
|
||||||
QtCore.QObject.connect(self.wrapSlideRadioButton,
|
QtCore.QObject.connect(self.wrapSlideRadioButton,
|
||||||
@ -257,6 +339,8 @@ class AdvancedTab(SettingsTab):
|
|||||||
self.tabTitleVisible = UiStrings().Advanced
|
self.tabTitleVisible = UiStrings().Advanced
|
||||||
self.uiGroupBox.setTitle(
|
self.uiGroupBox.setTitle(
|
||||||
translate('OpenLP.AdvancedTab', 'UI Settings'))
|
translate('OpenLP.AdvancedTab', 'UI Settings'))
|
||||||
|
self.dataDirectoryGroupBox.setTitle(
|
||||||
|
translate('OpenLP.AdvancedTab', 'Data Location'))
|
||||||
self.recentLabel.setText(
|
self.recentLabel.setText(
|
||||||
translate('OpenLP.AdvancedTab',
|
translate('OpenLP.AdvancedTab',
|
||||||
'Number of recent files to display:'))
|
'Number of recent files to display:'))
|
||||||
@ -320,6 +404,32 @@ class AdvancedTab(SettingsTab):
|
|||||||
'Browse for an image file to display.'))
|
'Browse for an image file to display.'))
|
||||||
self.defaultRevertButton.setToolTip(translate('OpenLP.AdvancedTab',
|
self.defaultRevertButton.setToolTip(translate('OpenLP.AdvancedTab',
|
||||||
'Revert to the default OpenLP logo.'))
|
'Revert to the default OpenLP logo.'))
|
||||||
|
self.dataDirectoryCurrentLabel.setText(translate('OpenLP.AdvancedTab',
|
||||||
|
'Current path:'))
|
||||||
|
self.dataDirectoryNewLabel.setText(translate('OpenLP.AdvancedTab',
|
||||||
|
'Custom path:'))
|
||||||
|
self.dataDirectoryBrowseButton.setToolTip(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Browse for new data file location.'))
|
||||||
|
self.dataDirectoryDefaultButton.setToolTip(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Set the data location to the default.'))
|
||||||
|
self.dataDirectoryCancelButton.setText(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Cancel'))
|
||||||
|
self.dataDirectoryCancelButton.setToolTip(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Cancel OpenLP data directory location change.'))
|
||||||
|
self.dataDirectoryCopyCheckBox.setText(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Copy data to new location.'))
|
||||||
|
self.dataDirectoryCopyCheckBox.setToolTip(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Copy the OpenLP data files to the new location.'))
|
||||||
|
self.newDataDirectoryHasFilesLabel.setText(
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'<strong>WARNING:</strong> New data directory location contains '
|
||||||
|
'OpenLP data files. These files WILL be replaced during a copy.'))
|
||||||
self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab',
|
self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab',
|
||||||
'X11'))
|
'X11'))
|
||||||
self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab',
|
self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab',
|
||||||
@ -397,6 +507,40 @@ class AdvancedTab(SettingsTab):
|
|||||||
else:
|
else:
|
||||||
self.nextItemRadioButton.setChecked(True)
|
self.nextItemRadioButton.setChecked(True)
|
||||||
settings.endGroup()
|
settings.endGroup()
|
||||||
|
self.dataDirectoryCopyCheckBox.hide()
|
||||||
|
self.newDataDirectoryHasFilesLabel.hide()
|
||||||
|
self.dataDirectoryCancelButton.hide()
|
||||||
|
# Since data location can be changed, make sure the path is present.
|
||||||
|
self.currentDataPath = AppLocation.get_data_path()
|
||||||
|
if not os.path.exists(self.currentDataPath):
|
||||||
|
log.error(u'Data path not found %s' % self.currentDataPath)
|
||||||
|
answer = QtGui.QMessageBox.critical(self,
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Data Directory Error'),
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'OpenLP data directory was not found\n\n%s\n\n'
|
||||||
|
'This data directory was previously changed from the OpenLP '
|
||||||
|
'default location. If the new location was on removable '
|
||||||
|
'media, that media needs to be made available.\n\n'
|
||||||
|
'Click "No" to stop loading OpenLP. allowing you to fix '
|
||||||
|
'the the problem.\n\n'
|
||||||
|
'Click "Yes" to reset the data directory to the default '
|
||||||
|
'location.' % self.currentDataPath),
|
||||||
|
QtGui.QMessageBox.StandardButtons(
|
||||||
|
QtGui.QMessageBox.Yes |
|
||||||
|
QtGui.QMessageBox.No),
|
||||||
|
QtGui.QMessageBox.No)
|
||||||
|
if answer == QtGui.QMessageBox.No:
|
||||||
|
log.info(u'User requested termination')
|
||||||
|
Receiver.send_message(u'cleanup')
|
||||||
|
sys.exit()
|
||||||
|
# Set data location to default.
|
||||||
|
settings.remove(u'advanced/data path')
|
||||||
|
self.currentDataPath = AppLocation.get_data_path()
|
||||||
|
log.warning(u'User requested data path set to default %s'
|
||||||
|
% self.currentDataPath)
|
||||||
|
self.dataDirectoryLabel.setText(os.path.abspath(
|
||||||
|
self.currentDataPath))
|
||||||
self.defaultColorButton.setStyleSheet(
|
self.defaultColorButton.setStyleSheet(
|
||||||
u'background-color: %s' % self.defaultColor)
|
u'background-color: %s' % self.defaultColor)
|
||||||
|
|
||||||
@ -446,6 +590,11 @@ class AdvancedTab(SettingsTab):
|
|||||||
self.displayChanged = False
|
self.displayChanged = False
|
||||||
Receiver.send_message(u'slidecontroller_update_slide_limits')
|
Receiver.send_message(u'slidecontroller_update_slide_limits')
|
||||||
|
|
||||||
|
def cancel(self):
|
||||||
|
# Dialogue was cancelled, remove any pending data path change.
|
||||||
|
self.onDataDirectoryCancelButtonClicked()
|
||||||
|
SettingsTab.cancel(self)
|
||||||
|
|
||||||
def serviceNameCheckBoxToggled(self, default_service_enabled):
|
def serviceNameCheckBoxToggled(self, default_service_enabled):
|
||||||
self.serviceNameDay.setEnabled(default_service_enabled)
|
self.serviceNameDay.setEnabled(default_service_enabled)
|
||||||
time_enabled = default_service_enabled and \
|
time_enabled = default_service_enabled and \
|
||||||
@ -507,6 +656,122 @@ class AdvancedTab(SettingsTab):
|
|||||||
self.defaultFileEdit.setText(filename)
|
self.defaultFileEdit.setText(filename)
|
||||||
self.defaultFileEdit.setFocus()
|
self.defaultFileEdit.setFocus()
|
||||||
|
|
||||||
|
def onDataDirectoryBrowseButtonClicked(self):
|
||||||
|
"""
|
||||||
|
Browse for a new data directory location.
|
||||||
|
"""
|
||||||
|
old_root_path = unicode(self.dataDirectoryLabel.text())
|
||||||
|
# Get the new directory location.
|
||||||
|
new_data_path = unicode(QtGui.QFileDialog.getExistingDirectory(self,
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Select Data Directory Location'), old_root_path,
|
||||||
|
options = QtGui.QFileDialog.ShowDirsOnly))
|
||||||
|
# Set the new data path.
|
||||||
|
if new_data_path:
|
||||||
|
if self.currentDataPath.lower() == new_data_path.lower():
|
||||||
|
self.onDataDirectoryCancelButtonClicked()
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
# Make sure they want to change the data.
|
||||||
|
answer = QtGui.QMessageBox.question(self,
|
||||||
|
translate('OpenLP.AdvancedTab', 'Confirm Data Directory Change'),
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'Are you sure you want to change the location of the OpenLP '
|
||||||
|
'data directory to:\n\n%s\n\n'
|
||||||
|
'The data directory will be changed when OpenLP is closed.'
|
||||||
|
% new_data_path),
|
||||||
|
QtGui.QMessageBox.StandardButtons(
|
||||||
|
QtGui.QMessageBox.Yes |
|
||||||
|
QtGui.QMessageBox.No),
|
||||||
|
QtGui.QMessageBox.No)
|
||||||
|
if answer != QtGui.QMessageBox.Yes:
|
||||||
|
return
|
||||||
|
# Check if data already exists here.
|
||||||
|
self.checkDataOverwrite(new_data_path)
|
||||||
|
# Save the new location.
|
||||||
|
Receiver.send_message(u'set_new_data_path', new_data_path)
|
||||||
|
self.newDataDirectoryEdit.setText(new_data_path)
|
||||||
|
self.dataDirectoryCancelButton.show()
|
||||||
|
|
||||||
|
def onDataDirectoryDefaultButtonClicked(self):
|
||||||
|
"""
|
||||||
|
Re-set the data directory location to the 'default' location.
|
||||||
|
"""
|
||||||
|
new_data_path = AppLocation.get_directory(AppLocation.DataDir)
|
||||||
|
if self.currentDataPath.lower() != new_data_path.lower():
|
||||||
|
# Make sure they want to change the data location back to the default.
|
||||||
|
answer = QtGui.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\n'
|
||||||
|
'This location will be used after OpenLP is closed.'),
|
||||||
|
QtGui.QMessageBox.StandardButtons(
|
||||||
|
QtGui.QMessageBox.Yes |
|
||||||
|
QtGui.QMessageBox.No),
|
||||||
|
QtGui.QMessageBox.No)
|
||||||
|
if answer != QtGui.QMessageBox.Yes:
|
||||||
|
return
|
||||||
|
self.checkDataOverwrite(new_data_path)
|
||||||
|
# Save the new location.
|
||||||
|
Receiver.send_message(u'set_new_data_path', new_data_path)
|
||||||
|
self.newDataDirectoryEdit.setText(os.path.abspath(new_data_path))
|
||||||
|
self.dataDirectoryCancelButton.show()
|
||||||
|
else:
|
||||||
|
# We cancel the change in case user changed their mind.
|
||||||
|
self.onDataDirectoryCancelButtonClicked()
|
||||||
|
|
||||||
|
def onDataDirectoryCopyCheckBoxToggled(self):
|
||||||
|
Receiver.send_message(u'set_copy_data',
|
||||||
|
self.dataDirectoryCopyCheckBox.isChecked())
|
||||||
|
if self.dataExists:
|
||||||
|
if self.dataDirectoryCopyCheckBox.isChecked():
|
||||||
|
self.newDataDirectoryHasFilesLabel.show()
|
||||||
|
else:
|
||||||
|
self.newDataDirectoryHasFilesLabel.hide()
|
||||||
|
|
||||||
|
def checkDataOverwrite(self, data_path ):
|
||||||
|
test_path = os.path.join(data_path, u'songs')
|
||||||
|
self.dataDirectoryCopyCheckBox.show()
|
||||||
|
if os.path.exists(test_path):
|
||||||
|
self.dataExists = True
|
||||||
|
# Check is they want to replace existing data.
|
||||||
|
answer = QtGui.QMessageBox.warning(self,
|
||||||
|
translate('OpenLP.AdvancedTab', 'Overwrite Existing Data'),
|
||||||
|
translate('OpenLP.AdvancedTab',
|
||||||
|
'WARNING: \n\n'
|
||||||
|
'The location you have selected \n\n%s\n\n'
|
||||||
|
'appears to contain OpenLP data files. Do you wish to replace '
|
||||||
|
'these files with the current data files?'
|
||||||
|
% os.path.abspath(data_path,)),
|
||||||
|
QtGui.QMessageBox.StandardButtons(
|
||||||
|
QtGui.QMessageBox.Yes |
|
||||||
|
QtGui.QMessageBox.No),
|
||||||
|
QtGui.QMessageBox.No)
|
||||||
|
if answer == QtGui.QMessageBox.Yes:
|
||||||
|
self.dataDirectoryCopyCheckBox.setChecked(True)
|
||||||
|
self.newDataDirectoryHasFilesLabel.show()
|
||||||
|
else:
|
||||||
|
self.dataDirectoryCopyCheckBox.setChecked(False)
|
||||||
|
self.newDataDirectoryHasFilesLabel.hide()
|
||||||
|
else:
|
||||||
|
self.dataExists = False
|
||||||
|
self.dataDirectoryCopyCheckBox.setChecked(True)
|
||||||
|
self.newDataDirectoryHasFilesLabel.hide()
|
||||||
|
|
||||||
|
def onDataDirectoryCancelButtonClicked(self):
|
||||||
|
"""
|
||||||
|
Cancel the data directory location change
|
||||||
|
"""
|
||||||
|
self.newDataDirectoryEdit.clear()
|
||||||
|
self.dataDirectoryCopyCheckBox.setChecked(False)
|
||||||
|
Receiver.send_message(u'set_new_data_path', u'')
|
||||||
|
Receiver.send_message(u'set_copy_data', False)
|
||||||
|
self.dataDirectoryCopyCheckBox.hide()
|
||||||
|
self.dataDirectoryCancelButton.hide()
|
||||||
|
self.newDataDirectoryHasFilesLabel.hide()
|
||||||
|
|
||||||
def onDefaultRevertButtonClicked(self):
|
def onDefaultRevertButtonClicked(self):
|
||||||
self.defaultFileEdit.setText(u':/graphics/openlp-splash-screen.png')
|
self.defaultFileEdit.setText(u':/graphics/openlp-splash-screen.png')
|
||||||
self.defaultFileEdit.setFocus()
|
self.defaultFileEdit.setFocus()
|
||||||
|
@ -29,6 +29,8 @@ import logging
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import shutil
|
import shutil
|
||||||
|
from distutils import dir_util
|
||||||
|
from distutils.errors import DistutilsFileError
|
||||||
from tempfile import gettempdir
|
from tempfile import gettempdir
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@ -582,6 +584,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
# Once settings are loaded update the menu with the recent files.
|
# Once settings are loaded update the menu with the recent files.
|
||||||
self.updateRecentFilesMenu()
|
self.updateRecentFilesMenu()
|
||||||
self.pluginForm = PluginForm(self)
|
self.pluginForm = PluginForm(self)
|
||||||
|
self.newDataPath = u''
|
||||||
|
self.copyData = False
|
||||||
# Set up signals and slots
|
# Set up signals and slots
|
||||||
QtCore.QObject.connect(self.importThemeItem,
|
QtCore.QObject.connect(self.importThemeItem,
|
||||||
QtCore.SIGNAL(u'triggered()'),
|
QtCore.SIGNAL(u'triggered()'),
|
||||||
@ -634,6 +638,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged)
|
QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged)
|
||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'mainwindow_status_text'), self.showStatusMessage)
|
QtCore.SIGNAL(u'mainwindow_status_text'), self.showStatusMessage)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'cleanup'), self.cleanUp)
|
||||||
# Media Manager
|
# Media Manager
|
||||||
QtCore.QObject.connect(self.mediaToolBox,
|
QtCore.QObject.connect(self.mediaToolBox,
|
||||||
QtCore.SIGNAL(u'currentChanged(int)'), self.onMediaToolBoxChanged)
|
QtCore.SIGNAL(u'currentChanged(int)'), self.onMediaToolBoxChanged)
|
||||||
@ -646,6 +652,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'openlp_information_message'),
|
QtCore.SIGNAL(u'openlp_information_message'),
|
||||||
self.onInformationMessage)
|
self.onInformationMessage)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'set_new_data_path'), self.setNewDataPath)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'set_copy_data'), self.setCopyData)
|
||||||
# warning cyclic dependency
|
# warning cyclic dependency
|
||||||
# renderer needs to call ThemeManager and
|
# renderer needs to call ThemeManager and
|
||||||
# ThemeManager needs to call Renderer
|
# ThemeManager needs to call Renderer
|
||||||
@ -1198,6 +1208,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
if save_settings:
|
if save_settings:
|
||||||
# Save settings
|
# Save settings
|
||||||
self.saveSettings()
|
self.saveSettings()
|
||||||
|
# Check if we need to change the data directory
|
||||||
|
if self.newDataPath:
|
||||||
|
self.changeDataDirectory()
|
||||||
# Close down the display
|
# Close down the display
|
||||||
if self.liveController.display:
|
if self.liveController.display:
|
||||||
self.liveController.display.close()
|
self.liveController.display.close()
|
||||||
@ -1474,3 +1487,45 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
self.timer_id = 0
|
self.timer_id = 0
|
||||||
self.loadProgressBar.hide()
|
self.loadProgressBar.hide()
|
||||||
Receiver.send_message(u'openlp_process_events')
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
|
||||||
|
def setNewDataPath(self, new_data_path):
|
||||||
|
self.newDataPath = new_data_path
|
||||||
|
|
||||||
|
def setCopyData(self, copy_data):
|
||||||
|
self.copyData = copy_data
|
||||||
|
|
||||||
|
def changeDataDirectory(self):
|
||||||
|
log.info(u'Changing data path to %s' % self.newDataPath )
|
||||||
|
old_data_path = unicode(AppLocation.get_data_path())
|
||||||
|
# Copy OpenLP data to new location if requested.
|
||||||
|
if self.copyData:
|
||||||
|
log.info(u'Copying data to new path')
|
||||||
|
try:
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
Receiver.send_message(u'cursor_busy')
|
||||||
|
self.showStatusMessage(
|
||||||
|
translate('OpenLP.MainWindow',
|
||||||
|
'Copying OpenLP data to new data directory location - %s '
|
||||||
|
'- Please wait for copy to finish'
|
||||||
|
% self.newDataPath))
|
||||||
|
dir_util.copy_tree(old_data_path, self.newDataPath)
|
||||||
|
log.info(u'Copy sucessful')
|
||||||
|
except (IOError, os.error, DistutilsFileError), why:
|
||||||
|
Receiver.send_message(u'cursor_normal')
|
||||||
|
log.exception(u'Data copy failed %s' % unicode(why))
|
||||||
|
QtGui.QMessageBox.critical(self,
|
||||||
|
translate('OpenLP.MainWindow', 'New Data Directory Error'),
|
||||||
|
translate('OpenLP.MainWindow',
|
||||||
|
'OpenLP Data directory copy failed\n\n%s'
|
||||||
|
% unicode(why)),
|
||||||
|
QtGui.QMessageBox.StandardButtons(
|
||||||
|
QtGui.QMessageBox.Ok))
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
log.info(u'No data copy requested')
|
||||||
|
# Change the location of data directory in config file.
|
||||||
|
settings = QtCore.QSettings()
|
||||||
|
settings.setValue(u'advanced/data path', self.newDataPath)
|
||||||
|
# Check if the new data path is our default.
|
||||||
|
if self.newDataPath == AppLocation.get_directory(AppLocation.DataDir):
|
||||||
|
settings.remove(u'advanced/data path')
|
||||||
|
@ -29,7 +29,7 @@ The :mod:`settingsform` provides a user interface for the OpenLP settings
|
|||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from PyQt4 import QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import Receiver, build_icon, PluginStatus
|
from openlp.core.lib import Receiver, build_icon, PluginStatus
|
||||||
from openlp.core.ui import AdvancedTab, GeneralTab, ThemesTab
|
from openlp.core.ui import AdvancedTab, GeneralTab, ThemesTab
|
||||||
|
@ -126,6 +126,11 @@ class AppLocation(object):
|
|||||||
"""
|
"""
|
||||||
Return the path OpenLP stores all its data under.
|
Return the path OpenLP stores all its data under.
|
||||||
"""
|
"""
|
||||||
|
# Check if we have a different data location.
|
||||||
|
if QtCore.QSettings().contains(u'advanced/data path'):
|
||||||
|
path = unicode(QtCore.QSettings().value(
|
||||||
|
u'advanced/data path').toString())
|
||||||
|
else:
|
||||||
path = AppLocation.get_directory(AppLocation.DataDir)
|
path = AppLocation.get_directory(AppLocation.DataDir)
|
||||||
check_directory_exists(path)
|
check_directory_exists(path)
|
||||||
return path
|
return path
|
||||||
|
Loading…
Reference in New Issue
Block a user