diff --git a/.gitignore b/.bzrignore similarity index 60% rename from .gitignore rename to .bzrignore index 19f017b62..fedd1a25e 100644 --- a/.gitignore +++ b/.bzrignore @@ -5,3 +5,6 @@ *.eric4project *.ropeproject *.e4* +.eric4project +list +openlp.org 2.0.e4* diff --git a/.eric4project/openlp.org 2.0.e4q b/.eric4project/openlp.org 2.0.e4q deleted file mode 100644 index 1fd5f428b..000000000 --- a/.eric4project/openlp.org 2.0.e4q +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.eric4project/openlp.org 2.0.e4s b/.eric4project/openlp.org 2.0.e4s deleted file mode 100644 index ac5031bac..000000000 --- a/.eric4project/openlp.org 2.0.e4s +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - /home/raoul/Projects/openlp-2/openlp.pyw - /home/raoul/Projects/openlp-2/openlp/ui/forms/splashscreen.py - /home/raoul/Projects/openlp-2/openlp/ui/forms/mainwindow.py - /home/raoul/Projects/openlp-2/openlp/ui/forms/__init__.py - - /home/raoul/Projects/openlp-2/openlp.pyw - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.eric4project/openlp.org 2.0.e4t b/.eric4project/openlp.org 2.0.e4t deleted file mode 100644 index 3bd5abd6d..000000000 --- a/.eric4project/openlp.org 2.0.e4t +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - TODO: what is the tags for bridge, pre-chorus? - - 2008-11-26, 21:10:45 - - openlp/song/song.py - 138 - - - - TODO: check font formatting - - 2008-11-26, 21:10:45 - - openlp/song/song.py - 523 - - - - TODO: Song: Logging - not all, but enough - - 2008-12-07, 10:06:59 - - openlp/plugins/songs/songxml.py - 39 - - - - TODO: Song: Handle OpenLP2 format - - 2008-12-07, 10:06:59 - - openlp/plugins/songs/songxml.py - 40 - - - - TODO: Song: Import OpenLP1 - - 2008-12-07, 10:06:59 - - openlp/plugins/songs/songxml.py - 41 - - - - TODO: Song: Export OpenLP1 - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 42 - - - - TODO: Song: Export Song to CCLI - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 43 - - - - TODO: Song: Export Song to OpenSong - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 44 - - - - TODO: Song: Import ChangingSong - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 45 - - - - TODO: Song: Export ChangingSong - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 46 - - - - TODO: what is the tags for bridge, pre-chorus? - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 149 - - - - TODO: check font formatting - - 2008-12-07, 10:07:00 - - openlp/plugins/songs/songxml.py - 534 - - - - TODO: need to get rid of this once all plugins are up to date - - 2009-03-01, 01:10:29 - - openlp/core/pluginmanager.py - 86 - - - - TODO: These shouldn't be called here... - - 2009-03-01, 01:10:29 - - openlp/core/pluginmanager.py - 108 - - - \ No newline at end of file diff --git a/openlp.org 2.0.e4p b/openlp.org 2.0.e4p deleted file mode 100644 index af320dd82..000000000 --- a/openlp.org 2.0.e4p +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - en - Python - Qt4 - - 1.9.0 - Raoul Snyman - raoulsnyman@openlp.org - - openlp.pyw - openlp/controls/__init__.py - openlp/core/test/test_render_theme.py - openlp/core/test/test_render.py - openlp/core/__init__.py - openlp/__init__.py - demo.py - openlp/core/settingsmanager.py - openlp/plugins/__init__.py - openlp/core/ui/__init__.py - openlp/core/ui/mainwindow.py - openlp/core/ui/splashscreen.py - openlp/core/ui/alertform.py - openlp/core/ui/about.py - openlp/plugins/songs/songsplugin.py - openlp/plugins/songs/__init__.py - openlp/plugins/songs/forms/__init__.py - openlp/plugins/songs/forms/openlpimportform.py - openlp/plugins/songs/forms/editsongform.py - openlp/plugins/songs/forms/opensongexportform.py - openlp/plugins/songs/forms/openlpexportform.py - openlp/plugins/songs/forms/opensongimportform.py - openlp/core/utils/__init__.py - openlp/core/theme/__init__.py - openlp/core/theme/theme.py - openlp/plugins/songs/test/test_song_opensong.py - openlp/plugins/songs/test/test_song_basic.py - openlp/plugins/songs/test/test_song_verse.py - openlp/plugins/songs/test/test_song_text.py - openlp/core/theme/test/test_theme.py - openlp/core/resources.py - openlp/core/lib/__init__.py - openlp/core/lib/xmlrootclass.py - openlp/core/lib/plugin.py - openlp/core/lib/mediamanageritem.py - openlp/core/lib/event.py - openlp/core/utils/confighelper.py - openlp/core/utils/winregistry.py - openlp/core/utils/registry.py - openlp/core/utils/linregistry.py - setup.py - openlp/core/lib/pluginconfig.py - openlp/core/test/test_plugin_manager.py - openlp/core/test/test_mediamanageritem.py - openlp/core/test/testplugins/testplugin1.py - openlp/core/test/testplugins/testplugin2/__init__.py - openlp/core/test/testplugins/testplugin2/testplugin2.py - openlp/plugins/bibles/bibleplugin.py - openlp/plugins/bibles/forms/bibleimportdialog.py - openlp/plugins/bibles/forms/bibleimportform.py - openlp/plugins/bibles/lib/bibleDBimpl.py - openlp/plugins/bibles/lib/bibleOSISimpl.py - openlp/plugins/bibles/lib/bibleHTTPimpl.py - openlp/plugins/bibles/lib/bibleCSVimpl.py - openlp/plugins/bibles/__init__.py - openlp/plugins/bibles/lib/__init__.py - openlp/plugins/bibles/forms/__init__.py - openlp/plugins/songs/lib/__init__.py - openlp/plugins/songs/lib/songxml.py - openlp/plugins/songs/lib/models.py - openlp/plugins/bibles/test/__init__.py - openlp/plugins/bibles/test/test_bibleManagerAPI.py - openlp/plugins/bibles/test/test_bibleManager.py - openlp/plugins/bibles/test/test_bibleManagerOSIS.py - openlp/plugins/bibles/test/test_bibleManagerCSV.py - openlp/plugins/presentations/lib/pptview.py - openlp/plugins/presentations/lib/impresscom.py - openlp/plugins/presentations/lib/powerpoint.py - openlp/plugins/presentations/lib/pptviewlib/ppttest.py - openlp/plugins/presentations/__init__.py - openlp/plugins/presentations/presentationplugin.py - openlp/plugins/videos/__init__.py - openlp/plugins/videos/videoplugin.py - openlp/plugins/images/__init__.py - openlp/plugins/images/imageplugin.py - openlp/plugins/songs/forms/editsongdialog.py - openlpcnv.pyw - openlp/plugins/songs/forms/songbookdialog.py - openlp/plugins/songs/forms/topicsdialog.py - openlp/plugins/songs/forms/authorsdialog.py - openlp/plugins/songs/forms/topicsform.py - openlp/plugins/songs/forms/authorsform.py - openlp/plugins/songs/forms/songbookform.py - openlp/migration/__init__.py - openlp/migration/migratefiles.py - openlp/migration/migratesongs.py - openlp/migration/display.py - openlp/migration/migratebibles.py - openlp/plugins/songs/lib/tables.py - openlp/plugins/songs/lib/classes.py - openlp/plugins/songs/lib/manager.py - openlp/plugins/bibles/lib/classes.py - openlp/plugins/bibles/lib/tables.py - openlp/plugins/bibles/lib/manager.py - openlp/plugins/bibles/lib/common.py - openlp/plugins/songs/lib/meta.py - openlp/core/test/testplugins/deeper/__init__.py - openlp/core/test/testplugins/deeper/toodeep/__init__.py - openlp/core/test/testplugins/deeper/toodeep/plugin3toodeep.py - openlp/core/lib/serviceitem.py - openlp/core/ui/slidecontroller.py - openlp/core/lib/eventreceiver.py - openlp/core/ui/servicemanager.py - openlp/core/lib/toolbar.py - openlp/core/ui/settingsform.py - openlp/core/ui/generaltab.py - openlp/core/ui/themestab.py - openlp/core/ui/alertstab.py - openlp/core/ui/settingsdialog.py - openlp/core/lib/settingstab.py - openlp/plugins/bibles/lib/biblestab.py - openlp/plugins/songs/lib/songstab.py - openlp/plugins/videos/lib/__init__.py - openlp/plugins/videos/lib/videotab.py - openlp/core/ui/test/test_service_manager.py - openlp/plugins/images/lib/__init__.py - openlp/plugins/images/lib/imageserviceitem.py - openlp/plugins/images/lib/listwithpreviews.py - openlp/plugins/songs/forms/editverseform.py - openlp/plugins/songs/forms/editversedialog.py - openlp/plugins/custom/__init__.py - openlp/plugins/custom/customplugin.py - openlp/plugins/custom/forms/__init__.py - openlp/plugins/custom/forms/editcustomform.py - openlp/plugins/custom/forms/editcustomdialog.py - openlp/plugins/custom/lib/__init__.py - openlp/plugins/custom/lib/customtab.py - openlp/plugins/custom/lib/classes.py - openlp/plugins/custom/lib/tables.py - openlp/plugins/custom/lib/meta.py - openlp/plugins/custom/lib/models.py - openlp/plugins/custom/lib/manager.py - openlp/plugins/images/lib/mediaitem.py - openlp/plugins/songs/lib/mediaitem.py - openlp/core/ui/maindisplay.py - openlp/core/ui/amendthemedialog.py - openlp/core/ui/thememanager.py - openlp/core/ui/amendthemeform.py - openlp/core/lib/eventmanager.py - openlp/core/lib/rendermanager.py - openlp/core/lib/renderer.py - openlp/core/lib/songxmlhandler.py - openlp/core/lib/pluginmanager.py - openlp/core/lib/themexmlhandler.py - openlp/plugins/bibles/lib/mediaitem.py - openlp/plugins/bibles/lib/textlistdata.py - openlp/plugins/presentations/lib/__init__.py - openlp/plugins/presentations/lib/mediaitem.py - openlp/plugins/presentations/lib/filelistdata.py - openlp/plugins/videos/lib/mediaitem.py - openlp/plugins/videos/lib/filelistdata.py - openlp/plugins/custom/lib/mediaitem.py - openlp/plugins/custom/lib/textlistdata.py - openlp/plugins/custom/lib/customserviceitem.py - resources/images/openlp-2_rc.py - - -
resources/forms/openlpexportform.ui
-
resources/forms/opensongexportform.ui
-
resources/forms/about.ui
-
resources/forms/settings.ui
-
resources/forms/themewizard.ui
-
resources/forms/opensongimportform.ui
-
resources/forms/alertform.ui
-
resources/forms/mainwindow.ui
-
resources/forms/songexport.ui
-
resources/forms/openlpimportform.ui
-
resources/forms/splashscreen.ui
-
resources/forms/authorsdialog.ui
-
resources/forms/bibleimportdialog.ui
-
resources/forms/songbookdialog.ui
-
resources/forms/topicsdialog.ui
-
resources/forms/editsongdialog.ui
-
resources/forms/editversedialog.ui
-
resources/forms/editcustomdialog.ui
-
resources/forms/amendthemedialog.ui
-
- - - - resources/images/openlp-2.qrc - - - - - copyright.txt - documentation/SongFormat.txt - documentation/pyqt-sql-py2exe.txt - documentation/PluginDevelopersGuide.txt - - openlp.pyw - - None - - - - add - - - - - - - - checkout - - - - - - - - commit - - - - - - - - diff - - - - - - - - export - - - - - - - - global - - - - - - - - history - - - - - - - - log - - - - - - - - remove - - - - - - - - status - - - - - - - - tag - - - - - - - - update - - - - - - - - - - - - standardLayout - - - True - - - - - - - - - - - - - - - -
\ No newline at end of file diff --git a/openlp.org 2.0.e4x b/openlp.org 2.0.e4x deleted file mode 100644 index 8d2f9e205..000000000 --- a/openlp.org 2.0.e4x +++ /dev/null @@ -1,45 +0,0 @@ -SOURCES = openlp/theme/test/test_theme.py \ - openlp/theme/__init__.py \ - openlp/theme/theme.py \ - openlp/controls/__init__.py \ - openlp/core/test/test_render_theme.py \ - openlp/core/test/test_render.py \ - openlp/core/interpolate.py \ - openlp/core/__init__.py \ - openlp/core/render.py \ - openlp/ui/__init__.py \ - openlp/ui/forms/__init__.py \ - openlp/__init__.py \ - openlp/utils/ConfigHelper.py \ - openlp/utils/__init__.py \ - demo.py \ - openlp/core/settingsmanager.py \ - openlp/resources/openlp_rc.py \ - openlp/resources/__init__.py \ - openlp/ui/forms/about.py \ - openlp/ui/forms/mainwindow.py \ - openlp/core/plugin.py \ - openlp/core/xmlrootclass.py \ - openlp/song/__init__.py \ - openlp/song/song.py \ - openlp/song/test/test_song_opensong.py \ - openlp/song/test/test_song_basic.py \ - openlp/song/test/test_song_text.py \ - openlp/plugins/biblemanager/__init__.py \ - openlp/plugins/biblemanager/BibleDBImpl.py \ - openlp/plugins/biblemanager/BibleManager.py \ - openlp/plugins/biblemanager/BibleHTTPImpl.py \ - openlp/plugins/biblemanager/test/__init__.py \ - openlp/plugins/biblemanager/test/test_bibleManager.py - -FORMS = openlp/resources/forms/mainwindow.ui \ - openlp/resources/forms/settings.ui \ - openlp/resources/forms/themewizard.ui \ - openlp/resources/forms/about.ui \ - openlp/resources/forms/editsongform.ui \ - openlp/resources/forms/alertform.ui \ - openlp/resources/forms/openlpimportform.ui \ - openlp/resources/forms/openlpexportform.ui - -TRANSLATIONS = openlp_en.ts - diff --git a/openlp.pyw b/openlp.pyw index 4e5e7736a..3909046c7 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -27,7 +27,7 @@ from openlp.core.lib import Receiver logging.basicConfig(level=logging.DEBUG, format=u'%(asctime)s %(name)-12s %(levelname)-8s %(message)s', - datefmt=u'%m-%d %H:%M', + datefmt=u'%m-%d %H:%M:%S', filename=u'openlp.log', filemode=u'w') diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 1c2de9e04..c49943e0f 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -114,7 +114,6 @@ class Renderer: def render_screen(self, screennum): log.debug(u'render screen\n %s %s ', screennum, self.words[screennum]) - import time t=0.0 words=self.words[screennum] retval=self._render_lines(words) @@ -173,7 +172,6 @@ class Renderer: else: p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000')) p.end() - log.debug(u'render background done') def split_set_of_lines(self, lines, footer): @@ -252,7 +250,7 @@ class Renderer: def render_lines(self, lines, footer_lines=None): """render a set of lines according to the theme, return bounding box""" - #log.debug(u'_render_lines %s', lines) + log.debug(u'_render_lines %s', lines) bbox=self._render_lines_unaligned(lines, False) # Main font if footer_lines is not None: @@ -264,11 +262,8 @@ class Renderer: bbox=self._render_lines_unaligned(lines, False, (x, y)) if footer_lines is not None: - #x, y = self._correctAlignment(self._rect_footer, bbox1) bbox=self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) ) - log.debug(u'render lines DONE') - return bbox def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)): @@ -279,7 +274,7 @@ class Renderer: than a screenful (eg. by using split_set_of_lines) Returns the bounding box of the text as QRect""" - log.debug(u'render unaligned %s', lines) + log.debug(u'render lines unaligned %s', lines) x, y=tlcorner brx=x bry=y @@ -298,7 +293,7 @@ class Renderer: p.setPen(QtGui.QPen(QtGui.QColor(0,0,255))) p.drawRect(retval) p.end() - log.debug(u'render unaligned DONE') + return retval @@ -410,7 +405,7 @@ class Renderer: return width and height of text as a tuple (w,h)""" # setup defaults - #log.debug(u"_get_extent_and_render %s %s %s ", [line], tlcorner, draw) + log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw) p=QtGui.QPainter() p.begin(self._paint) # 'twould be more efficient to set this once when theme changes diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index b891ce0a0..dbb7ead2a 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -18,6 +18,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ import logging +import time import os, os.path import sys from PyQt4 import QtGui, QtCore, Qt @@ -41,21 +42,20 @@ class RenderManager: self.current_display = 0 self.renderer = Renderer(None) self.calculate_default(self.screen_list[self.current_display]['size']) - self.frame = None def set_override_theme(self, theme): - log.debug("set override theme to %s", theme) + log.debug(u'set override theme to %s', theme) if theme is not None: self.theme = theme else: self.theme = self.default_theme - log.debug("theme is now %s", self.theme) + log.debug(u'theme is now %s', self.theme) self.themedata = self.theme_manager.getThemeData(self.theme) self.renderer.set_theme(self.themedata) self.build_text_rectangle(self.themedata) def build_text_rectangle(self, theme): - + log.debug(u'build_text_rectangle ') main_rect = None footer_rect = None @@ -74,6 +74,7 @@ class RenderManager: self.renderer.set_text_rectangle(main_rect,footer_rect) def generate_preview(self, themedata): + log.debug(u'generate preview ') self.calculate_default(QtCore.QSize(800,600)) self.renderer.set_theme(themedata) self.build_text_rectangle(themedata) @@ -94,25 +95,23 @@ class RenderManager: return frame def format_slide(self, words, footer): - self.calculate_default(QtCore.QSize(800,600)) - frame = QtGui.QPixmap(self.width, self.height) - self.renderer.set_paint_dest(frame) + log.debug(u'format slide') + self.calculate_default(self.screen_list[self.current_display]['size']) + self.renderer.set_paint_dest(QtGui.QPixmap(self.width, self.height)) return self.renderer.format_slide(words, footer) - def generate_slide(self,main_text, footer_text, preview=True): - if preview == True: - self.calculate_default(QtCore.QSize(800,600)) + def generate_slide(self,main_text, footer_text): + log.debug(u'generate slide') + self.calculate_default(self.screen_list[self.current_display]['size']) frame = QtGui.QPixmap(self.width, self.height) self.renderer.set_paint_dest(frame) - answer=self.renderer.render_lines(main_text, footer_text) return frame def calculate_default(self, screen): + log.debug(u'calculate default %s' , screen) self.width = screen.width() self.height = screen.height() + log.debug(u'calculate default %d,%d' , self.width, self.height) self.footer_start = int(self.height*0.95) # 95% is start of footer - #update the rederer frame - self.frame = QtGui.QPixmap(self.width, self.height) - self.renderer.set_paint_dest(self.frame) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 1e438ff1c..543fa41ca 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -19,7 +19,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ import logging import types -from PyQt4 import QtCore, QtGui +import time + from PyQt4.QtCore import * from PyQt4.QtGui import * @@ -51,34 +52,34 @@ class ServiceItem(): def addIcon(self, icon): ButtonIcon = None - if type(icon) is QtGui.QIcon: + if type(icon) is QIcon: ButtonIcon = icon elif type(icon) is types.StringType or type(icon) is types.UnicodeType: - ButtonIcon = QtGui.QIcon() + ButtonIcon = QIcon() if icon.startswith(u':/'): - ButtonIcon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, - QtGui.QIcon.Off) + ButtonIcon.addPixmap(QPixmap(icon), QIcon.Normal, + QIcon.Off) else: - ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), - QtGui.QIcon.Normal, QtGui.QIcon.Off) + ButtonIcon.addPixmap(QPixmap.fromImage(QImage(icon)), + QIcon.Normal, QIcon.Off) self.iconic_representation = ButtonIcon def render(self): """ - The render method is what the plugin uses to render it's meda to the - screen. + The render method is what renders the frames for the screen. """ log.debug(u'Render called') if self.theme == None: self.render_manager.set_override_theme(None) else: self.render_manager.set_override_theme(self.theme) - + log.debug(u'Formatting slides') for slide in self.raw_slides: self.format_slides.append(self.render_manager.format_slide(slide, False)) + log.debug(u'Rendering slides') for slide in self.format_slides: + self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer)) - self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer, False)) def get_parent_node(self): """ diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 628dcff1e..a5eb85076 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -29,6 +29,9 @@ class MainDisplay(QtGui.QWidget): self.setWindowTitle(u'OpenLP Display') self.screens = screens self.display = QtGui.QLabel(self) + self.display.setScaledContents(True) + self.displayBlank = False + self.blankFrame= None def setup(self, screenNumber): """ @@ -51,8 +54,24 @@ class MainDisplay(QtGui.QWidget): else: self.showMinimized() + painter=QtGui.QPainter() + self.blankFrame = QtGui.QPixmap(800, 600) + painter.begin(self.blankFrame) + painter.fillRect(self.blankFrame.rect(), QtGui.QColor(u'#000000')) + def frameView(self, frame): - self.display.setPixmap(frame) + if self.displayBlank == False: + self.display.setPixmap(frame) + self.frame = frame + + def blankDisplay(self): + if self.displayBlank == False: + self.displayBlank = True + self.display.setPixmap(self.blankFrame) + else: + self.displayBlank = False + self.frameView(self.frame) + def kill(self): pass diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 386976772..853d669cf 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -97,8 +97,6 @@ class MainWindow(object): # Initialise SlideControllers log.info(u'Set Up SlideControllers') - self.PreviewController.isLive = False - self.LiveController.isLive = True self.LiveController.mainDisplay = self.main_display def setupUi(self): @@ -130,8 +128,8 @@ class MainWindow(object): self.ControlSplitter.setOrientation(QtCore.Qt.Horizontal) self.ControlSplitter.setObjectName(u'ControlSplitter') self.MainContentLayout.addWidget(self.ControlSplitter) - self.PreviewController = SlideController(self.ControlSplitter) - self.LiveController = SlideController(self.ControlSplitter) + self.PreviewController = SlideController(self.ControlSplitter, False) + self.LiveController = SlideController(self.ControlSplitter, True) self.MenuBar = QtGui.QMenuBar(self.main_window) self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27)) self.MenuBar.setObjectName(u'MenuBar') @@ -296,10 +294,10 @@ class MainWindow(object): QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ToolsAddToolItem.setIcon(AddToolIcon) self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem') - self.action_Preview_Pane = QtGui.QAction(self.main_window) - self.action_Preview_Pane.setCheckable(True) - self.action_Preview_Pane.setChecked(True) - self.action_Preview_Pane.setObjectName(u'action_Preview_Pane') + self.action_Preview_Panel = QtGui.QAction(self.main_window) + self.action_Preview_Panel.setCheckable(True) + self.action_Preview_Panel.setChecked(True) + self.action_Preview_Panel.setObjectName(u'action_Preview_Panel') self.ModeLiveItem = QtGui.QAction(self.main_window) self.ModeLiveItem.setObjectName(u'ModeLiveItem') self.FileImportMenu.addAction(self.ImportThemeItem) @@ -322,7 +320,7 @@ class MainWindow(object): self.OptionsViewMenu.addAction(self.ViewServiceManagerItem) self.OptionsViewMenu.addAction(self.ViewThemeManagerItem) self.OptionsViewMenu.addSeparator() - self.OptionsViewMenu.addAction(self.action_Preview_Pane) + self.OptionsViewMenu.addAction(self.action_Preview_Panel) self.OptionsLanguageMenu.addAction(self.LanguageEnglishItem) self.OptionsLanguageMenu.addSeparator() self.OptionsLanguageMenu.addAction(self.LanguageTranslateItem) @@ -353,8 +351,8 @@ class MainWindow(object): QtCore.SIGNAL(u'triggered(bool)'), self.ServiceManagerDock.setVisible) QtCore.QObject.connect(self.ViewThemeManagerItem, QtCore.SIGNAL(u'triggered(bool)'), self.ThemeManagerDock.setVisible) - QtCore.QObject.connect(self.action_Preview_Pane, - QtCore.SIGNAL(u'toggled(bool)'), self.PreviewController.Pane.setVisible) + QtCore.QObject.connect(self.action_Preview_Panel, + QtCore.SIGNAL(u'toggled(bool)'), self.PreviewController.Panel.setVisible) QtCore.QObject.connect(self.MediaManagerDock, QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewMediaManagerItem.setChecked) QtCore.QObject.connect(self.ServiceManagerDock, @@ -451,7 +449,7 @@ class MainWindow(object): self.LanguageEnglishItem.setStatusTip(translate(u'main_window', u'Set the interface language to English')) self.ToolsAddToolItem.setText(translate(u'main_window', u'&Add Tool...')) self.ToolsAddToolItem.setStatusTip(translate(u'main_window', u'Add an application to the list of tools')) - self.action_Preview_Pane.setText(translate(u'main_window', u'&Preview Pane')) + self.action_Preview_Panel.setText(translate(u'main_window', u'&Preview Pane')) self.ModeLiveItem.setText(translate(u'main_window', u'&Live')) def show(self): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9905a91ed..f1e721a14 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -21,15 +21,16 @@ import os from time import sleep from copy import deepcopy -from PyQt4 import * -from PyQt4 import QtCore, QtGui + from PyQt4.QtCore import * from PyQt4.QtGui import * + # from openlp.core.resources import * # from openlp.core.ui import AboutForm, AlertForm, SettingsForm, SlideController from openlp.core.lib import OpenLPToolbar from openlp.core.lib import ServiceItem from openlp.core.lib import RenderManager +from openlp.core import translate # from openlp.core import PluginManager import logging @@ -47,6 +48,9 @@ class ServiceData(QAbstractItemModel): self.items=[] log.info("Starting") + def clearItems(self): + self.items = [] + def columnCount(self, parent): return 1; # always only a single column (for now) @@ -122,33 +126,73 @@ class ServiceManager(QWidget): def __init__(self, parent): QWidget.__init__(self) self.parent=parent - self.Layout = QtGui.QVBoxLayout(self) + self.Layout = QVBoxLayout(self) self.Layout.setSpacing(0) self.Layout.setMargin(0) self.Toolbar = OpenLPToolbar(self) - self.Toolbar.addToolbarButton("Move to top", ":/services/service_top.png") - self.Toolbar.addToolbarButton("Move up", ":/services/service_up.png") - self.Toolbar.addToolbarButton("Move down", ":/services/service_down.png") - self.Toolbar.addToolbarButton("Move to bottom", ":/services/service_bottom.png") + self.Toolbar.addToolbarButton("Move to top", ":/services/service_top.png", + translate(u'ServiceManager', u'Move to start'), self.onServiceTop) + self.Toolbar.addToolbarButton("Move up", ":/services/service_up.png", + translate(u'ServiceManager', u'Move up order'), self.onServiceUp) + self.Toolbar.addToolbarButton("Move down", ":/services/service_down.png", + translate(u'ServiceManager', u'Move down order'), self.onServiceDown) + self.Toolbar.addToolbarButton("Move to bottom", ":/services/service_bottom.png", + translate(u'ServiceManager', u'Move to end'), self.onServiceEnd) self.Toolbar.addSeparator() - self.Toolbar.addToolbarButton("New Service", ":/services/service_new.png") - self.Toolbar.addToolbarButton("Save Service", ":/services/service_save.png") + self.Toolbar.addToolbarButton("New Service", ":/services/service_new.png", + translate(u'ServiceManager', u'Create a new Service'), self.onNewService) + self.Toolbar.addToolbarButton("Delete From Service", ":/services/service_delete.png", + translate(u'ServiceManager', u'Delete From Service'), self.onDeleteFromService) self.Toolbar.addSeparator() - self.ThemeComboBox = QtGui.QComboBox(self.Toolbar) - self.ThemeComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar) + self.Toolbar.addToolbarButton("Save Service", ":/services/service_save.png", + translate(u'ServiceManager', u'Save Service'), self.onSaveService) + self.Toolbar.addToolbarButton("Load Service", ":/services/service_open.png", + translate(u'ServiceManager', u'Load Existing'), self.onLoadService) + + self.Toolbar.addSeparator() + self.ThemeComboBox = QComboBox(self.Toolbar) + self.ThemeComboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents) + self.ThemeWidget = QWidgetAction(self.Toolbar) self.ThemeWidget.setDefaultWidget(self.ThemeComboBox) self.Toolbar.addAction(self.ThemeWidget) self.Layout.addWidget(self.Toolbar) - self.TreeView = QtGui.QTreeView(self) + self.TreeView = QTreeView(self) self.service_data=ServiceData() self.TreeView.setModel(self.service_data) + self.TreeView.setAlternatingRowColors(True) self.Layout.addWidget(self.TreeView) - QtCore.QObject.connect(self.ThemeComboBox, - QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected) + QObject.connect(self.ThemeComboBox, + SIGNAL("activated(int)"), self.onThemeComboBoxSelected) + + def onServiceTop(self): + pass + + def onServiceUp(self): + pass + + def onServiceDown(self): + pass + + def onServiceEnd(self): + pass + + def onNewService(self): + self.service_data.clearItems() + + def onDeleteFromService(self): + pass + + def onSaveService(self): + Pass + + def onLoadService(self): + Pass + + + def onThemeComboBoxSelected(self, currentIndex): self.renderManager.default_theme = self.ThemeComboBox.currentText() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 2ffbf9c01..079d2f64e 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -20,10 +20,12 @@ Place, Suite 330, Boston, MA 02111-1307 USA import logging import os -from PyQt4 import QtCore, QtGui from PyQt4.QtCore import * from PyQt4.QtGui import * +from openlp.core.lib import OpenLPToolbar +from openlp.core import translate + class SlideData(QAbstractListModel): """ Tree of items for an order of Theme. @@ -46,14 +48,14 @@ class SlideData(QAbstractListModel): def columnCount(self, parent): return 1 - def rowCount(self, parent): + def rowCount(self, parent=None): return len(self.items) def insertRow(self, row, frame): self.beginInsertRows(QModelIndex(),row,row) log.info(u'insert row %d' % row) # create a preview image - frame1 = frame.scaled(QtCore.QSize(350,260)) + frame1 = frame.scaled(QSize(350,260)) self.items.insert(row,(frame1)) log.info(u'Items: %s' % self.items) self.endInsertRows() @@ -99,48 +101,112 @@ class SlideData(QAbstractListModel): return filelist -class SlideController(QtGui.QWidget): +class SlideController(QWidget): global log log=logging.getLogger(u'SlideController') - def __init__(self, control_splitter): - QtGui.QWidget.__init__(self) - self.Pane = QtGui.QWidget(control_splitter) - self.Splitter = QtGui.QSplitter(self.Pane) - self.Splitter.setOrientation(QtCore.Qt.Vertical) + def __init__(self, control_splitter, isLive): + QWidget.__init__(self) + self.isLive = isLive + self.Panel = QWidget(control_splitter) + self.Splitter = QSplitter(self.Panel) + self.Splitter.setOrientation(Qt.Vertical) - self.PaneLayout = QtGui.QVBoxLayout(self.Pane) - self.PaneLayout.addWidget(self.Splitter) - self.PaneLayout.setSpacing(50) - self.PaneLayout.setMargin(0) + self.PanelLayout = QVBoxLayout(self.Panel) + self.PanelLayout.addWidget(self.Splitter) + self.PanelLayout.setSpacing(50) + self.PanelLayout.setMargin(0) - self.Controller = QtGui.QScrollArea(self.Splitter) + self.Controller = QScrollArea(self.Splitter) self.Controller.setWidgetResizable(True) - self.PreviewListView = QtGui.QListView(self.Splitter) + self.PreviewListView = QListView(self.Splitter) self.PreviewListView.setAlternatingRowColors(True) self.PreviewListData = SlideData() self.PreviewListView.setModel(self.PreviewListData) - self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536)) + self.Controller.setGeometry(QRect(0, 0, 828, 536)) self.Controller.setWidget(self.PreviewListView) - self.SlidePreview = QtGui.QLabel(self.Splitter) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.Toolbar = OpenLPToolbar(self.Splitter) + sizeToolbarPolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + sizeToolbarPolicy.setHorizontalStretch(0) + sizeToolbarPolicy.setVerticalStretch(0) + sizeToolbarPolicy.setHeightForWidth(self.Toolbar.sizePolicy().hasHeightForWidth()) + + if self.isLive: + self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_first.png", + translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst) + self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_previous.png", + translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious) + self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_next.png", + translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext) + if self.isLive: + self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_last.png", + translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast) + self.Toolbar.addSeparator() + self.Toolbar.addToolbarButton("Close Sscreen", ":/slides/slide_close.png", + translate(u'SlideController', u'Close Screen'), self.onBlankScreen) + + self.Toolbar.setSizePolicy(sizeToolbarPolicy) + + self.SlidePreview = QLabel(self.Splitter) + sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth()) self.SlidePreview.setSizePolicy(sizePolicy) - self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190)) - self.SlidePreview.setFrameShape(QtGui.QFrame.WinPanel) - self.SlidePreview.setFrameShadow(QtGui.QFrame.Sunken) + self.SlidePreview.setMinimumSize(QSize(250, 190)) + self.SlidePreview.setFrameShape(QFrame.WinPanel) + self.SlidePreview.setFrameShadow(QFrame.Sunken) self.SlidePreview.setLineWidth(1) self.SlidePreview.setScaledContents(True) self.SlidePreview.setObjectName("SlidePreview") - QtCore.QObject.connect(self.PreviewListView, - QtCore.SIGNAL("clicked(QModelIndex)"), self.onSlideSelected) + QObject.connect(self.PreviewListView, + SIGNAL("clicked(QModelIndex)"), self.onSlideSelected) + def onSlideSelectedFirst(self): + row = self.PreviewListData.createIndex(0, 0) + if row.isValid(): + self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) + self.onSlideSelected(row) + + def onSlideSelectedNext(self): + indexes = self.PreviewListView.selectedIndexes() + rowNumber = 0 + for index in indexes: + if index.row() == self.PreviewListData.rowCount() - 1: + rowNumber = 0 + else: + rowNumber = index.row() + 1 + row = self.PreviewListData.createIndex(rowNumber , 0) + if row.isValid(): + self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) + self.onSlideSelected(row) + + + def onSlideSelectedPrevious(self): + indexes = self.PreviewListView.selectedIndexes() + rowNumber = 0 + for index in indexes: + if index.row() == 0: + rowNumber = self.PreviewListData.rowCount() - 1 + else: + rowNumber = index.row() - 1 + row = self.PreviewListData.createIndex(rowNumber , 0) + if row.isValid(): + self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) + self.onSlideSelected(row) + + def onSlideSelectedLast(self): + row = self.PreviewListData.createIndex(self.PreviewListData.rowCount() - 1 , 0) + if row.isValid(): + self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) + self.onSlideSelected(row) + + def onBlankScreen(self): + self.mainDisplay.blankDisplay() def onSlideSelected(self, index): frame = self.PreviewListData.getValue(index) @@ -152,11 +218,17 @@ class SlideController(QtGui.QWidget): self.mainDisplay.frameView(frame) def addServiceItem(self, serviceitem): + log.debug(u'addServiceItem') self.serviceitem = serviceitem self.serviceitem.render() self.PreviewListData.clearItems() for frame in self.serviceitem.frames: self.PreviewListData.addRow(frame) + row = self.PreviewListData.createIndex(0, 0) + if row.isValid(): + self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) + self.onSlideSelected(row) + def render(self): pass diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 7de4d32bf..40a16e020 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -164,12 +164,13 @@ class ThemeManager(QWidget): translate(u'ThemeManager', u'Export a theme'), self.onExportTheme) self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar) self.Layout.addWidget(self.Toolbar) + self.ThemeListView = QtGui.QListView(self) self.themeData = ThemeData() self.ThemeListView.setModel(self.themeData) self.ThemeListView.setAlternatingRowColors(True) self.Layout.addWidget(self.ThemeListView) - self.ThemeListView.setAlternatingRowColors(True) + self.themelist = [] self.path = os.path.join(ConfigHelper.get_data_path(), u'themes') self.checkThemesExists(self.path) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b4c24459a..9f9a2e825 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -371,10 +371,10 @@ class BibleMediaItem(MediaManagerItem): if len(raw_footer) <= 1: raw_footer.append(book) - service_item.theme = None - - service_item.raw_slides = raw_slides - service_item.raw_footer = raw_footer + if len(raw_slides) > 0: + service_item.theme = None + service_item.raw_slides = raw_slides + service_item.raw_footer = raw_footer def formatVerse(self, old_chapter, chapter, verse, opening, closing): loc = opening diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 3f24ac285..0e6a73e3d 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -187,6 +187,7 @@ class CustomMediaItem(MediaManagerItem): self.CustomListData.deleteRow(index) def onCustomPreviewClick(self): + log.debug(u'Custom Preview Requested') service_item = ServiceItem(self.parent) service_item.addIcon( ":/media/media_song.png") service_item.render_manager = self.parent.render_manager @@ -194,6 +195,7 @@ class CustomMediaItem(MediaManagerItem): self.parent.preview_controller.addServiceItem(service_item) def onCustomLiveClick(self): + log.debug(u'Custom Live Requested') service_item = ServiceItem(self.parent) service_item.addIcon( ":/media/media_song.png") service_item.render_manager = self.parent.render_manager @@ -201,6 +203,7 @@ class CustomMediaItem(MediaManagerItem): self.parent.live_controller.addServiceItem(service_item) def onCustomAddClick(self): + log.debug(u'Custom Add Requested') service_item = ServiceItem(self.parent) service_item.addIcon( ":/media/media_song.png") service_item.render_manager = self.parent.render_manager @@ -226,6 +229,7 @@ class CustomMediaItem(MediaManagerItem): for verse in verseList: raw_slides.append(verse[1]) raw_footer.append(title + u' '+ credit) - service_item.title = title - service_item.raw_slides = raw_slides - service_item.raw_footer = raw_footer + if theme is not None: + service_item.title = title + service_item.raw_slides = raw_slides + service_item.raw_footer = raw_footer