From 3198de5c555e28c59073cc71b1d1d6a7e7f6a176 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 31 Dec 2010 23:43:02 +0200 Subject: [PATCH 1/7] For once and for all, change the save/save as/load/etc of services. --- openlp/core/ui/mainwindow.py | 39 ++- openlp/core/ui/servicemanager.py | 495 +++++++++++++++++-------------- openlp/core/utils/__init__.py | 9 +- 3 files changed, 305 insertions(+), 238 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index b88f69910..7beae55fa 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -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) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index e2c1a765b..18dba7058 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -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) \ No newline at end of file + Receiver.send_message(u'servicemanager_list_response', data) diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index ff354b1c6..54bd78ccc 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -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'] \ No newline at end of file + u'get_filesystem_encoding', u'LanguageManager', u'ActionList'] From f7943d5746574a32e249c44e6ff354e70c031de1 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 1 Jan 2011 01:06:35 +0200 Subject: [PATCH 2/7] Add in an error message if there is a problem with the user's downloaded Bibles. --- openlp/plugins/bibles/lib/http.py | 19 +++++++++++++++++-- openlp/plugins/bibles/lib/mediaitem.py | 11 +++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index e0aeafa48..219c845fb 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -28,6 +28,7 @@ import logging import os import re import sqlite3 +import socket import urllib import urllib2 from HTMLParser import HTMLParseError @@ -184,6 +185,7 @@ class BGExtract(object): def __init__(self, proxyurl=None): log.debug(u'init %s', proxyurl) self.proxyurl = proxyurl + socket.setdefaulttimeout(30) def get_bible_chapter(self, version, bookname, chapter): """ @@ -210,6 +212,7 @@ class BGExtract(object): Receiver.send_message(u'openlp_process_events') except urllib2.URLError: log.exception(u'The web bible page could not be downloaded.') + Receiver.send_message(u'bibles_download_error') finally: if not page: return None @@ -219,6 +222,7 @@ class BGExtract(object): soup = BeautifulSoup(page, markupMassage=cleaner) except HTMLParseError: log.exception(u'BeautifulSoup could not parse the bible page.') + Receiver.send_message(u'bibles_download_error') finally: if not soup: return None @@ -247,6 +251,7 @@ class BSExtract(object): def __init__(self, proxyurl=None): log.debug(u'init %s', proxyurl) self.proxyurl = proxyurl + socket.setdefaulttimeout(30) def get_bible_chapter(self, version, bookname, chapter): """ @@ -264,7 +269,7 @@ class BSExtract(object): log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \ (version, bookname, chapter) - + log.debug(u'URL: %s', chapter_url) page = None try: @@ -272,6 +277,7 @@ class BSExtract(object): Receiver.send_message(u'openlp_process_events') except urllib2.URLError: log.exception(u'The web bible page could not be downloaded.') + Receiver.send_message(u'bibles_download_error') finally: if not page: return None @@ -280,6 +286,7 @@ class BSExtract(object): soup = BeautifulSoup(page) except HTMLParseError: log.exception(u'BeautifulSoup could not parse the bible page.') + Receiver.send_message(u'bibles_download_error') finally: if not soup: return None @@ -308,6 +315,7 @@ class CWExtract(object): def __init__(self, proxyurl=None): log.debug(u'init %s', proxyurl) self.proxyurl = proxyurl + socket.setdefaulttimeout(30) def get_bible_chapter(self, version, bookname, chapter): """ @@ -333,6 +341,7 @@ class CWExtract(object): Receiver.send_message(u'openlp_process_events') except urllib2.URLError: log.exception(u'The web bible page could not be downloaded.') + Receiver.send_message(u'bibles_download_error') finally: if not page: return None @@ -341,6 +350,7 @@ class CWExtract(object): soup = BeautifulSoup(page) except HTMLParseError: log.exception(u'BeautifulSoup could not parse the bible page.') + Receiver.send_message(u'bibles_download_error') finally: if not soup: return None @@ -491,7 +501,12 @@ class HTTPBible(BibleDB): ev = BGExtract(self.proxy_server) elif self.download_source.lower() == u'bibleserver': ev = BSExtract(self.proxy_server) - return ev.get_bible_chapter(self.download_name, book, chapter) + try: + return ev.get_bible_chapter(self.download_name, book, chapter) + except: + log.exception(u'Error occurred while downloading verses') + Receiver.send_message(u'bibles_download_error') + return None def get_books(self): """ diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 3f5ed41e4..39225acf1 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -261,6 +261,8 @@ class BibleMediaItem(MediaManagerItem): QtCore.SIGNAL(u'bibles_hideprogress'), self.onSearchProgressHide) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'bibles_nobook'), self.onNoBookFound) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'bibles_download_error'), self.onDownloadError) def addListViewToToolBar(self): MediaManagerItem.addListViewToToolBar(self) @@ -367,6 +369,15 @@ class BibleMediaItem(MediaManagerItem): 'No matching book could be found in this Bible.')) self.AdvancedSearchButton.setEnabled(True) + def onDownloadError(self): + QtGui.QMessageBox.critical(self, + translate('BiblesPlugin.MediaItem', 'Download Error'), + translate('BiblesPlugin.MediaItem', + 'There was a problem downloading your verse selection. Please ' + 'check your Internet connection, and if this error continues to ' + 'occur please consider reporting a bug.')) + self.AdvancedSearchButton.setEnabled(True) + def onImportClick(self): if not hasattr(self, u'import_wizard'): self.import_wizard = BibleImportForm(self, self.parent.manager, From 4bb59bff6734339064c83a721e54c2a221bb54f2 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 1 Jan 2011 12:33:14 +0200 Subject: [PATCH 3/7] Fix bug #641661 --- openlp/core/lib/eventreceiver.py | 2 +- openlp/core/ui/mainwindow.py | 19 +++++++- openlp/plugins/bibles/lib/db.py | 14 +++--- openlp/plugins/bibles/lib/http.py | 66 +++++++++++++++++--------- openlp/plugins/bibles/lib/mediaitem.py | 20 -------- 5 files changed, 70 insertions(+), 51 deletions(-) diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 4f69c519f..b39173849 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -278,4 +278,4 @@ class Receiver(object): """ Get the global ``eventreceiver`` instance. """ - return Receiver.eventreceiver \ No newline at end of file + return Receiver.eventreceiver diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a378dd633..ee15b31b1 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -612,6 +612,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'maindisplay_status_text'), self.showStatusMessage) + # Simple message boxes + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'openlp_error_message'), self.onErrorMessage) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'openlp_warning_message'), self.onWarningMessage) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'openlp_information_message'), + self.onInformationMessage) # warning cyclic dependency # RenderManager needs to call ThemeManager and # ThemeManager needs to call RenderManager @@ -720,6 +728,15 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): translate('OpenLP.MainWindow', 'The Main Display has been blanked out')) + def onErrorMessage(self, data): + QtGui.QMessageBox.critical(self, data[u'title'], data[u'message']) + + def onWarningMessage(self, data): + QtGui.QMessageBox.warning(self, data[u'title'], data[u'message']) + + def onInformationMessage(self, data): + QtGui.QMessageBox.information(self, data[u'title'], data[u'message']) + def onHelpWebSiteClicked(self): """ Load the OpenLP website @@ -834,7 +851,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): else: ret = QtGui.QMessageBox.question(self, translate('OpenLP.MainWindow', 'Close OpenLP'), - translate('OpenLP.MainWindow', 'Are you sure you want to Exit?'), + translate('OpenLP.MainWindow', 'Are you sure you want to close OpenLP?'), QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 5f37f3c73..62068437a 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -33,7 +33,7 @@ from sqlalchemy import Column, ForeignKey, or_, Table, types from sqlalchemy.orm import class_mapper, mapper, relation from sqlalchemy.orm.exc import UnmappedClassError -from openlp.core.lib import translate +from openlp.core.lib import Receiver, translate from openlp.core.lib.db import BaseModel, init_db, Manager log = logging.getLogger(__name__) @@ -354,12 +354,12 @@ class BibleDB(QtCore.QObject, Manager): verse_list.extend(verses) else: log.debug(u'OpenLP failed to find book %s', book) - QtGui.QMessageBox.information(self.bible_plugin.mediaItem, - translate('BiblesPlugin.BibleDB', 'Book not found'), - translate('BiblesPlugin.BibleDB', 'The book you requested ' - 'could not be found in this Bible. Please check your ' - 'spelling and that this is a complete Bible not just ' - 'one testament.')) + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblesPlugin', 'No Book Found'), + u'message': translate('BiblesPlugin', 'No matching book ' + 'could be found in this Bible. Check that you have ' + 'spelled the name of the book correctly.') + }) return verse_list def verse_search(self, text): diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 219c845fb..a4f93f929 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -35,7 +35,7 @@ from HTMLParser import HTMLParseError from BeautifulSoup import BeautifulSoup, NavigableString -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, translate from openlp.core.utils import AppLocation from openlp.plugins.bibles.lib import SearchResults from openlp.plugins.bibles.lib.db import BibleDB, Book @@ -212,7 +212,13 @@ class BGExtract(object): Receiver.send_message(u'openlp_process_events') except urllib2.URLError: log.exception(u'The web bible page could not be downloaded.') - Receiver.send_message(u'bibles_download_error') + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblePlugin.HTTPBible', 'Download Error'), + u'message': translate('BiblePlugin.HTTPBible', 'There was a ' + 'problem downloading your verse selection. Please check your ' + 'Internet connection, and if this error continues to occur ' + 'consider reporting a bug.') + }) finally: if not page: return None @@ -277,7 +283,13 @@ class BSExtract(object): Receiver.send_message(u'openlp_process_events') except urllib2.URLError: log.exception(u'The web bible page could not be downloaded.') - Receiver.send_message(u'bibles_download_error') + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblePlugin.HTTPBible', 'Download Error'), + u'message': translate('BiblePlugin.HTTPBible', 'There was a ' + 'problem downloading your verse selection. Please check your ' + 'Internet connection, and if this error continues to occur ' + 'consider reporting a bug.') + }) finally: if not page: return None @@ -286,10 +298,13 @@ class BSExtract(object): soup = BeautifulSoup(page) except HTMLParseError: log.exception(u'BeautifulSoup could not parse the bible page.') - Receiver.send_message(u'bibles_download_error') - finally: - if not soup: - return None + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblePlugin.HTTPBible', 'Parse Error'), + u'message': translate('BiblePlugin.HTTPBible', 'There was a ' + 'problem extracting your verse selection. If this error ' + 'continues to occur consider reporting a bug.') + }) + return None Receiver.send_message(u'openlp_process_events') content = None try: @@ -341,19 +356,26 @@ class CWExtract(object): Receiver.send_message(u'openlp_process_events') except urllib2.URLError: log.exception(u'The web bible page could not be downloaded.') - Receiver.send_message(u'bibles_download_error') - finally: - if not page: - return None + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblePlugin.HTTPBible', 'Download Error'), + u'message': translate('BiblePlugin.HTTPBible', 'There was a ' + 'problem downloading your verse selection. Please check your ' + 'Internet connection, and if this error continues to occur ' + 'consider reporting a bug.') + }) + return None soup = None try: soup = BeautifulSoup(page) except HTMLParseError: log.exception(u'BeautifulSoup could not parse the bible page.') - Receiver.send_message(u'bibles_download_error') - finally: - if not soup: - return None + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblePlugin.HTTPBible', 'Parse Error'), + u'message': translate('BiblePlugin.HTTPBible', 'There was a ' + 'problem extracting your verse selection. If this error ' + 'continues to occur consider reporting a bug.') + }) + return None Receiver.send_message(u'openlp_process_events') htmlverses = soup.findAll(u'span', u'versetext') verses = {} @@ -463,7 +485,12 @@ class HTTPBible(BibleDB): if not db_book: book_details = self.lookup_book(book) if not book_details: - Receiver.send_message(u'bibles_nobook') + Receiver.send_message(u'openlp_error_message', { + u'title': translate('BiblesPlugin', 'No Book Found'), + u'message': translate('BiblesPlugin', 'No matching ' + 'book could be found in this Bible. Check that you' + 'have spelled the name of the book correctly.') + }) return [] db_book = self.create_book(book_details[u'name'], book_details[u'abbreviation'], @@ -501,12 +528,7 @@ class HTTPBible(BibleDB): ev = BGExtract(self.proxy_server) elif self.download_source.lower() == u'bibleserver': ev = BSExtract(self.proxy_server) - try: - return ev.get_bible_chapter(self.download_name, book, chapter) - except: - log.exception(u'Error occurred while downloading verses') - Receiver.send_message(u'bibles_download_error') - return None + return ev.get_bible_chapter(self.download_name, book, chapter) def get_books(self): """ diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 39225acf1..d557897ed 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -259,10 +259,6 @@ class BibleMediaItem(MediaManagerItem): QtCore.SIGNAL(u'bibles_showprogress'), self.onSearchProgressShow) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'bibles_hideprogress'), self.onSearchProgressHide) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'bibles_nobook'), self.onNoBookFound) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'bibles_download_error'), self.onDownloadError) def addListViewToToolBar(self): MediaManagerItem.addListViewToToolBar(self) @@ -362,22 +358,6 @@ class BibleMediaItem(MediaManagerItem): def onSearchProgressHide(self): self.SearchProgress.setVisible(False) - def onNoBookFound(self): - QtGui.QMessageBox.critical(self, - translate('BiblesPlugin.MediaItem', 'No Book Found'), - translate('BiblesPlugin.MediaItem', - 'No matching book could be found in this Bible.')) - self.AdvancedSearchButton.setEnabled(True) - - def onDownloadError(self): - QtGui.QMessageBox.critical(self, - translate('BiblesPlugin.MediaItem', 'Download Error'), - translate('BiblesPlugin.MediaItem', - 'There was a problem downloading your verse selection. Please ' - 'check your Internet connection, and if this error continues to ' - 'occur please consider reporting a bug.')) - self.AdvancedSearchButton.setEnabled(True) - def onImportClick(self): if not hasattr(self, u'import_wizard'): self.import_wizard = BibleImportForm(self, self.parent.manager, From b52ead934d0ba612c748836d105fc0155ce7822a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 1 Jan 2011 11:44:16 +0000 Subject: [PATCH 4/7] Add Cursor management --- openlp.pyw | 21 ++++++++++++++++++- openlp/core/ui/mainwindow.py | 2 ++ openlp/core/ui/servicemanager.py | 4 +++- openlp/plugins/images/lib/mediaitem.py | 6 ++---- openlp/plugins/presentations/lib/mediaitem.py | 2 ++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 8cc7a16a6..888cdae9f 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -162,6 +162,10 @@ class OpenLP(QtGui.QApplication): #provide a listener for widgets to reqest a screen update. QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_process_events'), self.processEvents) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'cursor_busy'), self.setBusyCursor) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor) self.setOrganizationName(u'OpenLP') self.setOrganizationDomain(u'openlp.org') self.setApplicationName(u'OpenLP') @@ -203,6 +207,21 @@ class OpenLP(QtGui.QApplication): ''.join(format_exception(exctype, value, traceback))) self.exceptionForm.exec_() + def setBusyCursor(self): + """ + Sets the Busy Cursor on the Main Window + """ + #a=c + self.setOverrideCursor(QtCore.Qt.BusyCursor) + #self.processEvents() + + def setNormalCursor(self): + """ + Sets the Normal Cursor on the Main Window + """ + self.restoreOverrideCursor() + #self.processEvents() + def main(): """ The main function which parses command line options and then runs @@ -264,4 +283,4 @@ if __name__ == u'__main__': """ Instantiate and run the application. """ - main() \ No newline at end of file + main() diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a378dd633..88b4305a2 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -612,6 +612,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'maindisplay_status_text'), self.showStatusMessage) + Receiver.send_message(u'cursor_busy') # warning cyclic dependency # RenderManager needs to call ThemeManager and # ThemeManager needs to call RenderManager @@ -659,6 +660,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): if savedPlugin != -1: self.MediaToolBox.setCurrentIndex(savedPlugin) self.settingsForm.postSetUp() + Receiver.send_message(u'cursor_normal') def setAutoLanguage(self, value): self.LanguageGroup.setDisabled(value) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index e2c1a765b..0e104a0eb 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -571,6 +571,7 @@ class ServiceManager(QtGui.QWidget): Used when moving items as the move takes place in supporting array, and when regenerating all the items due to theme changes """ + Receiver.send_message(u'cursor_busy') # Correct order of items in array count = 1 for item in self.serviceItems: @@ -614,6 +615,7 @@ class ServiceManager(QtGui.QWidget): self.serviceManagerList.setCurrentItem(treewidgetitem1) item[u'expanded'] = temp treewidgetitem.setExpanded(item[u'expanded']) + Receiver.send_message(u'cursor_normal') def onSaveService(self, quick=False): """ @@ -1119,4 +1121,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) \ No newline at end of file + Receiver.send_message(u'servicemanager_list_response', data) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 170ac3b74..1c48e3eb6 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -139,8 +139,7 @@ class ImageMediaItem(MediaManagerItem): self.settingsSection, self.getFileList()) def loadList(self, list): - self.listView.setCursor(QtCore.Qt.BusyCursor) - Receiver.send_message(u'openlp_process_events') + Receiver.send_message(u'cursor_busy') for file in list: filename = os.path.split(unicode(file))[1] thumb = os.path.join(self.servicePath, filename) @@ -155,8 +154,7 @@ class ImageMediaItem(MediaManagerItem): item_name.setIcon(icon) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.listView.addItem(item_name) - self.listView.setCursor(QtCore.Qt.ArrowCursor) - Receiver.send_message(u'openlp_process_events') + Receiver.send_message(u'cursor_normal') def generateSlideData(self, service_item, item=None, xmlVersion=False): items = self.listView.selectedIndexes() diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index e832f1a10..9b8c2c1a9 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -171,6 +171,7 @@ class PresentationMediaItem(MediaManagerItem): This is called both on initial load of the plugin to populate with existing files, and when the user adds new files via the media manager """ + Receiver.send_message(u'cursor_busy') currlist = self.getFileList() titles = [] for file in currlist: @@ -215,6 +216,7 @@ class PresentationMediaItem(MediaManagerItem): item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) item_name.setIcon(icon) self.listView.addItem(item_name) + Receiver.send_message(u'cursor_normal') def onDeleteClick(self): """ From fd92d47057850a73cd16c32c23927e50cf851ccf Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 1 Jan 2011 12:20:42 +0000 Subject: [PATCH 5/7] More changes to cursors --- openlp/core/lib/eventreceiver.py | 17 ++++++++++++++++- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/servicemanager.py | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 4f69c519f..d3cbf41f7 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -220,6 +220,21 @@ class EventReceiver(QtCore.QObject): Waits for openlp to do something "interesting" and sends a remotes_poll_response signal when it does + ``openlp_critical_message`` + Displays a standalong Critical Message + + ``openlp_error_message`` + Displays a standalong Error Message + + ``openlp_information_message`` + Displays a standalong Information Message + + ``cursor_busy`` + Makes the cursor got to a busy form + + ``cursor_normal`` + Resets the cursor to default + """ def __init__(self): """ @@ -278,4 +293,4 @@ class Receiver(object): """ Get the global ``eventreceiver`` instance. """ - return Receiver.eventreceiver \ No newline at end of file + return Receiver.eventreceiver diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index d44b43574..1a32d0df3 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -1013,7 +1013,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QFileInfo(filename).fileName()), self) action.setData(QtCore.QVariant(filename)) self.connect(action, QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.loadService) + self.ServiceManagerContents.loadFile) self.FileMenu.addAction(action) self.FileMenu.addSeparator() self.FileMenu.addAction(self.FileMenuActions[-1]) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 076e50c11..2397df1b3 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -787,7 +787,6 @@ class ServiceManager(QtGui.QWidget): ``serviceItemCount`` The number of items in the service. """ - Receiver.send_message(u'cursor_busy') # Correct order of items in array count = 1 for item in self.serviceItems: @@ -831,7 +830,6 @@ class ServiceManager(QtGui.QWidget): self.serviceManagerList.setCurrentItem(treewidgetitem1) item[u'expanded'] = temp treewidgetitem.setExpanded(item[u'expanded']) - Receiver.send_message(u'cursor_normal') def validateItem(self, serviceItem): """ @@ -885,6 +883,7 @@ class ServiceManager(QtGui.QWidget): Rebuild the service list as things have changed and a repaint is the easiest way to do this. """ + Receiver.send_message(u'cursor_busy') log.debug(u'regenerateServiceItems') # force reset of renderer as theme data has changed self.parent.renderManager.themedata = None @@ -899,6 +898,7 @@ class ServiceManager(QtGui.QWidget): # Set to False as items may have changed rendering # does not impact the saved song so True may also be valid self.setModified(True) + Receiver.send_message(u'cursor_normal') def serviceItemUpdate(self, message): """ From 8cd04bc0173b88bbab7c616a9246c21dac2b68dd Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 1 Jan 2011 14:25:12 +0200 Subject: [PATCH 6/7] Fixed a few stray bugs to do with services. --- openlp/core/ui/mainwindow.py | 5 +++-- openlp/core/ui/servicemanager.py | 28 ++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 260384a5f..a442f983d 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -1007,11 +1007,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): if recentFilesToDisplay: self.FileMenu.addSeparator() for fileId, filename in enumerate(recentFilesToDisplay): - action = QtGui.QAction(u'&%d %s' % (fileId +1, + log.debug('Recent file name: %s', filename) + action = QtGui.QAction(u'&%d %s' % (fileId + 1, QtCore.QFileInfo(filename).fileName()), self) action.setData(QtCore.QVariant(filename)) self.connect(action, QtCore.SIGNAL(u'triggered()'), - self.ServiceManagerContents.loadService) + self.ServiceManagerContents.onRecentServiceClicked) self.FileMenu.addAction(action) self.FileMenu.addSeparator() self.FileMenu.addAction(self.FileMenuActions[-1]) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 18dba7058..9d7bada14 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -347,10 +347,7 @@ class ServiceManager(QtGui.QWidget): elif result == QtGui.QMessageBox.Save: if not self.saveFile(): return False - self.serviceManagerList.clear() - self.serviceItems = [] - self.setFileName(u'') - self.setModified(False) + self.newFile() def onLoadServiceClicked(self): if self.isModified(): @@ -381,6 +378,19 @@ class ServiceManager(QtGui.QWidget): def onSaveServiceAsClicked(self): self.saveFileAs() + def onRecentServiceClicked(self): + sender = self.sender() + self.loadFile(sender.data().toString()) + + def newFile(self): + """ + Create a blank new service file. + """ + self.serviceManagerList.clear() + self.serviceItems = [] + self.setFileName(u'') + self.setModified(False) + def saveFile(self): """ Save the current Service file. @@ -457,6 +467,8 @@ class ServiceManager(QtGui.QWidget): def loadFile(self, fileName): if not fileName: return False + else: + fileName = unicode(fileName) zip = None fileTo = None try: @@ -475,18 +487,18 @@ class ServiceManager(QtGui.QWidget): continue osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile)) filePath = os.path.join(self.servicePath, - split_filename(osfile)[1]) + os.path.split(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 filePath.endswith(u'osd'): + p_file = filePath if 'p_file' in locals(): fileTo = open(p_file, u'r') items = cPickle.load(fileTo) fileTo.close() - self.onNewService() + self.newFile() for item in items: serviceItem = ServiceItem() serviceItem.render_manager = self.parent.renderManager From fd5e173d21347ce73363240481049dd19ef231de Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 1 Jan 2011 12:49:38 +0000 Subject: [PATCH 7/7] Cleanups --- openlp.pyw | 8 +++----- openlp/core/lib/mediamanageritem.py | 2 ++ openlp/plugins/images/lib/mediaitem.py | 2 -- openlp/plugins/presentations/lib/mediaitem.py | 2 -- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 888cdae9f..f3455962d 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -205,22 +205,20 @@ class OpenLP(QtGui.QApplication): self.exceptionForm = ExceptionForm(self.mainWindow) self.exceptionForm.exceptionTextEdit.setPlainText( ''.join(format_exception(exctype, value, traceback))) + self.setNormalCursor() self.exceptionForm.exec_() def setBusyCursor(self): """ - Sets the Busy Cursor on the Main Window + Sets the Busy Cursor for the Application """ - #a=c self.setOverrideCursor(QtCore.Qt.BusyCursor) - #self.processEvents() def setNormalCursor(self): """ - Sets the Normal Cursor on the Main Window + Sets the Normal Cursor forthe Application """ self.restoreOverrideCursor() - #self.processEvents() def main(): """ diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 6147be608..a9484795b 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -349,11 +349,13 @@ class MediaManagerItem(QtGui.QWidget): self.OnNewFileMasks) log.info(u'New files(s) %s', unicode(files)) if files: + Receiver.send_message(u'cursor_busy') self.loadList(files) lastDir = os.path.split(unicode(files[0]))[0] SettingsManager.set_last_dir(self.settingsSection, lastDir) SettingsManager.set_list(self.settingsSection, self.settingsSection, self.getFileList()) + Receiver.send_message(u'cursor_normal') def getFileList(self): """ diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 1c48e3eb6..7281bb091 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -139,7 +139,6 @@ class ImageMediaItem(MediaManagerItem): self.settingsSection, self.getFileList()) def loadList(self, list): - Receiver.send_message(u'cursor_busy') for file in list: filename = os.path.split(unicode(file))[1] thumb = os.path.join(self.servicePath, filename) @@ -154,7 +153,6 @@ class ImageMediaItem(MediaManagerItem): item_name.setIcon(icon) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.listView.addItem(item_name) - Receiver.send_message(u'cursor_normal') def generateSlideData(self, service_item, item=None, xmlVersion=False): items = self.listView.selectedIndexes() diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 9b8c2c1a9..e832f1a10 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -171,7 +171,6 @@ class PresentationMediaItem(MediaManagerItem): This is called both on initial load of the plugin to populate with existing files, and when the user adds new files via the media manager """ - Receiver.send_message(u'cursor_busy') currlist = self.getFileList() titles = [] for file in currlist: @@ -216,7 +215,6 @@ class PresentationMediaItem(MediaManagerItem): item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) item_name.setIcon(icon) self.listView.addItem(item_name) - Receiver.send_message(u'cursor_normal') def onDeleteClick(self): """