Fixed Renderer to split lines and pages,

ServiceItem now handles them.
This commit is contained in:
Tim Bentley 2009-06-02 17:25:36 +01:00
commit a2034dd132
4 changed files with 78 additions and 74 deletions

View File

@ -109,7 +109,7 @@ class Renderer:
""" """
External API to sort out the text to pe placed on the frame 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) log.debug(u'format_slide %s', words)
verses = [] verses = []
words = words.replace("\r\n", "\n") words = words.replace("\r\n", "\n")
@ -120,9 +120,10 @@ class Renderer:
for line in lines: for line in lines:
text.append(line) text.append(line)
print self._split_set_of_lines(text, False) split_text = self._split_set_of_lines(text, False)
print "text ", text #print "split text ", split_text
return text #print "text ", text
return split_text
# def render_screen(self, screennum): # def render_screen(self, screennum):
# log.debug(u'render screen\n %s %s ', screennum, self.words[screennum]) # log.debug(u'render screen\n %s %s ', screennum, self.words[screennum])
@ -132,7 +133,9 @@ class Renderer:
# return retval # return retval
def set_text_rectangle(self, rect_main, rect_footer): def set_text_rectangle(self, rect_main, rect_footer):
""" Sets the rectangle within which text should be rendered""" """
Sets the rectangle within which text should be rendered
"""
self._rect = rect_main self._rect = rect_main
self._rect_footer = rect_footer self._rect_footer = rect_footer
@ -140,10 +143,10 @@ class Renderer:
""" """
Render a set of lines according to the theme, return bounding box Render a set of lines according to the theme, return bounding box
""" """
print "########## Generate frame from lines ##################" #print "########## Generate frame from lines ##################"
log.debug(u'generate_frame_from_lines - Start') log.debug(u'generate_frame_from_lines - Start')
print "Render Lines ", lines #print "Render Lines ", lines
bbox = self._render_lines_unaligned(lines, False) bbox = self._render_lines_unaligned(lines, False)
if footer_lines is not None: if footer_lines is not None:
@ -222,69 +225,73 @@ class Renderer:
We'll do this by getting the bounding box of each line, and then summing them appropriately We'll do this by getting the bounding box of each line, and then summing them appropriately
Returns a list of [lists of lines], one set for each screenful Returns a list of [lists of lines], one set for each screenful
""" """
############ THIS IS WRONG SO FIX IT
log.debug(u'Split set of lines')
bboxes = [] bboxes = []
print "Lines ", lines #print "lines ", lines
for line in lines: for line in lines:
bboxes.append(self._render_and_wrap_single_line(line, footer)) bboxes.append(self._render_and_wrap_single_line(line, footer))
#print line, bboxes #print "bboxes ", bboxes
numlines = len(lines) numlines = len(lines)
bottom = self._rect.bottom() bottom = self._rect.bottom()
#for ratio in (numlines): #, numlines/2, numlines/3, numlines/4):
ratio = numlines count = 0
good = 1
startline = 0 for ratio in (numlines, numlines/2, numlines/3, numlines/4):
endline = startline + ratio good = 1
#print "A ", numlines , startline, endline startline = 0
#print "B ", bboxes endline = startline + ratio
while (endline <= numlines): while (endline <= numlines and endline != 0):
by = 0 count += 1
for (x, y) in bboxes[startline:endline]: if count > 100:
by += y #print "busted"
#print by break
#print by , bottom by = 0
if by > bottom: for (x,y) in bboxes[startline:endline]:
good=0 #print by, startline, endline, x, y, bottom
by += y
#print "by ", by , bottom, startline, endline, numlines, ratio
if by > bottom:
good = 0
break
startline += ratio
endline = startline + ratio
if good == 1:
break break
startline += ratio
endline = startline+ratio
# if good == 1:
# break
# print "---------"
retval = [] retval = []
numlines_per_page = ratio numlines_per_page = ratio
#print "good ", good, ratio
if good: if good:
c = 0 c = 0
thislines = [] thislines = []
while c < numlines: while c < numlines:
thislines.append(lines[c]) thislines.append(lines[c])
c += 1 c += 1
#print "c ", c, len(thislines), numlines_per_page, thislines
if len(thislines) == numlines_per_page: if len(thislines) == numlines_per_page:
retval.append(thislines) retval.append(thislines)
thislines = [] thislines = []
if len(thislines) > 0:
retval.append(thislines)
#print "extra ", thislines
else: else:
# log.debug(u" "Just split where you can" # print "Just split where you can"
retval = [] retval = []
startline = 0 startline = 0
endline = startline+1 endline = startline + 1
while (endline <= numlines): while (endline <= numlines):
by = 0 by = 0
for (x, y) in bboxes[startline:endline]: for (x,y) in bboxes[startline:endline]:
by += y by += y
if by > bottom: if by > bottom:
retval.append(lines[startline:endline-1]) retval.append(lines[startline:endline-1])
startline = endline-1 startline = endline-1
endline = startline # gets incremented below # gets incremented below
endline = startline
by = 0 by = 0
endline += 1 endline += 1
print "retval ", retval #print "retval ", retval
return retval return retval
def _correctAlignment(self, rect, bbox): def _correctAlignment(self, rect, bbox):
@ -312,14 +319,12 @@ class Renderer:
x, y = tlcorner x, y = tlcorner
brx = x brx = x
bry = y bry = y
print "A ", bry
for line in lines: for line in lines:
# 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_and_wrap_single_line(line, footer, (x , bry)) (thisx, bry) = self._render_and_wrap_single_line(line, footer, (x , bry))
if (thisx > brx): if (thisx > brx):
brx = thisx brx = thisx
print "B ", bry
retval = QtCore.QRect(x, y,brx-x, bry-y) retval = QtCore.QRect(x, y,brx-x, bry-y)
if self._debug: if self._debug:
painter = QtGui.QPainter() painter = QtGui.QPainter()
@ -370,8 +375,6 @@ class Renderer:
else: else:
align = int(self._theme .display_horizontalAlign) align = int(self._theme .display_horizontalAlign)
print "wrap ", lines
for linenum in range(len(lines)): for linenum in range(len(lines)):
line = lines[linenum] line = lines[linenum]
#find out how wide line is #find out how wide line is

