Tim Bentley has proposed merging lp:~trb143/openlp/bugs into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  #693150 Custom Slide Display footer option
  https://bugs.launchpad.net/bugs/693150
  #693202 delete theme
  https://bugs.launchpad.net/bugs/693202

For more details, see:
https://code.launchpad.net/~trb143/openlp/bugs/+merge/49544

Add ability to set the start point of a media item.
Display the start and end time of an item in service manager.
-- 
https://code.launchpad.net/~trb143/openlp/bugs/+merge/49544
Your team OpenLP Core is requested to review the proposed merge of 
lp:~trb143/openlp/bugs into lp:openlp.
=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2011-02-02 12:28:48 +0000
+++ openlp/core/lib/serviceitem.py	2011-02-13 13:59:55 +0000
@@ -28,11 +28,14 @@
 type and capability of an item.
 """
 
+import datetime
 import logging
+import mutagen
 import os
 import uuid
 
 from openlp.core.lib import build_icon, clean_tags, expand_tags
+from openlp.core.lib.ui import UiStrings
 
 log = logging.getLogger(__name__)
 
@@ -60,6 +63,7 @@
     AddIfNewItem = 9
     ProvidesOwnDisplay = 10
     AllowsDetailedTitleDisplay = 11
+    AllowsVarableStartTime = 12
 
 
 class ServiceItem(object):
@@ -105,6 +109,7 @@
         self.data_string = u''
         self.edit_id = None
         self.xml_version = None
+        self.start_time = 0
         self._new_item()
 
     def _new_item(self):
@@ -257,7 +262,8 @@
             u'capabilities': self.capabilities,
             u'search': self.search_string,
             u'data': self.data_string,
-            u'xml_version': self.xml_version
+            u'xml_version': self.xml_version,
+            u'start_time': self.start_time
         }
         service_data = []
         if self.service_item_type == ServiceItemType.Text:
@@ -301,6 +307,8 @@
             self.data_string = header[u'data']
         if u'xml_version' in header:
             self.xml_version = header[u'xml_version']
+        if u'start_time' in header:
+            self.start_time = header[u'start_time']
         if self.service_item_type == ServiceItemType.Text:
             for slide in serviceitem[u'serviceitem'][u'data']:
                 self._raw_frames.append(slide)
@@ -420,3 +428,30 @@
             return self._raw_frames[row][u'path']
         except IndexError:
             return u''
+
+    def get_media_time(self):
+        """
+        Returns the start and finish time for a media item
+        """
+        tooltip = None
+        start = None
+        end = None
+        if self.start_time != 0:
+            start = UiStrings.StartTimeCode % \
+                unicode(datetime.timedelta(seconds=self.start_time))
+        path = os.path.join(self.get_frames()[0][u'path'],
+            self.get_frames()[0][u'title'])
+        if os.path.isfile(path):
+            file = mutagen.File(path)
+            if file is not None:
+                seconds = int(file.info.length)
+                end = UiStrings.LengthTime % \
+                    unicode(datetime.timedelta(seconds=seconds))
+        if not start and not end:
+            return None
+        elif start and not end:
+            return start
+        elif not start and end:
+            return end
+        else:
+            return u'%s : %s' % (start, end)

=== modified file 'openlp/core/lib/theme.py'
--- openlp/core/lib/theme.py	2011-02-10 23:00:15 +0000
+++ openlp/core/lib/theme.py	2011-02-13 13:59:55 +0000
@@ -170,8 +170,8 @@
     Type enumeration for horizontal alignment.
     """
     Left = 0
-    Center = 1
-    Right = 2
+    Center = 2
+    Right = 1
 
     @staticmethod
     def to_string(horizontal_type):

=== modified file 'openlp/core/lib/ui.py'
--- openlp/core/lib/ui.py	2011-02-10 22:49:30 +0000
+++ openlp/core/lib/ui.py	2011-02-13 13:59:55 +0000
@@ -58,6 +58,7 @@
     ExportType = unicode(translate('OpenLP.Ui', 'Export %s'))
     Import = translate('OpenLP.Ui', 'Import')
     ImportType = unicode(translate('OpenLP.Ui', 'Import %s'))
