Merged trunk, Fixed up odd trUtf8

This commit is contained in:
Raoul Snyman 2009-10-25 18:12:41 +02:00
commit 8de8638ba9
60 changed files with 228 additions and 113 deletions

8
openlp-1to2-converter.py Normal file → Executable file
View File

@ -25,7 +25,13 @@
import sys
import os
import sqlite
try:
import sqlite
except:
try:
import pysqlite2
except:
print 'No Sqlite2 package available'
import sqlite3
import re
from optparse import OptionParser

View File

@ -24,7 +24,6 @@
###############################################################################
import os
import sys
import re
ts_file = u"""<?xml version="1.0" encoding="utf-8"?>

View File

@ -86,6 +86,17 @@ class EventReceiver(QtCore.QObject):
``config_updated``
Informs components the config has changed
``edit_song``
Requests the current song on the preview display be loaded for edit
``preview_song``
Tells the song plugin the edit has finished and the song can be previewed
Only available if the edit was triggered by the Preview button.
``slidecontroller_change``
Informs the slidecontroller that a slide change has occurred
"""
global log
log = logging.getLogger(u'EventReceiver')

View File

@ -28,7 +28,7 @@ import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib.toolbar import *
from openlp.core.lib import translate, contextMenuAction, contextMenuSeparator
from openlp.core.lib import contextMenuAction, contextMenuSeparator
from serviceitem import ServiceItem
class MediaManagerItem(QtGui.QWidget):
@ -36,7 +36,7 @@ class MediaManagerItem(QtGui.QWidget):
MediaManagerItem is a helper widget for plugins.
None of the following *need* to be used, feel free to override
them cmopletely in your plugin's implementation. Alternatively,
them completely in your plugin's implementation. Alternatively,
call them from your plugin before or after you've done extra
things that you need to.
@ -118,7 +118,6 @@ class MediaManagerItem(QtGui.QWidget):
self.requiredIcons()
self.setupUi()
self.retranslateUi()
#self.initialise()
def requiredIcons(self):
"""

View File

@ -169,6 +169,8 @@ class Renderer(object):
page_length = int(self._rect.height() / metrics.height() - 2 ) - 1
ave_line_width = line_width / metrics.averageCharWidth()
ave_line_width = int(ave_line_width + (ave_line_width * 1))
log.debug(u'Page Length area height %s , metrics %s , lines %s' %
(int(self._rect.height()), metrics.height(), page_length ))
split_pages = []
page = []
split_lines = []
@ -195,15 +197,17 @@ class Renderer(object):
else:
split_text = line[:pos]
split_lines.append(split_text)
line = line[pos:]
line = line[pos:].lstrip()
#if we have more text add up to 10 spaces on the front.
if len(line) > 0 :
if len(line) > 0 and self._theme.font_main_indentation > 0:
line = u'%s%s' % \
(u' '[:self._theme.font_main_indentation], line)
(u' '[:int(self._theme.font_main_indentation)], line)
#Text fits in a line now
for line in split_lines:
for count, line in enumerate(split_lines):
page.append(line)
if len(page) == page_length:
#last but one line and only 2 lines to go or end of page
if (len(page) == page_length - 1 and len(split_lines) - 3 == count) or \
len(page) == page_length:
split_pages.append(page)
page = []
if len(page) > 0 and page != u' ':

View File

@ -65,6 +65,7 @@ class RenderManager(object):
self.service_theme = u''
self.global_style = u''
self.override_background = None
self.themedata = None
self.save_bg_frame = None
self.override_background_changed = False
@ -130,7 +131,7 @@ class RenderManager(object):
self.theme = self.service_theme
else:
self.theme = self.global_theme
if self.theme != self.renderer.theme_name:
if self.theme != self.renderer.theme_name or self.themedata is None:
log.debug(u'theme is now %s', self.theme)
self.themedata = self.theme_manager.getThemeData(self.theme)
self.calculate_default(

View File

@ -52,7 +52,7 @@ blankthemexml=\
<weight>Normal</weight>
<italics>False</italics>
<indentation>0</indentation>
<location override="False" x="0" y="0" width="0" height="0"/>
<location override="False" x="10" y="10" width="1024" height="730"/>
</font>
<font type="footer">
<name>Arial</name>
@ -61,7 +61,7 @@ blankthemexml=\
<weight>Normal</weight>
<italics>False</italics>
<indentation>0</indentation>
<location override="False" x="0" y="0" width="0" height="0"/>
<location override="False" x="10" y="730" width="1024" height="38"/>
</font>
<display>
<shadow color="#000000">True</shadow>

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class AboutForm(QtGui.QDialog):
"""

