Presentation, Custom , bug fixes

bzr-revno: 689
This commit is contained in:
Tim Bentley 2009-12-14 18:56:29 +00:00
commit 69d818222f
14 changed files with 321 additions and 116 deletions

View File

@ -357,7 +357,7 @@ class MediaManagerItem(QtGui.QWidget):
self.trUtf8('No items selected...'),
self.trUtf8('You must select one or more items'))
else:
log.debug(self.PluginNameShort + u' Preview Requested')
log.debug(self.PluginNameShort + u' Preview requested')
service_item = self.buildServiceItem()
if service_item:
service_item.fromPlugin = True
@ -369,7 +369,7 @@ class MediaManagerItem(QtGui.QWidget):
self.trUtf8('No items selected...'),
self.trUtf8('You must select one or more items'))
else:
log.debug(self.PluginNameShort + u' Live Requested')
log.debug(self.PluginNameShort + u' Live requested')
service_item = self.buildServiceItem()
if service_item:
service_item.fromPlugin = True
@ -381,7 +381,7 @@ class MediaManagerItem(QtGui.QWidget):
self.trUtf8('No items selected...'),
self.trUtf8('You must select one or more items'))
else:
log.debug(self.PluginNameShort + u' Add Requested')
log.debug(self.PluginNameShort + u' Add requested')
service_item = self.buildServiceItem()
if service_item:
service_item.fromPlugin = False

View File

@ -578,7 +578,7 @@ class Renderer(object):
painter.drawText(x, y + metrics.ascent(), line)
painter.end()
if self._theme.display_slideTransition:
# Print 2nd image with 50% weight
# Print 2nd image with 70% weight
painter = QtGui.QPainter()
painter.begin(self._frameOp)
painter.setRenderHint(QtGui.QPainter.Antialiasing);

View File

@ -112,6 +112,8 @@ class ServiceItem(object):
for slide in self._raw_frames:
slide[u'image'] = \
self.RenderManager.resize_image(slide[u'image'])
elif self.service_item_type == ServiceItemType.Command:
pass
else:
log.error(u'Invalid value renderer :%s' % self.service_item_type)

View File

@ -99,4 +99,4 @@ class AlertForm(QtGui.QDialog):
self.CancelButton.setText(self.trUtf8('Cancel'))
def onDisplayClicked(self):
self.parent.mainDisplay.displayAlert(self.AlertEntryEditItem.text())
self.parent.mainDisplay.displayAlert(unicode(self.AlertEntryEditItem.text()))

View File

