Merged in from remote branch.

This commit is contained in:
Raoul Snyman 2010-03-09 22:41:37 +02:00
commit bfda149552
16 changed files with 4775 additions and 853 deletions

View File

@ -50,16 +50,24 @@ media_manager_style = """
QToolBox::tab:selected {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 palette(light), stop: 1.0 palette(button));
border-color: palette(dark);
border-color: palette(button);
}
"""
class versionThread(QtCore.QThread):
class VersionThread(QtCore.QThread):
"""
A special Qt thread class to fetch the version of OpenLP from the website.
This is threaded so that it doesn't affect the loading time of OpenLP.
"""
def __init__(self, parent, app_version, generalConfig):
QtCore.QThread.__init__(self, parent)
self.parent = parent
self.app_version = app_version
self.generalConfig = generalConfig
def run (self):
def run(self):
"""
Run the thread.
"""
time.sleep(2)
version = check_latest_version(self.generalConfig, self.app_version)
#new version has arrived
@ -586,7 +594,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def versionThread(self):
app_version = self.applicationVersion[u'full']
vT = versionThread(self, app_version, self.generalConfig)
vT = VersionThread(self, app_version, self.generalConfig)
vT.start()
def onHelpAboutItemClicked(self):

View File

@ -42,7 +42,6 @@ class ServiceManagerList(QtGui.QTreeWidget):
def __init__(self, parent=None, name=None):
QtGui.QTreeWidget.__init__(self,parent)
self.parent = parent
self.setExpandsOnDoubleClick(False)
def keyPressEvent(self, event):
if type(event) == QtGui.QKeyEvent:
@ -250,6 +249,7 @@ class ServiceManager(QtGui.QWidget):
if self.serviceItemNoteForm.exec_():
self.serviceItems[item][u'service_item'].notes = \
self.serviceItemNoteForm.textEdit.toPlainText()
self.repaintServiceList(item, 0)
def nextItem(self):
"""
@ -429,15 +429,29 @@ class ServiceManager(QtGui.QWidget):
for itemcount, item in enumerate(self.serviceItems):
serviceitem = item[u'service_item']
treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)
treewidgetitem.setText(0,serviceitem.title)
treewidgetitem.setIcon(0,serviceitem.iconic_representation)
if len(serviceitem.notes) > 0:
icon = QtGui.QImage(serviceitem.icon)
icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio,
QtCore.Qt.SmoothTransformation)
overlay = QtGui.QImage(':/services/service_item_notes.png')
overlay = overlay.scaled(80, 80, QtCore.Qt.KeepAspectRatio,
QtCore.Qt.SmoothTransformation)
painter = QtGui.QPainter(icon)
painter.drawImage(0, 0, overlay)
painter.end()
treewidgetitem.setIcon(0, build_icon(icon))
else:
treewidgetitem.setIcon(0, serviceitem.iconic_representation)
treewidgetitem.setText(0, serviceitem.title)
treewidgetitem.setToolTip(0, serviceitem.notes)
treewidgetitem.setData(0, QtCore.Qt.UserRole,
QtCore.QVariant(item[u'order']))
treewidgetitem.setExpanded(item[u'expanded'])
for count, frame in enumerate(serviceitem.get_frames()):
treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem)
text = frame[u'title']
treewidgetitem1.setText(0,text[:40])
treewidgetitem1.setText(0, text[:40])
treewidgetitem1.setData(0, QtCore.Qt.UserRole,
QtCore.QVariant(count))
if serviceItem == itemcount and serviceItemCount == count:
@ -594,12 +608,12 @@ class ServiceManager(QtGui.QWidget):
self.serviceItems = []
self.isNew = True
for item in tempServiceItems:
self.addServiceItem(item[u'service_item'], True)
self.addServiceItem(item[u'service_item'], False, item[u'expanded'])
#Set to False as items may have changed rendering
#does not impact the saved song so True may aslo be valid
self.parent.serviceChanged(False, self.serviceName)
def addServiceItem(self, item, rebuild=False):
def addServiceItem(self, item, rebuild=False, expand=True):
"""
Add a Service item to the list
@ -619,12 +633,12 @@ class ServiceManager(QtGui.QWidget):
if sitem == -1:
self.serviceItems.append({u'service_item': item,
u'order': len(self.serviceItems) + 1,
u'expanded':True})
u'expanded':expand})
self.repaintServiceList(len(self.serviceItems) + 1, 0)
else:
self.serviceItems.insert(sitem + 1, {u'service_item': item,
u'order': len(self.serviceItems)+1,
u'expanded':True})
u'expanded':expand})
self.repaintServiceList(sitem + 1, 0)
#if rebuilding list make sure live is fixed.
if rebuild:

View File

