Add OOS and speed up Renderer

bzr-revno: 463
This commit is contained in:
Tim Bentley 2009-06-08 21:46:43 +01:00
commit 296a573007
14 changed files with 227 additions and 307 deletions

View File

@ -41,7 +41,6 @@ class OpenLP(QtGui.QApplication):
#provide a listener for widgets to reqest a screen update.
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'openlpprocessevents'), self.processEvents)
self.setApplicationName(u'openlp.org')
self.setApplicationVersion(u'1.9.0')
self.splash = SplashScreen(self.applicationVersion())
@ -66,4 +65,3 @@ class OpenLP(QtGui.QApplication):
if __name__ == u'__main__':
app = OpenLP(sys.argv)
app.run()

View File

@ -20,22 +20,14 @@ Place, Suite 330, Boston, MA 02111-1307 USA
import logging
import os, os.path
import sys
#from copy import copy
from datetime import *
from PyQt4 import QtGui, QtCore, Qt
from copy import copy
class Renderer:
"""
All the functions for rendering a set of words onto a Device Context
How to use:
set the words to be displayed with a call to format_slide() - this returns an array of screenfuls of data
set a theme (if you need) with set_theme
tell it which DC to render to with set_DC()
set the borders of where you want the text (if not the whole DC) with set_text_rectangle()
tell it to render a particular screenfull with render_screen(n)
Genarates a pixmap image of a array of text. The Text is formatted to
make sure it fits on the screen and if not extra frames a generated.
"""
global log
log = logging.getLogger(u'Renderer')
@ -98,7 +90,7 @@ class Renderer:
"""
if preview == True:
self._bg_frame = None
log.debug(u'set frame dest (frame) w %d h %d',frame_width, frame_height)
log.debug(u'set frame dest (frame) w %d h %d', frame_width, frame_height)
self._frame = QtGui.QPixmap(frame_width, frame_height)
if self._bg_image_filename is not None:
self.scale_bg_image()
@ -109,10 +101,10 @@ class Renderer:
"""
External API to sort out the text to pe placed on the frame
"""
print "########## Format Slide ##################"
#print "########## Format Slide ##################"
log.debug(u'format_slide %s', words)
verses = []
words = words.replace("\r\n", "\n")
words = words.replace(u'\r\n', u'\n')
verses_text = words.split(u'\n\n')
text = []
for verse in verses_text:
@ -120,8 +112,8 @@ class Renderer:
for line in lines:
text.append(line)
split_text = self._split_set_of_lines(text, False)
print "split text ", split_text
print "text ", text
#print "split text ", split_text
#print "text ", text
return split_text
def set_text_rectangle(self, rect_main, rect_footer):
@ -147,7 +139,6 @@ class Renderer:
bbox = self._render_lines_unaligned(lines, False, (x, y))
if footer_lines is not None:
bbox = self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
log.debug(u'generate_frame_from_lines - Finish')
return self._frame
def _generate_background_frame(self):
@ -158,7 +149,6 @@ class Renderer:
assert(self._theme)
self._bg_frame = QtGui.QPixmap(self._frame.width(), self._frame.height())
log.debug(u'render background %s ', self._theme.background_type)
bef = datetime.now()
painter = QtGui.QPainter()
painter.begin(self._bg_frame)
if self._theme.background_type == u'solid':
@ -193,9 +183,6 @@ class Renderer:
else:
painter.fillRect(self._frame.rect(), QtGui.QColor(u'#000000'))
painter.end()
aft = datetime.now()
print "background time", bef, aft, aft-bef
log.debug(u'render background finish')
def _split_set_of_lines(self, lines, footer):
"""
@ -212,16 +199,11 @@ class Renderer:
#print "bboxes ", bboxes
numlines = len(lines)
bottom = self._rect.bottom()
count = 0
for ratio in (numlines, numlines/2, numlines/3, numlines/4):
good = 1
startline = 0
endline = startline + ratio
while (endline <= numlines and endline != 0):
count += 1
if count > 100:
#print "busted"
break
by = 0
for (x,y) in bboxes[startline:endline]:
#print by, startline, endline, x, y, bottom
@ -278,7 +260,7 @@ class Renderer:
elif int(self._theme.display_verticalAlign) == 1: # centre align
y = rect.top() + (rect.height() - bbox.height()) / 2
else:
assert(0 , u'Invalid value for theme.VerticalAlign:%s' % self._theme.display_verticalAlign)
log.error(u'Invalid value for theme.VerticalAlign:%s' % self._theme.display_verticalAlign)
return x, y
def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)):
@ -306,7 +288,6 @@ class Renderer:
painter.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
painter.drawRect(retval)
painter.end()
log.debug(u'render lines unaligned Finish')
return retval
def _render_and_wrap_single_line(self, line, footer, tlcorner=(0,0)):
@ -317,7 +298,7 @@ class Renderer:
right-aligns the surplus words in the manner of song lyrics
Returns the bottom-right corner (of what was rendered) as a tuple(x, y).
"""
log.debug(u'Render single line %s @ %s '%( line, tlcorner))
#log.debug(u'Render single line %s @ %s '%( line, tlcorner))
x, y = tlcorner
# We draw the text to see how big it is and then iterate to make it fit
# when we line wrap we do in in the "lyrics" style, so the second line is
@ -342,7 +323,8 @@ class Renderer:
startx = x
starty = y
rightextent = None
if footer: # dont allow alignment messing with footers
# dont allow alignment messing with footers
if footer:
align = 0
else:
align = int(self._theme .display_horizontalAlign)
@ -354,42 +336,47 @@ class Renderer:
w += self._shadow_offset
h += self._shadow_offset
if self._theme.display_outline:
w += 2*self._outline_offset # pixels either side
h += 2*self._outline_offset # pixels top/bottom
# pixels either side
w += 2 * self._outline_offset
# pixels top/bottom
h += 2 * self._outline_offset
if align == 0: # left align
rightextent = x + w
if self._theme.display_wrapStyle == 1 and linenum != 0: # shift right from last line's rh edge
# shift right from last line's rh edge
if self._theme.display_wrapStyle == 1 and linenum != 0:
rightextent = self._first_line_right_extent + self._right_margin
if rightextent > maxx:
rightextent = maxx
x = rightextent - w
elif align == 1: # right align
# right align
elif align == 1:
rightextent = maxx
x = maxx - w
elif align == 2: # centre
# centre
elif align == 2:
x = (maxx - w) / 2;
rightextent = x + w
# now draw the text, and any outlines/shadows
if self._theme.display_shadow:
self._get_extent_and_render(line, footer,tlcorner=(x+self._shadow_offset,y+self._shadow_offset),
self._get_extent_and_render(line, footer, tlcorner=(x+self._shadow_offset,y+self._shadow_offset),
draw=True, color = self._theme.display_shadow_color)
if self._theme.display_outline:
self._get_extent_and_render(line, footer,(x+self._outline_offset,y), draw=True,
self._get_extent_and_render(line, footer, (x+self._outline_offset,y), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,(x, y+self._outline_offset), draw=True,
self._get_extent_and_render(line, footer, (x, y+self._outline_offset), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,(x, y-self._outline_offset), draw=True,
self._get_extent_and_render(line, footer, (x, y-self._outline_offset), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,(x-self._outline_offset,y), draw=True,
self._get_extent_and_render(line, footer, (x-self._outline_offset,y), draw=True,
color = self._theme.display_outline_color)
if self._outline_offset > 1:
self._get_extent_and_render(line, footer,(x+self._outline_offset,y+self._outline_offset), draw=True,
self._get_extent_and_render(line, footer, (x+self._outline_offset,y+self._outline_offset), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,(x-self._outline_offset,y+self._outline_offset), draw=True,
self._get_extent_and_render(line, footer, (x-self._outline_offset,y+self._outline_offset), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,(x+self._outline_offset,y-self._outline_offset), draw=True,
self._get_extent_and_render(line, footer, (x+self._outline_offset,y-self._outline_offset), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,(x-self._outline_offset,y-self._outline_offset), draw=True,
self._get_extent_and_render(line, footer, (x-self._outline_offset,y-self._outline_offset), draw=True,
color = self._theme.display_outline_color)
self._get_extent_and_render(line, footer,tlcorner=(x, y), draw=True)
y += h
@ -403,7 +390,6 @@ class Renderer:
painter.drawRect(startx , starty , rightextent-startx , y-starty)
painter.end()
brcorner = (rightextent , y)
log.debug(u'Render single line Finish')
return brcorner
# xxx this is what to override for an SDL version
@ -454,14 +440,7 @@ class Renderer:
Debugging method to allow images to be viewed
"""
im = image.toImage()
im.save("renderer.png", "png")
im.save(u'renderer.png', u'png')
if image2 is not None:
im = image2.toImage()
im.save("renderer2.png", "png")
# def render_screen(self, screennum):
# log.debug(u'render screen\n %s %s ', screennum, self.words[screennum])
# t = 0.0
# words = self.words[screennum]
# retval = self._render_lines(words)
# return retval
im.save(u'renderer2.png', u'png')

