bzr-revno: 444
This commit is contained in:
Tim Bentley 2009-05-11 19:22:20 +01:00
commit 081a9c98db
16 changed files with 290 additions and 219 deletions

View File

@ -26,7 +26,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver from openlp.core.lib import Receiver
logging.basicConfig(level=logging.DEBUG, logging.basicConfig(level=logging.DEBUG,
format=u'%(asctime)s %(name)-12s %(levelname)-8s %(message)s', format=u'%(asctime)s %(msecs)d %(name)-12s %(levelname)-8s %(message)s',
datefmt=u'%m-%d %H:%M:%S', datefmt=u'%m-%d %H:%M:%S',
filename=u'openlp.log', filename=u'openlp.log',
filemode=u'w') filemode=u'w')

View File

@ -35,6 +35,7 @@ class EventType(object):
AfterLoadService = 2 AfterLoadService = 2
BeforeSaveService = 3 BeforeSaveService = 3
AfterSaveService = 4 AfterSaveService = 4
LoadServiceItem = 5
# Preview events # Preview events
PreviewBeforeLoad = 11 PreviewBeforeLoad = 11
PreviewAfterLoad = 12 PreviewAfterLoad = 12

View File

@ -19,8 +19,9 @@ Place, Suite 330, Boston, MA 02111-1307 USA
""" """
import logging import logging
import os, os.path import os, os.path
import sys import sys
from datetime import *
from PyQt4 import QtGui, QtCore, Qt from PyQt4 import QtGui, QtCore, Qt
from copy import copy from copy import copy
@ -95,6 +96,7 @@ class Renderer:
self.img=QtGui.QPixmap.fromImage(i.scaled(QtCore.QSize(neww, newh), Qt.Qt.KeepAspectRatio)) self.img=QtGui.QPixmap.fromImage(i.scaled(QtCore.QSize(neww, newh), Qt.Qt.KeepAspectRatio))
def set_paint_dest(self, p): def set_paint_dest(self, p):
log.debug(u'set paint dest (frame) w %d h %d',p.width(), p.height())
self._paint=p self._paint=p
if self._bg_image_filename is not None: if self._bg_image_filename is not None:
self.scale_bg_image() self.scale_bg_image()
@ -128,6 +130,7 @@ class Renderer:
assert(self._theme) assert(self._theme)
assert(self._paint) assert(self._paint)
log.debug(u'render background %s ', self._theme.background_type) log.debug(u'render background %s ', self._theme.background_type)
bef = datetime.now()
p=QtGui.QPainter() p=QtGui.QPainter()
p.begin(self._paint) p.begin(self._paint)
if self._theme.background_type == u'solid': if self._theme.background_type == u'solid':
@ -172,6 +175,10 @@ class Renderer:
else: else:
p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000')) p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000'))
p.end() p.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): def split_set_of_lines(self, lines, footer):
@ -250,7 +257,7 @@ class Renderer:
def render_lines(self, lines, footer_lines=None): def render_lines(self, lines, footer_lines=None):
"""render a set of lines according to the theme, return bounding box""" """render a set of lines according to the theme, return bounding box"""
log.debug(u'_render_lines %s', lines) log.debug(u'render_lines - Start')
bbox=self._render_lines_unaligned(lines, False) # Main font bbox=self._render_lines_unaligned(lines, False) # Main font
if footer_lines is not None: if footer_lines is not None:
@ -263,7 +270,7 @@ class Renderer:
if footer_lines is not None: if footer_lines is not None:
bbox=self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) ) bbox=self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
log.debug(u'render_lines- Finish')
return bbox return bbox
def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)): def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)):
@ -274,13 +281,11 @@ class Renderer:
than a screenful (eg. by using split_set_of_lines) than a screenful (eg. by using split_set_of_lines)
Returns the bounding box of the text as QRect""" Returns the bounding box of the text as QRect"""
log.debug(u'render lines unaligned %s', lines) log.debug(u'render lines unaligned Start')
x, y=tlcorner x, y=tlcorner
brx=x brx=x
bry=y bry=y
for line in lines: for line in lines:
#if (line == ''):
# continue
# render after current bottom, but at original left edge # render after current bottom, but at original left edge
# keep track of right edge to see which is biggest # keep track of right edge to see which is biggest
(thisx, bry) = self._render_single_line(line, footer, (x,bry)) (thisx, bry) = self._render_single_line(line, footer, (x,bry))
@ -293,8 +298,7 @@ class Renderer:
p.setPen(QtGui.QPen(QtGui.QColor(0,0,255))) p.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
p.drawRect(retval) p.drawRect(retval)
p.end() p.end()
log.debug(u'render lines unaligned Finish')
return retval return retval
def _render_single_line(self, line, footer, tlcorner=(0,0)): def _render_single_line(self, line, footer, tlcorner=(0,0)):
@ -396,16 +400,16 @@ class Renderer:
p.end() p.end()
brcorner=(rightextent,y) brcorner=(rightextent,y)
log.debug(u'Render single line Finish')
return brcorner return brcorner
# xxx this is what to override for an SDL version # xxx this is what to override for an SDL version
def _get_extent_and_render(self, line, footer, tlcorner=(0,0), draw=False, color=None): def _get_extent_and_render(self, line, footer, tlcorner=(0,0), draw=False, color=None):
"""Find bounding box of text - as render_single_line. """Find bounding box of text - as render_single_line.
If draw is set, actually draw the text to the current DC as well If draw is set, actually draw the text to the current DC as well
return width and height of text as a tuple (w,h)""" return width and height of text as a tuple (w,h)"""
# setup defaults # setup defaults
log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw) #log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw)
p=QtGui.QPainter() p=QtGui.QPainter()
p.begin(self._paint) p.begin(self._paint)
# 'twould be more efficient to set this once when theme changes # 'twould be more efficient to set this once when theme changes