+    LengthTime = unicode(translate('OpenLP.Ui', 'Length %s'))
     Live = translate('OpenLP.Ui', 'Live')
     Load = translate('OpenLP.Ui', 'Load')
     LoadANew = unicode(translate('OpenLP.Ui', 'Load a new %s.'))
@@ -75,10 +76,10 @@
     SendSelectLive = unicode(translate('OpenLP.Ui',
         'Send the selected %s live.'))
     Service = translate('OpenLP.Ui', 'Service')
+    StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s'))
     Theme = translate('OpenLP.Ui', 'Theme')
     Themes = translate('OpenLP.Ui', 'Themes')
 
-
 def add_welcome_page(parent, image):
     """
     Generate an opening welcome page for a wizard using a provided image.

=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py	2011-02-08 16:25:46 +0000
+++ openlp/core/ui/__init__.py	2011-02-13 13:59:55 +0000
@@ -53,6 +53,7 @@
 
 from themeform import ThemeForm
 from filerenameform import FileRenameForm
+from starttimeform import StartTimeForm
 from maindisplay import MainDisplay
 from servicenoteform import ServiceNoteForm
 from serviceitemeditform import ServiceItemEditForm

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2011-02-12 16:07:11 +0000
+++ openlp/core/ui/maindisplay.py	2011-02-13 13:59:55 +0000
@@ -106,6 +106,9 @@
         self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject)
         Phonon.createPath(self.mediaObject, self.videoWidget)
         Phonon.createPath(self.mediaObject, self.audio)
+        QtCore.QObject.connect(self.mediaObject,
+            QtCore.SIGNAL(u'stateChanged(Phonon::State, Phonon::State)'),
+            self.videoStart)
         self.webView = QtWebKit.QWebView(self)
         self.webView.setGeometry(0, 0,
             self.screen[u'size'].width(), self.screen[u'size'].height())
@@ -341,6 +344,13 @@
         Receiver.send_message(u'maindisplay_active')
         return self.preview()
 
+    def videoStart(self, newState, oldState):
+        """
+        Start the video at a predetermined point.
+        """
+        if newState == 2:
+            self.mediaObject.seek(self.serviceItem.start_time * 1000)
+
     def isWebLoaded(self):
         """
         Called by webView event to show display is fully loaded

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2011-02-10 22:49:30 +0000
+++ openlp/core/ui/servicemanager.py	2011-02-13 13:59:55 +0000
@@ -36,7 +36,7 @@
     Receiver, build_icon, ItemCapabilities, SettingsManager, translate, \
     ThemeLevel
 from openlp.core.lib.ui import UiStrings, critical_error_message_box
-from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm
+from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
 from openlp.core.ui.printserviceorderform import PrintServiceOrderForm
 from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \
     split_filename
@@ -88,6 +88,7 @@
         self._fileName = u''
         self.serviceNoteForm = ServiceNoteForm(self.mainwindow)
         self.serviceItemEditForm = ServiceItemEditForm(self.mainwindow)
+        self.startTimeForm = StartTimeForm(self.mainwindow)
         # start with the layout
         self.layout = QtGui.QVBoxLayout(self)
         self.layout.setSpacing(0)
@@ -270,16 +271,19 @@
         self.notesAction = self.menu.addAction(
             translate('OpenLP.ServiceManager', '&Notes'))
         self.notesAction.setIcon(build_icon(u':/services/service_notes.png'))