View File

@ -65,9 +65,10 @@ class ServiceItem():
if len(self.frames) == 0 and len(self.raw_slides) > 0 : if len(self.frames) == 0 and len(self.raw_slides) > 0 :
for slide in self.raw_slides: for slide in self.raw_slides:
formated = self.plugin.render_manager.format_slide(slide) formated = self.plugin.render_manager.format_slide(slide)
print formated #print formated
frame = self.plugin.render_manager.generate_slide(formated, self.raw_footer) for format in formated:
self.frames.append({u'title': formated, u'image': frame}) frame = self.plugin.render_manager.generate_slide(format, self.raw_footer)
self.frames.append({u'title': format, u'image': frame})
else: else:
if len(self.command_files) > 0: if len(self.command_files) > 0:
pass pass

View File

@ -129,8 +129,8 @@ class MainWindow(object):
self.ControlSplitter.setObjectName(u'ControlSplitter') self.ControlSplitter.setObjectName(u'ControlSplitter')
self.MainContentLayout.addWidget(self.ControlSplitter) self.MainContentLayout.addWidget(self.ControlSplitter)
self.PreviewController = SlideController(self.ControlSplitter, self, False) self.PreviewController = SlideController( self.ControlSplitter, self, False)
self.LiveController = SlideController(self.ControlSplitter, self, True) self.LiveController = SlideController(self.ControlSplitter, self, True)
self.MenuBar = QtGui.QMenuBar(self.mainWindow) self.MenuBar = QtGui.QMenuBar(self.mainWindow)
self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27)) self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27))

View File