View File

@ -18,12 +18,31 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA Place, Suite 330, Boston, MA 02111-1307 USA
""" """
import logging import logging
import time
import os, os.path import os, os.path
import sys import sys
from datetime import *
from PyQt4 import QtGui, QtCore, Qt from PyQt4 import QtGui, QtCore, Qt
from renderer import Renderer from renderer import Renderer
import sys
import linecache
def traceit(frame, event, arg):
if event == "line":
lineno = frame.f_lineno
filename = frame.f_globals["__file__"]
if (filename.endswith(".pyc") or
filename.endswith(".pyo")):
filename = filename[:-1]
name = frame.f_globals["__name__"]
line = linecache.getline(filename, lineno)
if name.startswith("openlp"):
print "%s:%s: %s" % (name, lineno, line.rstrip())
return traceit
class RenderManager: class RenderManager:
""" """
Class to pull all Renderer interactions into one place. Class to pull all Renderer interactions into one place.
@ -51,6 +70,7 @@ class RenderManager:
self.theme = self.default_theme self.theme = self.default_theme
log.debug(u'theme is now %s', self.theme) log.debug(u'theme is now %s', self.theme)
self.themedata = self.theme_manager.getThemeData(self.theme) self.themedata = self.theme_manager.getThemeData(self.theme)
self.calculate_default(self.screen_list[self.current_display]['size'])
self.renderer.set_theme(self.themedata) self.renderer.set_theme(self.themedata)
self.build_text_rectangle(self.themedata) self.build_text_rectangle(self.themedata)
@ -74,7 +94,7 @@ class RenderManager:
self.renderer.set_text_rectangle(main_rect,footer_rect) self.renderer.set_text_rectangle(main_rect,footer_rect)
def generate_preview(self, themedata): def generate_preview(self, themedata):
log.debug(u'generate preview ') log.debug(u'generate preview')
self.calculate_default(QtCore.QSize(800,600)) self.calculate_default(QtCore.QSize(800,600))
self.renderer.set_theme(themedata) self.renderer.set_theme(themedata)
self.build_text_rectangle(themedata) self.build_text_rectangle(themedata)
@ -102,11 +122,18 @@ class RenderManager:
def generate_slide(self,main_text, footer_text): def generate_slide(self,main_text, footer_text):
log.debug(u'generate slide') log.debug(u'generate slide')
#sys.settrace(traceit)
self.calculate_default(self.screen_list[self.current_display]['size']) self.calculate_default(self.screen_list[self.current_display]['size'])
bef = datetime.now()
frame = QtGui.QPixmap(self.width, self.height) frame = QtGui.QPixmap(self.width, self.height)
aft = datetime.now()
print "framebuild time", bef, aft, aft-bef
self.renderer.set_paint_dest(frame) self.renderer.set_paint_dest(frame)
answer=self.renderer.render_lines(main_text, footer_text) answer=self.renderer.render_lines(main_text, footer_text)
#sys.settrace()
return frame return frame
def calculate_default(self, screen): def calculate_default(self, screen):

View File

@ -44,7 +44,6 @@ class ServiceItem():
self.items = [] self.items = []
self.iconic_representation = None self.iconic_representation = None
self.raw_slides = None self.raw_slides = None
self.format_slides = []
self.frames = [] self.frames = []
self.raw_footer = None self.raw_footer = None
self.theme = None self.theme = None
@ -74,11 +73,11 @@ class ServiceItem():
else: else:
self.render_manager.set_override_theme(self.theme) self.render_manager.set_override_theme(self.theme)
log.debug(u'Formatting slides') log.debug(u'Formatting slides')
for slide in self.raw_slides: if len(self.frames) == 0 :
self.format_slides.append(self.render_manager.format_slide(slide, False)) for slide in self.raw_slides:
log.debug(u'Rendering slides') formated = self.render_manager.format_slide(slide, False)
for slide in self.format_slides: frame = self.render_manager.generate_slide(formated, self.raw_footer)
self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer)) self.frames.append({u'formatted': formated, u'image': frame})
def get_parent_node(self): def get_parent_node(self):

View File

@ -92,6 +92,7 @@ class MainWindow(object):
self.ThemeManagerContents.eventManager = self.EventManager self.ThemeManagerContents.eventManager = self.EventManager
self.ThemeManagerContents.renderManager = self.RenderManager self.ThemeManagerContents.renderManager = self.RenderManager
self.ServiceManagerContents.renderManager = self.RenderManager self.ServiceManagerContents.renderManager = self.RenderManager
self.ServiceManagerContents.eventManager = self.EventManager
self.ThemeManagerContents.serviceManager = self.ServiceManagerContents self.ThemeManagerContents.serviceManager = self.ServiceManagerContents
self.ThemeManagerContents.loadThemes() self.ThemeManagerContents.loadThemes()

View File