@ -234,8 +234,12 @@ class MainDisplay(DisplayWidget):
``text``
display text
"""
log.debug(u'display alert called %s' % text)
alertTab = self.parent.settingsForm.AlertsTab
alertframe = QtGui.QPixmap.fromImage(self.frame)
if isinstance(self.frame, QtGui.QImage):
alertframe = QtGui.QPixmap.fromImage(self.frame)
else:
alertframe = QtGui.QPixmap.fromImage(self.frame[u'main'])
painter = QtGui.QPainter(alertframe)
top = alertframe.rect().height() * 0.9
painter.fillRect(
@ -261,7 +265,10 @@ class MainDisplay(DisplayWidget):
def timerEvent(self, event):
if event.timerId() == self.timer_id:
self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame))
if isinstance(self.frame, QtGui.QImage):
self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame))
else:
self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame[u'main']))
self.killTimer(self.timer_id)
self.timer_id = 0

View File

@ -246,7 +246,7 @@ class SlideController(QtGui.QWidget):
self.SlidePreview.sizePolicy().hasHeightForWidth())
self.SlidePreview.setSizePolicy(sizePolicy)
self.SlidePreview.setFixedSize(
QtCore.QSize(self.settingsmanager.slidecontroller_image, 225))
QtCore.QSize(self.settingsmanager.slidecontroller_image,self.settingsmanager.slidecontroller_image / 1.3 ))
self.SlidePreview.setFrameShape(QtGui.QFrame.Box)
self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)
self.SlidePreview.setLineWidth(1)
@ -390,14 +390,12 @@ class SlideController(QtGui.QWidget):
#If old item was a command tell it to stop
if self.serviceItem and self.serviceItem.is_command():
self.onMediaStop()
if item.is_command():
if self.isLive:
Receiver.send_message(u'%s_start' % item.name.lower(), \
[item.title, item.service_item_path,
item.get_frame_title(), slideno, self.isLive])
else:
if item.is_media():
self.onMediaStart(item)
if item.is_media():
self.onMediaStart(item)
elif item.is_command():
Receiver.send_message(u'%s_start' % item.name.lower(), \
[item.title, item.service_item_path,
item.get_frame_title(), slideno, self.isLive])
self.displayServiceManagerItems(item, slideno)
def displayServiceManagerItems(self, serviceItem, slideno):
@ -475,7 +473,8 @@ class SlideController(QtGui.QWidget):
if not self.serviceItem:
return
if self.serviceItem.is_command():
Receiver.send_message(u'%s_first'% self.serviceItem.name.lower())
Receiver.send_message(u'%s_first'% \
self.serviceItem.name.lower(), self.isLive)
self.updatePreview()
else:
self.PreviewListWidget.selectRow(0)
@ -504,17 +503,20 @@ class SlideController(QtGui.QWidget):
row = self.PreviewListWidget.currentRow()
self.selectedRow = 0
if row > -1 and row < self.PreviewListWidget.rowCount():
if self.serviceItem.is_command():
Receiver.send_message(u'%s_slide'% self.serviceItem.name.lower(), [row])
if self.isLive:
self.updatePreview()
if self.serviceItem.is_command() and self.isLive:
Receiver.send_message(u'%s_slide'% \
self.serviceItem.name.lower(), u'%s:%s' % (row, self.isLive))
self.updatePreview()
else:
before = time.time()
frame = self.serviceItem.get_rendered_frame(row)
if isinstance(frame, QtGui.QImage):
self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame))
else:
self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
if isinstance(frame[u'main'], basestring):
self.SlidePreview.setPixmap(QtGui.QPixmap(frame[u'main']))
else:
self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
log.log(15, u'Slide Rendering took %4s' % (time.time() - before))
if self.isLive:
self.parent.mainDisplay.frameView(frame, True)
@ -553,7 +555,8 @@ class SlideController(QtGui.QWidget):
if not self.serviceItem:
return
if self.serviceItem.is_command():
Receiver.send_message(u'%s_next'% self.serviceItem.name.lower())
Receiver.send_message(u'%s_next' % \
self.serviceItem.name.lower(), self.isLive)
self.updatePreview()
else:
row = self.PreviewListWidget.currentRow() + 1
@ -570,7 +573,7 @@ class SlideController(QtGui.QWidget):
return
if self.serviceItem.is_command():
Receiver.send_message(
u'%s_previous'% self.serviceItem.name.lower())
u'%s_previous'% self.serviceItem.name.lower(), self.isLive)
self.updatePreview()
else:
row = self.PreviewListWidget.currentRow() - 1
@ -586,7 +589,8 @@ class SlideController(QtGui.QWidget):
if not self.serviceItem:
return
if self.serviceItem.is_command():
Receiver.send_message(u'%s_last'% self.serviceItem.name.lower())
Receiver.send_message(u'%s_last' % \
self.serviceItem.name.lower(), self.isLive)
self.updatePreview()
else:
self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1)
@ -628,11 +632,16 @@ class SlideController(QtGui.QWidget):
self.serviceItem, row)
def onMediaStart(self, item):
self.mediaObject.stop()
self.mediaObject.clearQueue()
file = os.path.join(item.service_item_path, item.get_frame_title())
self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
self.onMediaPlay()
if self.isLive:
Receiver.send_message(u'%s_start' % item.name.lower(), \
[item.title, item.service_item_path,
item.get_frame_title(), slideno, self.isLive])
else:
self.mediaObject.stop()
self.mediaObject.clearQueue()
file = os.path.join(item.service_item_path, item.get_frame_title())
self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
self.onMediaPlay()
def onMediaPause(self):
if self.isLive:

View File

@ -28,6 +28,7 @@ import os.path
import logging
import chardet
import codecs
import time
from PyQt4 import QtCore
@ -174,12 +175,17 @@ class BibleOSISImpl():
testament)
dialogobject.incrementProgressBar(
self.booksOfBible[p[0]])
Receiver.send_message(u'process_events')
#minor delay to get the events processed
time.sleep(0.1)
count = 0
self.bibledb.add_verse(book.id, p[1], p[2], text)
count += 1
#Every 3 verses repaint the screen
if count % 3 == 0:
if count % 30 == 0:
Receiver.send_message(u'process_events')
#minor delay to get the events processed
time.sleep(0.1)
count = 0
except:
log.exception(u'Loading bible from OSIS file failed')

View File

@ -27,7 +27,7 @@ import logging
from forms import EditCustomForm
from openlp.core.lib import Plugin, build_icon
from openlp.plugins.custom.lib import CustomManager, CustomMediaItem
from openlp.plugins.custom.lib import CustomManager, CustomMediaItem, CustomTab
class CustomPlugin(Plugin):
@ -51,6 +51,9 @@ class CustomPlugin(Plugin):
self.edit_custom_form = EditCustomForm(self.custommanager)
self.icon = build_icon(u':/media/media_custom.png')
def get_settings_tab(self):
return CustomTab(self.name)
def get_media_manager_item(self):
# Create the CustomManagerItem object
return CustomMediaItem(self, self.icon, self.name)

View File

@ -25,3 +25,4 @@
from manager import CustomManager
from mediaitem import CustomMediaItem
from customtab import CustomTab

View File

@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2009 Raoul Snyman #
# Portions copyright (c) 2008-2009 Tim Bentley, Jonathan Corwin, Michael #
# Gorven, Scott Guerrieri, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
# Carsten Tinggaard #
# --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, str_to_bool
class CustomTab(SettingsTab):
"""
CustomTab is the Custom settings tab in the settings dialog.
"""
def __init__(self, title, section=None):
SettingsTab.__init__(self, title, section)
def setupUi(self):
self.setObjectName(u'CustomTab')
self.tabTitleVisible = self.trUtf8('Custom')
self.CustomLayout = QtGui.QFormLayout(self)
self.CustomLayout.setObjectName(u'CustomLayout')
self.CustomModeGroupBox = QtGui.QGroupBox(self)
self.CustomModeGroupBox.setObjectName(u'CustomModeGroupBox')
self.CustomModeLayout = QtGui.QVBoxLayout(self.CustomModeGroupBox)
self.CustomModeLayout.setSpacing(8)
self.CustomModeLayout.setMargin(8)
self.CustomModeLayout.setObjectName(u'CustomModeLayout')
self.DisplayFooterCheckBox = QtGui.QCheckBox(self.CustomModeGroupBox)
self.DisplayFooterCheckBox.setObjectName(u'DisplayFooterCheckBox')
self.CustomModeLayout.addWidget(self.DisplayFooterCheckBox)
self.CustomLayout.setWidget(
0, QtGui.QFormLayout.LabelRole, self.CustomModeGroupBox)
QtCore.QObject.connect(self.DisplayFooterCheckBox,
QtCore.SIGNAL(u'stateChanged(int)'),
self.onDisplayFooterCheckBoxChanged)
def retranslateUi(self):
self.CustomModeGroupBox.setTitle(self.trUtf8('Custom Display'))
self.DisplayFooterCheckBox.setText(
self.trUtf8('Display Footer:'))
def onDisplayFooterCheckBoxChanged(self, check_state):
self.displayFooter = False
# we have a set value convert to True/False
if check_state == QtCore.Qt.Checked:
self.displayFooter = True
def load(self):
self.displayFooter = str_to_bool(
self.config.get_config(u'display footer', True))
self.DisplayFooterCheckBox.setChecked(self.displayFooter)
def save(self):
self.config.set_config(u'display footer', unicode(self.displayFooter))

View File

@ -27,7 +27,8 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD, Receiver
from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD,\
Receiver, str_to_bool
class CustomListView(BaseListWithDnD):
def __init__(self, parent=None):
@ -155,9 +156,13 @@ class CustomMediaItem(MediaManagerItem):
verseList = songXML.get_verses()
for verse in verseList:
raw_slides.append(verse[1])
raw_footer.append(title + u' '+ credit)
service_item.title = title
for slide in raw_slides:
service_item.add_from_text(slide[:30], slide)
if str_to_bool(self.parent.config.get_config(u'display footer', True)) or \
len(credit) > 0:
raw_footer.append(title + u' '+ credit)
else:
raw_footer.append(u'')
service_item.raw_footer = raw_footer
return True

View File

@ -30,6 +30,122 @@ from PyQt4 import QtCore
from openlp.core.lib import Receiver
class Controller(object):
"""
This is the Presentation listener who acts on events from the slide
controller and passes the messages on the the correct presentation handlers
"""
global log
log = logging.getLogger(u'Controller')
log.info(u'Controller loaded')
def __init__(self, live):
self.isLive = live
log.info(u'%s controller loaded' % live)
def addHandler(self, controller, file):
log.debug(u'Live = %s, addHandler %s' % (self.isLive, file))
self.controller = controller
if self.controller.is_loaded():
self.shutdown(None)
self.controller.load_presentation(file)
if self.isLive:
self.controller.start_presentation()
Receiver.send_message(u'live_slide_hide')
self.controller.slidenumber = 0
def activate(self):
log.debug(u'Live = %s, activate' % self.isLive)
if self.controller.is_active():
return
if not self.controller.is_loaded():
self.controller.load_presentation(self.controller.filepath)
if self.isLive:
self.controller.start_presentation()
if self.controller.slidenumber > 1:
self.controller.goto_slide(self.controller.slidenumber)
def slide(self, slide, live):
log.debug(u'Live = %s, slide' % live)
# if not isLive:
# return
self.activate()
self.controller.goto_slide(int(slide) + 1)
self.controller.poll_slidenumber(live)
def first(self, message):
"""
Based on the handler passed at startup triggers the first slide
"""
log.debug(u'Live = %s, first' % self.isLive)
print "first ", message
if not self.isLive:
return
self.activate()
self.controller.start_presentation()
self.controller.poll_slidenumber(self.isLive)
def last(self, message):
"""
Based on the handler passed at startup triggers the first slide
"""
log.debug(u'Live = %s, last' % self.isLive)
print "last ", message
if not self.isLive:
return
self.activate()
self.controller.goto_slide(self.controller.get_slide_count())
self.controller.poll_slidenumber(self.isLive)
def next(self, message):
"""
Based on the handler passed at startup triggers the next slide event
"""
log.debug(u'Live = %s, next' % self.isLive)
print "next ", message
if not self.isLive:
return
self.activate()
self.controller.next_step()
self.controller.poll_slidenumber(self.isLive)
def previous(self, message):
"""
Based on the handler passed at startup triggers the previous slide event
"""
log.debug(u'Live = %s, previous' % self.isLive)
if not self.isLive:
return
print "previous ", message
self.activate()
self.controller.previous_step()
self.controller.poll_slidenumber(self.isLive)
def shutdown(self, message):
"""
Based on the handler passed at startup triggers slide show to shut down
"""
log.debug(u'Live = %s, shutdown' % self.isLive)
self.controller.close_presentation()
self.controller.slidenumber = 0
#self.timer.stop()
def blank(self):
if not self.isLive:
return
if not self.controller.is_loaded():
return
if not self.controller.is_active():
return
self.controller.blank_screen()
def unblank(self):
if not self.is_live:
return
self.activate()
self.controller.unblank_screen()
class MessageListener(object):
"""
This is the Presentation listener who acts on events from the slide
@ -41,8 +157,9 @@ class MessageListener(object):
def __init__(self, controllers):
self.controllers = controllers
self.handler = None
self.is_live = None
self.previewHandler = Controller(False)
self.liveHandler = Controller(True)
self.isLive = None
# messages are sent from core.ui.slidecontroller
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'presentations_start'), self.startup)
@ -71,108 +188,84 @@ class MessageListener(object):
Start of new presentation
Save the handler as any new presentations start here
"""
self.handler, file, self.is_live = self.decodeMessage(message)
self.controller = self.controllers[self.handler]
if self.controller.is_loaded():
self.shutdown(None)
self.controller.load_presentation(file)
if self.is_live:
self.controller.start_presentation()
Receiver.send_message(u'live_slide_hide')
self.controller.slidenumber = 0
self.timer.start()
def activate(self):
if self.controller.is_active():
return
if not self.controller.is_loaded():
self.controller.load_presentation(self.controller.filepath)
self.controller.start_presentation()
if self.controller.slidenumber > 1:
self.controller.goto_slide(self.controller.slidenumber)
log.debug(u'Startup called with message %s' % message)
self.handler, file, isLive = self.decodeMessage(message)
if isLive:
self.liveHandler.addHandler(self.controllers[self.handler], file)
else:
self.previewHandler.addHandler(self.controllers[self.handler], file)
def slide(self, message):
if not self.is_live:
return
self.activate()
if message:
self.controller.goto_slide(message[0]+1)
self.controller.poll_slidenumber(self.is_live)
slide, live = self.splitMessage(message)
if live:
self.liveHandler.slide(slide, live)
else:
self.previewHandler.slide(slide, live)
def first(self, message):
"""
Based on the handler passed at startup triggers the first slide
"""
if not self.is_live:
return
self.activate()
self.controller.start_presentation()
self.controller.poll_slidenumber(self.is_live)
if self.isLive:
self.liveHandler.first(message)
else:
self.previewHandler.first(message)
def last(self, message):
"""
Based on the handler passed at startup triggers the first slide
"""
if not self.is_live:
return
self.activate()
self.controller.goto_slide(self.controller.get_slide_count())
self.controller.poll_slidenumber(self.is_live)
if self.isLive:
self.liveHandler.last(message)
else:
self.previewHandler.last(message)
def next(self, message):
"""
Based on the handler passed at startup triggers the next slide event
"""
if not self.is_live:
return
self.activate()
self.controller.next_step()
self.controller.poll_slidenumber(self.is_live)
if self.isLive:
self.liveHandler.next(message)
else:
self.previewHandler.next(message)
def previous(self, message):
"""
Based on the handler passed at startup triggers the previous slide event
"""
if not self.is_live:
return
self.activate()
self.controller.previous_step()
self.controller.poll_slidenumber(self.is_live)
if self.isLive:
self.liveHandler.previous(message)
else:
self.previewHandler.previous(message)
def shutdown(self, message):
"""
Based on the handler passed at startup triggers slide show to shut down
"""
if self.is_live:
if self.isLive:
self.liveHandler.shutdown(message)
Receiver.send_message(u'live_slide_show')
self.controller.close_presentation()
self.controller.slidenumber = 0
self.timer.stop()
else:
self.previewHandler.shutdown(message)
def blank(self):
if not self.is_live:
return
if not self.controller.is_loaded():
return
if not self.controller.is_active():
return
self.controller.blank_screen()
if self.isLive:
self.liveHandler.blank()
else:
self.previewHandler.blank()
def unblank(self):
if not self.is_live:
return
self.activate()
self.controller.unblank_screen()
if self.isLive:
self.liveHandler.unblank()
else:
self.previewHandler.unblank()
def splitMessage(self, message):
"""
Splits the selection messages
into it's component parts
``message``
Message containing Presentaion handler name and file to be presented.
"""
bits = message.split(u':')
return bits[0], bits[1]
def decodeMessage(self, message):
"""
Splits the message from the SlideController into it's component parts
Splits the initial message from the SlideController
into it's component parts
``message``
Message containing Presentaion handler name and file to be presented.
"""
file = os.path.join(message[1], message[2])
return message[0], file, message[3]
return message[0], file, message[4]
def timeout(self):
self.controller.poll_slidenumber(self.is_live)

View File

@ -336,14 +336,19 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
data = u'%s:%s' %(verse, subVerse)
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
item.setText(afterText)
#number of lines has change
#number of lines has change so repaint the list moving the data
if len(tempText.split(u'\n')) != len(afterText.split(u'\n')):
tempList = {}
tempId = {}
for row in range(0, self.VerseListWidget.count()):
tempList[row] = self.VerseListWidget.item(row).text()
tempId[row] = self.VerseListWidget.item(row).\
data(QtCore.Qt.UserRole)
self.VerseListWidget.clear()
for row in range (0, len(tempList)):
self.VerseListWidget.addItem(tempList[row])
item = QtGui.QListWidgetItem(tempList[row])
item.setData(QtCore.Qt.UserRole, tempId[row])
self.VerseListWidget.addItem(item)
self.VerseListWidget.repaint()
self.VerseEditButton.setEnabled(False)
self.VerseDeleteButton.setEnabled(False)

View File

@ -1 +1 @@
1.9.0-688
1.9.0-689