View File

@ -24,7 +24,7 @@
import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class AlertForm(QtGui.QDialog):
global log

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, translate
from openlp.core.lib import SettingsTab
class AlertsTab(SettingsTab):
"""

View File

@ -23,7 +23,7 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class Ui_AmendThemeDialog(object):
def setupUi(self, AmendThemeDialog):

View File

@ -28,7 +28,7 @@ import os.path
from PyQt4 import QtCore, QtGui
from openlp.core.lib import ThemeXML, file_to_xml, translate
from openlp.core.lib import ThemeXML, file_to_xml
from amendthemedialog import Ui_AmendThemeDialog
log = logging.getLogger(u'AmendThemeForm')
@ -672,8 +672,11 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
int(self.theme.font_main_proportion), # size
int(main_weight), # weight
self.theme.font_main_italics)# italic
mainFont.setPixelSize(int(self.theme.font_main_proportion))
metrics = QtGui.QFontMetrics(mainFont)
page_length = (int(self.FontMainHeightSpinBox.value()) / metrics.height() - 2) - 1
log.debug(u'Page Length area height %s, metrics %s, lines %s' %
(int(self.FontMainHeightSpinBox.value()), metrics.height(), page_length))
page_length_text = unicode(self.trUtf8(u'Slide Height is %s rows'))
self.FontMainLinesPageLabel.setText(page_length_text % page_length)
frame = self.thememanager.generateImage(theme)

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, translate, str_to_bool
from openlp.core.lib import SettingsTab, str_to_bool
class GeneralTab(SettingsTab):
"""

View File