@ -18,101 +18,97 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA Place, Suite 330, Boston, MA 02111-1307 USA
""" """
import os import os
import logging
from time import sleep from time import sleep
from copy import deepcopy from copy import deepcopy
from PyQt4.QtCore import * from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import *
# from openlp.core.resources import *
# from openlp.core.ui import AboutForm, AlertForm, SettingsForm, SlideController
from openlp.core.lib import OpenLPToolbar from openlp.core.lib import OpenLPToolbar
from openlp.core.lib import ServiceItem from openlp.core.lib import ServiceItem
from openlp.core.lib import RenderManager from openlp.core.lib import RenderManager
from openlp.core import translate from openlp.core import translate
from openlp.core.lib import Event, EventType, EventManager
# from openlp.core import PluginManager #class ServiceData(QtCore.QAbstractItemModel):
import logging # """
# Tree of items for an order of service.
class ServiceData(QAbstractItemModel): # Includes methods for reading and writing the contents to an OOS file
""" # Root contains a list of ServiceItems
Tree of items for an order of service. # """
Includes methods for reading and writing the contents to an OOS file # global log
Root contains a list of ServiceItems # log=logging.getLogger(u'ServiceData')
""" # def __init__(self):
global log # QtCore.QAbstractItemModel.__init__(self)
log=logging.getLogger(u'ServiceData') # self.items=[]
def __init__(self): # log.info("Starting")
QAbstractItemModel.__init__(self) #
self.items=[] # def clearItems(self):
log.info("Starting") # self.items = []
#
def clearItems(self): # def columnCount(self, parent=None):
self.items = [] # return 1; # always only a single column (for now)
#
def columnCount(self, parent): # def rowCount(self, parent=None):
return 1; # always only a single column (for now) # return len(self.items)
#
def rowCount(self, parent): # def insertRow(self, row, service_item):
return len(self.items) # self.beginInsertRows(QtCore.QModelIndex(),row,row)
# log.info("insert row %s:%s" % (row,service_item))
def insertRow(self, row, service_item): # self.items.insert(row, service_item)
self.beginInsertRows(QModelIndex(),row,row) # log.info("Items: %s" % self.items)
log.info("insert row %s:%s" % (row,service_item)) # self.endInsertRows()
self.items.insert(row, service_item) #
log.info("Items: %s" % self.items) # def removeRow(self, row):
self.endInsertRows() # self.beginRemoveRows(QtCore.QModelIndex(), row,row)
# self.items.pop(row)
def removeRow(self, row): # self.endRemoveRows()
self.beginRemoveRows(QModelIndex(), row,row) #
self.items.pop(row) # def addRow(self, service_item):
self.endRemoveRows() # self.insertRow(len(self.items), service_item)
#
def addRow(self, item): # def index(self, row, col, parent = QtCore.QModelIndex()):
self.insertRow(len(self.items), item) # return self.createIndex(row,col)
#
def index(self, row, col, parent = QModelIndex()): # def parent(self, index=QtCore.QModelIndex()):
return self.createIndex(row,col) # return QtCore.QModelIndex() # no children as yet
#
def parent(self, index=QModelIndex()): # def data(self, index, role):
return QModelIndex() # no children as yet # """
# Called by the service manager to draw us in the service window
def data(self, index, role): # """
""" # log.debug(u'data %s %d', index, role)
Called by the service manager to draw us in the service window # row = index.row()
""" # if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
log.debug(u'data %s %d', index, role) # return QtCore.QVariant()
row=index.row() # item = self.items[row]
if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! # if role == QtCore.Qt.DisplayRole:
return QVariant() # retval= item.title + u':' + item.shortname
item=self.items[row] # elif role == QtCore.Qt.DecorationRole:
if role==Qt.DisplayRole: # retval = item.iconic_representation
retval= item.title + u':' + item.shortname # elif role == QtCore.Qt.ToolTipRole:
elif role == Qt.DecorationRole: # retval = None
retval = item.iconic_representation # else:
elif role == Qt.ToolTipRole: # retval = None
retval= None # if retval == None:
else: # retval = QtCore.QVariant()
retval= None ## log.info("Returning"+ str(retval))
if retval == None: # if type(retval) is not type(QtCore.QVariant):
retval=QVariant() # return QtCore.QVariant(retval)
# log.info("Returning"+ str(retval)) # else:
if type(retval) is not type(QVariant): # return retval
return QVariant(retval) #
else: # def __iter__(self):
return retval # for i in self.items:
# yield i
def __iter__(self): #
for i in self.items: # def item(self, row):
yield i # log.info("Get Item:%d -> %s" %(row, str(self.items)))
# return self.items[row]
def item(self, row):
log.info("Get Item:%d -> %s" %(row, str(self.items)))
return self.items[row]
class ServiceManager(QWidget): class ServiceManager(QtGui.QWidget):
"""Manages the orders of service. Currently this involves taking """Manages the orders of service. Currently this involves taking
text strings from plugins and adding them to an OOS file. In text strings from plugins and adding them to an OOS file. In
@ -124,48 +120,52 @@ class ServiceManager(QWidget):
log=logging.getLogger(u'ServiceManager') log=logging.getLogger(u'ServiceManager')
def __init__(self, parent): def __init__(self, parent):
QWidget.__init__(self) QtGui.QWidget.__init__(self)
self.parent=parent self.parent=parent
self.Layout = QVBoxLayout(self) self.Layout = QtGui.QVBoxLayout(self)
self.Layout.setSpacing(0) self.Layout.setSpacing(0)
self.Layout.setMargin(0) self.Layout.setMargin(0)
self.Toolbar = OpenLPToolbar(self) self.Toolbar = OpenLPToolbar(self)
self.Toolbar.addToolbarButton("Move to top", ":/services/service_top.png", self.Toolbar.addToolbarButton(u'Move to top', u':/services/service_top.png',
translate(u'ServiceManager', u'Move to start'), self.onServiceTop) translate(u'ServiceManager', u'Move to top'), self.onServiceTop)
self.Toolbar.addToolbarButton("Move up", ":/services/service_up.png", self.Toolbar.addToolbarButton(u'Move up', u':/services/service_up.png',
translate(u'ServiceManager', u'Move up order'), self.onServiceUp) translate(u'ServiceManager', u'Move up order'), self.onServiceUp)
self.Toolbar.addToolbarButton("Move down", ":/services/service_down.png", self.Toolbar.addToolbarButton(u'Move down', u':/services/service_down.png',
translate(u'ServiceManager', u'Move down order'), self.onServiceDown) translate(u'ServiceManager', u'Move down order'), self.onServiceDown)
self.Toolbar.addToolbarButton("Move to bottom", ":/services/service_bottom.png", self.Toolbar.addToolbarButton(u'Move to bottom', u':/services/service_bottom.png',
translate(u'ServiceManager', u'Move to end'), self.onServiceEnd) translate(u'ServiceManager', u'Move to end'), self.onServiceEnd)
self.Toolbar.addSeparator() self.Toolbar.addSeparator()
self.Toolbar.addToolbarButton("New Service", ":/services/service_new.png", self.Toolbar.addToolbarButton(u'New Service', u':/services/service_new.png',
translate(u'ServiceManager', u'Create a new Service'), self.onNewService) translate(u'ServiceManager', u'Create a new Service'), self.onNewService)
self.Toolbar.addToolbarButton("Delete From Service", ":/services/service_delete.png", self.Toolbar.addToolbarButton(u'Delete From Service', u':/services/service_delete.png',
translate(u'ServiceManager', u'Delete From Service'), self.onDeleteFromService) translate(u'ServiceManager', u'Delete From Service'), self.onDeleteFromService)
self.Toolbar.addSeparator() self.Toolbar.addSeparator()
self.Toolbar.addToolbarButton("Save Service", ":/services/service_save.png", self.Toolbar.addToolbarButton(u'Save Service', u':/services/service_save.png',
translate(u'ServiceManager', u'Save Service'), self.onSaveService) translate(u'ServiceManager', u'Save Service'), self.onSaveService)
self.Toolbar.addToolbarButton("Load Service", ":/services/service_open.png", self.Toolbar.addToolbarButton(u'Load Service', u':/services/service_open.png',
translate(u'ServiceManager', u'Load Existing'), self.onLoadService) translate(u'ServiceManager', u'Load Existing'), self.onLoadService)
self.Toolbar.addSeparator() self.Toolbar.addSeparator()
self.ThemeComboBox = QComboBox(self.Toolbar) self.ThemeComboBox = QtGui.QComboBox(self.Toolbar)
self.ThemeComboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents) self.ThemeComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
self.ThemeWidget = QWidgetAction(self.Toolbar) self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar)
self.ThemeWidget.setDefaultWidget(self.ThemeComboBox) self.ThemeWidget.setDefaultWidget(self.ThemeComboBox)
self.Toolbar.addAction(self.ThemeWidget) self.Toolbar.addAction(self.ThemeWidget)
self.Layout.addWidget(self.Toolbar) self.Layout.addWidget(self.Toolbar)
self.TreeView = QTreeView(self) self.serviceManagerList = QtGui.QTreeWidget(self)
self.service_data=ServiceData() self.serviceManagerList.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged|QtGui.QAbstractItemView.DoubleClicked|QtGui.QAbstractItemView.EditKeyPressed)
self.TreeView.setModel(self.service_data) self.serviceManagerList.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.TreeView.setAlternatingRowColors(True) self.serviceManagerList.setAlternatingRowColors(True)
self.Layout.addWidget(self.TreeView) self.serviceManagerList.setObjectName("serviceManagerList")
self.serviceManagerList .__class__.dragEnterEvent=self.dragEnterEvent
self.serviceManagerList .__class__.dragMoveEvent=self.dragEnterEvent
self.serviceManagerList .__class__.dropEvent =self.dropEvent
QObject.connect(self.ThemeComboBox, self.Layout.addWidget(self.serviceManagerList)
SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
QtCore.QObject.connect(self.ThemeComboBox,
QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
def onServiceTop(self): def onServiceTop(self):
pass pass
@ -191,40 +191,36 @@ class ServiceManager(QWidget):
def onLoadService(self): def onLoadService(self):
Pass Pass
def onThemeComboBoxSelected(self, currentIndex): def onThemeComboBoxSelected(self, currentIndex):
self.renderManager.default_theme = self.ThemeComboBox.currentText() self.renderManager.default_theme = self.ThemeComboBox.currentText()
def addServiceItem(self, item): def addServiceItem(self, item):
"""Adds service item""" treewidgetitem = QtGui.QTreeWidgetItem(self.serviceManagerList)
log.info("addServiceItem") treewidgetitem.setText(0,item.title + u':' + item.shortname)
indexes=self.TreeView.selectedIndexes() treewidgetitem.setIcon(0,item.iconic_representation)
assert len(indexes) <= 1 # can only have one selected index in this view treewidgetitem.setExpanded(True)
if indexes == []: item.render()
log.info("No row") for frame in item.frames:
row = None treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem)
selected_item = None text = frame[u'formatted'][0]
else: treewidgetitem1.setText(0,text[:10])
row=indexes[0].row() #treewidgetitem1.setIcon(0,frame[u'image'])
# if currently selected is of correct type, add it to it
log.info("row:%d"%row)
selected_item=self.service_data.item(row)
if type(selected_item) == type(item): def dragEnterEvent(self, event):
log.info("Add to existing item") """
selected_item.add(item) Accept Drag events
else: """
log.info("Create new item") event.accept()
if row is None:
self.service_data.addRow(item)
else:
self.service_data.insertRow(row+1, item)
def removeServiceItem(self): def dropEvent(self, event):
"""Remove currently selected item""" """
pass Handle the release of the event and trigger the plugin
to add the data
"""
link=event.mimeData()
if link.hasText():
plugin = event.mimeData().text()
self.eventManager.post_event(Event(EventType.LoadServiceItem, plugin))
def oos_as_text(self): def oos_as_text(self):
text=[] text=[]
@ -247,6 +243,9 @@ class ServiceManager(QWidget):
oosfile.close() oosfile.close()
def updateThemeList(self, theme_list): def updateThemeList(self, theme_list):
"""
Called from ThemeManager when the Themes have changed
"""
self.ThemeComboBox.clear() self.ThemeComboBox.clear()
for theme in theme_list: for theme in theme_list:
self.ThemeComboBox.addItem(theme) self.ThemeComboBox.addItem(theme)

View File

@ -20,13 +20,12 @@ Place, Suite 330, Boston, MA 02111-1307 USA
import logging import logging
import os import os
from PyQt4.QtCore import * from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import *
from openlp.core.lib import OpenLPToolbar from openlp.core.lib import OpenLPToolbar
from openlp.core import translate from openlp.core import translate
class SlideData(QAbstractListModel): class SlideData(QtCore.QAbstractListModel):
""" """
Tree of items for an order of Theme. Tree of items for an order of Theme.
Includes methods for reading and writing the contents to an OOS file Includes methods for reading and writing the contents to an OOS file
@ -36,13 +35,13 @@ class SlideData(QAbstractListModel):
log=logging.getLogger(u'SlideData') log=logging.getLogger(u'SlideData')
def __init__(self): def __init__(self):
QAbstractListModel.__init__(self) QtCore.QAbstractListModel.__init__(self)
self.items=[] self.items=[]
self.rowheight=50 self.rowheight=50
self.maximagewidth=self.rowheight*16/9.0; self.maximagewidth=self.rowheight*16/9.0;
log.info(u'Starting') log.info(u'Starting')
def clearItems(self): def clear(self):
self.items=[] self.items=[]
def columnCount(self, parent): def columnCount(self, parent):
@ -51,36 +50,36 @@ class SlideData(QAbstractListModel):
def rowCount(self, parent=None): def rowCount(self, parent=None):
return len(self.items) return len(self.items)
def insertRow(self, row, frame): def insertRow(self, row, frame, framenumber):
self.beginInsertRows(QModelIndex(),row,row) self.beginInsertRows(QtCore.QModelIndex(),row,row)
log.info(u'insert row %d' % row) log.info(u'insert row %d' % row)
# create a preview image # create a preview image
frame1 = frame.scaled(QSize(350,260)) frame1 = frame.scaled(QtCore.QSize(350,260), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
self.items.insert(row,(frame1)) self.items.insert(row,(frame1, framenumber))
log.info(u'Items: %s' % self.items) log.info(u'Items: %s' % self.items)
self.endInsertRows() self.endInsertRows()
def removeRow(self, row): def removeRow(self, row):
self.beginRemoveRows(QModelIndex(), row,row) self.beginRemoveRows(QtCore.QModelIndex(), row,row)
self.items.pop(row) self.items.pop(row)
self.endRemoveRows() self.endRemoveRows()
def addRow(self, frame): def addRow(self, frame, framenumber):
self.insertRow(len(self.items), frame) self.insertRow(len(self.items), frame, framenumber)
def data(self, index, role): def data(self, index, role):
row=index.row() row=index.row()
if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
return QVariant() return QtCore.QVariant()
# if role==Qt.DisplayRole: # if role==Qt.DisplayRole:
# retval= self.items[row][1] # retval= self.items[row][1]
if role == Qt.DecorationRole: if role == QtCore.Qt.DecorationRole:
retval= self.items[row]#[0] retval= self.items[row][0]
else: else:
retval= QVariant() retval= QtCore.QVariant()
# log.info("Returning"+ str(retval)) # log.info("Returning"+ str(retval))
if type(retval) is not type(QVariant): if type(retval) is not type(QtCore.QVariant):
return QVariant(retval) return QtCore.QVariant(retval)
else: else:
return retval return retval
@ -101,75 +100,84 @@ class SlideData(QAbstractListModel):
return filelist return filelist
class SlideController(QWidget): class SlideController(QtGui.QWidget):
global log global log
log=logging.getLogger(u'SlideController') log=logging.getLogger(u'SlideController')
def __init__(self, control_splitter, isLive): def __init__(self, control_splitter, isLive):
QWidget.__init__(self) QtGui.QWidget.__init__(self)
self.isLive = isLive self.isLive = isLive
self.Panel = QWidget(control_splitter) self.Panel = QtGui.QWidget(control_splitter)
self.Splitter = QSplitter(self.Panel) self.Splitter = QtGui.QSplitter(self.Panel)
self.Splitter.setOrientation(Qt.Vertical) self.Splitter.setOrientation(QtCore.Qt.Vertical)
self.PanelLayout = QVBoxLayout(self.Panel) self.PanelLayout = QtGui.QVBoxLayout(self.Panel)
self.PanelLayout.addWidget(self.Splitter) self.PanelLayout.addWidget(self.Splitter)
self.PanelLayout.setSpacing(50) self.PanelLayout.setSpacing(50)
self.PanelLayout.setMargin(0) self.PanelLayout.setMargin(0)
self.Controller = QScrollArea(self.Splitter) self.Controller = QtGui.QScrollArea(self.Splitter)
self.Controller.setWidgetResizable(True) self.Controller.setWidgetResizable(True)
self.PreviewListView = QListView(self.Splitter) self.PreviewListView = QtGui.QListView(self.Splitter)
self.PreviewListView.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
self.PreviewListView.setAlternatingRowColors(True) self.PreviewListView.setAlternatingRowColors(True)
self.PreviewListData = SlideData() self.PreviewListData = SlideData()
self.PreviewListView.setModel(self.PreviewListData) self.PreviewListView.setModel(self.PreviewListData)
self.PreviewListView.setSelectionRectVisible(True)
self.Controller.setGeometry(QRect(0, 0, 828, 536)) self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536))
self.Controller.setWidget(self.PreviewListView) self.Controller.setWidget(self.PreviewListView)
self.Toolbar = OpenLPToolbar(self.Splitter) self.Toolbar = OpenLPToolbar(self.Splitter)
sizeToolbarPolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizeToolbarPolicy.setHorizontalStretch(0) sizeToolbarPolicy.setHorizontalStretch(0)
sizeToolbarPolicy.setVerticalStretch(0) sizeToolbarPolicy.setVerticalStretch(0)
sizeToolbarPolicy.setHeightForWidth(self.Toolbar.sizePolicy().hasHeightForWidth()) sizeToolbarPolicy.setHeightForWidth(self.Toolbar.sizePolicy().hasHeightForWidth())
if self.isLive: if self.isLive:
self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_first.png", self.Toolbar.addToolbarButton(u'First Slide', u':/slides/slide_first.png',
translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst) translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst)
self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_previous.png", self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_previous.png',
translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious) translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious)
self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_next.png", self.Toolbar.addToolbarButton(u'First Slide', u':/slides/slide_next.png',
translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext) translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext)
if self.isLive: if self.isLive:
self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_last.png", self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_last.png',
translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast) translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast)
self.Toolbar.addSeparator() self.Toolbar.addSeparator()
self.Toolbar.addToolbarButton("Close Sscreen", ":/slides/slide_close.png", self.Toolbar.addToolbarButton(u'Close Screen', u':/slides/slide_close.png',
translate(u'SlideController', u'Close Screen'), self.onBlankScreen) translate(u'SlideController', u'Close Screen'), self.onBlankScreen)
self.Toolbar.setSizePolicy(sizeToolbarPolicy) self.Toolbar.setSizePolicy(sizeToolbarPolicy)
self.SlidePreview = QLabel(self.Splitter) self.SlidePreview = QtGui.QLabel(self.Splitter)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth())
self.SlidePreview.setSizePolicy(sizePolicy) self.SlidePreview.setSizePolicy(sizePolicy)
self.SlidePreview.setMinimumSize(QSize(250, 190)) self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190))
self.SlidePreview.setFrameShape(QFrame.WinPanel) self.SlidePreview.setFrameShape(QtGui.QFrame.WinPanel)
self.SlidePreview.setFrameShadow(QFrame.Sunken) self.SlidePreview.setFrameShadow(QtGui.QFrame.Sunken)
self.SlidePreview.setLineWidth(1) self.SlidePreview.setLineWidth(1)
self.SlidePreview.setScaledContents(True) self.SlidePreview.setScaledContents(True)
self.SlidePreview.setObjectName("SlidePreview") self.SlidePreview.setObjectName(u'SlidePreview')
QObject.connect(self.PreviewListView, QtCore.QObject.connect(self.PreviewListView,
SIGNAL("clicked(QModelIndex)"), self.onSlideSelected) QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
QtCore.QObject.connect(self.PreviewListView,
QtCore.SIGNAL(u'clicked(QListViewItem)'), self.onCurrentItemChanged)
def onCurrentItemChanged(self, current, previous):
print u'Method slideControllerList currentItemChanged called', current, previous
def onSlideSelectedFirst(self): def onSlideSelectedFirst(self):
row = self.PreviewListData.createIndex(0, 0) row = self.PreviewListData.createIndex(0, 0)
if row.isValid(): if row.isValid():
self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
self.onSlideSelected(row) self.onSlideSelected(row)
def onSlideSelectedNext(self): def onSlideSelectedNext(self):
@ -182,10 +190,9 @@ class SlideController(QWidget):
rowNumber = index.row() + 1 rowNumber = index.row() + 1
row = self.PreviewListData.createIndex(rowNumber , 0) row = self.PreviewListData.createIndex(rowNumber , 0)
if row.isValid(): if row.isValid():
self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
self.onSlideSelected(row) self.onSlideSelected(row)
def onSlideSelectedPrevious(self): def onSlideSelectedPrevious(self):
indexes = self.PreviewListView.selectedIndexes() indexes = self.PreviewListView.selectedIndexes()
rowNumber = 0 rowNumber = 0
@ -196,13 +203,13 @@ class SlideController(QWidget):
rowNumber = index.row() - 1 rowNumber = index.row() - 1
row = self.PreviewListData.createIndex(rowNumber , 0) row = self.PreviewListData.createIndex(rowNumber , 0)
if row.isValid(): if row.isValid():
self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
self.onSlideSelected(row) self.onSlideSelected(row)
def onSlideSelectedLast(self): def onSlideSelectedLast(self):
row = self.PreviewListData.createIndex(self.PreviewListData.rowCount() - 1 , 0) row = self.PreviewListData.createIndex(self.PreviewListData.rowCount() - 1 , 0)
if row.isValid(): if row.isValid():
self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
self.onSlideSelected(row) self.onSlideSelected(row)
def onBlankScreen(self): def onBlankScreen(self):
@ -213,21 +220,25 @@ class SlideController(QWidget):
self.previewFrame(frame) self.previewFrame(frame)
def previewFrame(self, frame): def previewFrame(self, frame):
self.SlidePreview.setPixmap(frame) self.SlidePreview.setPixmap(frame[0])
if self.isLive: if self.isLive:
self.mainDisplay.frameView(frame) no = frame[1]
LiveFrame = self.serviceitem.frames[no][u'image']
self.mainDisplay.frameView(LiveFrame)
def addServiceItem(self, serviceitem): def addServiceItem(self, serviceitem):
log.debug(u'addServiceItem') log.debug(u'addServiceItem')
self.serviceitem = serviceitem self.serviceitem = serviceitem
self.serviceitem.render() self.serviceitem.render()
self.PreviewListData.clearItems() self.PreviewListData.clear()
framenumber = 0
for frame in self.serviceitem.frames: for frame in self.serviceitem.frames:
self.PreviewListData.addRow(frame) self.PreviewListData.addRow(frame[u'image'], framenumber)
framenumber += 1
row = self.PreviewListData.createIndex(0, 0) row = self.PreviewListData.createIndex(0, 0)
if row.isValid(): if row.isValid():
self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent) self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
self.onSlideSelected(row) self.onSlideSelected(row)
def render(self): def render(self):

