diff --git a/cnvdb.py b/cnvdb.py index 73c105b5b..a1e200ea8 100644 --- a/cnvdb.py +++ b/cnvdb.py @@ -30,6 +30,8 @@ class Convert(): infile = codecs.open(inname, 'r', encoding='iso-8859-1') writefile = codecs.open(outname, 'w', encoding='utf-8') for line in infile: + #replace the quotes with quotes + line, replace("''", "'") writefile.write(line) infile.close() writefile.close() diff --git a/openlp/core/lib/listwithpreviews.py b/openlp/core/lib/listwithpreviews.py index dce892c31..1ccb8165f 100644 --- a/openlp/core/lib/listwithpreviews.py +++ b/openlp/core/lib/listwithpreviews.py @@ -35,14 +35,18 @@ class ListWithPreviews(QtCore.QAbstractListModel): self.items = [] self.rowheight = 50 self.maximagewidth = self.rowheight * 16 / 9.0; - if new_preview_function is not None: - self.make_preview=new_preview_function - else: - self.make_preview=self.preview_function + self.preview_function = new_preview_function - def preview_function(self, filename): + def make_preview(self, filename): if os.path.exists(filename): - preview = QtGui.QImage(filename) + if self.preview_function is not None: + preview=self.preview_function(filename) + else: + preview = QtGui.QImage(filename) + else: + preview = None + + if preview is not None: w = self.maximagewidth; h = self.rowheight preview = preview.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 1f86dfe93..f8a710246 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -23,14 +23,38 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib.toolbar import * -from openlp.core.lib import translate -from listwithpreviews import ListWithPreviews +from openlp.core.lib import translate, contextMenuAction, contextMenuSeparator from serviceitem import ServiceItem 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, call them from your + plugin before or after you've done etra things that you need to. + + The plugin will be assigned an icon called u':/media/media_' + 'self.ShortPluginName + u'image.png' + which needs to be available in the main resources in order for them to work, you need to have setup + + self.TranslationContext + self.PluginTextShort # eg 'Image' for the image plugin + self.ConfigSection - where the items in the media manager are stored + this could potentially be self.PluginTextShort.lower() + + self.OnNewPrompt=u'Select Image(s)' + self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' + assumes that the new action is to load a file. If not, override onnew + + self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD()) + each plugin needs to inherit a class from this and pass that *class* (not an instance) to here + via the ListViewWithDnD_class member + + self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually) + - no scaling required - that's done later + If this fn is not defined, a default will be used (treat the filename as an image) """ + global log log = logging.getLogger(u'MediaManagerItem') log.info(u'Media Item loaded') @@ -84,61 +108,6 @@ class MediaManagerItem(QtGui.QWidget): """ self.Toolbar.addSeparator() - def contextMenuSeparator(self, base): - action = QtGui.QAction(u'', base) - action.setSeparator(True) - return action - - def contextMenuAction(self, base, icon, text, slot): - """ - Utility method to help build context menus for plugins - """ - if type(icon) is QtGui.QIcon: - ButtonIcon = icon - elif type(icon) is types.StringType or type(icon) is types.UnicodeType: - ButtonIcon = QtGui.QIcon() - if icon.startswith(u':/'): - ButtonIcon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, - QtGui.QIcon.Off) - else: - ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), - QtGui.QIcon.Normal, QtGui.QIcon.Off) - - action = QtGui.QAction(text, base) - action .setIcon(ButtonIcon) - QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) - return action - - ########################################################################### - ### None of the following *need* to be used, feel free to override - ### them cmopletely in your plugin's implementation. Alternatively, call them from your - ### plugin before or after you've done etra things that you need to. - ### in order for them to work, you need to have setup - # self.TranslationContext - # self.PluginTextShort # eg "Image" for the image plugin - # self.ConfigSection - where the items in the media manager are stored - # this could potentially be self.PluginTextShort.lower() - # self.IconPath=u'images/images' - allows specific icons to be used - # self.hasFileIcon - Is the file Icon required - # self.hasEditIcon - Is the edit Icon required - # self.hasNewIcon - Is the new Icon required - # - # self.OnNewPrompt=u'Select Image(s)' - # self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' - # assumes that the new action is to load a file. If not, override onnew - # self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD()) - # each plugin needs to inherit a class from this and pass that *class* (not an instance) to here - # via the ListViewWithDnD_class member - # The assumption is that given that at least two plugins are of the form - # "text with an icon" then all this will help - # even for plugins of another sort, the setup of the right-click menu, common toolbar - # will help to keep things consistent and ease the creation of new plugins - - # also a set of completely consistent action anesm then exist - # (onPreviewClick() is always called that, rather than having the - # name of the plugin added in as well... I regard that as a - # feature, I guess others might differ!) - def setupUi(self): # Add a toolbar self.addToolbar() @@ -168,7 +137,7 @@ class MediaManagerItem(QtGui.QWidget): u':'+self.IconPath+ u'_delete.png', self.onDeleteClick, self.PluginTextShort+u'DeleteItem') ## Separator Line ## self.addToolbarSeparator() - ## Preview Button ## + ## Preview ## self.addToolbarButton( translate(self.TranslationContext, u'Preview '+self.PluginTextShort), translate(self.TranslationContext, u'Preview the selected item'), @@ -178,7 +147,7 @@ class MediaManagerItem(QtGui.QWidget): translate(self.TranslationContext, u'Go Live'), translate(self.TranslationContext, u'Send the selected item live'), u':/system/system_live.png', self.onLiveClick, u'LiveItem') - ## Add Button ## + ## Add to service Button ## self.addToolbarButton( translate(self.TranslationContext, u'Add '+self.PluginTextShort+u' To Service'), translate(self.TranslationContext, u'Add the selected item(s) to the service'), @@ -199,26 +168,29 @@ class MediaManagerItem(QtGui.QWidget): #define and add the context menu self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) if self.hasEditIcon: - self.ListView.addAction(self.contextMenuAction(self.ListView, + self.ListView.addAction(contextMenuAction(self.ListView, ':' +self.IconPath+u'_new.png', translate(self.TranslationContext, u'&Edit '+self.PluginTextShort), self.onEditClick)) self.ListView.addAction(self.contextMenuSeparator(self.SongListWidget)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_preview.png', translate(self.TranslationContext, u'&Preview '+self.PluginTextShort), self.onPreviewClick)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_live.png', translate(self.TranslationContext, u'&Show Live'), self.onLiveClick)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_add.png', translate(self.TranslationContext, u'&Add to Service'), self.onAddClick)) QtCore.QObject.connect(self.ListView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick) + def initialise(self): + pass + def addHeaderBar(self): pass @@ -232,12 +204,15 @@ class MediaManagerItem(QtGui.QWidget): self.loadList(files) dir, filename = os.path.split(unicode(files[0])) self.parent.config.set_last_dir(dir) - #self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList()) + self.parent.config.set_list(self.ConfigSection, self.getFileList()) def getFileList(self): count = 0 - while count < len(self.ListView): - filelist = [set.ListView.item(count).text()] + filelist = [] + while count < self.ListView.count(): + bitem = self.ListView.item(count) + filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString()) + filelist.append(filename) count += 1 return filelist @@ -257,7 +232,7 @@ class MediaManagerItem(QtGui.QWidget): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs to be defined by the plugin') def onPreviewClick(self): - log.debug(self.PluginTextShort+u'Preview Requested') + log.debug(self.PluginTextShort+u' Preview Requested') service_item = ServiceItem(self.parent) service_item.addIcon(u':/media/media_'+self.PluginTextShort.lower()+u'.png') self.generateSlideData(service_item) diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 737db455a..4fa8a88e9 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -155,8 +155,12 @@ class RenderManager: def calculate_default(self, screen): log.debug(u'calculate default %s' , screen) - self.width = screen.width() - self.height = screen.height() + if self.current_display == 0: + self.width = 1024 + self.height = 768 + else: + self.width = screen.width() + self.height = screen.height() log.debug(u'calculate default %d,%d' , self.width, self.height) # 90% is start of footer self.footer_start = int(self.height * 0.90) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 48d1af59a..8fcef14ae 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -17,7 +17,7 @@ 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 slidecontroller import BaseToolbar +from slidecontroller import MasterToolbar from slidecontrollermanager import SlideControllerManager from maindisplay import MainDisplay from amendthemeform import AmendThemeForm @@ -33,5 +33,5 @@ from servicemanager import ServiceManager from thememanager import ThemeManager from mainwindow import MainWindow -__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'BaseToolbar' +__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MasterToolbar' 'MainWindow', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', 'AmendThemeForm'] diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index dc3bb6625..afa4da931 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -78,7 +78,7 @@ class MainDisplay(QtGui.QWidget): def blankDisplay(self): if not self.displayBlank: self.displayBlank = True - self.display.setPixmap(self.blankFrame) + self.display.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame)) else: self.displayBlank = False self.frameView(self.frame) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index e942ec3ea..7b56a09c8 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -205,7 +205,7 @@ class MainWindow(object): self.MediaManagerDock.setWindowIcon(icon) self.MediaManagerDock.setFloating(False) self.MediaManagerDock.setObjectName(u'MediaManagerDock') - self.MediaManagerDock.setMinimumWidth(250) + self.MediaManagerDock.setMinimumWidth(300) self.MediaManagerContents = QtGui.QWidget() self.MediaManagerContents.setObjectName(u'MediaManagerContents') self.MediaManagerLayout = QtGui.QHBoxLayout(self.MediaManagerContents) @@ -227,7 +227,7 @@ class MainWindow(object): self.ServiceManagerDock.setFeatures( QtGui.QDockWidget.AllDockWidgetFeatures) self.ServiceManagerDock.setObjectName(u'ServiceManagerDock') - self.ServiceManagerDock.setMinimumWidth(250) + self.ServiceManagerDock.setMinimumWidth(300) self.ServiceManagerContents = ServiceManager(self) self.ServiceManagerDock.setWidget(self.ServiceManagerContents) self.mainWindow.addDockWidget( diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 641715052..5679b76e1 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -21,100 +21,28 @@ import logging import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, translate +from openlp.core.lib import OpenLPToolbar, translate, buildIcon -class SlideData(QtCore.QAbstractListModel): - """ - List of frames to be displayed on the list and the main display. - """ - global log - log = logging.getLogger(u'SlideData') - - def __init__(self): - QtCore.QAbstractListModel.__init__(self) - self.items = [] - self.rowheight = 50 - self.maximagewidth = self.rowheight * 16 / 9.0; - log.info(u'Starting') - - def clear(self): - self.items = [] - - def columnCount(self, parent): - return 1 - - def rowCount(self, parent=None): - return len(self.items) - - def insertRow(self, row, frame, framenumber): - self.beginInsertRows(QtCore.QModelIndex(), row, row) - log.info(u'insert row %d' % row) - # create a preview image - frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio, - QtCore.Qt.SmoothTransformation) - self.items.insert(row, (frame1, framenumber)) - log.info(u'Item loaded') - self.endInsertRows() - - def removeRow(self, row): - self.beginRemoveRows(QtCore.QModelIndex(), row, row) - self.items.pop(row) - self.endRemoveRows() - - def addRow(self, frame, framenumber): - self.insertRow(len(self.items), frame, framenumber) - - def data(self, index, role): - row = index.row() - if row > len(self.items): - # if the last row is selected and deleted, we then get called with - # an empty row! - return QtCore.QVariant() - if role == QtCore.Qt.DecorationRole: - retval = self.items[row][0] - else: - retval = QtCore.QVariant() - if type(retval) is not type(QtCore.QVariant): - return QtCore.QVariant(retval) - else: - return retval - - def __iter__(self): - for item in self.items: - yield item - - def getValue(self, index): - row = index.row() - return self.items[row] - - def getItem(self, row): - log.info(u'Get Item:%d -> %s' %(row, unicode(self.items))) - return self.items[row] - - def getList(self): - filelist = [item[3] for item in self.items]; - return filelist - -class SlideList(QtGui.QListView): +class SlideList(QtGui.QTableWidget): def __init__(self,parent=None,name=None): - QtGui.QListView.__init__(self,parent.Controller) + QtGui.QTableWidget.__init__(self,parent.Controller) self.parent = parent def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: #here accept the event and do something if event.key() == QtCore.Qt.Key_Up: - self.parent.onSlideSelectedPrevious() + self.parent.BaseToolbar.onSlideSelectedPrevious() event.accept() elif event.key() == QtCore.Qt.Key_Down: - self.parent.onSlideSelectedNext() + self.parent.BaseToolbar.onSlideSelectedNext() event.accept() elif event.key() == QtCore.Qt.Key_PageUp: - self.parent.onSlideSelectedFirst() + self.parent.BaseToolbar.onSlideSelectedFirst() event.accept() elif event.key() == QtCore.Qt.Key_PageDown: - self.parent.onSlideSelectedLast() + self.parent.BaseToolbar.onSlideSelectedLast() event.accept() event.ignore() else: @@ -132,6 +60,7 @@ class SlideController(QtGui.QWidget): """ Set up the Slide Controller. """ + self.toolbarList = {} QtGui.QWidget.__init__(self, parent.mainWindow) self.isLive = isLive self.parent = parent @@ -145,7 +74,7 @@ class SlideController(QtGui.QWidget): self.PanelLayout.setMargin(0) # Actual controller section self.Controller = QtGui.QWidget(self.Splitter) - self.Controller.setGeometry(QtCore.QRect(0, 0, 800, 536)) + self.Controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) self.Controller.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum)) @@ -153,21 +82,17 @@ class SlideController(QtGui.QWidget): self.ControllerLayout.setSpacing(0) self.ControllerLayout.setMargin(0) # Controller list view - self.PreviewListView = SlideList(self) - self.PreviewListView.setUniformItemSizes(True) - self.PreviewListView.setIconSize(QtCore.QSize(250, 190)) - self.PreviewListData = SlideData() - self.PreviewListView.isLive = self.isLive - if QtCore.QT_VERSION_STR > u'4.4.0': - self.PreviewListView.setFlow(1) - self.PreviewListView.setViewMode(1) - self.PreviewListView.setWrapping(False) - self.PreviewListView.setModel(self.PreviewListData) - self.PreviewListView.setSpacing(0) - self.PreviewListView.setObjectName(u'PreviewListView') - self.ControllerLayout.addWidget(self.PreviewListView) + self.PreviewListWidget = SlideList(self) + self.PreviewListWidget.setColumnCount(1) + self.PreviewListWidget.horizontalHeader().setVisible(False) + self.PreviewListWidget.verticalHeader().setVisible(False) + self.PreviewListWidget.setColumnWidth(1, self.Controller.width()) + self.PreviewListWidget.isLive = self.isLive + self.PreviewListWidget.setObjectName(u'PreviewListWidget') + self.ControllerLayout.addWidget(self.PreviewListWidget) # Plugin the Base Toolbar class - self.BaseToolbar = BaseToolbar(self.isLive) + self.BaseToolbar = MasterToolbar(self.isLive) + self.registerToolbar(u'master', self.BaseToolbar) self.Toolbar = self.BaseToolbar.getToolbar() self.ControllerLayout.addWidget(self.Toolbar) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, @@ -179,7 +104,7 @@ class SlideController(QtGui.QWidget): self.Toolbar.setSizePolicy(sizeToolbarPolicy) # Screen preview area self.PreviewFrame = QtGui.QFrame(self.Splitter) - self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 250, 190)) + self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 280, 190)) self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy( QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)) self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) @@ -197,44 +122,83 @@ class SlideController(QtGui.QWidget): sizePolicy.setHeightForWidth( self.SlidePreview.sizePolicy().hasHeightForWidth()) self.SlidePreview.setSizePolicy(sizePolicy) - self.SlidePreview.setMinimumSize(QtCore.QSize(280, 210)) + self.SlidePreview.setFixedSize(QtCore.QSize(250, 210)) self.SlidePreview.setFrameShape(QtGui.QFrame.Box) self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain) self.SlidePreview.setLineWidth(1) self.SlidePreview.setScaledContents(True) self.SlidePreview.setObjectName(u'SlidePreview') self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1) - QtCore.QObject.connect(self.PreviewListView, + # Signals + QtCore.QObject.connect(self.PreviewListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.BaseToolbar.onSlideSelected) - QtCore.QObject.connect(self.PreviewListView, + QtCore.QObject.connect(self.PreviewListWidget, QtCore.SIGNAL(u'activated(QModelIndex)'), self.BaseToolbar.onSlideSelected) # Add Late Arrivals - self.BaseToolbar.PreviewListView = self.PreviewListView - self.BaseToolbar.PreviewListData = self.PreviewListData + self.BaseToolbar.PreviewListWidget = self.PreviewListWidget self.BaseToolbar.SlidePreview = self.SlidePreview self.BaseToolbar.mainDisplay = self.parent.mainDisplay + def registerToolbar(self, handle,controller): + #store the handle name in lower case so no probems later + self.toolbarList[handle.lower()] = controller + + def retrieveToolbar(self, handle): + """ + Find the toolbar and return master if none present + Add extra information back into toolbar class + """ + try: + toolbar = self.toolbarList[handle.lower()] + except: + toolbar = self.toolbarList[u'master'] + toolbar.PreviewListWidget = self.PreviewListWidget + toolbar.SlidePreview = self.SlidePreview + toolbar.mainDisplay = self.parent.mainDisplay + return toolbar + def addServiceItem(self, item): + """ + helper method to pass item to correct toolbar + """ + self.BaseToolbar = self.retrieveToolbar(item.shortname) + self.ControllerLayout.removeWidget(self.Toolbar) + #remove the old toolbar + self.Toolbar.clear() + self.Toolbar = self.BaseToolbar.getToolbar() + self.ControllerLayout.addWidget(self.Toolbar) self.BaseToolbar.addServiceItem(item) def addServiceManagerItem(self, item, slideno): + """ + helper method to pass item to correct toolbar + """ + self.BaseToolbar = self.retrieveToolbar(item.shortname) + self.ControllerLayout.removeWidget(self.Toolbar) + #remove the old toolbar + self.Toolbar.clear() + self.Toolbar = self.BaseToolbar.getToolbar() + self.ControllerLayout.addWidget(self.Toolbar) self.BaseToolbar.addServiceManagerItem(item, slideno) -class BaseToolbar(object): - +class MasterToolbar(QtCore.QObject): + """ + Class from which all tollbars should extend + """ def __init__(self, isLive): self.Toolbar = None - self.PreviewListView = QtGui.QListWidget() - self.PreviewListData = None + QtCore.QObject.__init__(self) + self.PreviewListWidget = QtGui.QListWidget() self.isLive = isLive - self.defineToolbar() def getToolbar(self): + #define toolbar here as it needs to be redefined each time + #as the clear destroys it. + self.defineToolbar() return self.Toolbar def defineToolbar(self): # Controller toolbar - #self.Toolbar = OpenLPToolbar(self.Controller) self.Toolbar = OpenLPToolbar(self) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) @@ -249,11 +213,11 @@ class BaseToolbar(object): u':/slides/slide_first.png', translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst) - self.Toolbar.addToolbarButton(u'Last Slide', + self.Toolbar.addToolbarButton(u'Previous Slide', u':/slides/slide_previous.png', translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton(u'First Slide', + self.Toolbar.addToolbarButton(u'Next Slide', u':/slides/slide_next.png', translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext) @@ -272,56 +236,35 @@ class BaseToolbar(object): """ Go to the first slide. """ - row = self.PreviewListData.createIndex(0, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + self.PreviewListWidget.selectRow(0) + self.onSlideSelected() def onSlideSelectedNext(self): """ Go to the next slide. """ - 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, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + row = self.PreviewListWidget.currentRow() + 1 + if row == self.PreviewListWidget.rowCount(): + row = 0 + self.PreviewListWidget.selectRow(row) + self.onSlideSelected() def onSlideSelectedPrevious(self): """ Go to the previous slide. """ - 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, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + row = self.PreviewListWidget.currentRow() - 1 + if row == -1: + row = self.PreviewListWidget.rowCount() - 1 + self.PreviewListWidget.selectRow(row) + self.onSlideSelected() def onSlideSelectedLast(self): """ Go to the last slide. """ - row = self.PreviewListData.createIndex( - self.PreviewListData.rowCount() - 1, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) + self.onSlideSelected() def onBlankScreen(self): """ @@ -329,54 +272,56 @@ class BaseToolbar(object): """ self.mainDisplay.blankDisplay() - def onSlideSelected(self, index): + def onSlideSelected(self): """ Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen """ - frame = self.PreviewListData.getValue(index) - self.previewFrame(frame) + row = self.PreviewListWidget.currentRow() + if row > -1 and row < self.PreviewListWidget.rowCount(): + label = self.PreviewListWidget.cellWidget(row, 0) + smallframe = label.pixmap() + frame = self.serviceitem.frames[row][u'image'] + self.SlidePreview.setPixmap(smallframe) + if self.isLive: + self.mainDisplay.frameView(frame) - def previewFrame(self, frame): + def addServiceItem(self, serviceitem, slideno = 1): """ - Generates a preview of the current slide. - """ - self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[0])) - if self.isLive: - no = frame[1] - LiveFrame = self.serviceitem.frames[no][u'image'] - self.mainDisplay.frameView(LiveFrame) - - def addServiceItem(self, serviceitem): - """ - Loads a ServiceItem. + Loads a ServiceItem into the system from plugins + Display the first slide """ log.debug(u'add Service Item') - self.serviceitem = serviceitem - self.serviceitem.render() - self.PreviewListData.clear() - framenumber = 0 - for frame in self.serviceitem.frames: - self.PreviewListData.addRow(frame[u'image'], framenumber) - framenumber += 1 - row = self.PreviewListData.createIndex(0, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + serviceitem.render() + self.addServiceManagerItem(serviceitem, 0) def addServiceManagerItem(self, serviceitem, slideno): """ - Loads a ServiceManagerItem. + Loads a ServiceItem into the system from ServiceManager + Display the Slide Passed """ log.debug(u'add Service Manager Item') - self.PreviewListData.clear() + self.PreviewListWidget.clear() + self.PreviewListWidget.setRowCount(0) self.serviceitem = serviceitem framenumber = 0 for frame in self.serviceitem.frames: - self.PreviewListData.addRow(frame[u'image'], framenumber) + self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1) + pixmap = QtGui.QPixmap.fromImage(frame[u'image']) + item = QtGui.QTableWidgetItem() + label = QtGui.QLabel() + label.setMargin(15) + label.setScaledContents(True) + width = 300 + height = width * pixmap.height() / pixmap.width() + label.setPixmap(pixmap) + self.PreviewListWidget.setCellWidget(framenumber, 0,label) + self.PreviewListWidget.setItem( framenumber, 0, item) + self.PreviewListWidget.setRowHeight(framenumber, height) + self.PreviewListWidget.setColumnWidth(0, width) framenumber += 1 - row = self.PreviewListData.createIndex(slideno, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + if slideno > self.PreviewListWidget.rowCount(): + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + else: + self.PreviewListWidget.selectRow(slideno) + self.onSlideSelected() diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 177075eaa..602f85bb9 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -177,7 +177,6 @@ class ThemeManager(QtGui.QWidget): items = self.ThemeListView.selectedIndexes() if len(items) > 0: for item in items: - print item data = self.themeData.getValue(item) self.amendThemeForm.loadTheme(data[3]) self.amendThemeForm.exec_() @@ -222,7 +221,10 @@ class ThemeManager(QtGui.QWidget): for root, dirs, files in os.walk(self.path): for name in files: if name.endswith(u'.png'): - self.themeData.addRow(os.path.join(self.path, name)) + #check to see file is in route directory + theme = os.path.join(self.path, name) + if os.path.exists(theme): + self.themeData.addRow(theme) self.parent.EventManager.post_event(Event(EventType.ThemeListChanged)) self.parent.ServiceManagerContents.updateThemeList(self.getThemes()) self.parent.settingsForm.ThemesTab.updateThemeList(self.getThemes()) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 0a1347fae..4dd42b9e9 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -37,7 +37,7 @@ class BiblePlugin(Plugin): self.weight = -9 # Create the plugin icon self.icon = QtGui.QIcon() - self.icon.addPixmap(QtGui.QPixmap(u':/media/media_verse.png'), + self.icon.addPixmap(QtGui.QPixmap(u':/media/media_bible.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) #Register the bible Manager self.biblemanager = BibleManager(self.config) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 23f58c013..8c261d32f 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -245,7 +245,7 @@ class BibleManager(): log.debug(u'get_verse_text : new book') for chapter in range(schapter, echapter+1): search_results = self.bible_http_cache [bible].get_bible_chapter(bible, 0, bookname, chapter) - if search_results.has_verse_list() : + if search_results.has_verselist() : ## We have found a book of the bible lets check to see if it was there. ## By reusing the returned book name we get a correct book. ## For example it is possible to request ac and get Acts back. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 1186fd42b..fd7681ae1 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -21,7 +21,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import ServiceItem, MediaManagerItem, Receiver, translate +from openlp.core.lib import ServiceItem, MediaManagerItem, Receiver, translate, contextMenuAction, contextMenuSeparator from openlp.plugins.bibles.forms import BibleImportForm class BibleList(QtGui.QListWidget): @@ -215,13 +215,13 @@ class BibleMediaItem(MediaManagerItem): QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick) # Context Menus self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, u':/system/system_preview.png', translate(u'BibleMediaItem',u'&Preview Verse'), self.onPreviewClick)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, u':/system/system_live.png', translate(u'BibleMediaItem',u'&Show Live'), self.onLiveClick)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, u':/system/system_add.png', translate(u'BibleMediaItem',u'&Add to Service'), self.onAddClick)) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index b583d12e1..dc0077b94 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -21,7 +21,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, SongXMLParser, ServiceItem, translate +from openlp.core.lib import MediaManagerItem, SongXMLParser, ServiceItem, translate, contextMenuAction, contextMenuSeparator class CustomList(QtGui.QListWidget): @@ -114,17 +114,17 @@ class CustomMediaItem(MediaManagerItem): QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onCustomPreviewClick) #define and add the context menu self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - self.ListView.addAction(self.contextMenuAction(self.ListView, + self.ListView.addAction(contextMenuAction(self.ListView, ':/custom/custom_edit.png', translate(u'CustomMediaItem', u'&Edit Custom'), self.onCustomEditClick)) - self.ListView.addAction(self.contextMenuSeparator(self.ListView)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuSeparator(self.ListView)) + self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_preview.png', translate(u'CustomMediaItem',u'&Preview Custom'), self.onCustomPreviewClick)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_live.png', translate(u'CustomMediaItem',u'&Show Live'), self.onCustomLiveClick)) - self.ListView.addAction(self.contextMenuAction( + self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_add.png', translate(u'CustomMediaItem',u'&Add to Service'), self.onCustomAddClick)) diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index e46cb6a2b..8a49b8c74 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -22,7 +22,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, Event, EventType -from openlp.plugins.images.lib import ImageMediaItem +from openlp.plugins.images.lib import ImageMediaItem, ImageTab class ImagePlugin(Plugin): global log @@ -40,6 +40,10 @@ class ImagePlugin(Plugin): # passed with drag and drop messages self.dnd_id = u'Image' + def get_settings_tab(self): + self.ImageTab = ImageTab() + return self.ImageTab + def get_media_manager_item(self): # Create the MediaManagerItem object self.media_item = ImageMediaItem(self, self.icon, u'Images') diff --git a/openlp/plugins/images/lib/__init__.py b/openlp/plugins/images/lib/__init__.py index ac20c9f45..8ffdca25f 100644 --- a/openlp/plugins/images/lib/__init__.py +++ b/openlp/plugins/images/lib/__init__.py @@ -19,3 +19,4 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ from mediaitem import ImageMediaItem from imageslidecontroller import ImageToolbar +from imagetab import ImageTab diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index 3c2f8b510..68f7da815 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -22,23 +22,20 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, translate -from openlp.core.ui.slidecontroller import BaseToolbar +from openlp.core.ui.slidecontroller import MasterToolbar -class ImageToolbar(BaseToolbar): +class ImageToolbar(MasterToolbar): - def __init__(self, isLive): + def __init__(self, parent, isLive): + MasterToolbar.__init__(self, isLive) + self.parent = parent self.Toolbar = None - self.PreviewListView = QtGui.QListWidget() - self.PreviewListData = None self.isLive = isLive self.defineToolbar() - def getToolbar(self): - return self.Toolbar - def defineToolbar(self): # Controller toolbar - #self.Toolbar = OpenLPToolbar(self.Controller) + self.Toolbar = OpenLPToolbar(self) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizeToolbarPolicy.setHorizontalStretch(0) @@ -50,11 +47,11 @@ class ImageToolbar(BaseToolbar): u':/slides/slide_first.png', translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst) - self.Toolbar.addToolbarButton(u'Last Slide', + self.Toolbar.addToolbarButton(u'Previous Slide', u':/slides/slide_previous.png', translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton(u'First Slide', + self.Toolbar.addToolbarButton(u'Next Slide', u':/slides/slide_next.png', translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext) @@ -70,34 +67,29 @@ class ImageToolbar(BaseToolbar): self.onBlankScreen) self.Toolbar.addSeparator() self.Toolbar.addToolbarButton(u'Start Loop', - u':/slides/slide_last.png', + u':/media/media_time.png', translate(u'SlideController', u'Start continuous loop'), self.onStartLoop) self.Toolbar.addToolbarButton(u'Stop Loop', - u':/slides/slide_last.png', - translate(u'SlideController', u'Start continuous loop'), + u':/media/media_stop.png', + translate(u'SlideController', u'Stop continuous loop'), self.onStopLoop) self.Toolbar.setSizePolicy(sizeToolbarPolicy) - self.ControllerLayout.addWidget(self.Toolbar) def onStartLoop(self): """ Go to the last slide. """ - row = self.PreviewListData.createIndex( - self.PreviewListData.rowCount() - 1, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + delay = self.parent.parent.ImageTab.loop_delay + self.timer_id = self.startTimer(delay * 1000) def onStopLoop(self): """ Go to the last slide. """ - row = self.PreviewListData.createIndex( - self.PreviewListData.rowCount() - 1, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + self.killTimer(self.timer_id) + + def timerEvent(self, event): + if event.timerId() == self.timer_id: + self.onSlideSelectedNext() + diff --git a/openlp/plugins/images/lib/imagetab.py b/openlp/plugins/images/lib/imagetab.py new file mode 100644 index 000000000..d1e58c4c6 --- /dev/null +++ b/openlp/plugins/images/lib/imagetab.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008 Raoul Snyman +Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, + +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, translate + +class ImageTab(SettingsTab): + """ + ImageTab is the Image settings tab in the settings dialog. + """ + def __init__(self): + SettingsTab.__init__(self, translate(u'ImageTab', u'Image'), u'Image') + + def setupUi(self): + self.setObjectName(u'ImageTab') + self.ImageLayout = QtGui.QFormLayout(self) + self.ImageLayout.setObjectName(u'ImageLayout') + self.ImageModeGroupBox = QtGui.QGroupBox(self) + self.ImageModeGroupBox.setObjectName(u'ImageModeGroupBox') + self.TimeoutLayout = QtGui.QHBoxLayout(self.ImageModeGroupBox) + self.TimeoutLayout.setSpacing(8) + self.TimeoutLayout.setMargin(0) + self.TimeoutLayout.setObjectName(u'TimeoutLayout') + self.TimeoutLabel = QtGui.QLabel(self.ImageModeGroupBox) + self.TimeoutLabel.setObjectName(u'TimeoutLabel') + self.TimeoutLayout.addWidget(self.TimeoutLabel) + self.TimeoutSpinBox = QtGui.QSpinBox(self.ImageModeGroupBox) + self.TimeoutSpinBox.setMaximum(180) + self.TimeoutSpinBox.setObjectName(u'TimeoutSpinBox') + self.TimeoutLayout.addWidget(self.TimeoutSpinBox) + self.TimeoutSpacer = QtGui.QSpacerItem(147, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.TimeoutLayout.addItem(self.TimeoutSpacer) + + self.ImageLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.ImageModeGroupBox) + # Signals and slots + QtCore.QObject.connect(self.TimeoutSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), self.onTimeoutSpinBoxChanged) + + def retranslateUi(self): + self.TimeoutLabel.setText(translate(u'ImageTab', u'Slide Loop Delay:')) + + def onTimeoutSpinBoxChanged(self): + self.loop_delay = self.TimeoutSpinBox.value() + + def load(self): + self.loop_delay = int(self.config.get_config(u'loop delay', 5)) + self.TimeoutSpinBox.setValue(self.loop_delay) + + def save(self): + self.config.set_config(u'loop delay', self.loop_delay) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 286670756..db9629401 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -53,12 +53,12 @@ class ImageMediaItem(MediaManagerItem): # this next is a class, not an instance of a class - it will # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = ImageListView + self.ServiceItemIconName = u':/media/media_image.png' + MediaManagerItem.__init__(self, parent, icon, title) - #create and install our own slide controllers - #a=c -# live_controller = ImageSlideController(self.parent.slideManager.parent, True) -# preview_controller = ImageSlideController(self.parent.slideManager.parent) -# self.parent.slideManager.add_controllers(u'image', preview_controller, live_controller) + #create and install our own slide controller toolbar + imageToolbar = ImageToolbar(self, True) + parent.live_controller.registerToolbar(self.ConfigSection, imageToolbar) def initialise(self): self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 26bdd1ced..bf5ff9702 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -19,6 +19,12 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ import logging import os +import tempfile +try: + import gst +except: + log = logging.getLogger(u'MediaMediaItemSetup') + log.warning(u'Can\'t generate Videos previews - import gst failed'); from PyQt4 import QtCore, QtGui @@ -26,6 +32,13 @@ from openlp.core.lib import MediaManagerItem, translate from openlp.plugins.media.lib import MediaTab from openlp.plugins.media.lib import FileListData +# from listwithpreviews import ListWithPreviews +from openlp.core.lib import MediaManagerItem, ServiceItem, translate, BaseListWithDnD, buildIcon + +class MediaListView(BaseListWithDnD): + def __init__(self, parent=None): + self.PluginName = u'Media' + BaseListWithDnD.__init__(self, parent) class MediaMediaItem(MediaManagerItem): """ @@ -36,100 +49,98 @@ class MediaMediaItem(MediaManagerItem): log.info(u'Media Media Item loaded') def __init__(self, parent, icon, title): + self.TranslationContext = u'MediaPlugin' + self.hasFileIcon = True + self.hasNewIcon = False + self.hasEditIcon = False + self.IconPath = u'images/image' + self.PluginTextShort = u'Media' + self.ConfigSection = u'images' + self.OnNewPrompt = u'Select Media(s)' + self.OnNewFileMasks = u'Videos (*.avi *.mpeg *.mpg *.mp4);;Audio (*.ogg *.mp3 *.wma);;All files (*)' + # this next is a class, not an instance of a class - it will + # be instanced by the base MediaManagerItem + self.ListViewWithDnD_class = MediaListView + #self.ServiceItemIconName = u':/media/media_image.png' + self.PreviewFunction = self.video_get_preview MediaManagerItem.__init__(self, parent, icon, title) - def setupUi(self): - # Add a toolbar - self.addToolbar() - # Create buttons for the toolbar - ## New Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'New Media'), - translate(u'MediaMediaItem',u'Load Media into openlp.org'), - ':/videos/video_load.png', self.onMediaNewClick, 'MediaNewItem') - ## Delete Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Delete Media'), - translate(u'MediaMediaItem',u'Delete the selected Media item'), - ':/videos/video_delete.png', self.onMediaDeleteClick, 'MediaDeleteItem') - ## Separator Line ## - self.addToolbarSeparator() - ## Preview Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Preview Media'), - translate(u'MediaMediaItem',u'Preview the selected Media item'), - ':/system/system_preview.png', self.onMediaPreviewClick, 'MediaPreviewItem') - ## Live Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Go Live'), - translate(u'MediaMediaItem',u'Send the selected Media item live'), - ':/system/system_live.png', self.onMediaLiveClick, 'MediaLiveItem') - ## Add Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Add Media To Service'), - translate(u'MediaMediaItem',u'Add the selected Media items(s) to the service'), - ':/system/system_add.png',self.onMediaAddClick, 'MediaAddItem') - ## Add the Medialist widget ## + def video_get_preview(self, filename): + """Gets a preview of the first frame of a video file using + GSTREAMER (non-portable??? - Can't figure out how to do with + Phonon - returns a QImage""" + try: + # Define your pipeline, just as you would at the command prompt. + # This is much easier than trying to create and link each gstreamer element in Python. + # This is great for pipelines that end with a filesink (i.e. there is no audible or visual output) + log.info ("Video preview %s"%( filename)) + outfile=tempfile.NamedTemporaryFile(suffix='.png') + cmd=u'filesrc location="%s" ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s"'% (filename, outfile.name) + pipe = gst.parse_launch(cmd) + # Get a reference to the pipeline's bus + bus = pipe.get_bus() - self.MediaListView = QtGui.QListView() - self.MediaListView.setAlternatingRowColors(True) - self.MediaListData = FileListData() - self.MediaListView.setModel(self.MediaListData) + # Set the pipeline's state to PLAYING + pipe.set_state(gst.STATE_PLAYING) - self.PageLayout.addWidget(self.MediaListView) + # Listen to the pipeline's bus indefinitely until we receive a EOS (end of stream) message. + # This is a super important step, or the pipeline might not work as expected. For example, + # in my example pipeline above, the pngenc will not export an actual image unless you have + # this line of code. It just exports a 0 byte png file. So... don't forget this step. + bus.poll(gst.MESSAGE_EOS, -1) + img = QtGui.QImage(outfile.name) + outfile.close() +# os.unlink(outfile.name) + pipe.set_state(gst.STATE_NULL) + return img + except: + log.info("Can't generate video preview for some reason"); + import sys + print sys.exc_info() + return None - #define and add the context menu - self.MediaListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - - self.MediaListView.addAction(self.contextMenuAction( - self.MediaListView, ':/system/system_preview.png', - translate(u'MediaMediaItem',u'&Preview Media'), self.onMediaPreviewClick)) - self.MediaListView.addAction(self.contextMenuAction( - self.MediaListView, ':/system/system_live.png', - translate(u'MediaMediaItem',u'&Show Live'), self.onMediaLiveClick)) - self.MediaListView.addAction(self.contextMenuAction( - self.MediaListView, ':/system/system_add.png', - translate(u'MediaMediaItem',u'&Add to Service'), self.onMediaAddClick)) - - def initialise(self): - list = self.parent.config.load_list(u'Media') - self.loadMediaList(list) - - def onMediaNewClick(self): - files = QtGui.QFileDialog.getOpenFileNames(None, - translate(u'MediaMediaItem', u'Select Media(s) items'), - self.parent.config.get_last_dir(), - u'Videos (*.avi *.mpeg);;Audio (*.mp3 *.ogg *.wma);;All files (*)') - if len(files) > 0: - self.loadMediaList(files) - dir, filename = os.path.split(unicode(files[0])) - self.parent.config.set_last_dir(dir) - self.parent.config.set_list(u'media', self.MediaListData.getFileList()) - - def getFileList(self): - filelist = [item[0] for item in self.MediaListView]; - return filelist - - def loadMediaList(self, list): - for files in list: - self.MediaListData.addRow(files) - - def onMediaDeleteClick(self): - indexes = self.MediaListView.selectedIndexes() + def generateSlideData(self, service_item): + indexes = self.ListView.selectedIndexes() + service_item.title = u'Media' for index in indexes: - current_row = int(index.row()) - self.MediaListData.removeRow(current_row) - self.parent.config.set_list(u'media', self.MediaListData.getFileList()) + filename = self.ListData.getFilename(index) + frame = QtGui.QImage(unicode(filename)) + (path, name) = os.path.split(filename) + service_item.add_from_image(path, name, frame) - def onMediaPreviewClick(self): + def onPreviewClick(self): log.debug(u'Media Preview Button pressed') - items = self.MediaListView.selectedIndexes() + items = self.ListView.selectedIndexes() for item in items: - text = self.MediaListData.getValue(item) + text = self.ListData.getValue(item) print text def onMediaLiveClick(self): + log.debug(u'Media Live Button pressed') pass - def onMediaAddClick(self): - pass \ No newline at end of file + def initialise(self): + self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) + self.ListView.setIconSize(QtCore.QSize(88,50)) + self.loadList(self.parent.config.load_list(self.ConfigSection)) + + def onDeleteClick(self): + item = self.ListView.currentItem() + if item is not None: + item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] + row = self.ListView.row(item) + self.ListView.takeItem(row) + self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList()) + + def loadList(self, list): + for file in list: + (path, filename) = os.path.split(unicode(file)) + item_name = QtGui.QListWidgetItem(filename) + img = self.video_get_preview(file) + #item_name.setIcon(buildIcon(file)) + item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) + self.ListView.addItem(item_name) + +# def onMediaAddClick(self): +# log.debug(u'Media Add Button pressed') +# pass diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index e90257104..a14613607 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -22,7 +22,6 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab from openlp.plugins.media.lib import MediaTab,MediaMediaItem - class MediaPlugin(Plugin): def __init__(self, plugin_helpers): diff --git a/openlp/plugins/media/video_render.py b/openlp/plugins/media/video_render.py deleted file mode 100644 index fa3807d5d..000000000 --- a/openlp/plugins/media/video_render.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -""" -OpenLP - Open Source Lyrics Projection -Copyright (c) 2008 Raoul Snyman -Portions copyright (c) 2008 Martin Thompson, Tim Bentley, - -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 -""" -import os -from PyQt4 import QtCore, QtGui - -# xxx this needs a try, except once we've decided what to do if it fails -from PyQt4.phonon import Phonon - -# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab -# from openlp.plugins.media.lib import MediaTab,MediaMediaItem - -"""Renders a video to some surface or other """ - -class w(QtGui.QMainWindow): - def __init__(self, parent=None): - super(QtGui.QMainWindow, self).__init__(parent) - self.resize(640,480) - self.setWindowTitle(u'simple media player') - self.show() - -if __name__==u'__main__': - app = QtGui.QApplication([]) -# widget = QtGui.QWidget() -# widget.resize(320, 240) -# widget.setWindowTitle(u'simple') -# widget.show() -# QCore.QCoreApplication.setApplicationName(u'OpenLP') - mainwindow=w() - widget=QtGui.QWidget(mainwindow) - mainwindow.setCentralWidget(widget) - widget.setLayout(QtGui.QVBoxLayout(widget)) -# videofile=u'r-128.rm' - videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' - source=Phonon.MediaSource(videofile) - - media=Phonon.MediaObject(widget) - media.setCurrentSource(source) - - video=Phonon.VideoWidget(widget) - audio=Phonon.AudioOutput(Phonon.MusicCategory) -# controller=Phonon.MediaController(media) - Phonon.createPath(media, video); - Phonon.createPath(media, audio); -# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget) - slider=Phonon.SeekSlider(media, mainwindow) - widget.layout().addWidget(slider) - widget.layout().addWidget(video) - slider.show() - - video.show() - media.play() - app.exec_() - diff --git a/openlp/plugins/presentations/lib/impresscom.py b/openlp/plugins/presentations/lib/impresscom.py index 59c7366f8..99e2f2c46 100644 --- a/openlp/plugins/presentations/lib/impresscom.py +++ b/openlp/plugins/presentations/lib/impresscom.py @@ -57,7 +57,7 @@ class Openoffice(object): self.createApp() def startOpenoffice(self): - cmd = u'openoffice.org -nologo -norestore -minimized -impress' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' + cmd = u'openoffice.org -nologo -norestore -invisible -minimized -impress' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' retval = subprocess.Popen(cmd, shell=True) self.oopid = retval.pid diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 7b4e1af3d..5165237d5 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -20,7 +20,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, translate, ServiceItem, SongXMLParser +from openlp.core.lib import MediaManagerItem, translate, ServiceItem, SongXMLParser , contextMenuAction, contextMenuSeparator from openlp.plugins.songs.forms import EditSongForm @@ -138,17 +138,17 @@ class SongMediaItem(MediaManagerItem): QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onSongPreviewClick) #define and add the context menu self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - self.ListView.addAction(self.contextMenuAction(self.ListView, + self.ListView.addAction(contextMenuAction(self.ListView, ':/songs/song_new.png', translate(u'SongMediaItem', u'&Edit Song'), self.onSongEditClick)) - self.ListView.addAction(self.contextMenuSeparator(self.ListView)) - self.ListView.addAction(self.contextMenuAction(self.ListView, + self.ListView.addAction(contextMenuSeparator(self.ListView)) + self.ListView.addAction(contextMenuAction(self.ListView, ':/system/system_preview.png', translate(u'SongMediaItem', u'&Preview Song'), self.onSongPreviewClick)) - self.ListView.addAction(self.contextMenuAction(self.ListView, + self.ListView.addAction(contextMenuAction(self.ListView, ':/system/system_live.png', translate(u'SongMediaItem', u'&Show Live'), self.onSongLiveClick)) - self.ListView.addAction(self.contextMenuAction(self.ListView, + self.ListView.addAction(contextMenuAction(self.ListView, ':/system/system_add.png', translate(u'SongMediaItem', u'&Add to Service'), self.onSongAddClick)) diff --git a/resources/images/media_verse.png b/resources/images/media_bible.png similarity index 100% rename from resources/images/media_verse.png rename to resources/images/media_bible.png diff --git a/resources/images/media_stop.png b/resources/images/media_stop.png new file mode 100644 index 000000000..5b4c488bd Binary files /dev/null and b/resources/images/media_stop.png differ diff --git a/resources/images/media_time.png b/resources/images/media_time.png new file mode 100644 index 000000000..77ba33c8c Binary files /dev/null and b/resources/images/media_time.png differ diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 62151f185..0571a70d5 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -86,8 +86,10 @@ media_presentation.png media_image.png media_song.png - media_verse.png + media_bible.png media_video.png + media_time.png + media_stop.png messagebox_critical.png