View File

@ -64,6 +64,7 @@ class RenderManager:
self.calculate_default(self.screen_list[self.current_display]['size'])
self.theme = u''
self.service_theme = u''
self.global_style = u''
def update_display(self, screen_number):
"""

View File

@ -32,12 +32,14 @@ class ServiceItem():
log=logging.getLogger(u'ServiceItem')
log.info(u'Service Item created')
def __init__(self, hostplugin):
def __init__(self, hostplugin=None):
"""
Init Method
"""
self.plugin = hostplugin
self.shortname = hostplugin.name
if hostplugin is not None:
self.RenderManager = self.plugin.render_manager
self.shortname = hostplugin.name
self.title = u''
self.items = []
self.iconic_representation = None
@ -47,10 +49,11 @@ class ServiceItem():
self.frames = []
self.raw_footer = None
self.theme = None
log.debug(u'Service item created for %s ', self.shortname)
#log.debug(u'Service item created for %s ', self.shortname)
self.service_frames = []
def addIcon(self, icon):
self.icon = icon
self.iconic_representation = buildIcon(icon)
def render(self):
@ -59,15 +62,15 @@ class ServiceItem():
"""
log.debug(u'Render called')
if self.theme == None:
self.plugin.render_manager.set_override_theme(None)
self.RenderManager.set_override_theme(None)
else:
self.plugin.render_manager.set_override_theme(self.theme)
self.RenderManager.set_override_theme(self.theme)
log.debug(u'Formatting slides')
if self.service_item_type == u'text':
for slide in self.service_frames:
formated = self.plugin.render_manager.format_slide(slide[u'raw_slide'])
formated = self.RenderManager.format_slide(slide[u'raw_slide'])
for format in formated:
frame = self.plugin.render_manager.generate_slide(format, self.raw_footer)
frame = self.RenderManager.generate_slide(format, self.raw_footer)
self.frames.append({u'title': slide[u'title'], u'image': frame})
elif self.service_item_type == u'command':
self.frames = self.service_frames
@ -76,7 +79,7 @@ class ServiceItem():
self.frames = self.service_frames
self.service_frames = []
else:
assert(0 , u'Invalid value rendere :%s' % self.service_item_type)
log.error(u'Invalid value renderer :%s' % self.service_item_type)
def add_from_image(self, frame_title, image):
self.service_item_type = u'image'
@ -91,24 +94,29 @@ class ServiceItem():
self.service_item_type = u'command'
self.service_frames.append({u'title': frame_title, u'command': command})
def get_oos_repr(self):
"""
This method returns some text which can be saved into the OOS
file to represent this item
"""
pass
oos_header = {u'plugin': self.shortname,u'theme':self.theme, u'title':self.title,
u'icon':self.icon, u'footer':self.raw_footer, u'type':self.service_item_type}
oos_data = []
if self.service_item_type == u'text':
for slide in self.service_frames:
oos_data.append(slide[u'raw_slide'])
return {u'header': oos_header, u'data': self.service_frames}
def set_from_oos(self, oostext):
def set_from_oos(self, serviceitem):
"""
This method takes some oostext (passed from the ServiceManager)
and parses it into the data actually required
"""
pass
def set_from_plugin(self):
"""
Takes data from the plugin media chooser
"""
pass
header = serviceitem[u'serviceitem'][u'header']
self.title = header[u'title']
self.service_item_type = header[u'type']
self.shortname = header[u'plugin']
self.theme = header[u'theme']
self.addIcon(header[u'icon'])
self.raw_footer = header[u'footer']
self.service_frames = serviceitem[u'serviceitem'][u'data']

View File

@ -60,7 +60,7 @@ class MainDisplay(QtGui.QWidget):
if not screen[u'primary']:
self.showFullScreen()
else:
self.hide()
self.showMinimized()
painter = QtGui.QPainter()
self.blankFrame = QtGui.QPixmap(screen[u'size'].width(), screen[u'size'].height())
painter.begin(self.blankFrame)

View File

@ -75,12 +75,12 @@ class MainWindow(object):
# hook methods have to happen after find_plugins. Find plugins needs the
# controllershence the hooks have moved from setupUI() to here
# Find and insert media manager items
log.info(u'hook media')
self.plugin_manager.hook_media_manager(self.MediaToolBox)
# Find and insert settings tabs
log.info(u'hook settings')
self.plugin_manager.hook_settings_tabs(self.settingsForm)
# Find and insert media manager items
log.info(u'hook media')
self.plugin_manager.hook_media_manager(self.MediaToolBox)
# Call the hook method to pull in import menus.
log.info(u'hook menus')
self.plugin_manager.hook_import_menu(self.FileImportMenu)

View File