View File

@ -25,7 +25,7 @@ from PyQt4.QtGui import *
mypath=os.path.split(os.path.abspath(__file__))[0] mypath=os.path.split(os.path.abspath(__file__))[0]
sys.path.insert(0,(os.path.join(mypath, '..','..', '..','..'))) sys.path.insert(0,(os.path.join(mypath, '..','..', '..','..')))
from openlp.core.ui import ServiceManager from openlp.core.ui import ServiceManager
from openlp.plugins.images import ImageServiceItem from openlp.plugins.images.lib import ImageServiceItem
import logging import logging
logging.basicConfig(filename="test_service_manager.log",level=logging.INFO, filemode="w") logging.basicConfig(filename="test_service_manager.log",level=logging.INFO, filemode="w")
@ -47,7 +47,7 @@ class TestServiceManager_base:
app = QtGui.QApplication([]) app = QtGui.QApplication([])
except UnboundLocalError: except UnboundLocalError:
app = QtGui.QApplication([]) app = QtGui.QApplication([])
def teardown_class(self): def teardown_class(self):
pass pass
@ -84,7 +84,7 @@ class TestServiceManager_base:
assert lines[0].startswith("# <openlp.plugins.images.imageserviceitem.ImageServiceItem object") assert lines[0].startswith("# <openlp.plugins.images.imageserviceitem.ImageServiceItem object")
assert lines[1] == "test.gif" assert lines[1] == "test.gif"
log.info("done") log.info("done")
def test_2items_as_separate_items(self): def test_2items_as_separate_items(self):
# If nothing is selected when item is added, a new base service item is added # If nothing is selected when item is added, a new base service item is added
log.info("test_2items_as_separate_items") log.info("test_2items_as_separate_items")
@ -105,7 +105,7 @@ class TestServiceManager_base:
assert lines[3] == "test2.gif" assert lines[3] == "test2.gif"
assert lines[4] == "test3.gif" assert lines[4] == "test3.gif"
log.info("done") log.info("done")
def test_2items_merged(self): def test_2items_merged(self):
# If the first object is selected when item is added it should be extended # If the first object is selected when item is added it should be extended
log.info("test_2items_merged") log.info("test_2items_merged")
@ -134,7 +134,7 @@ class TestServiceManager_base:
# move to top, bottom # move to top, bottom
# new and save as # new and save as
# deleting items # deleting items
if __name__=="__main__": if __name__=="__main__":
t=TestServiceManager_base() t=TestServiceManager_base()

