diff --git a/openlp.pyw b/openlp.pyw index 3909046c7..67086ae3e 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -26,7 +26,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver 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', filename=u'openlp.log', filemode=u'w') diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index d8437363f..a509e0d4d 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -19,8 +19,9 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ import logging import os, os.path - import sys + +from datetime import * from PyQt4 import QtGui, QtCore, Qt from copy import copy @@ -95,6 +96,7 @@ class Renderer: self.img=QtGui.QPixmap.fromImage(i.scaled(QtCore.QSize(neww, newh), Qt.Qt.KeepAspectRatio)) def set_paint_dest(self, p): + log.debug(u'set paint dest (frame) w %d h %d',p.width(), p.height()) self._paint=p if self._bg_image_filename is not None: self.scale_bg_image() @@ -128,6 +130,7 @@ class Renderer: assert(self._theme) assert(self._paint) log.debug(u'render background %s ', self._theme.background_type) + bef = datetime.now() p=QtGui.QPainter() p.begin(self._paint) if self._theme.background_type == u'solid': @@ -172,6 +175,10 @@ class Renderer: else: p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000')) 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): @@ -250,7 +257,7 @@ class Renderer: def render_lines(self, lines, footer_lines=None): """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 if footer_lines is not None: @@ -263,7 +270,7 @@ class Renderer: 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'render_lines- Finish') return bbox def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)): @@ -274,7 +281,7 @@ class Renderer: than a screenful (eg. by using split_set_of_lines) 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 brx=x bry=y @@ -291,8 +298,7 @@ class Renderer: p.setPen(QtGui.QPen(QtGui.QColor(0,0,255))) p.drawRect(retval) p.end() - - + log.debug(u'render lines unaligned Finish') return retval def _render_single_line(self, line, footer, tlcorner=(0,0)): @@ -394,6 +400,7 @@ class Renderer: p.end() brcorner=(rightextent,y) + log.debug(u'Render single line Finish') return brcorner # xxx this is what to override for an SDL version diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 72125bd1a..b62b22297 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -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 """ import logging -import time import os, os.path import sys + +from datetime import * from PyQt4 import QtGui, QtCore, Qt 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 to pull all Renderer interactions into one place. @@ -51,6 +70,7 @@ class RenderManager: self.theme = self.default_theme log.debug(u'theme is now %s', 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.build_text_rectangle(self.themedata) @@ -74,7 +94,7 @@ class RenderManager: self.renderer.set_text_rectangle(main_rect,footer_rect) def generate_preview(self, themedata): - log.debug(u'generate preview ') + log.debug(u'generate preview') self.calculate_default(QtCore.QSize(800,600)) self.renderer.set_theme(themedata) self.build_text_rectangle(themedata) @@ -102,20 +122,23 @@ class RenderManager: def generate_slide(self,main_text, footer_text): log.debug(u'generate slide') + #sys.settrace(traceit) + self.calculate_default(self.screen_list[self.current_display]['size']) + bef = datetime.now() frame = QtGui.QPixmap(self.width, self.height) + aft = datetime.now() + print "framebuild time", bef, aft, aft-bef + self.renderer.set_paint_dest(frame) answer=self.renderer.render_lines(main_text, footer_text) + #sys.settrace() return frame def calculate_default(self, screen): log.debug(u'calculate default %s' , screen) self.width = screen.width() self.height = screen.height() - if self.width > 1024: - self.width = 1024 - if self.height > 768: - self.height = 768 log.debug(u'calculate default %d,%d' , self.width, self.height) self.footer_start = int(self.height*0.95) # 95% is start of footer diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 6f29b0ed9..31b70a017 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -76,7 +76,7 @@ class ServiceItem(): if len(self.frames) == 0 : for slide in self.raw_slides: formated = self.render_manager.format_slide(slide, False) - frame = self.render_manager.generate_slide(slide, self.raw_footer) + frame = self.render_manager.generate_slide(formated, self.raw_footer) self.frames.append({u'formatted': formated, u'image': frame}) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index f2c00d540..fd5b94129 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -31,81 +31,81 @@ from openlp.core.lib import RenderManager from openlp.core import translate from openlp.core.lib import Event, EventType, EventManager -class ServiceData(QtCore.QAbstractItemModel): - """ - Tree of items for an order of service. - Includes methods for reading and writing the contents to an OOS file - Root contains a list of ServiceItems - """ - global log - log=logging.getLogger(u'ServiceData') - def __init__(self): - QtCore.QAbstractItemModel.__init__(self) - self.items=[] - log.info("Starting") - - def clearItems(self): - self.items = [] - - def columnCount(self, parent=None): - return 1; # always only a single column (for now) - - def rowCount(self, parent=None): - return len(self.items) - - def insertRow(self, row, service_item): - self.beginInsertRows(QtCore.QModelIndex(),row,row) - log.info("insert row %s:%s" % (row,service_item)) - self.items.insert(row, service_item) - log.info("Items: %s" % self.items) - self.endInsertRows() - - def removeRow(self, row): - self.beginRemoveRows(QtCore.QModelIndex(), row,row) - self.items.pop(row) - self.endRemoveRows() - - def addRow(self, service_item): - self.insertRow(len(self.items), service_item) - - def index(self, row, col, parent = QtCore.QModelIndex()): - return self.createIndex(row,col) - - def parent(self, index=QtCore.QModelIndex()): - return QtCore.QModelIndex() # no children as yet - - def data(self, index, role): - """ - Called by the service manager to draw us in the service window - """ - log.debug(u'data %s %d', index, role) - row = index.row() - if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! - return QtCore.QVariant() - item = self.items[row] - if role == QtCore.Qt.DisplayRole: - retval= item.title + u':' + item.shortname - elif role == QtCore.Qt.DecorationRole: - retval = item.iconic_representation - elif role == QtCore.Qt.ToolTipRole: - retval = None - else: - retval = None - if retval == None: - retval = QtCore.QVariant() -# log.info("Returning"+ str(retval)) - if type(retval) is not type(QtCore.QVariant): - return QtCore.QVariant(retval) - else: - return retval - - def __iter__(self): - for i in self.items: - yield i - - def item(self, row): - log.info("Get Item:%d -> %s" %(row, str(self.items))) - return self.items[row] +#class ServiceData(QtCore.QAbstractItemModel): +# """ +# Tree of items for an order of service. +# Includes methods for reading and writing the contents to an OOS file +# Root contains a list of ServiceItems +# """ +# global log +# log=logging.getLogger(u'ServiceData') +# def __init__(self): +# QtCore.QAbstractItemModel.__init__(self) +# self.items=[] +# log.info("Starting") +# +# def clearItems(self): +# self.items = [] +# +# def columnCount(self, parent=None): +# return 1; # always only a single column (for now) +# +# def rowCount(self, parent=None): +# return len(self.items) +# +# def insertRow(self, row, service_item): +# self.beginInsertRows(QtCore.QModelIndex(),row,row) +# log.info("insert row %s:%s" % (row,service_item)) +# self.items.insert(row, service_item) +# log.info("Items: %s" % self.items) +# self.endInsertRows() +# +# def removeRow(self, row): +# self.beginRemoveRows(QtCore.QModelIndex(), row,row) +# self.items.pop(row) +# self.endRemoveRows() +# +# def addRow(self, service_item): +# self.insertRow(len(self.items), service_item) +# +# def index(self, row, col, parent = QtCore.QModelIndex()): +# return self.createIndex(row,col) +# +# def parent(self, index=QtCore.QModelIndex()): +# return QtCore.QModelIndex() # no children as yet +# +# def data(self, index, role): +# """ +# Called by the service manager to draw us in the service window +# """ +# log.debug(u'data %s %d', index, role) +# row = index.row() +# if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! +# return QtCore.QVariant() +# item = self.items[row] +# if role == QtCore.Qt.DisplayRole: +# retval= item.title + u':' + item.shortname +# elif role == QtCore.Qt.DecorationRole: +# retval = item.iconic_representation +# elif role == QtCore.Qt.ToolTipRole: +# retval = None +# else: +# retval = None +# if retval == None: +# retval = QtCore.QVariant() +## log.info("Returning"+ str(retval)) +# if type(retval) is not type(QtCore.QVariant): +# return QtCore.QVariant(retval) +# else: +# return retval +# +# def __iter__(self): +# for i in self.items: +# yield i +# +# def item(self, row): +# log.info("Get Item:%d -> %s" %(row, str(self.items))) +# return self.items[row] class ServiceManager(QtGui.QWidget): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 941c7e8d3..0d4105974 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -41,7 +41,7 @@ class SlideData(QtCore.QAbstractListModel): self.maximagewidth=self.rowheight*16/9.0; log.info(u'Starting') - def clearItems(self): + def clear(self): self.items=[] def columnCount(self, parent): @@ -50,12 +50,12 @@ class SlideData(QtCore.QAbstractListModel): def rowCount(self, parent=None): return len(self.items) - def insertRow(self, row, frame): + def insertRow(self, row, frame, framenumber): self.beginInsertRows(QtCore.QModelIndex(),row,row) log.info(u'insert row %d' % row) # create a preview image - frame1 = frame.scaled(QtCore.QSize(350,260)) - self.items.insert(row,(frame1)) + frame1 = frame.scaled(QtCore.QSize(350,260), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) + self.items.insert(row,(frame1, framenumber)) log.info(u'Items: %s' % self.items) self.endInsertRows() @@ -64,8 +64,8 @@ class SlideData(QtCore.QAbstractListModel): self.items.pop(row) self.endRemoveRows() - def addRow(self, frame): - self.insertRow(len(self.items), frame) + def addRow(self, frame, framenumber): + self.insertRow(len(self.items), frame, framenumber) def data(self, index, role): row=index.row() @@ -74,7 +74,7 @@ class SlideData(QtCore.QAbstractListModel): # if role==Qt.DisplayRole: # retval= self.items[row][1] if role == QtCore.Qt.DecorationRole: - retval= self.items[row]#[0] + retval= self.items[row][0] else: retval= QtCore.QVariant() # log.info("Returning"+ str(retval)) @@ -120,9 +120,11 @@ class SlideController(QtGui.QWidget): self.Controller.setWidgetResizable(True) self.PreviewListView = QtGui.QListView(self.Splitter) + self.PreviewListView.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged) self.PreviewListView.setAlternatingRowColors(True) self.PreviewListData = SlideData() self.PreviewListView.setModel(self.PreviewListData) + self.PreviewListView.setSelectionRectVisible(True) self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536)) self.Controller.setWidget(self.PreviewListView) @@ -144,7 +146,7 @@ class SlideController(QtGui.QWidget): self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_last.png', translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast) self.Toolbar.addSeparator() - self.Toolbar.addToolbarButton(u'Close Sscreen', u':/slides/slide_close.png', + self.Toolbar.addToolbarButton(u'Close Screen', u':/slides/slide_close.png', translate(u'SlideController', u'Close Screen'), self.onBlankScreen) self.Toolbar.setSizePolicy(sizeToolbarPolicy) @@ -164,6 +166,13 @@ class SlideController(QtGui.QWidget): QtCore.QObject.connect(self.PreviewListView, 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): row = self.PreviewListData.createIndex(0, 0) @@ -184,7 +193,6 @@ class SlideController(QtGui.QWidget): self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent) self.onSlideSelected(row) - def onSlideSelectedPrevious(self): indexes = self.PreviewListView.selectedIndexes() rowNumber = 0 @@ -212,17 +220,21 @@ class SlideController(QtGui.QWidget): self.previewFrame(frame) def previewFrame(self, frame): - self.SlidePreview.setPixmap(frame) + self.SlidePreview.setPixmap(frame[0]) 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): log.debug(u'addServiceItem') self.serviceitem = serviceitem self.serviceitem.render() - self.PreviewListData.clearItems() + self.PreviewListData.clear() + framenumber = 0 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) if row.isValid(): diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 40a16e020..a919825a8 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -72,7 +72,7 @@ class ThemeData(QAbstractListModel): preview = QPixmap(str(filename)) width = self.maximagewidth height = self.rowheight - preview = preview.scaled(width, height, Qt.KeepAspectRatio) + preview = preview.scaled(width, height, Qt.KeepAspectRatio, Qt.SmoothTransformation) realwidth = preview.width() realheight = preview.height() # and move it to the centre of the preview space diff --git a/openlp/plugins/images/__init__.py b/openlp/plugins/images/__init__.py index aa7efaf52..e1ec9228a 100644 --- a/openlp/plugins/images/__init__.py +++ b/openlp/plugins/images/__init__.py @@ -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 """ -from imageplugin import ImagePlugin +#from imageplugin import ImagePlugin #from imageserviceitem import ImageServiceItem diff --git a/openlp/plugins/images/lib/listwithpreviews.py b/openlp/plugins/images/lib/listwithpreviews.py index 6a16636e7..271ea181e 100644 --- a/openlp/plugins/images/lib/listwithpreviews.py +++ b/openlp/plugins/images/lib/listwithpreviews.py @@ -29,7 +29,7 @@ class ListWithPreviews(QAbstractListModel): if os.path.exists(filename): preview = QPixmap(str(filename)) 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() # and move it to the centre of the preview space p=QPixmap(w,h)