@ -19,6 +19,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
"""
import os
import logging
import cPickle
from PyQt4 import QtCore, QtGui
from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, Event, \
@ -134,7 +135,8 @@ class ServiceManager(QtGui.QWidget):
"""
Clear the list to create a new service
"""
self.service_data.clearItems()
self.ServiceManagerList.clear()
self.serviceItems = []
def onDeleteFromService(self):
"""
@ -146,13 +148,34 @@ class ServiceManager(QtGui.QWidget):
"""
Save the current service
"""
pass
filename = QtGui.QFileDialog.getSaveFileName(self, u'Save Order of Service',self.config.get_last_dir() )
if filename != u'':
self.config.set_last_dir(filename)
print filename
service = []
for item in self.serviceItems:
service.append({u'serviceitem':item[u'data'].get_oos_repr()})
file = open(filename+u'.oos', u'wb')
cPickle.dump(service, file)
file.close()
def onLoadService(self):
"""
Load an existing service from disk
"""
pass
filename = QtGui.QFileDialog.getOpenFileName(self, u'Open Order of Service',self.config.get_last_dir(),
u'Services (*.oos)')
if filename != u'':
self.config.set_last_dir(filename)
file = open(filename, u'r')
items = cPickle.load(file)
file.close()
self.onNewService()
for item in items:
serviceitem = ServiceItem()
serviceitem.RenderManager = self.parent.RenderManager
serviceitem.set_from_oos(item)
self.addServiceItem(serviceitem)
def onThemeComboBoxSelected(self, currentIndex):
"""
@ -162,16 +185,16 @@ class ServiceManager(QtGui.QWidget):
self.parent.RenderManager.set_service_theme(self.service_theme)
self.config.set_config(u'theme service theme', self.service_theme)
def addServiceItem(self, item):
def addServiceItem(self, item, expand=True):
"""
Add an item to the list
"""
self.serviceItems.append({u'data': item, u'order': len(self.serviceItems)+1})
treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList)
treewidgetitem.setText(0,item.title) # + u':' + item.shortname)
treewidgetitem.setText(0,item.title)
treewidgetitem.setIcon(0,item.iconic_representation)
treewidgetitem.setData(0, QtCore.Qt.UserRole, QtCore.QVariant(len(self.serviceItems)))
treewidgetitem.setExpanded(True)
treewidgetitem.setExpanded(expand)
item.render()
count = 0
for frame in item.frames:
@ -204,13 +227,14 @@ class ServiceManager(QtGui.QWidget):
count = 0
for item in items:
childCount = item.childCount()
if childCount >= 1: # is the parent
if childCount >= 1:
pos = item.data(0, QtCore.Qt.UserRole).toInt()[0]
else:
parentitem = item.parent()
pos = parentitem.data(0, QtCore.Qt.UserRole).toInt()[0]
count = item.data(0, QtCore.Qt.UserRole).toInt()[0]
pos = pos - 1 #adjust for zeor indexing
#adjuest for zero based arrays
pos = pos - 1
return pos, count
def dragEnterEvent(self, event):
@ -229,26 +253,6 @@ class ServiceManager(QtGui.QWidget):
plugin = event.mimeData().text()
self.parent.EventManager.post_event(Event(EventType.LoadServiceItem, plugin))
def oos_as_text(self):
text=[]
log.info( "oos as text")
log.info("Data:"+str(self.service_data))
for i in self.service_data:
text.append("# " + str(i))
text.append(i.get_oos_text())
return '\n'.join(text)
def write_oos(self, filename):
"""
Write a full OOS file out - iterate over plugins and call their respective methods
This format is totally arbitrary testing purposes - something sensible needs to go in here!
"""
oosfile=open(filename, "w")
oosfile.write("# BEGIN OOS\n")
oosfile.write(self.oos_as_text)
oosfile.write("# END OOS\n")
oosfile.close()
def updateThemeList(self, theme_list):
"""
Called from ThemeManager when the Themes have changed
@ -264,4 +268,3 @@ class ServiceManager(QtGui.QWidget):
self.service_theme = u''
self.ThemeComboBox.setCurrentIndex(id)
self.parent.RenderManager.set_service_theme(self.service_theme)

View File

@ -135,11 +135,10 @@ class SlideController(QtGui.QWidget):
self.PreviewListView = QtGui.QListView(self.Controller)
self.PreviewListData = SlideData()
self.PreviewListView.isLive = self.isLive
self.PreviewListView.setFlow(1)
self.PreviewListView.setViewMode(1)
#self.PreviewListView.setFlow(1)
#self.PreviewListView.setViewMode(1)
self.PreviewListView.setWrapping(False)
self.PreviewListView.setModel(self.PreviewListData)
#self.PreviewListView.setSelectionRectVisible(True)
self.PreviewListView.setSpacing(0)
self.PreviewListView.setObjectName(u'PreviewListView')
self.ControllerLayout.addWidget(self.PreviewListView)

View File

@ -33,9 +33,9 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
global log
log=logging.getLogger(u'BibleImportForm')
log.info(u'BibleImportForm loaded')
'''
"""
Class documentation goes here.
'''
"""
def __init__(self, config, biblemanager , bibleplugin, parent = None):
'''
Constructor
@ -124,7 +124,7 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
# Was OSIS and is not any more stops lostFocus running mad
if self.bible_type == u'OSIS':
self.bible_type = None
self.freeAll()
self.resetScreenFieldStates()
def onBooksLocationEditLostFocus(self):
self.checkOsis()
@ -209,9 +209,9 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
str(self.PermisionEdit.displayText()))
self.bible_type = None
# free the screen state restrictions
self.freeAll()
self.resetScreenFieldStates()
# reset all the screen fields
self.resetAll()
self.resetEntryFields()
def checkOsis(self):
if len(self.BooksLocationEdit.displayText()) > 0 or len(self.VerseLocationEdit.displayText()) > 0:
@ -220,7 +220,7 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
# Was CSV and is not any more stops lostFocus running mad
if self.bible_type == u'CSV':
self.bible_type = None
self.freeAll()
self.resetScreenFieldStates()
def checkHttp(self):
if self.BibleComboBox.currentIndex() != 0 : # First slot is blank so no bible
@ -229,7 +229,7 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
# Was HTTP and is not any more stops lostFocus running mad
if self.bible_type == u'HTTP':
self.bible_type = None
self.freeAll()
self.resetScreenFieldStates()
def blockCsv(self):
self.BooksLocationEdit.setReadOnly(True)
@ -247,7 +247,7 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
self.blockHttp()
def setOsis(self):
self.bible_type = 'OSIS'
self.bible_type = u'OSIS'
self.OSISLocationEdit.setReadOnly(False)
self.OsisFileButton.setEnabled(True)
self.blockCsv()
@ -268,8 +268,9 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
self.LocationComboBox.setEnabled(False)
self.BibleComboBox.setEnabled(False)
def freeAll(self):
if self.bible_type == None: # only reset if no bible type set.
def resetScreenFieldStates(self):
# only reset if no bible type set.
if self.bible_type == None:
self.BooksLocationEdit.setReadOnly(False)
self.VerseLocationEdit.setReadOnly(False)
self.BooksFileButton.setEnabled(True)
@ -279,7 +280,7 @@ class BibleImportForm(QtGui.QDialog, Ui_BibleImportDialog):
self.LocationComboBox.setEnabled(True)
self.BibleComboBox.setEnabled(True)
def resetAll(self):
def resetEntryFields(self):
self.BooksLocationEdit.setText(u'')
self.VerseLocationEdit.setText(u'')
self.OSISLocationEdit.setText(u'')

View File

@ -17,6 +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
"""
import logging
from PyQt4 import Qt, QtCore, QtGui
@ -27,6 +28,10 @@ class BiblesTab(SettingsTab):
"""
BiblesTab is the Bibles settings tab in the settings dialog.
"""
global log
log = logging.getLogger(u'BibleTab')
log.info(u'Bible Tab loaded')
def __init__(self):
self.paragraph_style = True
self.show_new_chapters = False
@ -67,14 +72,12 @@ class BiblesTab(SettingsTab):
self.NewChaptersCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox)
self.NewChaptersCheckBox.setObjectName("NewChaptersCheckBox")
self.VerseDisplayLayout.addWidget(self.NewChaptersCheckBox, 1, 0, 1, 1)
self.DisplayStyleWidget = QtGui.QWidget(self.VerseDisplayGroupBox)
self.DisplayStyleWidget.setObjectName(u'DisplayStyleWidget')
self.DisplayStyleLayout = QtGui.QHBoxLayout(self.DisplayStyleWidget)
self.DisplayStyleLayout.setSpacing(8)
self.DisplayStyleLayout.setMargin(0)
self.DisplayStyleLayout.setObjectName(u'DisplayStyleLayout')
self.DisplayStyleLabel = QtGui.QLabel(self.DisplayStyleWidget)
self.DisplayStyleLabel.setObjectName(u'DisplayStyleLabel')
self.DisplayStyleLayout.addWidget(self.DisplayStyleLabel)
@ -86,14 +89,12 @@ class BiblesTab(SettingsTab):
self.DisplayStyleComboBox.addItem(QtCore.QString())
self.DisplayStyleLayout.addWidget(self.DisplayStyleComboBox)
self.VerseDisplayLayout.addWidget(self.DisplayStyleWidget, 2, 0, 1, 1)
self.BibleThemeWidget = QtGui.QWidget(self.VerseDisplayGroupBox)
self.BibleThemeWidget.setObjectName(u'BibleThemeWidget')
self.BibleThemeLayout = QtGui.QHBoxLayout(self.BibleThemeWidget)
self.BibleThemeLayout.setSpacing(8)
self.BibleThemeLayout.setMargin(0)
self.BibleThemeLayout.setObjectName(u'BibleThemeLayout')
self.BibleThemeLabel = QtGui.QLabel(self.BibleThemeWidget)
self.BibleThemeLabel.setObjectName(u'BibleThemeLabel')
self.BibleThemeLayout.addWidget(self.BibleThemeLabel)
@ -102,7 +103,6 @@ class BiblesTab(SettingsTab):
self.BibleThemeComboBox.addItem(QtCore.QString())
self.BibleThemeLayout.addWidget(self.BibleThemeComboBox)
self.VerseDisplayLayout.addWidget(self.BibleThemeWidget, 3, 0, 1, 1)
self.ChangeNoteLabel = QtGui.QLabel(self.VerseDisplayGroupBox)
self.ChangeNoteLabel.setObjectName(u'ChangeNoteLabel')
self.VerseDisplayLayout.addWidget(self.ChangeNoteLabel, 4, 0, 1, 1)
@ -111,7 +111,6 @@ class BiblesTab(SettingsTab):
QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.BibleLeftLayout.addItem(self.BibleLeftSpacer)
self.BibleLayout.addWidget(self.BibleLeftWidget)
self.BibleRightWidget = QtGui.QWidget(self)
self.BibleRightWidget.setObjectName(u'BibleRightWidget')
self.BibleRightLayout = QtGui.QVBoxLayout(self.BibleRightWidget)
@ -176,13 +175,15 @@ class BiblesTab(SettingsTab):
def onNewChaptersCheckBoxChanged(self):
check_state = self.NewChaptersCheckBox.checkState()
self.show_new_chapters = False
if check_state == 2: # we have a set value convert to True/False
# we have a set value convert to True/False
if check_state == 2:
self.show_new_chapters = True
def onBibleSearchCheckBoxChanged(self):
check_state = self.BibleSearchCheckBox.checkState()
self.bible_search = False
if check_state == 2: # we have a set value convert to True/False
# we have a set value convert to True/False
if check_state == 2:
self.bible_search = True
def load(self):