View File

@ -72,7 +72,7 @@ class ThemeData(QAbstractListModel):
preview = QPixmap(str(filename)) preview = QPixmap(str(filename))
width = self.maximagewidth width = self.maximagewidth
height = self.rowheight height = self.rowheight
preview = preview.scaled(width, height, Qt.KeepAspectRatio) preview = preview.scaled(width, height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
realwidth = preview.width() realwidth = preview.width()
realheight = preview.height() realheight = preview.height()
# and move it to the centre of the preview space # and move it to the centre of the preview space

View File

@ -60,3 +60,6 @@ class CustomPlugin(Plugin):
if event.event_type == EventType.ThemeListChanged: if event.event_type == EventType.ThemeListChanged:
log.debug(u'New Theme request received') log.debug(u'New Theme request received')
self.edit_custom_form.loadThemes(self.theme_manager.getThemes()) self.edit_custom_form.loadThemes(self.theme_manager.getThemes())
if event.event_type == EventType.LoadServiceItem and event.payload == 'Custom':
log.debug(u'Load Service Item received')
self.media_item.onCustomAddClick()

View File

@ -109,6 +109,8 @@ class CustomMediaItem(MediaManagerItem):
self.CustomListView.setAlternatingRowColors(True) self.CustomListView.setAlternatingRowColors(True)
self.CustomListData = TextListData() self.CustomListData = TextListData()
self.CustomListView.setModel(self.CustomListData) self.CustomListView.setModel(self.CustomListData)
self.CustomListView.setDragEnabled(True)
self.CustomListView .__class__.mouseMoveEvent =self.onMouseMoveEvent
self.PageLayout.addWidget(self.CustomListView) self.PageLayout.addWidget(self.CustomListView)
@ -233,3 +235,27 @@ class CustomMediaItem(MediaManagerItem):
service_item.title = title service_item.title = title
service_item.raw_slides = raw_slides service_item.raw_slides = raw_slides
service_item.raw_footer = raw_footer service_item.raw_footer = raw_footer
def onMouseMoveEvent(self, event):
"""
Drag and drop eventDo not care what data is selected
as the recepient will use events to request the data move
just tell it what plugin to call
"""
if event.buttons() != QtCore.Qt.LeftButton:
return
items = self.CustomListView.selectedIndexes()
if items == []:
return
drag = QtGui.QDrag(self)
mimeData = QtCore.QMimeData()
drag.setMimeData(mimeData)
for item in items:
mimeData.setText(u'Custom')
dropAction = drag.start(QtCore.Qt.CopyAction)
if dropAction == QtCore.Qt.CopyAction:
self.close()

View File

@ -18,6 +18,6 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA Place, Suite 330, Boston, MA 02111-1307 USA
""" """
from imageplugin import ImagePlugin #from imageplugin import ImagePlugin
from imageserviceitem import ImageServiceItem #from imageserviceitem import ImageServiceItem

View File

@ -39,7 +39,7 @@ class ImageServiceItem(ServiceItem):
it simply tells the slide controller to use it??? it simply tells the slide controller to use it???
It contains 1 or more images It contains 1 or more images
""" """
global log global log
log=logging.getLogger("ImageServiceItem") log=logging.getLogger("ImageServiceItem")
@ -56,7 +56,7 @@ class ImageServiceItem(ServiceItem):
# c.uniformItemSizes=True # c.uniformItemSizes=True
# c.setModel(self.imgs) # c.setModel(self.imgs)
# c.setGeometry(0,0,200,200) # c.setGeometry(0,0,200,200)
def render(self): def render(self):
""" """
The render method is what the plugin uses to render its meda to the The render method is what the plugin uses to render its meda to the
@ -64,7 +64,7 @@ class ImageServiceItem(ServiceItem):
""" """
# render the "image chooser first" # render the "image chooser first"
# for f in self.imgs: # for f in self.imgs:
# fl , nm = os.path.split(str(f)) # fl , nm = os.path.split(str(f))
# c = self.slide_controller.rowCount() # c = self.slide_controller.rowCount()
# self.slide_controller.setRowCount(c+1) # self.slide_controller.setRowCount(c+1)
# twi = QtGui.QTableWidgetItem(str(f)) # twi = QtGui.QTableWidgetItem(str(f))
@ -72,7 +72,7 @@ class ImageServiceItem(ServiceItem):
# twi = QtGui.QTableWidgetItem(str(nm)) # twi = QtGui.QTableWidgetItem(str(nm))
# self.slide_controller.setItem(c , 1, twi) # self.slide_controller.setItem(c , 1, twi)
# self.slide_controller.setRowHeight(c, 80) # self.slide_controller.setRowHeight(c, 80)
# render the preview screen here # render the preview screen here
def get_parent_node(self): def get_parent_node(self):
@ -92,7 +92,7 @@ class ImageServiceItem(ServiceItem):
log.info("add Item..."+str(data)) log.info("add Item..."+str(data))
for filename in data.get_file_list(): for filename in data.get_file_list():
self.add(filename) self.add(filename)
def get_oos_text(self): def get_oos_text(self):
""" """
@ -100,7 +100,7 @@ class ImageServiceItem(ServiceItem):
""" """
log.info("Get oos text") log.info("Get oos text")
log.info(str(self.imgs)) log.info(str(self.imgs))
log.info(str(self.imgs.get_file_list())) # log.info(str(self.imgs.get_file_list()))
return '\n'.join(self.imgs.get_file_list()) return '\n'.join(self.imgs.get_file_list())
def set_from_oos(self, text): def set_from_oos(self, text):
@ -111,4 +111,4 @@ class ImageServiceItem(ServiceItem):
files=text.split('\n') files=text.split('\n')
for f in files: for f in files:
self.imgs.addRow(f) self.imgs.addRow(f)

View File

@ -29,7 +29,7 @@ class ListWithPreviews(QAbstractListModel):
if os.path.exists(filename): if os.path.exists(filename):
preview = QPixmap(str(filename)) preview = QPixmap(str(filename))
w=self.maximagewidth;h=self.rowheight w=self.maximagewidth;h=self.rowheight
preview = preview.scaled(w,h, Qt.KeepAspectRatio) preview = preview.scaled(w,h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
realw=preview.width(); realh=preview.height() realw=preview.width(); realh=preview.height()
# and move it to the centre of the preview space # and move it to the centre of the preview space
p=QPixmap(w,h) p=QPixmap(w,h)