+        self.timeAction = self.menu.addAction(
+            translate('OpenLP.ServiceManager', '&Start Time'))
+        self.timeAction.setIcon(build_icon(u':/media/media_time.png'))
         self.deleteAction = self.menu.addAction(
             translate('OpenLP.ServiceManager', '&Delete From Service'))
         self.deleteAction.setIcon(build_icon(u':/general/general_delete.png'))
         self.sep1 = self.menu.addAction(u'')
         self.sep1.setSeparator(True)
         self.previewAction = self.menu.addAction(
-            translate('OpenLP.ServiceManager', '&Preview Verse'))
+            translate('OpenLP.ServiceManager', 'Show &Preview'))
         self.previewAction.setIcon(build_icon(u':/general/general_preview.png'))
         self.liveAction = self.menu.addAction(
-            translate('OpenLP.ServiceManager', '&Live Verse'))
+            translate('OpenLP.ServiceManager', 'Show &Live'))
         self.liveAction.setIcon(build_icon(u':/general/general_live.png'))
         self.sep2 = self.menu.addAction(u'')
         self.sep2.setSeparator(True)
@@ -563,6 +567,7 @@
         self.editAction.setVisible(False)
         self.maintainAction.setVisible(False)
         self.notesAction.setVisible(False)
+        self.timeAction.setVisible(False)
         if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsEdit)\
             and serviceItem[u'service_item'].edit_id:
             self.editAction.setVisible(True)
@@ -571,6 +576,9 @@
             self.maintainAction.setVisible(True)
         if item.parent() is None:
             self.notesAction.setVisible(True)
+        if serviceItem[u'service_item']\
+            .is_capable(ItemCapabilities.AllowsVarableStartTime):
+            self.timeAction.setVisible(True)
         self.themeMenu.menuAction().setVisible(False)
         if serviceItem[u'service_item'].is_text():
             self.themeMenu.menuAction().setVisible(True)
@@ -583,6 +591,8 @@
             self.onDeleteFromService()
         if action == self.notesAction:
             self.onServiceItemNoteForm()
+        if action == self.timeAction:
+            self.onStartTimeForm()
         if action == self.previewAction:
             self.makePreview()
         if action == self.liveAction:
@@ -597,6 +607,16 @@
                 self.serviceNoteForm.textEdit.toPlainText()
             self.repaintServiceList(item, -1)
 
+    def onStartTimeForm(self):
+        item = self.findServiceItem()[0]
+        self.startTimeForm.item = self.serviceItems[item]
+        if self.startTimeForm.exec_():
+            self.serviceItems[item][u'service_item'].start_time = \
+                self.startTimeForm.hourSpinBox.value() * 3600 + \
+                self.startTimeForm.minuteSpinBox.value() * 60 + \
+                self.startTimeForm.secondSpinBox.value()
+            self.repaintServiceList(item, -1)
+
     def onServiceItemEditForm(self):
         item = self.findServiceItem()[0]
         self.serviceItemEditForm.setServiceItem(
@@ -843,6 +863,11 @@
                 text = frame[u'title'].replace(u'\n', u' ')
                 child.setText(0, text[:40])
                 child.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(count))
+                if item[u'service_item'] \
+                    .is_capable(ItemCapabilities.AllowsVarableStartTime):
+                    tip = item[u'service_item'].get_media_time()
+                    if tip:
+                        child.setToolTip(0, tip)
                 if serviceItem == itemcount:
                     if item[u'expanded'] and serviceItemChild == count:
                         self.serviceManagerList.setCurrentItem(child)