View File

@ -42,9 +42,7 @@ class BibleList(QtGui.QListView):
mimeData = QtCore.QMimeData()
drag.setMimeData(mimeData)
mimeData.setText(u'Bibles')
dropAction = drag.start(QtCore.Qt.CopyAction)
if dropAction == QtCore.Qt.CopyAction:
self.close()
@ -90,7 +88,6 @@ class BibleMediaItem(MediaManagerItem):
translate(u'BibleMediaItem',u'Add the selected Bible(s) to the service'),
u':/system/system_add.png',
self.onBibleAddClick, u'BibleAddItem')
# Create the tab widget
self.SearchTabWidget = QtGui.QTabWidget(self)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
@ -99,7 +96,6 @@ class BibleMediaItem(MediaManagerItem):
sizePolicy.setHeightForWidth(self.SearchTabWidget.sizePolicy().hasHeightForWidth())
self.SearchTabWidget.setSizePolicy(sizePolicy)
self.SearchTabWidget.setObjectName(u'SearchTabWidget')
# Add the Quick Search tab
self.QuickTab = QtGui.QWidget()
self.QuickTab.setObjectName(u'QuickTab')
@ -138,7 +134,6 @@ class BibleMediaItem(MediaManagerItem):
QuickSpacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
self.QuickLayout.addItem(QuickSpacerItem, 4, 2, 1, 1)
# Add the Advanced Search tab
self.AdvancedTab = QtGui.QWidget()
self.AdvancedTab.setObjectName(u'AdvancedTab')
@ -170,45 +165,37 @@ class BibleMediaItem(MediaManagerItem):
self.AdvancedToLabel = QtGui.QLabel(self.AdvancedTab)
self.AdvancedToLabel.setObjectName(u'AdvancedToLabel')
self.AdvancedLayout.addWidget(self.AdvancedToLabel, 4, 0, 1, 1)
self.AdvancedFromChapter = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedFromChapter.setObjectName(u'AdvancedFromChapter')
self.AdvancedLayout.addWidget(self.AdvancedFromChapter, 3, 2, 1, 1)
self.AdvancedFromVerse = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedFromVerse.setObjectName(u'AdvancedFromVerse')
self.AdvancedLayout.addWidget(self.AdvancedFromVerse, 3, 3, 1, 1)
self.AdvancedToChapter = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedToChapter.setObjectName(u'AdvancedToChapter')
self.AdvancedLayout.addWidget(self.AdvancedToChapter, 4, 2, 1, 1)
self.AdvancedToVerse = QtGui.QComboBox(self.AdvancedTab)
self.AdvancedToVerse.setObjectName(u'AdvancedToVerse')
self.AdvancedLayout.addWidget(self.AdvancedToVerse, 4, 3, 1, 1)
self.AdvancedClearLabel = QtGui.QLabel(self.QuickTab)
self.AdvancedClearLabel.setObjectName(u'QuickSearchLabel')
self.AdvancedLayout.addWidget(self.AdvancedClearLabel, 5, 0, 1, 1)
self.ClearAdvancedSearchComboBox = QtGui.QComboBox(self.QuickTab)
self.ClearAdvancedSearchComboBox.setObjectName(u'ClearAdvancedSearchComboBox')
self.AdvancedLayout.addWidget(self.ClearAdvancedSearchComboBox, 5, 2, 1, 1)
self.AdvancedSearchButton = QtGui.QPushButton(self.AdvancedTab)
self.AdvancedSearchButton.setObjectName(u'AdvancedSearchButton')
self.AdvancedLayout.addWidget(self.AdvancedSearchButton, 5, 3, 1, 1)
self.SearchTabWidget.addTab(self.AdvancedTab, u'Advanced')
# Add the search tab widget to the page layout
self.PageLayout.addWidget(self.SearchTabWidget)
self.BibleListView = BibleList()
self.BibleListView.setAlternatingRowColors(True)
self.BibleListData = TextListData()
self.BibleListView.setModel(self.BibleListData)
self.BibleListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.BibleListView.setDragEnabled(True)
self.PageLayout.addWidget(self.BibleListView)
# Combo Boxes
QtCore.QObject.connect(self.AdvancedVersionComboBox,
QtCore.SIGNAL(u'activated(int)'), self.onAdvancedVersionComboBox)
@ -226,7 +213,7 @@ class BibleMediaItem(MediaManagerItem):
QtCore.QObject.connect(self.QuickSearchButton,
QtCore.SIGNAL(u'pressed()'), self.onQuickSearchButton)
QtCore.QObject.connect(self.BibleListView,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onRowSelected)
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onBiblePreviewClick)
# Context Menus
self.BibleListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.BibleListView.addAction(self.contextMenuAction(
@ -239,7 +226,6 @@ class BibleMediaItem(MediaManagerItem):
self.BibleListView, u':/system/system_add.png',
translate(u'BibleMediaItem',u'&Add to Service'), self.onBibleAddClick))
def retranslateUi(self):
log.debug(u'retranslateUi')
self.QuickVersionLabel.setText(translate(u'BibleMediaItem', u'Version:'))
@ -262,9 +248,6 @@ class BibleMediaItem(MediaManagerItem):
self.ClearAdvancedSearchComboBox.addItem(translate(u'BibleMediaItem', u'Clear'))
self.ClearAdvancedSearchComboBox.addItem(translate(u'BibleMediaItem', u'Keep'))
def onRowSelected(self, row):
self.onBiblePreviewClick()
def initialise(self):
log.debug(u'initialise')
self.loadBibles()
@ -277,7 +260,8 @@ class BibleMediaItem(MediaManagerItem):
# load bibles into the combo boxes
for bible in bibles:
self.QuickVersionComboBox.addItem(bible)
bibles = self.parent.biblemanager.get_bibles(u'partial') # Without HTTP
# Without HTT
bibles = self.parent.biblemanager.get_bibles(u'partial')
first = True
# load bibles into the combo boxes
for bible in bibles:
@ -367,7 +351,7 @@ class BibleMediaItem(MediaManagerItem):
self.parent.preview_controller.addServiceItem(service_item)
def generateSlideData(self, service_item):
log.debug(u'Bible Preview Button pressed')
log.debug(u'generating slide data')
items = self.BibleListView.selectedIndexes()
old_chapter = u''
raw_slides=[]
@ -459,7 +443,7 @@ class BibleMediaItem(MediaManagerItem):
end_chapter = ''
start_verse = ''
end_verse = ''
search = search.replace(u' ', ' ').strip()
search = search.replace(u' ', u' ').strip()
original = search
message = None
# Remove book beware 0 index arrays