@ -30,9 +30,8 @@ from PyQt4 import QtCore, QtGui
from openlp.core.ui import AboutForm, SettingsForm, AlertForm, \
ServiceManager, ThemeManager, MainDisplay, SlideController, \
PluginForm, MediaDockManager
from openlp.core.lib import translate, RenderManager, PluginConfig, \
OpenLPDockWidget, SettingsManager, PluginManager, Receiver, \
buildIcon, str_to_bool
from openlp.core.lib import RenderManager, PluginConfig, buildIcon, \
OpenLPDockWidget, SettingsManager, PluginManager, Receiver, str_to_bool
from openlp.core.utils import check_latest_version
media_manager_style = """

View File

@ -23,7 +23,6 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
class Ui_PluginViewDialog(object):
def setupUi(self, PluginViewDialog):

View File

@ -30,7 +30,7 @@ import zipfile
from PyQt4 import QtCore, QtGui
from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \
translate, ServiceType, contextMenuAction, contextMenuSeparator, Receiver
ServiceType, contextMenuAction, contextMenuSeparator, Receiver
class ServiceManagerList(QtGui.QTreeWidget):

View File

@ -23,7 +23,6 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
class Ui_SettingsDialog(object):
def setupUi(self, SettingsDialog):

View File

@ -26,7 +26,7 @@ import logging
import time
from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, translate, Receiver, ServiceType
from openlp.core.lib import OpenLPToolbar, Receiver, ServiceType
label_stylesheet = u"""
QTableWidget::item:selected
@ -87,13 +87,18 @@ class SlideController(QtGui.QWidget):
self.isLive = isLive
self.parent = parent
self.image_list = [
self.trUtf8(u'Start Loop'),
self.trUtf8(u'Stop Loop'),
#self.trUtf8(u'Loop Separator'),
self.trUtf8(u'Image SpinBox')
u'Start Loop',
u'Stop Loop',
u'Loop Separator',
u'Image SpinBox'
]
self.song_list = [
u'Edit Song',
]
self.timer_id = 0
self.commandItem = None
self.songEdit = False
self.row = 0
self.Panel = QtGui.QWidget(parent.ControlSplitter)
# Layout for holding panel
self.PanelLayout = QtGui.QVBoxLayout(self.Panel)
@ -140,17 +145,17 @@ class SlideController(QtGui.QWidget):
self.Toolbar.setSizePolicy(sizeToolbarPolicy)
if self.isLive:
self.Toolbar.addToolbarButton(
self.trUtf8(u'First Slide'), u':/slides/slide_first.png',
u'First Slide', u':/slides/slide_first.png',
self.trUtf8(u'Move to first'), self.onSlideSelectedFirst)
self.Toolbar.addToolbarButton(
self.trUtf8(u'Previous Slide'), u':/slides/slide_previous.png',
u'Previous Slide', u':/slides/slide_previous.png',
self.trUtf8(u'Move to previous'), self.onSlideSelectedPrevious)
self.Toolbar.addToolbarButton(
self.trUtf8(u'Next Slide'), u':/slides/slide_next.png',
u'Next Slide', u':/slides/slide_next.png',
self.trUtf8(u'Move to next'), self.onSlideSelectedNext)
if self.isLive:
self.Toolbar.addToolbarButton(
self.trUtf8(u'Last Slide'), u':/slides/slide_last.png',
u'Last Slide', u':/slides/slide_last.png',
self.trUtf8(u'Move to last'), self.onSlideSelectedLast)
if self.isLive:
self.Toolbar.addToolbarSeparator(u'Close Separator')
@ -159,20 +164,25 @@ class SlideController(QtGui.QWidget):
if not self.isLive:
self.Toolbar.addToolbarSeparator(u'Close Separator')
self.Toolbar.addToolbarButton(
self.trUtf8(u'Go Live'), u':/system/system_live.png',
u'Go Live', u':/system/system_live.png',
self.trUtf8(u'Move to live'), self.onGoLive)
self.Toolbar.addToolbarSeparator(u'Close Separator')
self.Toolbar.addToolbarButton(
u'Edit Song', u':songs/song_edit.png',
self.trUtf8(u'Edit and re-preview Song'), self.onEditSong)
if isLive:
self.Toolbar.addToolbarSeparator(u'Loop Separator')
self.Toolbar.addToolbarButton(
self.trUtf8(u'Start Loop'), u':/media/media_time.png',
u'Start Loop', u':/media/media_time.png',
self.trUtf8(u'Start continuous loop'), self.onStartLoop)
self.Toolbar.addToolbarButton(
self.trUtf8(u'Stop Loop'), u':/media/media_stop.png',
u'Stop Loop', u':/media/media_stop.png',
self.trUtf8(u'Stop continuous loop'), self.onStopLoop)
self.DelaySpinBox = QtGui.QSpinBox()
self.Toolbar.addToolbarWidget(
self.trUtf8(u'Image SpinBox'), self.DelaySpinBox)
u'Image SpinBox', self.DelaySpinBox)
self.DelaySpinBox.setSuffix(self.trUtf8(u's'))
self.DelaySpinBox.setToolTip(self.trUtf8(u'Delay between slides in seconds'))
self.ControllerLayout.addWidget(self.Toolbar)
# Screen preview area
@ -216,6 +226,8 @@ class SlideController(QtGui.QWidget):
Receiver().send_message(u'request_spin_delay')
if isLive:
self.Toolbar.makeWidgetsInvisible(self.image_list)
else:
self.Toolbar.makeWidgetsInvisible(self.song_list)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_first'), self.onSlideSelectedFirst)
QtCore.QObject.connect(Receiver.get_receiver(),
@ -224,6 +236,8 @@ class SlideController(QtGui.QWidget):
QtCore.SIGNAL(u'slidecontroller_previous'), self.onSlideSelectedPrevious)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_last'), self.onSlideSelectedLast)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_change'), self.onSlideChange)
def receiveSpinDelay(self, value):
self.DelaySpinBox.setValue(int(value))
@ -255,7 +269,10 @@ class SlideController(QtGui.QWidget):
"""
Allows the Preview toolbar to be customised
"""
pass
if item.name == u'Songs':
self.Toolbar.makeWidgetsVisible(self.song_list)
else:
self.Toolbar.makeWidgetsInvisible(self.song_list)
def addServiceItem(self, item):
"""
@ -277,7 +294,12 @@ class SlideController(QtGui.QWidget):
Receiver().send_message(u'%s_start' % item.name.lower(), \
[item.shortname, item.service_item_path,
item.service_frames[0][u'title']])
self.displayServiceManagerItems(item, 0)
slideno = 0
if self.songEdit:
slideno = self.row
self.songEdit = False
self.displayServiceManagerItems(item, slideno)
def addServiceManagerItem(self, item, slideno):
"""
@ -285,7 +307,7 @@ class SlideController(QtGui.QWidget):
request the correct the toolbar of the plugin
Called by ServiceManager
"""
log.debug(u'addServiceItem')
log.debug(u'addServiceManagerItem')
#If old item was a command tell it to stop
if self.commandItem is not None and \
self.commandItem.service_item_type == ServiceType.Command:
@ -351,6 +373,7 @@ class SlideController(QtGui.QWidget):
if self.commandItem is not None and \
self.commandItem.service_item_type == ServiceType.Command:
Receiver().send_message(u'%s_first'% self.commandItem.name.lower())
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
else:
self.PreviewListWidget.selectRow(0)
self.onSlideSelected()
@ -374,11 +397,13 @@ class SlideController(QtGui.QWidget):
if this is the Live Controller also display on the screen
"""
row = self.PreviewListWidget.currentRow()
self.row = 0
if row > -1 and row < self.PreviewListWidget.rowCount():
if self.commandItem.service_item_type == ServiceType.Command:
Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row])
if isLive:
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
else:
#label = self.PreviewListWidget.cellWidget(row, 0)
frame = self.serviceitem.frames[row][u'image']
before = time.time()
if frame is None:
@ -387,7 +412,26 @@ class SlideController(QtGui.QWidget):
log.info(u'Slide Rendering took %4s' % (time.time() - before))
if self.isLive:
self.parent.mainDisplay.frameView(frame)
self.row = row
def onSlideChange(self, row):
"""
The slide has been changed. Update the slidecontroller accordingly
"""
self.PreviewListWidget.selectRow(row)
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
def grabMainDisplay(self):
rm = self.parent.RenderManager
if not rm.screen_list[rm.current_display][u'primary']:
winid = QtGui.QApplication.desktop().winId()
rect = rm.screen_list[rm.current_display][u'size']
winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), rect.y(), rect.width(), rect.height())
self.SlidePreview.setPixmap(winimg)
else:
label = self.PreviewListWidget.cellWidget(self.PreviewListWidget.currentRow(), 0)
self.SlidePreview.setPixmap(label.pixmap())
def onSlideSelectedNext(self):
"""
Go to the next slide.
@ -395,6 +439,7 @@ class SlideController(QtGui.QWidget):
if self.commandItem is not None and \
self.commandItem.service_item_type == ServiceType.Command:
Receiver().send_message(u'%s_next'% self.commandItem.name.lower())
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
else:
row = self.PreviewListWidget.currentRow() + 1
if row == self.PreviewListWidget.rowCount():
@ -410,6 +455,7 @@ class SlideController(QtGui.QWidget):
self.commandItem.service_item_type == ServiceType.Command:
Receiver().send_message(
u'%s_previous'% self.commandItem.name.lower())
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
else:
row = self.PreviewListWidget.currentRow() - 1
if row == -1:
@ -424,6 +470,7 @@ class SlideController(QtGui.QWidget):
if self.commandItem is not None and \
self.commandItem.service_item_type == ServiceType.Command:
Receiver().send_message(u'%s_last'% self.commandItem.name.lower())
QtCore.QTimer.singleShot(0.5, self.grabMainDisplay)
else:
self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1)
self.onSlideSelected()
@ -449,6 +496,10 @@ class SlideController(QtGui.QWidget):
if event.timerId() == self.timer_id:
self.onSlideSelectedNext()
def onEditSong(self):
self.songEdit = True
Receiver().send_message(u'edit_song')
def onGoLive(self):
"""
If preview copy slide item to live