@ -81,13 +81,12 @@ class AppLocation(object):
def check_latest_version(config, current_version):
version_string = current_version
#set to prod in the distribution confif file.
environment = config.get_config(u'run environment', u'dev')
last_test = config.get_config(u'last version test', datetime.now().date())
this_test = unicode(datetime.now().date())
config.set_config(u'last version test', this_test)
if last_test != this_test:
version_string = u''
req = urllib2.Request(u'http://www.openlp.org/files/%s_version.txt' % environment)
req = urllib2.Request(u'http://www.openlp.org/files/version.txt')
req.add_header(u'User-Agent', u'OpenLP/%s' % current_version)
try:
handle = urllib2.urlopen(req, None)

View File

@ -76,7 +76,7 @@ class AlertsManager(QtCore.QObject):
display text
"""
log.debug(u'display alert called %s' % text)
self.parent.maindisplay.parent.StatusBar.showMessage(self.trUtf8(u''))
self.parent.maindisplay.parent.StatusBar.showMessage(u'')
self.alertList.append(text)
if self.timer_id != 0 or self.parent.maindisplay.mediaLoaded:
self.parent.maindisplay.parent.StatusBar.showMessage(\

View File

@ -61,7 +61,7 @@ class ImageMediaItem(MediaManagerItem):
def retranslateUi(self):
self.OnNewPrompt = self.trUtf8('Select Image(s)')
self.OnNewFileMasks = \
self.trUtf8('Images (*.jpg *jpeg *.gif *.png *.bmp)')
self.trUtf8('Images (*.jpg *jpeg *.gif *.png *.bmp);; All files (*)')
def requiredIcons(self):
MediaManagerItem.requiredIcons(self)

View File

@ -25,6 +25,7 @@
# OOo API documentation:
# http://api.openoffice.org/docs/common/ref/com/sun/star/presentation/XSlideShowController.html
# http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Basic/Getting_Information_about_UNO_Objects#Inspecting_interfaces_during_debugging
# http://docs.go-oo.org/sd/html/classsd_1_1SlideShow.html
# http://www.oooforum.org/forum/viewtopic.phtml?t=5252
# http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Working_with_Presentations
@ -62,7 +63,8 @@ class ImpressController(PresentationController):
"""
log.debug(u'Initialising')
PresentationController.__init__(self, plugin, u'Impress')
self.supports = [u'.odp', u'.ppt', u'.pps', u'.pptx', u'.ppsx']
self.supports = [u'.odp']
self.alsosupports = [u'.ppt', u'.pps', u'.pptx', u'.ppsx']
self.process = None
self.desktop = None
@ -145,10 +147,17 @@ class ImpressController(PresentationController):
doc.close_presentation()
if os.name != u'nt':
desktop = self.get_uno_desktop()
else:
desktop = self.get_com_desktop()
docs = desktop.getComponents()
if docs.hasElements():
log.debug(u'OpenOffice not terminated')
else:
try:
desktop.terminate()
log.debug(u'OpenOffice killed')
except:
pass
log.exception(u'Failed to terminate OpenOffice')
def add_doc(self, name):
log.debug(u'Add Doc OpenOffice')

View File

@ -56,7 +56,7 @@ class PresentationMediaItem(MediaManagerItem):
# be instanced by the base MediaManagerItem
self.ListViewWithDnD_class = PresentationListView
MediaManagerItem.__init__(self, parent, icon, title)
self.message_listener = MessageListener(controllers)
self.message_listener = MessageListener(self)
def initPluginNameVisible(self):
self.PluginNameVisible = self.trUtf8('Presentation')
@ -66,7 +66,8 @@ class PresentationMediaItem(MediaManagerItem):
fileType = u''
for controller in self.controllers:
if self.controllers[controller].enabled:
for type in self.controllers[controller].supports:
types = self.controllers[controller].supports + self.controllers[controller].alsosupports
for type in types:
if fileType.find(type) == -1:
fileType += u'*%s ' % type
self.OnNewFileMasks = self.trUtf8('Presentations (%s)' % fileType)
@ -106,6 +107,9 @@ class PresentationMediaItem(MediaManagerItem):
#load the drop down selection
if self.controllers[item].enabled:
self.DisplayTypeComboBox.addItem(item)
if self.DisplayTypeComboBox.count() > 1:
self.DisplayTypeComboBox.insertItem(0, u'Automatic')
self.DisplayTypeComboBox.setCurrentIndex(0)
def loadList(self, list):
currlist = self.getFileList()
@ -145,10 +149,16 @@ class PresentationMediaItem(MediaManagerItem):
return False
service_item.title = unicode(self.DisplayTypeComboBox.currentText())
service_item.shortname = unicode(self.DisplayTypeComboBox.currentText())
controller = self.controllers[service_item.shortname]
shortname = service_item.shortname
for item in items:
bitem = self.ListView.item(item.row())
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
if shortname==u'Automatic':
service_item.shortname = self.findControllerByType(filename)
if not service_item.shortname:
return False
controller = self.controllers[service_item.shortname]
(path, name) = os.path.split(filename)
doc = controller.add_doc(filename)
if doc.get_slide_preview_file(1) is None:
@ -161,3 +171,17 @@ class PresentationMediaItem(MediaManagerItem):
img = doc.get_slide_preview_file(i)
controller.remove_doc(doc)
return True
def findControllerByType(self, filename):
filetype = os.path.splitext(filename)[1]
if not filetype:
return None
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].supports:
return controller
for controller in self.controllers:
if self.controllers[controller].enabled:
if filetype in self.controllers[controller].alsosupports:
return controller
return None