View File

@ -41,9 +41,7 @@ class CustomList(QtGui.QListView):
mimeData = QtCore.QMimeData()
drag.setMimeData(mimeData)
mimeData.setText(u'Custom')
dropAction = drag.start(QtCore.Qt.CopyAction)
if dropAction == QtCore.Qt.CopyAction:
self.close()
@ -65,36 +63,36 @@ class CustomMediaItem(MediaManagerItem):
# Create buttons for the toolbar
## New Custom Button ##
self.addToolbarButton(
translate('CustomMediaItem',u'New Custom Item'),
translate('CustomMediaItem',u'Add a new Custom Item'),
':/custom/custom_new.png', self.onCustomNewClick, 'CustomNewItem')
translate(u'CustomMediaItem',u'New Custom Item'),
translate(u'CustomMediaItem',u'Add a new Custom Item'),
u':/custom/custom_new.png', self.onCustomNewClick, u'CustomNewItem')
## Edit Custom Button ##
self.addToolbarButton(
translate('CustomMediaItem',u'Edit Custom Item'),
translate('CustomMediaItem',u'Edit the selected Custom Item'),
':/custom/custom_edit.png', self.onCustomEditClick, 'CustomEditItem')
translate(u'CustomMediaItem',u'Edit Custom Item'),
translate(u'CustomMediaItem',u'Edit the selected Custom Item'),
u':/custom/custom_edit.png', self.onCustomEditClick, u'CustomEditItem')
## Delete Custom Button ##
self.addToolbarButton(
translate('CustomMediaItem',u'Delete Custom Item'),
translate('CustomMediaItem',u'Delete the selected Custom Item'),
':/custom/custom_delete.png', self.onCustomDeleteClick, 'CustomDeleteItem')
translate(u'CustomMediaItem',u'Delete Custom Item'),
translate(u'CustomMediaItem',u'Delete the selected Custom Item'),
u':/custom/custom_delete.png', self.onCustomDeleteClick, u'CustomDeleteItem')
## Separator Line ##
self.addToolbarSeparator()
## Preview Custom Button ##
self.addToolbarButton(
translate('CustomMediaItem',u'Preview Custom Item'),
translate('CustomMediaItem',u'Preview the selected Custom Item'),
':/system/system_preview.png', self.onCustomPreviewClick, 'CustomPreviewItem')
translate(u'CustomMediaItem',u'Preview Custom Item'),
translate(u'CustomMediaItem',u'Preview the selected Custom Item'),
u':/system/system_preview.png', self.onCustomPreviewClick, u'CustomPreviewItem')
## Live Custom Button ##
self.addToolbarButton(
translate('CustomMediaItem',u'Go Live'),
translate('CustomMediaItem', u'Send the selected Custom live'),
':/system/system_live.png', self.onCustomLiveClick, 'CustomLiveItem')
translate(u'CustomMediaItem',u'Go Live'),
translate(u'CustomMediaItem', u'Send the selected Custom live'),
u':/system/system_live.png', self.onCustomLiveClick, u'CustomLiveItem')
## Add Custom Button ##
self.addToolbarButton(
translate('CustomMediaItem',u'Add Custom To Service'),
translate('CustomMediaItem',u'Add the selected Custom(s) to the service'),
':/system/system_add.png', self.onCustomAddClick, 'CustomAddItem')
translate(u'CustomMediaItem',u'Add Custom To Service'),
translate(u'CustomMediaItem',u'Add the selected Custom(s) to the service'),
u':/system/system_add.png', self.onCustomAddClick, u'CustomAddItem')
# Add the Customlist widget
self.CustomWidget = QtGui.QWidget(self)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
@ -103,64 +101,36 @@ class CustomMediaItem(MediaManagerItem):
sizePolicy.setHeightForWidth(self.CustomWidget.sizePolicy().hasHeightForWidth())
self.CustomWidget.setSizePolicy(sizePolicy)
self.CustomWidget.setObjectName(u'CustomWidget')
# self.SearchLayout = QtGui.QGridLayout(self.CustomWidget)
# self.SearchLayout.setObjectName('SearchLayout')
# self.SearchTextLabel = QtGui.QLabel(self.CustomWidget)
# self.SearchTextLabel.setObjectName('SearchTextLabel')
# self.SearchTextLabel.setText('Search Text:')
# self.SearchLayout.addWidget(self.SearchTextLabel, 2, 0, 1, 1)
# self.SearchTextEdit = QtGui.QLineEdit(self.CustomWidget)
# self.SearchTextEdit.setObjectName('SearchTextEdit')
# self.SearchLayout.addWidget(self.SearchTextEdit, 2, 1, 1, 2)
#
# self.ClearTextButton = QtGui.QPushButton(self.CustomWidget)
# self.ClearTextButton.setObjectName('ClearTextButton')
#
# self.SearchLayout.addWidget(self.ClearTextButton, 3, 1, 1, 1)
# self.SearchTextButton = QtGui.QPushButton(self.CustomWidget)
# self.SearchTextButton.setObjectName('SearchTextButton')
# self.SearchLayout.addWidget(self.SearchTextButton, 3, 2, 1, 1)
# Add the Custom widget to the page layout
self.PageLayout.addWidget(self.CustomWidget)
self.CustomListView = CustomList()
self.CustomListView.setAlternatingRowColors(True)
self.CustomListData = TextListData()
self.CustomListView.setModel(self.CustomListData)
self.CustomListView.setDragEnabled(True)
self.PageLayout.addWidget(self.CustomListView)
# Signals
# QtCore.QObject.connect(self.SearchTextButton,
# QtCore.SIGNAL("pressed()"), self.onSearchTextButtonClick)
# QtCore.QObject.connect(self.ClearTextButton,
# QtCore.SIGNAL("pressed()"), self.onClearTextButtonClick)
# QtCore.QObject.connect(self.SearchTextEdit,
# QtCore.SIGNAL("textChanged(const QString&)"), self.onSearchTextEditChanged)
# QtCore.QObject.connect(self.CustomListView,
# QtCore.SIGNAL("itemPressed(QTableWidgetItem * item)"), self.onCustomSelected)
QtCore.QObject.connect(self.CustomListView,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onCustomPreviewClick)
#define and add the context menu
self.CustomListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.CustomListView.addAction(self.contextMenuAction(self.CustomListView,
':/custom/custom_edit.png', translate('CustomMediaItem', u'&Edit Custom'),
':/custom/custom_edit.png', translate(u'CustomMediaItem', u'&Edit Custom'),
self.onCustomEditClick))
self.CustomListView.addAction(self.contextMenuSeparator(self.CustomListView))
self.CustomListView.addAction(self.contextMenuAction(
self.CustomListView, ':/system/system_preview.png',
translate('CustomMediaItem',u'&Preview Custom'), self.onCustomPreviewClick))
translate(u'CustomMediaItem',u'&Preview Custom'), self.onCustomPreviewClick))
self.CustomListView.addAction(self.contextMenuAction(
self.CustomListView, ':/system/system_live.png',
translate('CustomMediaItem',u'&Show Live'), self.onCustomLiveClick))
translate(u'CustomMediaItem',u'&Show Live'), self.onCustomLiveClick))
self.CustomListView.addAction(self.contextMenuAction(
self.CustomListView, ':/system/system_add.png',
translate('CustomMediaItem',u'&Add to Service'), self.onCustomAddClick))
translate(u'CustomMediaItem',u'&Add to Service'), self.onCustomAddClick))
# def retranslateUi(self):
# self.ClearTextButton.setText(translate('CustomMediaItem', u'Clear'))
# self.SearchTextButton.setText(translate('CustomMediaItem', u'Search'))
# self.ClearTextButton.setText(translate(u'CustomMediaItem', u'Clear'))
# self.SearchTextButton.setText(translate(u'CustomMediaItem', u'Search'))
def initialise(self):
self.loadCustomList(self.parent.custommanager.get_all_slides())
@ -177,7 +147,8 @@ class CustomMediaItem(MediaManagerItem):
self.SearchTextEdit.clear()
def onSearchTextEditChanged(self, text):
if len(text) > 3: # only search if > 3 characters
# only search if > 3 characters
if len(text) > 3:
self.onSearchTextButtonClick()
def onSearchTextButtonClick(self):
@ -209,21 +180,21 @@ class CustomMediaItem(MediaManagerItem):
def onCustomPreviewClick(self):
log.debug(u'Custom Preview Requested')
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.addIcon(u':/media/media_song.png')
self.generateSlideData(service_item)
self.parent.preview_controller.addServiceItem(service_item)
def onCustomLiveClick(self):
log.debug(u'Custom Live Requested')
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.addIcon(u':/media/media_song.png')
self.generateSlideData(service_item)
self.parent.live_controller.addServiceItem(service_item)
def onCustomAddClick(self):
log.debug(u'Custom Add Requested')
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.addIcon(u':/media/media_song.png')
self.generateSlideData(service_item)
self.parent.service_manager.addServiceItem(service_item)