View File

@ -23,7 +23,7 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class SplashScreen(object):
def __init__(self, version):

View File

@ -32,7 +32,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.ui import AmendThemeForm
from openlp.core.theme import Theme
from openlp.core.lib import PluginConfig, OpenLPToolbar, ThemeXML, translate, \
from openlp.core.lib import PluginConfig, OpenLPToolbar, ThemeXML, \
str_to_bool, file_to_xml, buildIcon, Receiver, contextMenuAction, \
contextMenuSeparator
from openlp.core.utils import ConfigHelper
@ -371,7 +371,7 @@ class ThemeManager(QtGui.QWidget):
newtheme.add_font(unicode(theme.FontName),
unicode(theme.FontColor.name()),
unicode(theme.FontProportion * 2), u'False')
unicode(theme.FontProportion * 3), u'False')
newtheme.add_font(unicode(theme.FontName),
unicode(theme.FontColor.name()),
unicode(12), u'False', u'footer')

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, translate, Receiver
from openlp.core.lib import SettingsTab, Receiver
class ThemesTab(SettingsTab):
"""

View File

@ -27,7 +27,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, Receiver, translate, str_to_bool, buildIcon
from openlp.core.lib import Plugin, Receiver, str_to_bool, buildIcon
from openlp.plugins.audit.lib import AuditManager
from openlp.plugins.audit.forms import AuditDetailForm, AuditDeleteForm
from openlp.plugins.audit.lib.models import AuditItem

View File

@ -27,8 +27,6 @@ from datetime import date
from PyQt4 import QtGui
from auditdeletedialog import Ui_AuditDeleteDialog
from openlp.core.lib import translate
#from openlp.plugins.audit.lib import AuditManager
class AuditDeleteForm(QtGui.QDialog, Ui_AuditDeleteDialog):
"""

