forked from openlp/openlp
For once and for all, change the save/save as/load/etc of services.
This commit is contained in:
parent
5e730c3138
commit
3198de5c55
@ -582,16 +582,16 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
QtCore.QObject.connect(self.SettingsShortcutsItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onSettingsShortcutsItemClicked)
|
||||
QtCore.QObject.connect(self.FileNewItem, QtCore.SIGNAL(u'triggered()'),
|
||||
self.ServiceManagerContents.onNewService)
|
||||
self.ServiceManagerContents.onNewServiceClicked)
|
||||
QtCore.QObject.connect(self.FileOpenItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.ServiceManagerContents.onLoadService)
|
||||
self.ServiceManagerContents.onLoadServiceClicked)
|
||||
QtCore.QObject.connect(self.FileSaveItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.ServiceManagerContents.onQuickSaveService)
|
||||
self.ServiceManagerContents.onSaveServiceClicked)
|
||||
QtCore.QObject.connect(self.FileSaveAsItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.ServiceManagerContents.onSaveService)
|
||||
self.ServiceManagerContents.onSaveServiceAsClicked)
|
||||
# i18n set signals for languages
|
||||
QtCore.QObject.connect(self.AutoLanguageItem,
|
||||
QtCore.SIGNAL(u'toggled(bool)'), self.setAutoLanguage)
|
||||
@ -691,7 +691,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
if QtCore.QSettings().value(
|
||||
self.generalSettingsSection + u'/auto open',
|
||||
QtCore.QVariant(False)).toBool():
|
||||
self.ServiceManagerContents.onLoadService(True)
|
||||
#self.ServiceManagerContents.onLoadService(True)
|
||||
self.ServiceManagerContents.loadLastFile()
|
||||
view_mode = QtCore.QSettings().value(u'%s/view mode' % \
|
||||
self.generalSettingsSection, u'default')
|
||||
if view_mode == u'default':
|
||||
@ -805,7 +806,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
"""
|
||||
Hook to close the main window and display windows on exit
|
||||
"""
|
||||
if self.serviceNotSaved:
|
||||
if self.ServiceManagerContents.isModified():
|
||||
ret = QtGui.QMessageBox.question(self,
|
||||
translate('OpenLP.MainWindow', 'Save Changes to Service?'),
|
||||
translate('OpenLP.MainWindow', 'Your service has changed. '
|
||||
@ -816,9 +817,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
QtGui.QMessageBox.Save),
|
||||
QtGui.QMessageBox.Save)
|
||||
if ret == QtGui.QMessageBox.Save:
|
||||
self.ServiceManagerContents.onSaveService(True)
|
||||
self.cleanUp()
|
||||
event.accept()
|
||||
#self.ServiceManagerContents.onSaveService(True)
|
||||
if self.ServiceManagerContents.saveFile():
|
||||
self.cleanUp()
|
||||
event.accept()
|
||||
else:
|
||||
event.ignore()
|
||||
elif ret == QtGui.QMessageBox.Discard:
|
||||
self.cleanUp()
|
||||
event.accept()
|
||||
@ -878,6 +882,23 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
title = u'%s - %s*' % (self.mainTitle, service_name)
|
||||
self.setWindowTitle(title)
|
||||
|
||||
def setServiceModified(self, modified, fileName):
|
||||
"""
|
||||
This method is called from the ServiceManager to set the title of the
|
||||
main window.
|
||||
|
||||
``modified``
|
||||
Whether or not this service has been modified.
|
||||
|
||||
``fileName``
|
||||
The file name of the service file.
|
||||
"""
|
||||
if modified:
|
||||
title = u'%s - %s*' % (self.mainTitle, fileName)
|
||||
else:
|
||||
title = u'%s - %s' % (self.mainTitle, fileName)
|
||||
self.setWindowTitle(title)
|
||||
|
||||
def showStatusMessage(self, message):
|
||||
self.StatusBar.showMessage(message)
|
||||
|
||||
|
@ -37,7 +37,7 @@ from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \
|
||||
Receiver, build_icon, ItemCapabilities, SettingsManager, translate, \
|
||||
ThemeLevel
|
||||
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm
|
||||
from openlp.core.utils import AppLocation
|
||||
from openlp.core.utils import AppLocation, split_filename
|
||||
|
||||
class ServiceManagerList(QtGui.QTreeWidget):
|
||||
"""
|
||||
@ -90,6 +90,7 @@ class ServiceManagerList(QtGui.QTreeWidget):
|
||||
mimeData.setText(u'ServiceManager')
|
||||
drag.start(QtCore.Qt.CopyAction)
|
||||
|
||||
|
||||
class ServiceManager(QtGui.QWidget):
|
||||
"""
|
||||
Manages the services. This involves taking text strings from plugins and
|
||||
@ -101,15 +102,16 @@ class ServiceManager(QtGui.QWidget):
|
||||
"""
|
||||
Sets up the service manager, toolbars, list view, et al.
|
||||
"""
|
||||
QtGui.QWidget.__init__(self)
|
||||
QtGui.QWidget.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.serviceItems = []
|
||||
self.serviceName = u''
|
||||
self.suffixes = []
|
||||
self.droppos = 0
|
||||
self.dropPosition = 0
|
||||
self.expandTabs = False
|
||||
#is a new service and has not been saved
|
||||
self.isNew = True
|
||||
self._modified = False
|
||||
self._fileName = u''
|
||||
self.serviceNoteForm = ServiceNoteForm(self.parent)
|
||||
self.serviceItemEditForm = ServiceItemEditForm(self.parent)
|
||||
#start with the layout
|
||||
@ -123,17 +125,17 @@ class ServiceManager(QtGui.QWidget):
|
||||
translate('OpenLP.ServiceManager', 'New Service'),
|
||||
u':/general/general_new.png',
|
||||
translate('OpenLP.ServiceManager', 'Create a new service'),
|
||||
self.onNewService)
|
||||
self.onNewServiceClicked)
|
||||
self.toolbar.addToolbarButton(
|
||||
translate('OpenLP.ServiceManager', 'Open Service'),
|
||||
u':/general/general_open.png',
|
||||
translate('OpenLP.ServiceManager', 'Load an existing service'),
|
||||
self.onLoadService)
|
||||
self.onLoadServiceClicked)
|
||||
self.toolbar.addToolbarButton(
|
||||
translate('OpenLP.ServiceManager', 'Save Service'),
|
||||
u':/general/general_save.png',
|
||||
translate('OpenLP.ServiceManager', 'Save this service'),
|
||||
self.onQuickSaveService)
|
||||
self.onSaveServiceClicked)
|
||||
self.toolbar.addSeparator()
|
||||
self.themeLabel = QtGui.QLabel(translate('OpenLP.ServiceManager',
|
||||
'Theme:'), self)
|
||||
@ -282,6 +284,40 @@ class ServiceManager(QtGui.QWidget):
|
||||
self.menu.addMenu(self.themeMenu)
|
||||
self.configUpdated(True)
|
||||
|
||||
def setModified(self, modified=True):
|
||||
"""
|
||||
Setter for property "modified". Sets whether or not the current service
|
||||
has been modified.
|
||||
"""
|
||||
self._modified = modified
|
||||
serviceFile = self.shortFileName() or u'Untitled Service'
|
||||
self.parent.setServiceModified(modified, serviceFile)
|
||||
|
||||
def isModified(self):
|
||||
"""
|
||||
Getter for boolean property "modified".
|
||||
"""
|
||||
return self._modified
|
||||
|
||||
def setFileName(self, fileName):
|
||||
"""
|
||||
Setter for service file.
|
||||
"""
|
||||
self._fileName = unicode(fileName)
|
||||
self.parent.setServiceModified(self.isModified, self.shortFileName())
|
||||
|
||||
def fileName(self):
|
||||
"""
|
||||
Return the current file name including path.
|
||||
"""
|
||||
return self._fileName
|
||||
|
||||
def shortFileName(self):
|
||||
"""
|
||||
Return the current file name, excluding the path.
|
||||
"""
|
||||
return split_filename(self._fileName)[1]
|
||||
|
||||
def configUpdated(self, firstTime=False):
|
||||
"""
|
||||
Triggered when Config dialog is updated.
|
||||
@ -295,6 +331,201 @@ class ServiceManager(QtGui.QWidget):
|
||||
def supportedSuffixes(self, suffix):
|
||||
self.suffixes.append(suffix)
|
||||
|
||||
def onNewServiceClicked(self):
|
||||
"""
|
||||
Create a new service.
|
||||
"""
|
||||
if self.isModified():
|
||||
result = QtGui.QMessageBox.question(self.parent,
|
||||
translate('OpenLP.ServiceManager', 'Save Changes'),
|
||||
translate('OpenLP.ServiceManager', 'The current service has '
|
||||
'been modified, would you like to save it?'),
|
||||
QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard |
|
||||
QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Save)
|
||||
if result == QtGui.QMessageBox.Cancel:
|
||||
return False
|
||||
elif result == QtGui.QMessageBox.Save:
|
||||
if not self.saveFile():
|
||||
return False
|
||||
self.serviceManagerList.clear()
|
||||
self.serviceItems = []
|
||||
self.setFileName(u'')
|
||||
self.setModified(False)
|
||||
|
||||
def onLoadServiceClicked(self):
|
||||
if self.isModified():
|
||||
result = QtGui.QMessageBox.question(self.parent,
|
||||
translate('OpenLP.ServiceManager', 'Save Changes'),
|
||||
translate('OpenLP.ServiceManager', 'The current service has '
|
||||
'been modified, would you like to save it?'),
|
||||
QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard |
|
||||
QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Save)
|
||||
if result == QtGui.QMessageBox.Cancel:
|
||||
return False
|
||||
elif result == QtGui.QMessageBox.Save:
|
||||
self.saveFile()
|
||||
fileName = unicode(QtGui.QFileDialog.getOpenFileName(self.parent,
|
||||
translate('OpenLP.ServiceManager', 'Open File'),
|
||||
SettingsManager.get_last_dir(self.parent.serviceSettingsSection),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'OpenLP Service Files (*.osz) (*.osz)')))
|
||||
if not fileName:
|
||||
return False
|
||||
SettingsManager.set_last_dir(self.parent.serviceSettingsSection,
|
||||
split_filename(fileName)[0])
|
||||
self.loadFile(fileName)
|
||||
|
||||
def onSaveServiceClicked(self):
|
||||
self.saveFile()
|
||||
|
||||
def onSaveServiceAsClicked(self):
|
||||
self.saveFileAs()
|
||||
|
||||
def saveFile(self):
|
||||
"""
|
||||
Save the current Service file.
|
||||
"""
|
||||
if not self.fileName():
|
||||
return self.saveFileAs()
|
||||
else:
|
||||
fileName = self.fileName()
|
||||
log.debug(u'ServiceManager.saveFile - %s' % fileName)
|
||||
SettingsManager.set_last_dir(self.parent.serviceSettingsSection,
|
||||
split_filename(fileName)[0])
|
||||
service = []
|
||||
serviceFileName = fileName.replace(u'.osz', u'.osd')
|
||||
zip = None
|
||||
file = None
|
||||
try:
|
||||
write_list = []
|
||||
zip = zipfile.ZipFile(unicode(fileName), 'w')
|
||||
for item in self.serviceItems:
|
||||
service.append({u'serviceitem': \
|
||||
item[u'service_item'].get_service_repr()})
|
||||
if item[u'service_item'].uses_file():
|
||||
for frame in item[u'service_item'].get_frames():
|
||||
if item[u'service_item'].is_image():
|
||||
path_from = frame[u'path']
|
||||
else:
|
||||
path_from = unicode(os.path.join(
|
||||
frame[u'path'],
|
||||
frame[u'title']))
|
||||
# On write a file once
|
||||
if not path_from in write_list:
|
||||
write_list.append(path_from)
|
||||
zip.write(path_from.encode(u'utf-8'))
|
||||
file = open(serviceFileName, u'wb')
|
||||
cPickle.dump(service, file)
|
||||
file.close()
|
||||
zip.write(serviceFileName.encode(u'utf-8'))
|
||||
except IOError:
|
||||
log.exception(u'Failed to save service to disk')
|
||||
finally:
|
||||
if file:
|
||||
file.close()
|
||||
if zip:
|
||||
zip.close()
|
||||
try:
|
||||
os.remove(serviceFileName)
|
||||
except (IOError, OSError):
|
||||
# if not present do not worry
|
||||
pass
|
||||
self.parent.addRecentFile(fileName)
|
||||
self.setModified(False)
|
||||
return True
|
||||
|
||||
def saveFileAs(self):
|
||||
"""
|
||||
Get a file name and then call :function:`ServiceManager.saveFile` to
|
||||
save the file.
|
||||
"""
|
||||
fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.parent,
|
||||
translate('OpenLP.ServiceManager', 'Save Service'),
|
||||
SettingsManager.get_last_dir(self.parent.serviceSettingsSection),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'OpenLP Service Files (*.osz) (*.osz)')))
|
||||
if not fileName:
|
||||
return False
|
||||
if os.path.splitext(fileName)[1] == u'':
|
||||
fileName += u'.osz'
|
||||
else:
|
||||
ext = os.path.splitext(fileName)[1]
|
||||
fileName.replace(ext, u'.osz')
|
||||
self.setFileName(fileName)
|
||||
return self.saveFile()
|
||||
|
||||
def loadFile(self, fileName):
|
||||
if not fileName:
|
||||
return False
|
||||
zip = None
|
||||
fileTo = None
|
||||
try:
|
||||
zip = zipfile.ZipFile(unicode(fileName))
|
||||
for file in zip.namelist():
|
||||
try:
|
||||
ucsfile = file.decode(u'utf-8')
|
||||
except UnicodeDecodeError:
|
||||
QtGui.QMessageBox.critical(
|
||||
self, translate('OpenLP.ServiceManager', 'Error'),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'File is not a valid service.\n'
|
||||
'The content encoding is not UTF-8.'))
|
||||
log.exception(u'Filename "%s" is not valid UTF-8' %
|
||||
file.decode(u'utf-8', u'replace'))
|
||||
continue
|
||||
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
|
||||
filePath = os.path.join(self.servicePath,
|
||||
split_filename(osfile)[1])
|
||||
fileTo = open(filePath, u'wb')
|
||||
fileTo.write(zip.read(file))
|
||||
fileTo.flush()
|
||||
fileTo.close()
|
||||
if file_path.endswith(u'osd'):
|
||||
p_file = file_path
|
||||
if 'p_file' in locals():
|
||||
fileTo = open(p_file, u'r')
|
||||
items = cPickle.load(fileTo)
|
||||
fileTo.close()
|
||||
self.onNewService()
|
||||
for item in items:
|
||||
serviceItem = ServiceItem()
|
||||
serviceItem.render_manager = self.parent.renderManager
|
||||
serviceItem.set_from_service(item, self.servicePath)
|
||||
self.validateItem(serviceItem)
|
||||
self.addServiceItem(serviceItem)
|
||||
if serviceItem.is_capable(
|
||||
ItemCapabilities.OnLoadUpdate):
|
||||
Receiver.send_message(u'%s_service_load' %
|
||||
serviceItem.name.lower(), serviceItem)
|
||||
try:
|
||||
if os.path.isfile(p_file):
|
||||
os.remove(p_file)
|
||||
except (IOError, OSError):
|
||||
log.exception(u'Failed to remove osd file')
|
||||
else:
|
||||
QtGui.QMessageBox.critical(
|
||||
self, translate('OpenLP.ServiceManager', 'Error'),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'File is not a valid service.'))
|
||||
log.exception(u'File contains no service data')
|
||||
except (IOError, NameError):
|
||||
log.exception(u'Problem loading a service file')
|
||||
finally:
|
||||
if fileTo:
|
||||
fileTo.close()
|
||||
if zip:
|
||||
zip.close()
|
||||
self.setFileName(fileName)
|
||||
self.parent.addRecentFile(fileName)
|
||||
self.setModified(False)
|
||||
# Refresh Plugin lists
|
||||
Receiver.send_message(u'plugin_list_refresh')
|
||||
|
||||
def loadLastFile(self):
|
||||
if not self.parent.recentFiles:
|
||||
return
|
||||
self.loadFile(self.parent.recentFiles[0])
|
||||
|
||||
def contextMenu(self, point):
|
||||
item = self.serviceManagerList.itemAt(point)
|
||||
if item is None:
|
||||
@ -427,6 +658,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
# Top Item was selected so set the last one
|
||||
if setLastItem:
|
||||
lastItem.setSelected(True)
|
||||
self.isModified = True
|
||||
|
||||
def onMoveSelectionDown(self):
|
||||
"""
|
||||
@ -449,6 +681,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
serviceIterator += 1
|
||||
if setSelected:
|
||||
firstItem.setSelected(True)
|
||||
self.isModified = True
|
||||
|
||||
def onCollapseAll(self):
|
||||
"""
|
||||
@ -492,7 +725,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
self.serviceItems.remove(self.serviceItems[item])
|
||||
self.serviceItems.insert(0, temp)
|
||||
self.repaintServiceList(0, count)
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.isModified = True
|
||||
|
||||
def onServiceUp(self):
|
||||
"""
|
||||
@ -505,7 +738,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
self.serviceItems.remove(self.serviceItems[item])
|
||||
self.serviceItems.insert(item - 1, temp)
|
||||
self.repaintServiceList(item - 1, count)
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.setModified(True)
|
||||
|
||||
def onServiceDown(self):
|
||||
"""
|
||||
@ -518,7 +751,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
self.serviceItems.remove(self.serviceItems[item])
|
||||
self.serviceItems.insert(item + 1, temp)
|
||||
self.repaintServiceList(item + 1, count)
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.setModified(True)
|
||||
|
||||
def onServiceEnd(self):
|
||||
"""
|
||||
@ -530,30 +763,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
self.serviceItems.remove(self.serviceItems[item])
|
||||
self.serviceItems.insert(len(self.serviceItems), temp)
|
||||
self.repaintServiceList(len(self.serviceItems) - 1, count)
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
|
||||
def onNewService(self):
|
||||
"""
|
||||
Clear the list to create a new service
|
||||
"""
|
||||
if self.parent.serviceNotSaved and QtCore.QSettings().value(
|
||||
self.parent.generalSettingsSection + u'/save prompt',
|
||||
QtCore.QVariant(False)).toBool():
|
||||
ret = QtGui.QMessageBox.question(self,
|
||||
translate('OpenLP.ServiceManager', 'Save Changes to Service?'),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'Your service is unsaved, do you want to save '
|
||||
'those changes before creating a new one?'),
|
||||
QtGui.QMessageBox.StandardButtons(
|
||||
QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Save),
|
||||
QtGui.QMessageBox.Save)
|
||||
if ret == QtGui.QMessageBox.Save:
|
||||
self.onSaveService()
|
||||
self.serviceManagerList.clear()
|
||||
self.serviceItems = []
|
||||
self.serviceName = u''
|
||||
self.isNew = True
|
||||
self.parent.serviceChanged(True, self.serviceName)
|
||||
self.setModified(True)
|
||||
|
||||
def onDeleteFromService(self):
|
||||
"""
|
||||
@ -563,13 +773,19 @@ class ServiceManager(QtGui.QWidget):
|
||||
if item is not -1:
|
||||
self.serviceItems.remove(self.serviceItems[item])
|
||||
self.repaintServiceList(0, 0)
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.setModified(True)
|
||||
|
||||
def repaintServiceList(self, serviceItem, serviceItemCount):
|
||||
"""
|
||||
Clear the existing service list and prepaint all the items
|
||||
Used when moving items as the move takes place in supporting array,
|
||||
and when regenerating all the items due to theme changes
|
||||
Clear the existing service list and prepaint all the items. This is
|
||||
used when moving items as the move takes place in a supporting list,
|
||||
and when regenerating all the items due to theme changes.
|
||||
|
||||
``serviceItem``
|
||||
The item which changed.
|
||||
|
||||
``serviceItemCount``
|
||||
The number of items in the service.
|
||||
"""
|
||||
# Correct order of items in array
|
||||
count = 1
|
||||
@ -615,183 +831,6 @@ class ServiceManager(QtGui.QWidget):
|
||||
item[u'expanded'] = temp
|
||||
treewidgetitem.setExpanded(item[u'expanded'])
|
||||
|
||||
def onSaveService(self, quick=False):
|
||||
"""
|
||||
Save the current service in a zip (OSZ) file
|
||||
This file contains
|
||||
* An osd which is a pickle of the service items
|
||||
* All image, presentation and video files needed to run the service.
|
||||
"""
|
||||
log.debug(u'onSaveService %s' % quick)
|
||||
if not quick or self.isNew:
|
||||
filename = QtGui.QFileDialog.getSaveFileName(self,
|
||||
translate('OpenLP.ServiceManager', 'Save Service'),
|
||||
SettingsManager.get_last_dir(self.parent.serviceSettingsSection),
|
||||
translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz)'))
|
||||
else:
|
||||
filename = os.path.join(SettingsManager.get_last_dir(
|
||||
self.parent.serviceSettingsSection), self.serviceName)
|
||||
if filename:
|
||||
filename = QtCore.QDir.toNativeSeparators(filename)
|
||||
splittedFile = filename.split(u'.')
|
||||
if splittedFile[-1] != u'osz':
|
||||
filename = filename + u'.osz'
|
||||
filename = unicode(filename)
|
||||
self.isNew = False
|
||||
SettingsManager.set_last_dir(self.parent.serviceSettingsSection,
|
||||
os.path.split(filename)[0])
|
||||
service = []
|
||||
servicefile = filename + u'.osd'
|
||||
zip = None
|
||||
file = None
|
||||
try:
|
||||
write_list = []
|
||||
zip = zipfile.ZipFile(unicode(filename), 'w')
|
||||
for item in self.serviceItems:
|
||||
service.append({u'serviceitem':item[u'service_item']
|
||||
.get_service_repr()})
|
||||
if item[u'service_item'].uses_file():
|
||||
for frame in item[u'service_item'].get_frames():
|
||||
if item[u'service_item'].is_image():
|
||||
path_from = frame[u'path']
|
||||
else:
|
||||
path_from = unicode(os.path.join(
|
||||
frame[u'path'],
|
||||
frame[u'title']))
|
||||
# On write a file once
|
||||
if not path_from in write_list:
|
||||
write_list.append(path_from)
|
||||
zip.write(path_from.encode(u'utf-8'))
|
||||
file = open(servicefile, u'wb')
|
||||
cPickle.dump(service, file)
|
||||
file.close()
|
||||
zip.write(servicefile.encode(u'utf-8'))
|
||||
except IOError:
|
||||
log.exception(u'Failed to save service to disk')
|
||||
finally:
|
||||
if file:
|
||||
file.close()
|
||||
if zip:
|
||||
zip.close()
|
||||
try:
|
||||
os.remove(servicefile)
|
||||
except (IOError, OSError):
|
||||
pass #if not present do not worry
|
||||
name = filename.split(os.path.sep)
|
||||
self.serviceName = name[-1]
|
||||
self.parent.addRecentFile(filename)
|
||||
self.parent.serviceChanged(True, self.serviceName)
|
||||
|
||||
def onQuickSaveService(self):
|
||||
self.onSaveService(True)
|
||||
|
||||
def onLoadService(self, lastService=False):
|
||||
if lastService:
|
||||
if not self.parent.recentFiles:
|
||||
return
|
||||
filename = self.parent.recentFiles[0]
|
||||
else:
|
||||
filename = QtGui.QFileDialog.getOpenFileName(
|
||||
self, translate('OpenLP.ServiceManager', 'Open Service'),
|
||||
SettingsManager.get_last_dir(
|
||||
self.parent.serviceSettingsSection), u'Services (*.osz)')
|
||||
filename = QtCore.QDir.toNativeSeparators(filename)
|
||||
self.loadService(filename)
|
||||
|
||||
def loadService(self, filename=None):
|
||||
"""
|
||||
Load an existing service from disk and rebuild the serviceitems. All
|
||||
files retrieved from the zip file are placed in a temporary directory
|
||||
and will only be used for this service.
|
||||
"""
|
||||
if self.parent.serviceNotSaved:
|
||||
ret = QtGui.QMessageBox.question(self,
|
||||
translate('OpenLP.ServiceManager', 'Save Changes to Service?'),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'Your current service is unsaved, do you want to '
|
||||
'save the changes before opening a new one?'),
|
||||
QtGui.QMessageBox.StandardButtons(
|
||||
QtGui.QMessageBox.Discard | QtGui.QMessageBox.Save),
|
||||
QtGui.QMessageBox.Save)
|
||||
if ret == QtGui.QMessageBox.Save:
|
||||
self.onSaveService()
|
||||
if filename is None:
|
||||
action = self.sender()
|
||||
if isinstance(action, QtGui.QAction):
|
||||
filename = action.data().toString()
|
||||
else:
|
||||
return
|
||||
filename = unicode(filename)
|
||||
name = filename.split(os.path.sep)
|
||||
if filename:
|
||||
SettingsManager.set_last_dir(self.parent.serviceSettingsSection,
|
||||
os.path.split(filename)[0])
|
||||
zip = None
|
||||
file_to = None
|
||||
try:
|
||||
zip = zipfile.ZipFile(unicode(filename))
|
||||
for file in zip.namelist():
|
||||
try:
|
||||
ucsfile = file.decode(u'utf-8')
|
||||
except UnicodeDecodeError:
|
||||
QtGui.QMessageBox.critical(
|
||||
self, translate('OpenLP.ServiceManager', 'Error'),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'File is not a valid service.\n'
|
||||
'The content encoding is not UTF-8.'))
|
||||
log.exception(u'Filename "%s" is not valid UTF-8' %
|
||||
file.decode(u'utf-8', u'replace'))
|
||||
continue
|
||||
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
|
||||
names = osfile.split(os.path.sep)
|
||||
file_path = os.path.join(self.servicePath,
|
||||
names[len(names) - 1])
|
||||
file_to = open(file_path, u'wb')
|
||||
file_to.write(zip.read(file))
|
||||
file_to.flush()
|
||||
file_to.close()
|
||||
if file_path.endswith(u'osd'):
|
||||
p_file = file_path
|
||||
if 'p_file' in locals():
|
||||
file_to = open(p_file, u'r')
|
||||
items = cPickle.load(file_to)
|
||||
file_to.close()
|
||||
self.onNewService()
|
||||
for item in items:
|
||||
serviceitem = ServiceItem()
|
||||
serviceitem.render_manager = self.parent.renderManager
|
||||
serviceitem.set_from_service(item, self.servicePath)
|
||||
self.validateItem(serviceitem)
|
||||
self.addServiceItem(serviceitem)
|
||||
if serviceitem.is_capable(
|
||||
ItemCapabilities.OnLoadUpdate):
|
||||
Receiver.send_message(u'%s_service_load' %
|
||||
serviceitem.name.lower(), serviceitem)
|
||||
try:
|
||||
if os.path.isfile(p_file):
|
||||
os.remove(p_file)
|
||||
except (IOError, OSError):
|
||||
log.exception(u'Failed to remove osd file')
|
||||
else:
|
||||
QtGui.QMessageBox.critical(
|
||||
self, translate('OpenLP.ServiceManager', 'Error'),
|
||||
translate('OpenLP.ServiceManager',
|
||||
'File is not a valid service.'))
|
||||
log.exception(u'File contains no service data')
|
||||
except (IOError, NameError):
|
||||
log.exception(u'Problem loading a service file')
|
||||
finally:
|
||||
if file_to:
|
||||
file_to.close()
|
||||
if zip:
|
||||
zip.close()
|
||||
self.isNew = False
|
||||
self.serviceName = name[len(name) - 1]
|
||||
self.parent.addRecentFile(filename)
|
||||
self.parent.serviceChanged(True, self.serviceName)
|
||||
# Refresh Plugin lists
|
||||
Receiver.send_message(u'plugin_list_refresh')
|
||||
|
||||
def validateItem(self, serviceItem):
|
||||
"""
|
||||
Validates the service item and if the suffix matches an accepted
|
||||
@ -857,7 +896,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
item[u'service_item'], False, expand=item[u'expanded'])
|
||||
# Set to False as items may have changed rendering
|
||||
# does not impact the saved song so True may also be valid
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.setModified(True)
|
||||
|
||||
def serviceItemUpdate(self, message):
|
||||
"""
|
||||
@ -881,7 +920,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
item[u'service_item'] = newItem
|
||||
self.repaintServiceList(itemcount + 1, 0)
|
||||
self.parent.liveController.replaceServiceManagerItem(newItem)
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.setModified(True)
|
||||
|
||||
def addServiceItem(self, item, rebuild=False, expand=None, replace=False):
|
||||
"""
|
||||
@ -905,7 +944,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
self.parent.liveController.replaceServiceManagerItem(item)
|
||||
else:
|
||||
# nothing selected for dnd
|
||||
if self.droppos == 0:
|
||||
if self.dropPosition == 0:
|
||||
if isinstance(item, list):
|
||||
for inditem in item:
|
||||
self.serviceItems.append({u'service_item': inditem,
|
||||
@ -917,15 +956,15 @@ class ServiceManager(QtGui.QWidget):
|
||||
u'expanded':expand})
|
||||
self.repaintServiceList(len(self.serviceItems) + 1, 0)
|
||||
else:
|
||||
self.serviceItems.insert(self.droppos, {u'service_item': item,
|
||||
u'order': self.droppos,
|
||||
self.serviceItems.insert(self.dropPosition, {u'service_item': item,
|
||||
u'order': self.dropPosition,
|
||||
u'expanded':expand})
|
||||
self.repaintServiceList(self.droppos, 0)
|
||||
self.repaintServiceList(self.dropPosition, 0)
|
||||
# if rebuilding list make sure live is fixed.
|
||||
if rebuild:
|
||||
self.parent.liveController.replaceServiceManagerItem(item)
|
||||
self.droppos = 0
|
||||
self.parent.serviceChanged(False, self.serviceName)
|
||||
self.dropPosition = 0
|
||||
self.setModified(True)
|
||||
|
||||
def makePreview(self):
|
||||
"""
|
||||
@ -1045,7 +1084,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
# we are not over anything so drop
|
||||
replace = False
|
||||
if item is None:
|
||||
self.droppos = len(self.serviceItems)
|
||||
self.dropPosition = len(self.serviceItems)
|
||||
else:
|
||||
# we are over somthing so lets investigate
|
||||
pos = self._getParentItemData(item) - 1
|
||||
@ -1056,14 +1095,14 @@ class ServiceManager(QtGui.QWidget):
|
||||
action = self.dndMenu.exec_(QtGui.QCursor.pos())
|
||||
# New action required
|
||||
if action == self.newAction:
|
||||
self.droppos = self._getParentItemData(item)
|
||||
self.dropPosition = self._getParentItemData(item)
|
||||
# Append to existing action
|
||||
if action == self.addToAction:
|
||||
self.droppos = self._getParentItemData(item)
|
||||
self.dropPosition = self._getParentItemData(item)
|
||||
item.setSelected(True)
|
||||
replace = True
|
||||
else:
|
||||
self.droppos = self._getParentItemData(item)
|
||||
self.dropPosition = self._getParentItemData(item)
|
||||
Receiver.send_message(u'%s_add_service_item' % plugin, replace)
|
||||
|
||||
def updateThemeList(self, theme_list):
|
||||
@ -1119,4 +1158,4 @@ class ServiceManager(QtGui.QWidget):
|
||||
data_item[u'notes'] = unicode(service_item.notes)
|
||||
data_item[u'selected'] = (item == curitem)
|
||||
data.append(data_item)
|
||||
Receiver.send_message(u'servicemanager_list_response', data)
|
||||
Receiver.send_message(u'servicemanager_list_response', data)
|
||||
|
@ -275,8 +275,15 @@ def get_images_filter():
|
||||
visible_formats, actual_formats)
|
||||
return images_filter
|
||||
|
||||
def split_filename(path):
|
||||
path = os.path.abspath(path)
|
||||
if not os.path.isfile(path):
|
||||
return path, u''
|
||||
else:
|
||||
return os.path.split(path)
|
||||
|
||||
from languagemanager import LanguageManager
|
||||
from actions import ActionList
|
||||
|
||||
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
|
||||
u'get_filesystem_encoding', u'LanguageManager', u'ActionList']
|
||||
u'get_filesystem_encoding', u'LanguageManager', u'ActionList']
|
||||
|
Loading…
Reference in New Issue
Block a user