View File

@ -42,9 +42,7 @@ class ImageList(QtGui.QListView):
mimeData = QtCore.QMimeData()
drag.setMimeData(mimeData)
mimeData.setText(u'Image')
dropAction = drag.start(QtCore.Qt.CopyAction)
if dropAction == QtCore.Qt.CopyAction:
self.close()
@ -65,32 +63,31 @@ class ImageMediaItem(MediaManagerItem):
# Create buttons for the toolbar
## New Song Button ##
self.addToolbarButton(
translate('ImageMediaItem', u'Load Image'),
translate('ImageMediaItem', u'Load images into openlp.org'),
':/images/image_load.png', self.onImagesNewClick, 'ImageNewItem')
translate(u'ImageMediaItem', u'Load Image'),
translate(u'ImageMediaItem', u'Load images into openlp.org'),
u':/images/image_load.png', self.onImagesNewClick, u'ImageNewItem')
## Delete Song Button ##
self.addToolbarButton(
translate('ImageMediaItem', u'Delete Image'),
translate('ImageMediaItem', u'Delete the selected image'),
':/images/image_delete.png', self.onImageDeleteClick, 'ImageDeleteItem')
translate(u'ImageMediaItem', u'Delete Image'),
translate(u'ImageMediaItem', u'Delete the selected image'),
u':/images/image_delete.png', self.onImageDeleteClick, u'ImageDeleteItem')
## Separator Line ##
self.addToolbarSeparator()
## Preview Song Button ##
self.addToolbarButton(
translate('ImageMediaItem', u'Preview Song'),
translate('ImageMediaItem', u'Preview the selected image'),
':/system/system_preview.png', self.onImagePreviewClick, 'ImagePreviewItem')
translate(u'ImageMediaItem', u'Preview Song'),
translate(u'ImageMediaItem', u'Preview the selected image'),
u':/system/system_preview.png', self.onImagePreviewClick, u'ImagePreviewItem')
## Live Song Button ##
self.addToolbarButton(
translate('ImageMediaItem', u'Go Live'),
translate('ImageMediaItem', u'Send the selected image live'),
':/system/system_live.png', self.onImageLiveClick, 'ImageLiveItem')
translate(u'ImageMediaItem', u'Go Live'),
translate(u'ImageMediaItem', u'Send the selected image live'),
u':/system/system_live.png', self.onImageLiveClick, u'ImageLiveItem')
## Add Song Button ##
self.addToolbarButton(
translate('ImageMediaItem', u'Add Image To Service'),
translate('ImageMediaItem', u'Add the selected image(s) to the service'),
':/system/system_add.png', self.onImageAddClick, 'ImageAddItem')
translate(u'ImageMediaItem', u'Add Image To Service'),
translate(u'ImageMediaItem', u'Add the selected image(s) to the service'),
u':/system/system_add.png', self.onImageAddClick, u'ImageAddItem')
#Add the Image List widget
self.ImageListView = ImageList()
self.ImageListView.uniformItemSizes = True
@ -101,33 +98,29 @@ class ImageMediaItem(MediaManagerItem):
self.ImageListView.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
self.ImageListView.setAlternatingRowColors(True)
self.ImageListView.setDragEnabled(True)
self.ImageListView.setObjectName('ImageListView')
self.ImageListView.setObjectName(u'ImageListView')
self.PageLayout.addWidget(self.ImageListView)
#define and add the context menu
self.ImageListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.ImageListView.addAction(self.contextMenuAction(
self.ImageListView, ':/system/system_preview.png',
translate('ImageMediaItem', u'&Preview Image'),
translate(u'ImageMediaItem', u'&Preview Image'),
self.onImagePreviewClick))
self.ImageListView.addAction(self.contextMenuAction(
self.ImageListView, ':/system/system_live.png',
translate('ImageMediaItem', u'&Show Live'),
translate(u'ImageMediaItem', u'&Show Live'),
self.onImageLiveClick))
self.ImageListView.addAction(self.contextMenuAction(
self.ImageListView, ':/system/system_add.png',
translate('ImageMediaItem', u'&Add to Service'),
translate(u'ImageMediaItem', u'&Add to Service'),
self.onImageAddClick))
def initialise(self):
self.loadImageList(self.parent.config.load_list(u'images'))
def onImagesNewClick(self):
files = QtGui.QFileDialog.getOpenFileNames(None,
translate('ImageMediaItem', u'Select Image(s)'),
translate(u'ImageMediaItem', u'Select Image(s)'),
self.parent.config.get_last_dir(),
u'Images (*.jpg *.gif *.png *.bmp)')
log.info(u'New image(s)', str(files))
@ -160,20 +153,20 @@ class ImageMediaItem(MediaManagerItem):
def onImagePreviewClick(self):
log.debug(u'Image Preview Requested')
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_image.png")
service_item.addIcon(u':/media/media_image.png')
self.generateSlideData(service_item)
self.parent.preview_controller.addServiceItem(service_item)
def onImageLiveClick(self):
log.debug(u'Image Live Requested')
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_image.png")
service_item.addIcon(u':/media/media_image.png')
self.generateSlideData(service_item)
self.parent.live_controller.addServiceItem(service_item)
def onImageAddClick(self):
log.debug(u'Image Add Requested')
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_image.png")
service_item.addIcon(u':/media/media_image.png')
self.generateSlideData(service_item)
self.parent.service_manager.addServiceItem(service_item)