=== added file 'openlp/core/ui/starttimedialog.py'
--- openlp/core/ui/starttimedialog.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/starttimedialog.py	2011-02-13 13:59:55 +0000
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2011 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# 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 translate
+from openlp.core.lib.ui import create_accept_reject_button_box
+
+class Ui_StartTimeDialog(object):
+    def setupUi(self, StartTimeDialog):
+        StartTimeDialog.setObjectName(u'StartTimeDialog')
+        StartTimeDialog.resize(300, 10)
+        self.dialogLayout = QtGui.QGridLayout(StartTimeDialog)
+        self.dialogLayout.setObjectName(u'dialogLayout')
+        self.hourLabel = QtGui.QLabel(StartTimeDialog)
+        self.hourLabel.setObjectName("hourLabel")
+        self.dialogLayout.addWidget(self.hourLabel, 0, 0, 1, 1)
+        self.hourSpinBox = QtGui.QSpinBox(StartTimeDialog)
+        self.hourSpinBox.setObjectName("hourSpinBox")
+        self.dialogLayout.addWidget(self.hourSpinBox, 0, 1, 1, 1)
+        self.minuteLabel = QtGui.QLabel(StartTimeDialog)
+        self.minuteLabel.setObjectName("minuteLabel")
+        self.dialogLayout.addWidget(self.minuteLabel, 1, 0, 1, 1)
+        self.minuteSpinBox = QtGui.QSpinBox(StartTimeDialog)
+        self.minuteSpinBox.setObjectName("minuteSpinBox")
+        self.dialogLayout.addWidget(self.minuteSpinBox, 1, 1, 1, 1)
+        self.secondLabel = QtGui.QLabel(StartTimeDialog)
+        self.secondLabel.setObjectName("secondLabel")
+        self.dialogLayout.addWidget(self.secondLabel, 2, 0, 1, 1)
+        self.secondSpinBox = QtGui.QSpinBox(StartTimeDialog)
+        self.secondSpinBox.setObjectName("secondSpinBox")
+        self.dialogLayout.addWidget(self.secondSpinBox, 2, 1, 1, 1)
+        self.buttonBox = create_accept_reject_button_box(StartTimeDialog, True)
+        self.dialogLayout.addWidget(self.buttonBox, 4, 0, 1, 2)
+        self.retranslateUi(StartTimeDialog)
+        self.setMaximumHeight(self.sizeHint().height())
+        QtCore.QMetaObject.connectSlotsByName(StartTimeDialog)
+
+    def retranslateUi(self, StartTimeDialog):
+        self.setWindowTitle(translate('OpenLP.StartTimeForm',
+            'Item Start Time'))
+        self.hourLabel.setText(translate('OpenLP.StartTimeForm', 'Hours:'))
+        self.hourSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'h'))
+        self.minuteSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'm'))
+        self.secondSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 's'))
+        self.minuteLabel.setText(translate('OpenLP.StartTimeForm', 'Minutes:'))
+        self.secondLabel.setText(translate('OpenLP.StartTimeForm', 'Seconds:'))

=== added file 'openlp/core/ui/starttimeform.py'
--- openlp/core/ui/starttimeform.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/starttimeform.py	2011-02-13 13:59:55 +0000
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2011 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# 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 QtGui
+
+from starttimedialog import Ui_StartTimeDialog
+
+class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog):
+    """
+    The exception dialog
+    """
+    def __init__(self, parent):
+        QtGui.QDialog.__init__(self, parent)
+        self.setupUi(self)
+
+    def exec_(self):
+        """
+        Run the Dialog with correct heading.
+        """
+        seconds = self.item[u'service_item'].start_time
+        hours = seconds / 3600
+        seconds -= 3600 * hours
+        minutes = seconds / 60
+        seconds -= 60 * minutes
+        self.hourSpinBox.setValue(hours)
+        self.minuteSpinBox.setValue(minutes)
+        self.secondSpinBox.setValue(seconds)
+        return QtGui.QDialog.exec_(self)
+

=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py	2011-02-11 04:04:05 +0000
+++ openlp/plugins/media/lib/mediaitem.py	2011-02-13 13:59:55 +0000
@@ -123,6 +123,7 @@
             service_item.title = unicode(
                 translate('MediaPlugin.MediaItem', 'Media'))
             service_item.add_capability(ItemCapabilities.RequiresMedia)
+            service_item.add_capability(ItemCapabilities.AllowsVarableStartTime)
             # force a nonexistent theme
             service_item.theme = -1
             frame = u':/media/image_clapperboard.png'

_______________________________________________
Mailing list: https://launchpad.net/~openlp-core
Post to     : openlp-core@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openlp-core
More help   : https://help.launchpad.net/ListHelp

Reply via email to