View File

@ -154,8 +154,9 @@ class MessageListener(object):
"""
log.info(u'Message Listener loaded')
def __init__(self, controllers):
self.controllers = controllers
def __init__(self, mediaitem):
self.controllers = mediaitem.controllers
self.mediaitem = mediaitem
self.previewHandler = Controller(False)
self.liveHandler = Controller(True)
# messages are sent from core.ui.slidecontroller
@ -188,6 +189,12 @@ class MessageListener(object):
"""
log.debug(u'Startup called with message %s' % message)
self.handler, file, isLive = self.decodeMessage(message)
filetype = os.path.splitext(file)[1][1:]
if self.handler==u'Automatic':
self.handler = self.mediaitem.findControllerByType(file)
if not self.handler:
return
if isLive:
self.liveHandler.addHandler(self.controllers[self.handler], file)
else:

View File

@ -52,7 +52,7 @@ class PowerpointController(PresentationController):
"""
log.debug(u'Initialising')
PresentationController.__init__(self, plugin, u'Powerpoint')
self.supports = [u'.ppt', u'.pps']
self.supports = [u'.ppt', u'.pps', u'.pptx', u'.ppsx']
self.process = None
def check_available(self):
@ -100,6 +100,8 @@ class PowerpointController(PresentationController):
doc.close_presentation()
if self.process is None:
return
if self.process.Presentations.Count > 0:
return
try:
self.process.Quit()
except:

View File

@ -49,7 +49,7 @@ class PptviewController(PresentationController):
log.debug(u'Initialising')
self.process = None
PresentationController.__init__(self, plugin, u'Powerpoint Viewer')
self.supports = [u'.ppt', u'.pps']
self.supports = [u'.ppt', u'.pps', u'.pptx', u'.ppsx']
def check_available(self):
"""

View File

@ -93,6 +93,7 @@ class PresentationController(object):
Name of the application, to appear in the application
"""
self.supports = []
self.alsosupports = []
self.docs = []
self.plugin = plugin
self.name = name

File diff suppressed because it is too large Load Diff

View File

@ -78,6 +78,7 @@
<qresource prefix="services">
<file>service_edit.png</file>
<file>service_notes.png</file>
<file>service_item_notes.png</file>
<file>service_bottom.png</file>
<file>service_down.png</file>
<file>service_top.png</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

View File

@ -24,6 +24,7 @@
###############################################################################
import os
from cgi import escape
from ast import parse, NodeVisitor, Str
ts_file = u"""<?xml version="1.0" encoding="utf-8"?>
@ -45,7 +46,8 @@ ts_message = u""" <message>
class StringExtractor(NodeVisitor):
def __init__(self, strings, filename):
def __init__(self, strings, filename, base_path):
self.base_path = base_path
self.filename = filename
self.strings = strings
self.classname = 'unknown'
@ -58,10 +60,10 @@ class StringExtractor(NodeVisitor):
if hasattr(node.func, 'attr') and node.func.attr == 'trUtf8' and isinstance(node.args[0], Str):
string = node.args[0].s
key = '%s-%s' % (self.classname, string)
self.strings[key] = [self.classname, self.filename, node.lineno, string]
self.strings[key] = [self.classname, self.filename[len(self.base_path) + 1:], node.lineno, escape(string)]
self.generic_visit(node)
def parse_file(filename, strings):
def parse_file(base_path, filename, strings):
file = open(filename, u'r')
try:
ast = parse(file.read())
@ -70,7 +72,7 @@ def parse_file(filename, strings):
return
file.close()
StringExtractor(strings, filename).visit(ast)
StringExtractor(strings, filename, base_path).visit(ast)
def write_file(filename, strings):
translation_file = u''
@ -94,15 +96,18 @@ def write_file(filename, strings):
def main():
strings = {}
start_dir = os.path.abspath(u'.')
start_dir = os.path.abspath(u'..')
for root, dirs, files in os.walk(start_dir):
for file in files:
if file.endswith(u'.py'):
print u'Parsing "%s"' % file
parse_file(os.path.join(root, file), strings)
parse_file(start_dir, os.path.join(root, file), strings)
print u'Generating TS file...',
write_file(os.path.join(start_dir, u'i18n', u'openlp_en.ts'), strings)
write_file(os.path.join(start_dir, u'resources', u'i18n', u'openlp_en.ts'), strings)
print u'done.'
if __name__ == u'__main__':
if os.path.split(os.path.abspath(u'.'))[1] != u'scripts':
print u'You need to run this script from the scripts directory.'
else:
main()

View File

@ -1 +1 @@
1.9.0-723
1.9.0-725