View File

@ -43,9 +43,7 @@ class SongList(QtGui.QListView):
mimeData = QtCore.QMimeData()
drag.setMimeData(mimeData)
mimeData.setText(u'Song')
dropAction = drag.start(QtCore.Qt.CopyAction)
if dropAction == QtCore.Qt.CopyAction:
self.close()
@ -54,8 +52,8 @@ class SongMediaItem(MediaManagerItem):
This is the custom media manager item for Songs.
"""
global log
log = logging.getLogger("SongMediaItem")
log.info("Song Media Item loaded")
log = logging.getLogger(u'SongMediaItem')
log.info(u'Song Media Item loaded')
def __init__(self, parent, icon, title):
MediaManagerItem.__init__(self, parent, icon, title)
@ -66,30 +64,30 @@ class SongMediaItem(MediaManagerItem):
self.addToolbar()
# Create buttons for the toolbar
## New Song Button ##
self.addToolbarButton(translate('SongMediaItem', u'New Song'),
translate('SongMediaItem', u'Add a new song'),
self.addToolbarButton(translate(u'SongMediaItem', u'New Song'),
translate(u'SongMediaItem', u'Add a new song'),
':/songs/song_new.png', self.onSongNewClick, 'SongNewItem')
## Edit Song Button ##
self.addToolbarButton(translate('SongMediaItem', u'Edit Song'),
translate('SongMediaItem', u'Edit the selected song'),
self.addToolbarButton(translate(u'SongMediaItem', u'Edit Song'),
translate(u'SongMediaItem', u'Edit the selected song'),
':/songs/song_edit.png', self.onSongEditClick, 'SongEditItem')
## Delete Song Button ##
self.addToolbarButton(translate('SongMediaItem', u'Delete Song'),
translate('SongMediaItem', u'Delete the selected song'),
self.addToolbarButton(translate(u'SongMediaItem', u'Delete Song'),
translate(u'SongMediaItem', u'Delete the selected song'),
':/songs/song_delete.png', self.onSongDeleteClick, 'SongDeleteItem')
## Separator Line ##
self.addToolbarSeparator()
## Preview Song Button ##
self.addToolbarButton(translate('SongMediaItem', u'Preview Song'),
translate('SongMediaItem', u'Preview the selected song'),
self.addToolbarButton(translate(u'SongMediaItem', u'Preview Song'),
translate(u'SongMediaItem', u'Preview the selected song'),
':/system/system_preview.png', self.onSongPreviewClick, 'SongPreviewItem')
## Live Song Button ##
self.addToolbarButton(translate('SongMediaItem', u'Go Live'),
translate('SongMediaItem', u'Send the selected song live'),
self.addToolbarButton(translate(u'SongMediaItem', u'Go Live'),
translate(u'SongMediaItem', u'Send the selected song live'),
':/system/system_live.png', self.onSongLiveClick, 'SongLiveItem')
## Add Song Button ##
self.addToolbarButton(translate('SongMediaItem', u'Add Song To Service'),
translate('SongMediaItem', u'Add the selected song(s) to the service'),
self.addToolbarButton(translate(u'SongMediaItem', u'Add Song To Service'),
translate(u'SongMediaItem', u'Add the selected song(s) to the service'),
':/system/system_add.png', self.onSongAddClick, 'SongAddItem')
## Add the songlist widget ##
# Create the tab widget
@ -99,92 +97,77 @@ class SongMediaItem(MediaManagerItem):
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.SongWidget.sizePolicy().hasHeightForWidth())
self.SongWidget.setSizePolicy(sizePolicy)
self.SongWidget.setObjectName('SongWidget')
self.SongWidget.setObjectName(u'SongWidget')
self.SearchLayout = QtGui.QGridLayout(self.SongWidget)
self.SearchLayout.setObjectName('SearchLayout')
self.SearchLayout.setObjectName(u'SearchLayout')
self.SearchTypeComboBox = QtGui.QComboBox(self.SongWidget)
self.SearchTypeComboBox.setObjectName('SearchTypeComboBox')
self.SearchTypeComboBox.setObjectName(u'SearchTypeComboBox')
self.SearchLayout.addWidget(self.SearchTypeComboBox, 0, 1, 1, 2)
self.SearchTypeLabel = QtGui.QLabel(self.SongWidget)
self.SearchTypeLabel.setObjectName('SearchTypeLabel')
self.SearchTypeLabel.setObjectName(u'SearchTypeLabel')
self.SearchLayout.addWidget(self.SearchTypeLabel, 0, 0, 1, 1)
self.SearchTextLabel = QtGui.QLabel(self.SongWidget)
self.SearchTextLabel.setObjectName('SearchTextLabel')
self.SearchTextLabel.setObjectName(u'SearchTextLabel')
self.SearchLayout.addWidget(self.SearchTextLabel, 2, 0, 1, 1)
self.SearchTextEdit = QtGui.QLineEdit(self.SongWidget)
self.SearchTextEdit.setObjectName('SearchTextEdit')
self.SearchTextEdit.setObjectName(u'SearchTextEdit')
self.SearchLayout.addWidget(self.SearchTextEdit, 2, 1, 1, 2)
self.ClearTextButton = QtGui.QPushButton(self.SongWidget)
self.ClearTextButton.setObjectName('ClearTextButton')
self.ClearTextButton.setObjectName(u'ClearTextButton')
self.SearchLayout.addWidget(self.ClearTextButton, 3, 1, 1, 1)
self.SearchTextButton = QtGui.QPushButton(self.SongWidget)
self.SearchTextButton.setObjectName('SearchTextButton')
self.SearchTextButton.setObjectName(u'SearchTextButton')
self.SearchLayout.addWidget(self.SearchTextButton, 3, 2, 1, 1)
# Add the song widget to the page layout
self.PageLayout.addWidget(self.SongWidget)
self.SongListView = SongList()
self.SongListView.setAlternatingRowColors(True)
self.SongListData = TextListData()
self.SongListView.setModel(self.SongListData)
self.SongListView.setDragEnabled(True)
# self.SongListView = QtGui.QTableWidget()
# self.SongListView.setColumnCount(2)
# self.SongListView.setColumnHidden(0, True)
# self.SongListView.setColumnWidth(1, 240)
# self.SongListView.setShowGrid(False)
# self.SongListView.setSortingEnabled(False)
# self.SongListView.setAlternatingRowColors(True)
# self.SongListView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
# self.SongListView.horizontalHeader().setVisible(False)
# self.SongListView.verticalHeader().setVisible(False)
# self.SongListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
self.SongListView.setObjectName('SongListView')
self.SongListView.setObjectName(u'SongListView')
self.PageLayout.addWidget(self.SongListView)
self.SongListView.setDragEnabled(True)
# Signals and slots
QtCore.QObject.connect(self.SearchTextButton,
QtCore.SIGNAL('pressed()'), self.onSearchTextButtonClick)
QtCore.SIGNAL(u'pressed()'), self.onSearchTextButtonClick)
QtCore.QObject.connect(self.ClearTextButton,
QtCore.SIGNAL('pressed()'), self.onClearTextButtonClick)
QtCore.SIGNAL(u'pressed()'), self.onClearTextButtonClick)
QtCore.QObject.connect(self.SearchTextEdit,
QtCore.SIGNAL('textChanged(const QString&)'), self.onSearchTextEditChanged)
# QtCore.QObject.connect(self.SongListView,
# QtCore.SIGNAL('itemPressed(QTableWidgetItem * item)'), self.onSongSelected)
QtCore.SIGNAL(u'textChanged(const QString&)'), self.onSearchTextEditChanged)
QtCore.QObject.connect(self.SongListView,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onSongPreviewClick)
#define and add the context menu
self.SongListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.SongListView.addAction(self.contextMenuAction(self.SongListView,
':/songs/song_new.png', translate('SongMediaItem', u'&Edit Song'),
':/songs/song_new.png', translate(u'SongMediaItem', u'&Edit Song'),
self.onSongEditClick))
self.SongListView.addAction(self.contextMenuSeparator(self.SongListView))
self.SongListView.addAction(self.contextMenuAction(self.SongListView,
':/system/system_preview.png', translate('SongMediaItem', u'&Preview Song'),
':/system/system_preview.png', translate(u'SongMediaItem', u'&Preview Song'),
self.onSongPreviewClick))
self.SongListView.addAction(self.contextMenuAction(self.SongListView,
':/system/system_live.png', translate('SongMediaItem', u'&Show Live'),
':/system/system_live.png', translate(u'SongMediaItem', u'&Show Live'),
self.onSongLiveClick))
self.SongListView.addAction(self.contextMenuAction(self.SongListView,
':/system/system_add.png', translate('SongMediaItem', u'&Add to Service'),
':/system/system_add.png', translate(u'SongMediaItem', u'&Add to Service'),
self.onSongAddClick))
def retranslateUi(self):
self.SearchTypeLabel.setText(translate('SongMediaItem', u'Search Type:'))
self.SearchTextLabel.setText(translate('SongMediaItem', u'Search Text:'))
self.ClearTextButton.setText(translate('SongMediaItem', u'Clear'))
self.SearchTextButton.setText(translate('SongMediaItem', u'Search'))
self.SearchTypeLabel.setText(translate(u'SongMediaItem', u'Search Type:'))
self.SearchTextLabel.setText(translate(u'SongMediaItem', u'Search Text:'))
self.ClearTextButton.setText(translate(u'SongMediaItem', u'Clear'))
self.SearchTextButton.setText(translate(u'SongMediaItem', u'Search'))
def initialise(self):
self.SearchTypeComboBox.addItem(translate('SongMediaItem', u'Titles'))
self.SearchTypeComboBox.addItem(translate('SongMediaItem', u'Lyrics'))
self.SearchTypeComboBox.addItem(translate('SongMediaItem', u'Authors'))
self.SearchTypeComboBox.addItem(translate(u'SongMediaItem', u'Titles'))
self.SearchTypeComboBox.addItem(translate(u'SongMediaItem', u'Lyrics'))
self.SearchTypeComboBox.addItem(translate(u'SongMediaItem', u'Authors'))
def displayResults(self, searchresults):
log.debug("display results")
log.debug(u'display results')
self.SongListData.resetStore()
#log.debug("Records returned from search %s", len(searchresults))
#log.debug(u'Records returned from search %s", len(searchresults))
for song in searchresults:
author_list = u''
for author in song.authors:
@ -192,7 +175,6 @@ class SongMediaItem(MediaManagerItem):
author_list = author_list + u', '
author_list = author_list + author.display_name
song_detail = str(u'%s (%s)' % (str(song.title), str(author_list)))
self.SongListData.addRow(song.id,song_detail)
def onClearTextButtonClick(self):
@ -205,7 +187,7 @@ class SongMediaItem(MediaManagerItem):
search_length = 3
if self.SearchTypeComboBox.currentIndex() == 1:
search_length = 7
if len(text) > search_length: # only search if > 3 characters
if len(text) > search_length:
self.onSearchTextButtonClick()
def onSearchTextButtonClick(self):
@ -213,13 +195,13 @@ class SongMediaItem(MediaManagerItem):
search_results = []
search_type = self.SearchTypeComboBox.currentIndex()
if search_type == 0:
log.debug("Titles Search")
log.debug(u'Titles Search')
search_results = self.parent.songmanager.search_song_title(search_keywords)
elif search_type == 1:
log.debug("Lyrics Search")
log.debug(u'Lyrics Search')
search_results = self.parent.songmanager.search_song_lyrics(search_keywords)
elif search_type == 2:
log.debug("Authors Search")
log.debug(u'Authors Search')
#searchresults = self.songmanager.get_song_from_author(searchtext)
self.displayResults(search_results)
@ -242,7 +224,7 @@ class SongMediaItem(MediaManagerItem):
def onSongPreviewClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.addIcon(u':/media/media_song.png')
self.generateSlideData(service_item)
self.parent.preview_controller.addServiceItem(service_item)
@ -267,12 +249,12 @@ class SongMediaItem(MediaManagerItem):
def onSongLiveClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.addIcon(u':/media/media_song.png')
self.generateSlideData(service_item)
self.parent.live_controller.addServiceItem(service_item)
def onSongAddClick(self):
service_item = ServiceItem(self.parent)
service_item.addIcon( ":/media/media_song.png")
service_item.addIcon( u':/media/media_song.png')
self.generateSlideData(service_item)
self.parent.service_manager.addServiceItem(service_item)