@ -98,10 +98,10 @@ class SlideData(QtCore.QAbstractListModel):
class SlideController(QtGui.QWidget): class SlideController(QtGui.QWidget):
global log global log
log=logging.getLogger(u'SlideController') log = logging.getLogger(u'SlideController')
def __init__(self, control_splitter, parent , isLive): def __init__(self, control_splitter, parent, isLive):
QtGui.QWidget.__init__(self) QtGui.QWidget.__init__(self, parent.mainWindow)
self.isLive = isLive self.isLive = isLive
self.parent = parent self.parent = parent
self.Panel = QtGui.QWidget(control_splitter) self.Panel = QtGui.QWidget(control_splitter)
@ -110,34 +110,30 @@ class SlideController(QtGui.QWidget):
self.PanelLayout = QtGui.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(0)
self.PanelLayout.setMargin(0) self.PanelLayout.setMargin(0)
self.Controller = QtGui.QScrollArea(self.Splitter) self.Controller = QtGui.QWidget(self.Splitter)
self.Controller.setGeometry(QtCore.QRect(0, 0, 700, 536)) self.Controller.setGeometry(QtCore.QRect(0, 0, 800, 536))
self.Controller.setWidgetResizable(True) self.Controller.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum))
self.Controller.setObjectName("scrollArea") self.ControllerLayout = QtGui.QVBoxLayout(self.Controller)
self.ControllerLayout.setSpacing(0)
self.ControllerLayout.setMargin(0)
self.scrollAreaWidgetContents = QtGui.QWidget(self.Controller) self.PreviewListView = QtGui.QListView(self.Controller)
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 700, 536)) self.PreviewListData = SlideData()
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.PreviewListView.isLive = self.isLive
self.gridLayout = QtGui.QGridLayout(self.scrollAreaWidgetContents)
self.gridLayout.setObjectName("gridLayout")
self.PreviewListView = QtGui.QListView(self.scrollAreaWidgetContents)
self.PreviewListView.setFlow(1) self.PreviewListView.setFlow(1)
self.PreviewListView.setViewMode(1) self.PreviewListView.setViewMode(1)
self.PreviewListView.setWrapping(False) self.PreviewListView.setWrapping(False)
self.PreviewListData = SlideData()
self.PreviewListView.setModel(self.PreviewListData) self.PreviewListView.setModel(self.PreviewListData)
#self.PreviewListView.setSelectionRectVisible(True) #self.PreviewListView.setSelectionRectVisible(True)
self.PreviewListView.setSpacing(5)
self.PreviewListView.setSpacing(0)
self.PreviewListView.setObjectName("PreviewListView") self.PreviewListView.setObjectName("PreviewListView")
self.ControllerLayout.addWidget(self.PreviewListView)
self.gridLayout.addWidget(self.PreviewListView, 0, 0, 1, 1) self.Toolbar = OpenLPToolbar(self.Controller)
self.Controller.setWidget(self.scrollAreaWidgetContents)
self.Toolbar = OpenLPToolbar(self.Splitter)
sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
sizeToolbarPolicy.setHorizontalStretch(0) sizeToolbarPolicy.setHorizontalStretch(0)
sizeToolbarPolicy.setVerticalStretch(0) sizeToolbarPolicy.setVerticalStretch(0)
@ -159,14 +155,18 @@ class SlideController(QtGui.QWidget):
self.Toolbar.setSizePolicy(sizeToolbarPolicy) self.Toolbar.setSizePolicy(sizeToolbarPolicy)
self.ControllerLayout.addWidget(self.Toolbar)
self.PreviewFrame = QtGui.QFrame(self.Splitter) self.PreviewFrame = QtGui.QFrame(self.Splitter)
self.PreviewFrame.setGeometry(QtCore.QRect(50, 270, 250, 190)) self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 250, 190))
self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy(
QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum))
self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)
self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken) self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken)
self.PreviewFrame.setObjectName(u'PreviewFrame') self.PreviewFrame.setObjectName(u'PreviewFrame')
self.grid = QtGui.QGridLayout(self.PreviewFrame) self.grid = QtGui.QGridLayout(self.PreviewFrame)
self.grid.setMargin(10) self.grid.setMargin(8)
self.grid.setObjectName(u'grid') self.grid.setObjectName(u'grid')
self.SlidePreview = QtGui.QLabel(self.PreviewFrame) self.SlidePreview = QtGui.QLabel(self.PreviewFrame)
@ -176,8 +176,8 @@ class SlideController(QtGui.QWidget):
sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth())
self.SlidePreview.setSizePolicy(sizePolicy) self.SlidePreview.setSizePolicy(sizePolicy)
self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190)) self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190))
self.SlidePreview.setFrameShape(QtGui.QFrame.WinPanel) self.SlidePreview.setFrameShape(QtGui.QFrame.Box)
self.SlidePreview.setFrameShadow(QtGui.QFrame.Sunken) self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)
self.SlidePreview.setLineWidth(1) self.SlidePreview.setLineWidth(1)
self.SlidePreview.setScaledContents(True) self.SlidePreview.setScaledContents(True)
self.SlidePreview.setObjectName(u'SlidePreview') self.SlidePreview.setObjectName(u'SlidePreview')