View File

@ -26,7 +26,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, translate, buildIcon
from openlp.core.lib import Plugin, buildIcon
from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem
class BiblePlugin(Plugin):

View File

@ -29,8 +29,7 @@ import os.path
from PyQt4 import QtCore, QtGui
from bibleimportdialog import Ui_BibleImportDialog
from openlp.core.lib import Receiver, translate
from openlp.core.lib import Receiver
class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
global log

View File

@ -158,6 +158,11 @@ class BibleDBImpl(BibleCommon):
def get_bible_text(self, bookname, chapter, sverse, everse):
log.debug(u'get_bible_text %s, %s, %s, %s', bookname, chapter, sverse,
everse)
#Look up book name or abbreviation
book = self.get_bible_book(bookname)
if book is not None:
bookname = book.name
log.debug(u'bookname corrected to %s' % bookname)
verses = self.session.query(Verse).join(Book).filter(
Book.name == bookname).filter(Verse.chapter == chapter).filter(
Verse.verse>=sverse).filter(Verse.verse<=everse).order_by(

View File

@ -30,7 +30,7 @@ import codecs
from PyQt4 import QtCore
from openlp.core.lib import translate, Receiver
from openlp.core.lib import Receiver
class BibleOSISImpl():
"""

View File

@ -26,7 +26,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, str_to_bool, Receiver
from openlp.core.lib import str_to_bool, Receiver
from openlp.core.lib import SettingsTab
class BiblesTab(SettingsTab):

View File

@ -25,8 +25,6 @@
import logging
import os
from openlp.core.lib import translate
from bibleOSISimpl import BibleOSISImpl
from bibleCSVimpl import BibleCSVImpl
from bibleDBimpl import BibleDBImpl

View File

@ -27,8 +27,8 @@ import time
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, MediaManagerItem, Receiver, \
BaseListWithDnD, str_to_bool
from openlp.core.lib import MediaManagerItem, Receiver, str_to_bool, \
BaseListWithDnD
from openlp.plugins.bibles.forms import BibleImportForm
from openlp.plugins.bibles.lib.manager import BibleMode

View File

@ -22,7 +22,7 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class Ui_customEditDialog(object):
def setupUi(self, customEditDialog):

View File

@ -25,7 +25,7 @@
from PyQt4 import QtCore, QtGui
from editcustomdialog import Ui_customEditDialog
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver
from openlp.plugins.custom.lib.models import CustomSlide
class EditCustomForm(QtGui.QDialog, Ui_customEditDialog):

View File

@ -24,15 +24,15 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, translate, Receiver
from openlp.core.lib import SettingsTab, Receiver
class ImageTab(SettingsTab):
"""
ImageTab is the Image settings tab in the settings dialog.
"""
def __init__(self):
#SettingsTab.__init__(self, self.trUtf8(u'Images'), u'Image')
SettingsTab.__init__(self, u'Images', u'Image')
#SettingsTab.__init__(self, self.trUtf8(u'Images'), u'Images')
SettingsTab.__init__(self, u'Images', u'Images')
def setupUi(self):
self.setObjectName(u'ImageTab')

View File

@ -26,7 +26,7 @@ import logging
import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, buildIcon, translate
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, buildIcon
# We have to explicitly create separate classes for each plugin
# in order for DnD to the Service manager to work correctly.

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, str_to_bool, translate
from openlp.core.lib import SettingsTab, str_to_bool
class MediaTab(SettingsTab):
"""

View File

@ -28,6 +28,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
import logging
import os
import time
if os.name == u'nt':
from win32com.client import Dispatch
@ -85,7 +86,7 @@ class ImpressController(PresentationController):
self.manager._FlagAsMethod(u'Bridge_GetValueObject')
else:
# -headless
cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"'
cmd = u'openoffice.org -nologo -norestore -minimized -invisible -nofirststartwizard -accept="socket,host=localhost,port=2002;urp;"'
self.process = QtCore.QProcess()
self.process.startDetached(cmd)
self.process.waitForStarted()
@ -96,6 +97,12 @@ class ImpressController(PresentationController):
"""
log.debug(u'Kill')
self.close_presentation()
if os.name != u'nt':
desktop = self.get_uno_desktop()
try:
desktop.terminate()
except:
pass
def load_presentation(self, presentation):
"""
@ -121,18 +128,19 @@ class ImpressController(PresentationController):
url = uno.systemPathToFileUrl(presentation)
if desktop is None:
return
self.desktop = desktop
properties = []
properties.append(self.create_property(u'Minimized', True))
properties = tuple(properties)
try:
self.desktop = desktop
properties = []
properties = tuple(properties)
self.document = desktop.loadComponentFromURL(url, u'_blank',
0, properties)
self.presentation = self.document.getPresentation()
self.presentation.Display = self.plugin.render_manager.current_display + 1
self.controller = None
except:
log.exception(u'Failed to load presentation')
return
self.presentation = self.document.getPresentation()
self.presentation.Display = self.plugin.render_manager.current_display + 1
self.controller = None
self.create_thumbnails()
def create_thumbnails(self):
@ -148,13 +156,7 @@ class ImpressController(PresentationController):
else:
thumbdir = uno.systemPathToFileUrl(self.thumbnailpath)
props = []
if os.name == u'nt':
prop = self.manager.Bridge_GetStruct(u'com.sun.star.beans.PropertyValue')
else:
prop = PropertyValue()
prop.Name = u'FilterName'
prop.Value = u'impress_png_Export'
props.append(prop)
props.append(self.create_property(u'FilterName', u'impress_png_Export'))
props = tuple(props)
doc = self.document
pages = doc.getDrawPages()
@ -164,6 +166,15 @@ class ImpressController(PresentationController):
doc.storeToURL(thumbdir + u'/' + self.thumbnailprefix +
unicode(idx+1) + u'.png', props)
def create_property(self, name, value):
if os.name == u'nt':
prop = self.manager.Bridge_GetStruct(u'com.sun.star.beans.PropertyValue')
else:
prop = PropertyValue()
prop.Name = name
prop.Value = value
return prop
def get_uno_desktop(self):
log.debug(u'getUNODesktop')
ctx = None
@ -245,6 +256,11 @@ class ImpressController(PresentationController):
def start_presentation(self):
if self.controller is None or not self.controller.isRunning():
self.presentation.start()
# start() returns before the getCurrentComponent is ready. Try for 5 seconds
i = 1
while self.desktop.getCurrentComponent() is None and i < 50:
time.sleep(0.1)
i = i + 1
self.controller = self.desktop.getCurrentComponent().Presentation.getController()
else:
self.controller.activate()

View File

@ -27,7 +27,7 @@ import os
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, translate, BaseListWithDnD
from openlp.core.lib import MediaManagerItem, BaseListWithDnD
from openlp.plugins.presentations.lib import MessageListener
# We have to explicitly create separate classes for each plugin

View File

@ -68,6 +68,7 @@ class MessageListener(object):
self.controller.load_presentation(file)
self.controller.start_presentation()
self.controller.slidenumber = 0
self.controller.timer.start()
def activate(self):
if self.controller.is_active():
@ -82,7 +83,7 @@ class MessageListener(object):
self.activate()
if message is not None:
self.controller.goto_slide(message[0]+1)
self.controller.slidenumber = self.controller.get_slide_number()
self.controller.poll_slidenumber()
def first(self, message):
"""
@ -90,7 +91,7 @@ class MessageListener(object):
"""
self.activate()
self.controller.start_presentation()
self.controller.slidenumber = self.controller.get_slide_number()
self.controller.poll_slidenumber()
def last(self, message):
"""
@ -98,7 +99,7 @@ class MessageListener(object):
"""
self.activate()
self.controller.goto_slide(self.controller.get_slide_count())
self.controller.slidenumber = self.controller.get_slide_number()
self.controller.poll_slidenumber()
def next(self, message):
"""
@ -106,7 +107,7 @@ class MessageListener(object):
"""
self.activate()
self.controller.next_step()
self.controller.slidenumber = self.controller.get_slide_number()
self.controller.poll_slidenumber()
def previous(self, message):
"""
@ -114,7 +115,7 @@ class MessageListener(object):
"""
self.activate()
self.controller.previous_step()
self.controller.slidenumber = self.controller.get_slide_number()
self.controller.poll_slidenumber()
def shutdown(self, message):
"""
@ -122,6 +123,7 @@ class MessageListener(object):
"""
self.controller.close_presentation()
self.controller.slidenumber = 0
self.controller.timer.shutdown()
def blank(self):
if not self.controller.is_loaded():

View File

@ -24,6 +24,8 @@ import shutil
from PyQt4 import QtCore
from openlp.core.lib import Receiver
class PresentationController(object):
"""
Base class for presentation controllers to inherit from
@ -143,6 +145,9 @@ class PresentationController(object):
self.thumbnailprefix = u'slide'
if not os.path.isdir(self.thumbnailroot):
os.makedirs(self.thumbnailroot)
self.timer = QtCore.QTimer()
self.timer.setInterval(500)
QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.poll_slidenumber)
def check_available(self):
"""
@ -291,3 +296,16 @@ class PresentationController(object):
The slide an image is required for, starting at 1
"""
return None
def poll_slidenumber(self):
"""
Check the current slide number
"""
if not self.is_active():
return
current = self.get_slide_number()
if current == self.slidenumber:
return
self.slidenumber = current
Receiver().send_message(u'slidecontroller_change', self.slidenumber - 1)

View File

@ -24,7 +24,7 @@
from PyQt4 import QtGui
from openlp.core.lib import SettingsTab, translate
from openlp.core.lib import SettingsTab
class PresentationTab(SettingsTab):
"""

View File

@ -20,7 +20,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
from PyQt4 import QtGui
from openlp.core.lib import SettingsTab, translate
from openlp.core.lib import SettingsTab
class RemoteTab(SettingsTab):
"""

View File

@ -23,7 +23,6 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
class Ui_AuthorsDialog(object):
def setupUi(self, AuthorsDialog):

View File

@ -23,7 +23,7 @@
###############################################################################
from PyQt4 import QtGui, QtCore
from openlp.core.lib import translate
from openlp.plugins.songs.forms.authorsdialog import Ui_AuthorsDialog
class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog):

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class Ui_EditSongDialog(object):
def setupUi(self, EditSongDialog):

View File

@ -26,7 +26,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver
from openlp.plugins.songs.forms import EditVerseForm
from openlp.plugins.songs.lib.models import Song
from editsongdialog import Ui_EditSongDialog
@ -410,6 +410,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.songmanager.save_song(self.song)
if self.title_change:
Receiver().send_message(u'load_song_list')
Receiver().send_message(u'preview_song')
self.close()
def processLyrics(self):

View File

@ -23,7 +23,6 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
class Ui_EditVerseDialog(object):
def setupUi(self, EditVerseDialog):

View File

@ -22,7 +22,8 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
from PyQt4 import QtCore, QtGui
from PyQt4 import QtGui
from openlp.plugins.songs.forms.openlpexportdialog import Ui_OpenLPExportDialog
class OpenLPExportForm(QtGui.QDialog, Ui_OpenLPExportDialog):

View File

@ -22,7 +22,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
from PyQt4 import QtCore, QtGui
from PyQt4 import QtGui
from openlp.plugins.songs.forms.openlpimportdialog import Ui_OpenLPImportDialog
class OpenLPImportForm(QtGui.QDialog, Ui_OpenLPImportDialog):
@ -30,4 +30,3 @@ class OpenLPImportForm(QtGui.QDialog, Ui_OpenLPImportDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)

View File

@ -22,7 +22,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
from PyQt4 import QtCore, QtGui
from PyQt4 import QtGui
from openlp.plugins.songs.forms.opensongexportdialog import Ui_OpenSongExportDialog
class OpenSongExportForm(QtGui.QDialog, Ui_OpenSongExportDialog):

View File

@ -22,7 +22,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
from PyQt4 import QtCore, QtGui
from PyQt4 import QtGui
from openlp.plugins.songs.forms.opensongimportdialog import Ui_OpenSongImportDialog
class OpenSongImportForm(QtGui.QDialog, Ui_OpenSongImportDialog):

View File

@ -23,7 +23,6 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
class Ui_SongBookDialog(object):
def setupUi(self, SongBookDialog):

View File

@ -24,7 +24,6 @@
from PyQt4 import QtGui
from openlp.core.lib import translate
from openlp.plugins.songs.forms.songbookdialog import Ui_SongBookDialog
class SongBookForm(QtGui.QDialog, Ui_SongBookDialog):

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, buildIcon
from openlp.core.lib import buildIcon
class Ui_SongMaintenanceDialog(object):
def setupUi(self, SongMaintenanceDialog):

View File

@ -18,7 +18,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
"""
from PyQt4 import QtGui, QtCore
from openlp.core.lib import translate
from openlp.plugins.songs.lib.classes import Author, Book, Topic
from songmaintenancedialog import Ui_SongMaintenanceDialog
from authorsform import AuthorsForm

View File

@ -23,7 +23,6 @@
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate
class Ui_TopicsDialog(object):
def setupUi(self, TopicsDialog):

View File

@ -24,7 +24,6 @@
from PyQt4 import QtGui
from openlp.core.lib import translate
from openlp.plugins.songs.forms.topicsdialog import Ui_TopicsDialog
class TopicsForm(QtGui.QDialog, Ui_TopicsDialog):

View File

@ -26,7 +26,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, translate, SongXMLParser, \
from openlp.core.lib import MediaManagerItem, SongXMLParser, \
BaseListWithDnD, Receiver, str_to_bool
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm
@ -55,6 +55,7 @@ class SongMediaItem(MediaManagerItem):
self.edit_song_form = EditSongForm(self.parent.songmanager, self)
self.song_maintenance_form = SongMaintenanceForm(
self.parent.songmanager, self)
self.fromPreview = None
def requiredIcons(self):
MediaManagerItem.requiredIcons(self)
@ -121,6 +122,10 @@ class SongMediaItem(MediaManagerItem):
QtCore.SIGNAL(u'load_song_list'), self.onSearchTextButtonClick)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_updated'), self.configUpdated)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'edit_song'), self.onEventEditSong)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'preview_song'), self.onPreviewClick)
def configUpdated(self):
self.searchAsYouType = str_to_bool(
@ -168,19 +173,22 @@ class SongMediaItem(MediaManagerItem):
if author_list != u'':
author_list = author_list + u', '
author_list = author_list + author.display_name
song_detail = unicode(u'%s (%s)' % \
(unicode(song.title), unicode(author_list)))
song_detail = unicode(self.trUtf8(u'%s (%s)' % \
(unicode(song.title), unicode(author_list))))
song_name = QtGui.QListWidgetItem(song_detail)
song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id))
self.ListView.addItem(song_name)
if song.id == self.fromPreview:
self.fromPreview = 0
self.ListView.setCurrentItem(song_name)
def displayResultsAuthor(self, searchresults):
log.debug(u'display results Author')
self.ListView.clear()
for author in searchresults:
for song in author.songs:
song_detail = unicode(u'%s (%s)' % \
(unicode(author.display_name), unicode(song.title)))
song_detail = unicode(self.trUtf8(u'%s (%s)' % \
(unicode(author.display_name), unicode(song.title))))
song_name = QtGui.QListWidgetItem(song_detail)
song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id))
self.ListView.addItem(song_name)
@ -218,13 +226,19 @@ class SongMediaItem(MediaManagerItem):
def onSongMaintenanceClick(self):
self.song_maintenance_form.exec_()
def onEditClick(self):
def onEditClick(self, preview=False):
item = self.ListView.currentItem()
if item is not None:
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.fromPreview = 0
if preview:
self.fromPreview = item_id
self.edit_song_form.loadSong(item_id)
self.edit_song_form.exec_()
def onEventEditSong (self):
self.onEditClick(True)
def onDeleteClick(self):
item = self.ListView.currentItem()
if item is not None:

View File

@ -24,7 +24,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, str_to_bool, translate
from openlp.core.lib import SettingsTab, str_to_bool
class SongsTab(SettingsTab):
"""

View File

@ -26,7 +26,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, translate, buildIcon
from openlp.core.lib import Plugin, buildIcon
from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab
from openlp.plugins.songs.forms import OpenLPImportForm, OpenSongExportForm, \
OpenSongImportForm, OpenLPExportForm

View File

@ -28,8 +28,7 @@ import logging
import time
import subprocess
import codecs
import sys
from datetime import date
if os.name == u'nt':
import win32api
import win32con