Merge lp:~trb143/openlp/servicing into lp:openlp

Proposed by Tim Bentley
Status: Merged
Merged at revision: not available
Proposed branch: lp:~trb143/openlp/servicing
Merge into: lp:openlp
Diff against target: None lines
To merge this branch: bzr merge lp:~trb143/openlp/servicing
Reviewer Review Type Date Requested Status
Raoul Snyman Approve
Review via email: mp+6402@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Tim Bentley (trb143) wrote :

Add Drag and drop from Custom plugin to ServiceManager
Improve rendering of images for all code sections so they look nice.

Note
Prints in Renderer/RenderManager are to review performance of the Renderer.

Revision history for this message
Raoul Snyman (raoul-snyman) wrote :

  992 # for f in self.imgs:
  993 # fl , nm = os.path.split(str(f))
  994 # c = self.slide_controller.rowCount()
  995 # self.slide_controller.setRowCount(c+1)
  996 # twi = QtGui.QTableWidgetItem(str(f))

I know this is commented out, but looking at those variables, I can't see at a glance what they are supposed to be. Please can you make decently named variables.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openlp.pyw'
2--- openlp.pyw 2009-05-04 13:48:12 +0000
3+++ openlp.pyw 2009-05-11 05:09:43 +0000
4@@ -26,7 +26,7 @@
5 from openlp.core.lib import Receiver
6
7 logging.basicConfig(level=logging.DEBUG,
8- format=u'%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
9+ format=u'%(asctime)s %(msecs)d %(name)-12s %(levelname)-8s %(message)s',
10 datefmt=u'%m-%d %H:%M:%S',
11 filename=u'openlp.log',
12 filemode=u'w')
13
14=== modified file 'openlp/core/lib/event.py'
15--- openlp/core/lib/event.py 2009-04-06 18:45:45 +0000
16+++ openlp/core/lib/event.py 2009-05-09 07:01:33 +0000
17@@ -35,6 +35,7 @@
18 AfterLoadService = 2
19 BeforeSaveService = 3
20 AfterSaveService = 4
21+ LoadServiceItem = 5
22 # Preview events
23 PreviewBeforeLoad = 11
24 PreviewAfterLoad = 12
25
26=== modified file 'openlp/core/lib/renderer.py'
27--- openlp/core/lib/renderer.py 2009-05-04 13:48:12 +0000
28+++ openlp/core/lib/renderer.py 2009-05-11 05:09:43 +0000
29@@ -19,8 +19,9 @@
30 """
31 import logging
32 import os, os.path
33-
34 import sys
35+
36+from datetime import *
37 from PyQt4 import QtGui, QtCore, Qt
38
39 from copy import copy
40@@ -95,6 +96,7 @@
41 self.img=QtGui.QPixmap.fromImage(i.scaled(QtCore.QSize(neww, newh), Qt.Qt.KeepAspectRatio))
42
43 def set_paint_dest(self, p):
44+ log.debug(u'set paint dest (frame) w %d h %d',p.width(), p.height())
45 self._paint=p
46 if self._bg_image_filename is not None:
47 self.scale_bg_image()
48@@ -128,6 +130,7 @@
49 assert(self._theme)
50 assert(self._paint)
51 log.debug(u'render background %s ', self._theme.background_type)
52+ bef = datetime.now()
53 p=QtGui.QPainter()
54 p.begin(self._paint)
55 if self._theme.background_type == u'solid':
56@@ -172,6 +175,10 @@
57 else:
58 p.fillRect(self._paint.rect(), QtGui.QColor(u'#000000'))
59 p.end()
60+ aft = datetime.now()
61+ print "background time", bef, aft, aft-bef
62+
63+ log.debug(u'render background finish')
64
65 def split_set_of_lines(self, lines, footer):
66
67@@ -250,7 +257,7 @@
68
69 def render_lines(self, lines, footer_lines=None):
70 """render a set of lines according to the theme, return bounding box"""
71- log.debug(u'_render_lines %s', lines)
72+ log.debug(u'render_lines - Start')
73
74 bbox=self._render_lines_unaligned(lines, False) # Main font
75 if footer_lines is not None:
76@@ -263,7 +270,7 @@
77
78 if footer_lines is not None:
79 bbox=self._render_lines_unaligned(footer_lines, True, (self._rect_footer.left(), self._rect_footer.top()) )
80-
81+ log.debug(u'render_lines- Finish')
82 return bbox
83
84 def _render_lines_unaligned(self, lines, footer, tlcorner=(0,0)):
85@@ -274,13 +281,11 @@
86 than a screenful (eg. by using split_set_of_lines)
87
88 Returns the bounding box of the text as QRect"""
89- log.debug(u'render lines unaligned %s', lines)
90+ log.debug(u'render lines unaligned Start')
91 x, y=tlcorner
92 brx=x
93 bry=y
94 for line in lines:
95- #if (line == ''):
96- # continue
97 # render after current bottom, but at original left edge
98 # keep track of right edge to see which is biggest
99 (thisx, bry) = self._render_single_line(line, footer, (x,bry))
100@@ -293,8 +298,7 @@
101 p.setPen(QtGui.QPen(QtGui.QColor(0,0,255)))
102 p.drawRect(retval)
103 p.end()
104-
105-
106+ log.debug(u'render lines unaligned Finish')
107 return retval
108
109 def _render_single_line(self, line, footer, tlcorner=(0,0)):
110@@ -396,16 +400,16 @@
111 p.end()
112
113 brcorner=(rightextent,y)
114+ log.debug(u'Render single line Finish')
115 return brcorner
116
117 # xxx this is what to override for an SDL version
118 def _get_extent_and_render(self, line, footer, tlcorner=(0,0), draw=False, color=None):
119 """Find bounding box of text - as render_single_line.
120 If draw is set, actually draw the text to the current DC as well
121-
122 return width and height of text as a tuple (w,h)"""
123 # setup defaults
124- log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw)
125+ #log.debug(u'_get_extent_and_render %s %s %s ', [line], tlcorner, draw)
126 p=QtGui.QPainter()
127 p.begin(self._paint)
128 # 'twould be more efficient to set this once when theme changes
129
130=== modified file 'openlp/core/lib/rendermanager.py'
131--- openlp/core/lib/rendermanager.py 2009-05-04 13:48:12 +0000
132+++ openlp/core/lib/rendermanager.py 2009-05-11 05:09:43 +0000
133@@ -18,12 +18,31 @@
134 Place, Suite 330, Boston, MA 02111-1307 USA
135 """
136 import logging
137-import time
138 import os, os.path
139 import sys
140+
141+from datetime import *
142 from PyQt4 import QtGui, QtCore, Qt
143 from renderer import Renderer
144
145+import sys
146+import linecache
147+
148+def traceit(frame, event, arg):
149+ if event == "line":
150+ lineno = frame.f_lineno
151+ filename = frame.f_globals["__file__"]
152+ if (filename.endswith(".pyc") or
153+ filename.endswith(".pyo")):
154+ filename = filename[:-1]
155+ name = frame.f_globals["__name__"]
156+ line = linecache.getline(filename, lineno)
157+ if name.startswith("openlp"):
158+ print "%s:%s: %s" % (name, lineno, line.rstrip())
159+ return traceit
160+
161+
162+
163 class RenderManager:
164 """
165 Class to pull all Renderer interactions into one place.
166@@ -51,6 +70,7 @@
167 self.theme = self.default_theme
168 log.debug(u'theme is now %s', self.theme)
169 self.themedata = self.theme_manager.getThemeData(self.theme)
170+ self.calculate_default(self.screen_list[self.current_display]['size'])
171 self.renderer.set_theme(self.themedata)
172 self.build_text_rectangle(self.themedata)
173
174@@ -74,7 +94,7 @@
175 self.renderer.set_text_rectangle(main_rect,footer_rect)
176
177 def generate_preview(self, themedata):
178- log.debug(u'generate preview ')
179+ log.debug(u'generate preview')
180 self.calculate_default(QtCore.QSize(800,600))
181 self.renderer.set_theme(themedata)
182 self.build_text_rectangle(themedata)
183@@ -102,11 +122,18 @@
184
185 def generate_slide(self,main_text, footer_text):
186 log.debug(u'generate slide')
187+ #sys.settrace(traceit)
188+
189 self.calculate_default(self.screen_list[self.current_display]['size'])
190
191+ bef = datetime.now()
192 frame = QtGui.QPixmap(self.width, self.height)
193+ aft = datetime.now()
194+ print "framebuild time", bef, aft, aft-bef
195+
196 self.renderer.set_paint_dest(frame)
197 answer=self.renderer.render_lines(main_text, footer_text)
198+ #sys.settrace()
199 return frame
200
201 def calculate_default(self, screen):
202
203=== modified file 'openlp/core/lib/serviceitem.py'
204--- openlp/core/lib/serviceitem.py 2009-05-04 13:48:12 +0000
205+++ openlp/core/lib/serviceitem.py 2009-05-11 05:09:43 +0000
206@@ -44,7 +44,6 @@
207 self.items = []
208 self.iconic_representation = None
209 self.raw_slides = None
210- self.format_slides = []
211 self.frames = []
212 self.raw_footer = None
213 self.theme = None
214@@ -74,11 +73,11 @@
215 else:
216 self.render_manager.set_override_theme(self.theme)
217 log.debug(u'Formatting slides')
218- for slide in self.raw_slides:
219- self.format_slides.append(self.render_manager.format_slide(slide, False))
220- log.debug(u'Rendering slides')
221- for slide in self.format_slides:
222- self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer))
223+ if len(self.frames) == 0 :
224+ for slide in self.raw_slides:
225+ formated = self.render_manager.format_slide(slide, False)
226+ frame = self.render_manager.generate_slide(formated, self.raw_footer)
227+ self.frames.append({u'formatted': formated, u'image': frame})
228
229
230 def get_parent_node(self):
231
232=== modified file 'openlp/core/ui/mainwindow.py'
233--- openlp/core/ui/mainwindow.py 2009-05-04 08:15:48 +0000
234+++ openlp/core/ui/mainwindow.py 2009-05-09 07:01:33 +0000
235@@ -92,6 +92,7 @@
236 self.ThemeManagerContents.eventManager = self.EventManager
237 self.ThemeManagerContents.renderManager = self.RenderManager
238 self.ServiceManagerContents.renderManager = self.RenderManager
239+ self.ServiceManagerContents.eventManager = self.EventManager
240 self.ThemeManagerContents.serviceManager = self.ServiceManagerContents
241 self.ThemeManagerContents.loadThemes()
242
243
244=== modified file 'openlp/core/ui/servicemanager.py'
245--- openlp/core/ui/servicemanager.py 2009-05-04 08:15:48 +0000
246+++ openlp/core/ui/servicemanager.py 2009-05-11 05:09:43 +0000
247@@ -18,101 +18,97 @@
248 Place, Suite 330, Boston, MA 02111-1307 USA
249 """
250 import os
251+import logging
252
253 from time import sleep
254 from copy import deepcopy
255
256-from PyQt4.QtCore import *
257-from PyQt4.QtGui import *
258+from PyQt4 import QtCore, QtGui
259
260-# from openlp.core.resources import *
261-# from openlp.core.ui import AboutForm, AlertForm, SettingsForm, SlideController
262 from openlp.core.lib import OpenLPToolbar
263 from openlp.core.lib import ServiceItem
264 from openlp.core.lib import RenderManager
265 from openlp.core import translate
266-
267-# from openlp.core import PluginManager
268-import logging
269-
270-class ServiceData(QAbstractItemModel):
271- """
272- Tree of items for an order of service.
273- Includes methods for reading and writing the contents to an OOS file
274- Root contains a list of ServiceItems
275- """
276- global log
277- log=logging.getLogger(u'ServiceData')
278- def __init__(self):
279- QAbstractItemModel.__init__(self)
280- self.items=[]
281- log.info("Starting")
282-
283- def clearItems(self):
284- self.items = []
285-
286- def columnCount(self, parent):
287- return 1; # always only a single column (for now)
288-
289- def rowCount(self, parent):
290- return len(self.items)
291-
292- def insertRow(self, row, service_item):
293- self.beginInsertRows(QModelIndex(),row,row)
294- log.info("insert row %s:%s" % (row,service_item))
295- self.items.insert(row, service_item)
296- log.info("Items: %s" % self.items)
297- self.endInsertRows()
298-
299- def removeRow(self, row):
300- self.beginRemoveRows(QModelIndex(), row,row)
301- self.items.pop(row)
302- self.endRemoveRows()
303-
304- def addRow(self, item):
305- self.insertRow(len(self.items), item)
306-
307- def index(self, row, col, parent = QModelIndex()):
308- return self.createIndex(row,col)
309-
310- def parent(self, index=QModelIndex()):
311- return QModelIndex() # no children as yet
312-
313- def data(self, index, role):
314- """
315- Called by the service manager to draw us in the service window
316- """
317- log.debug(u'data %s %d', index, role)
318- row=index.row()
319- if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
320- return QVariant()
321- item=self.items[row]
322- if role==Qt.DisplayRole:
323- retval= item.title + u':' + item.shortname
324- elif role == Qt.DecorationRole:
325- retval = item.iconic_representation
326- elif role == Qt.ToolTipRole:
327- retval= None
328- else:
329- retval= None
330- if retval == None:
331- retval=QVariant()
332-# log.info("Returning"+ str(retval))
333- if type(retval) is not type(QVariant):
334- return QVariant(retval)
335- else:
336- return retval
337-
338- def __iter__(self):
339- for i in self.items:
340- yield i
341-
342- def item(self, row):
343- log.info("Get Item:%d -> %s" %(row, str(self.items)))
344- return self.items[row]
345-
346-
347-class ServiceManager(QWidget):
348+from openlp.core.lib import Event, EventType, EventManager
349+
350+#class ServiceData(QtCore.QAbstractItemModel):
351+# """
352+# Tree of items for an order of service.
353+# Includes methods for reading and writing the contents to an OOS file
354+# Root contains a list of ServiceItems
355+# """
356+# global log
357+# log=logging.getLogger(u'ServiceData')
358+# def __init__(self):
359+# QtCore.QAbstractItemModel.__init__(self)
360+# self.items=[]
361+# log.info("Starting")
362+#
363+# def clearItems(self):
364+# self.items = []
365+#
366+# def columnCount(self, parent=None):
367+# return 1; # always only a single column (for now)
368+#
369+# def rowCount(self, parent=None):
370+# return len(self.items)
371+#
372+# def insertRow(self, row, service_item):
373+# self.beginInsertRows(QtCore.QModelIndex(),row,row)
374+# log.info("insert row %s:%s" % (row,service_item))
375+# self.items.insert(row, service_item)
376+# log.info("Items: %s" % self.items)
377+# self.endInsertRows()
378+#
379+# def removeRow(self, row):
380+# self.beginRemoveRows(QtCore.QModelIndex(), row,row)
381+# self.items.pop(row)
382+# self.endRemoveRows()
383+#
384+# def addRow(self, service_item):
385+# self.insertRow(len(self.items), service_item)
386+#
387+# def index(self, row, col, parent = QtCore.QModelIndex()):
388+# return self.createIndex(row,col)
389+#
390+# def parent(self, index=QtCore.QModelIndex()):
391+# return QtCore.QModelIndex() # no children as yet
392+#
393+# def data(self, index, role):
394+# """
395+# Called by the service manager to draw us in the service window
396+# """
397+# log.debug(u'data %s %d', index, role)
398+# row = index.row()
399+# if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
400+# return QtCore.QVariant()
401+# item = self.items[row]
402+# if role == QtCore.Qt.DisplayRole:
403+# retval= item.title + u':' + item.shortname
404+# elif role == QtCore.Qt.DecorationRole:
405+# retval = item.iconic_representation
406+# elif role == QtCore.Qt.ToolTipRole:
407+# retval = None
408+# else:
409+# retval = None
410+# if retval == None:
411+# retval = QtCore.QVariant()
412+## log.info("Returning"+ str(retval))
413+# if type(retval) is not type(QtCore.QVariant):
414+# return QtCore.QVariant(retval)
415+# else:
416+# return retval
417+#
418+# def __iter__(self):
419+# for i in self.items:
420+# yield i
421+#
422+# def item(self, row):
423+# log.info("Get Item:%d -> %s" %(row, str(self.items)))
424+# return self.items[row]
425+
426+
427+class ServiceManager(QtGui.QWidget):
428
429 """Manages the orders of service. Currently this involves taking
430 text strings from plugins and adding them to an OOS file. In
431@@ -124,48 +120,52 @@
432 log=logging.getLogger(u'ServiceManager')
433
434 def __init__(self, parent):
435- QWidget.__init__(self)
436+ QtGui.QWidget.__init__(self)
437 self.parent=parent
438- self.Layout = QVBoxLayout(self)
439+ self.Layout = QtGui.QVBoxLayout(self)
440 self.Layout.setSpacing(0)
441 self.Layout.setMargin(0)
442 self.Toolbar = OpenLPToolbar(self)
443- self.Toolbar.addToolbarButton("Move to top", ":/services/service_top.png",
444- translate(u'ServiceManager', u'Move to start'), self.onServiceTop)
445- self.Toolbar.addToolbarButton("Move up", ":/services/service_up.png",
446+ self.Toolbar.addToolbarButton(u'Move to top', u':/services/service_top.png',
447+ translate(u'ServiceManager', u'Move to top'), self.onServiceTop)
448+ self.Toolbar.addToolbarButton(u'Move up', u':/services/service_up.png',
449 translate(u'ServiceManager', u'Move up order'), self.onServiceUp)
450- self.Toolbar.addToolbarButton("Move down", ":/services/service_down.png",
451+ self.Toolbar.addToolbarButton(u'Move down', u':/services/service_down.png',
452 translate(u'ServiceManager', u'Move down order'), self.onServiceDown)
453- self.Toolbar.addToolbarButton("Move to bottom", ":/services/service_bottom.png",
454+ self.Toolbar.addToolbarButton(u'Move to bottom', u':/services/service_bottom.png',
455 translate(u'ServiceManager', u'Move to end'), self.onServiceEnd)
456 self.Toolbar.addSeparator()
457- self.Toolbar.addToolbarButton("New Service", ":/services/service_new.png",
458+ self.Toolbar.addToolbarButton(u'New Service', u':/services/service_new.png',
459 translate(u'ServiceManager', u'Create a new Service'), self.onNewService)
460- self.Toolbar.addToolbarButton("Delete From Service", ":/services/service_delete.png",
461+ self.Toolbar.addToolbarButton(u'Delete From Service', u':/services/service_delete.png',
462 translate(u'ServiceManager', u'Delete From Service'), self.onDeleteFromService)
463 self.Toolbar.addSeparator()
464- self.Toolbar.addToolbarButton("Save Service", ":/services/service_save.png",
465+ self.Toolbar.addToolbarButton(u'Save Service', u':/services/service_save.png',
466 translate(u'ServiceManager', u'Save Service'), self.onSaveService)
467- self.Toolbar.addToolbarButton("Load Service", ":/services/service_open.png",
468+ self.Toolbar.addToolbarButton(u'Load Service', u':/services/service_open.png',
469 translate(u'ServiceManager', u'Load Existing'), self.onLoadService)
470
471 self.Toolbar.addSeparator()
472- self.ThemeComboBox = QComboBox(self.Toolbar)
473- self.ThemeComboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents)
474- self.ThemeWidget = QWidgetAction(self.Toolbar)
475+ self.ThemeComboBox = QtGui.QComboBox(self.Toolbar)
476+ self.ThemeComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
477+ self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar)
478 self.ThemeWidget.setDefaultWidget(self.ThemeComboBox)
479 self.Toolbar.addAction(self.ThemeWidget)
480-
481 self.Layout.addWidget(self.Toolbar)
482
483- self.TreeView = QTreeView(self)
484- self.service_data=ServiceData()
485- self.TreeView.setModel(self.service_data)
486- self.TreeView.setAlternatingRowColors(True)
487- self.Layout.addWidget(self.TreeView)
488-
489- QObject.connect(self.ThemeComboBox,
490- SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
491+ self.serviceManagerList = QtGui.QTreeWidget(self)
492+ self.serviceManagerList.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged|QtGui.QAbstractItemView.DoubleClicked|QtGui.QAbstractItemView.EditKeyPressed)
493+ self.serviceManagerList.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
494+ self.serviceManagerList.setAlternatingRowColors(True)
495+ self.serviceManagerList.setObjectName("serviceManagerList")
496+ self.serviceManagerList .__class__.dragEnterEvent=self.dragEnterEvent
497+ self.serviceManagerList .__class__.dragMoveEvent=self.dragEnterEvent
498+ self.serviceManagerList .__class__.dropEvent =self.dropEvent
499+
500+ self.Layout.addWidget(self.serviceManagerList)
501+
502+ QtCore.QObject.connect(self.ThemeComboBox,
503+ QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected)
504
505 def onServiceTop(self):
506 pass
507@@ -191,40 +191,36 @@
508 def onLoadService(self):
509 Pass
510
511-
512-
513-
514 def onThemeComboBoxSelected(self, currentIndex):
515 self.renderManager.default_theme = self.ThemeComboBox.currentText()
516
517 def addServiceItem(self, item):
518- """Adds service item"""
519- log.info("addServiceItem")
520- indexes=self.TreeView.selectedIndexes()
521- assert len(indexes) <= 1 # can only have one selected index in this view
522- if indexes == []:
523- log.info("No row")
524- row = None
525- selected_item = None
526- else:
527- row=indexes[0].row()
528- # if currently selected is of correct type, add it to it
529- log.info("row:%d"%row)
530- selected_item=self.service_data.item(row)
531-
532- if type(selected_item) == type(item):
533- log.info("Add to existing item")
534- selected_item.add(item)
535- else:
536- log.info("Create new item")
537- if row is None:
538- self.service_data.addRow(item)
539- else:
540- self.service_data.insertRow(row+1, item)
541-
542- def removeServiceItem(self):
543- """Remove currently selected item"""
544- pass
545+ treewidgetitem = QtGui.QTreeWidgetItem(self.serviceManagerList)
546+ treewidgetitem.setText(0,item.title + u':' + item.shortname)
547+ treewidgetitem.setIcon(0,item.iconic_representation)
548+ treewidgetitem.setExpanded(True)
549+ item.render()
550+ for frame in item.frames:
551+ treewidgetitem1 = QtGui.QTreeWidgetItem(treewidgetitem)
552+ text = frame[u'formatted'][0]
553+ treewidgetitem1.setText(0,text[:10])
554+ #treewidgetitem1.setIcon(0,frame[u'image'])
555+
556+ def dragEnterEvent(self, event):
557+ """
558+ Accept Drag events
559+ """
560+ event.accept()
561+
562+ def dropEvent(self, event):
563+ """
564+ Handle the release of the event and trigger the plugin
565+ to add the data
566+ """
567+ link=event.mimeData()
568+ if link.hasText():
569+ plugin = event.mimeData().text()
570+ self.eventManager.post_event(Event(EventType.LoadServiceItem, plugin))
571
572 def oos_as_text(self):
573 text=[]
574@@ -247,6 +243,9 @@
575 oosfile.close()
576
577 def updateThemeList(self, theme_list):
578+ """
579+ Called from ThemeManager when the Themes have changed
580+ """
581 self.ThemeComboBox.clear()
582 for theme in theme_list:
583 self.ThemeComboBox.addItem(theme)
584
585=== modified file 'openlp/core/ui/slidecontroller.py'
586--- openlp/core/ui/slidecontroller.py 2009-05-04 13:48:12 +0000
587+++ openlp/core/ui/slidecontroller.py 2009-05-11 05:09:43 +0000
588@@ -20,13 +20,12 @@
589 import logging
590 import os
591
592-from PyQt4.QtCore import *
593-from PyQt4.QtGui import *
594+from PyQt4 import QtCore, QtGui
595
596 from openlp.core.lib import OpenLPToolbar
597 from openlp.core import translate
598
599-class SlideData(QAbstractListModel):
600+class SlideData(QtCore.QAbstractListModel):
601 """
602 Tree of items for an order of Theme.
603 Includes methods for reading and writing the contents to an OOS file
604@@ -36,13 +35,13 @@
605 log=logging.getLogger(u'SlideData')
606
607 def __init__(self):
608- QAbstractListModel.__init__(self)
609+ QtCore.QAbstractListModel.__init__(self)
610 self.items=[]
611 self.rowheight=50
612 self.maximagewidth=self.rowheight*16/9.0;
613 log.info(u'Starting')
614
615- def clearItems(self):
616+ def clear(self):
617 self.items=[]
618
619 def columnCount(self, parent):
620@@ -51,36 +50,36 @@
621 def rowCount(self, parent=None):
622 return len(self.items)
623
624- def insertRow(self, row, frame):
625- self.beginInsertRows(QModelIndex(),row,row)
626+ def insertRow(self, row, frame, framenumber):
627+ self.beginInsertRows(QtCore.QModelIndex(),row,row)
628 log.info(u'insert row %d' % row)
629 # create a preview image
630- frame1 = frame.scaled(QSize(350,260))
631- self.items.insert(row,(frame1))
632+ frame1 = frame.scaled(QtCore.QSize(350,260), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
633+ self.items.insert(row,(frame1, framenumber))
634 log.info(u'Items: %s' % self.items)
635 self.endInsertRows()
636
637 def removeRow(self, row):
638- self.beginRemoveRows(QModelIndex(), row,row)
639+ self.beginRemoveRows(QtCore.QModelIndex(), row,row)
640 self.items.pop(row)
641 self.endRemoveRows()
642
643- def addRow(self, frame):
644- self.insertRow(len(self.items), frame)
645+ def addRow(self, frame, framenumber):
646+ self.insertRow(len(self.items), frame, framenumber)
647
648 def data(self, index, role):
649 row=index.row()
650 if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row!
651- return QVariant()
652+ return QtCore.QVariant()
653 # if role==Qt.DisplayRole:
654 # retval= self.items[row][1]
655- if role == Qt.DecorationRole:
656- retval= self.items[row]#[0]
657+ if role == QtCore.Qt.DecorationRole:
658+ retval= self.items[row][0]
659 else:
660- retval= QVariant()
661+ retval= QtCore.QVariant()
662 # log.info("Returning"+ str(retval))
663- if type(retval) is not type(QVariant):
664- return QVariant(retval)
665+ if type(retval) is not type(QtCore.QVariant):
666+ return QtCore.QVariant(retval)
667 else:
668 return retval
669
670@@ -101,75 +100,84 @@
671 return filelist
672
673
674-class SlideController(QWidget):
675+class SlideController(QtGui.QWidget):
676 global log
677 log=logging.getLogger(u'SlideController')
678
679 def __init__(self, control_splitter, isLive):
680- QWidget.__init__(self)
681+ QtGui.QWidget.__init__(self)
682 self.isLive = isLive
683- self.Panel = QWidget(control_splitter)
684- self.Splitter = QSplitter(self.Panel)
685- self.Splitter.setOrientation(Qt.Vertical)
686+ self.Panel = QtGui.QWidget(control_splitter)
687+ self.Splitter = QtGui.QSplitter(self.Panel)
688+ self.Splitter.setOrientation(QtCore.Qt.Vertical)
689
690- self.PanelLayout = QVBoxLayout(self.Panel)
691+ self.PanelLayout = QtGui.QVBoxLayout(self.Panel)
692 self.PanelLayout.addWidget(self.Splitter)
693 self.PanelLayout.setSpacing(50)
694 self.PanelLayout.setMargin(0)
695
696- self.Controller = QScrollArea(self.Splitter)
697+ self.Controller = QtGui.QScrollArea(self.Splitter)
698 self.Controller.setWidgetResizable(True)
699
700- self.PreviewListView = QListView(self.Splitter)
701+ self.PreviewListView = QtGui.QListView(self.Splitter)
702+ self.PreviewListView.setEditTriggers(QtGui.QAbstractItemView.CurrentChanged)
703 self.PreviewListView.setAlternatingRowColors(True)
704 self.PreviewListData = SlideData()
705 self.PreviewListView.setModel(self.PreviewListData)
706+ self.PreviewListView.setSelectionRectVisible(True)
707
708- self.Controller.setGeometry(QRect(0, 0, 828, 536))
709+ self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536))
710 self.Controller.setWidget(self.PreviewListView)
711
712 self.Toolbar = OpenLPToolbar(self.Splitter)
713- sizeToolbarPolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
714+ sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
715 sizeToolbarPolicy.setHorizontalStretch(0)
716 sizeToolbarPolicy.setVerticalStretch(0)
717 sizeToolbarPolicy.setHeightForWidth(self.Toolbar.sizePolicy().hasHeightForWidth())
718
719 if self.isLive:
720- self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_first.png",
721+ self.Toolbar.addToolbarButton(u'First Slide', u':/slides/slide_first.png',
722 translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst)
723- self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_previous.png",
724+ self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_previous.png',
725 translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious)
726- self.Toolbar.addToolbarButton("First Slide", ":/slides/slide_next.png",
727+ self.Toolbar.addToolbarButton(u'First Slide', u':/slides/slide_next.png',
728 translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext)
729 if self.isLive:
730- self.Toolbar.addToolbarButton("Last Slide", ":/slides/slide_last.png",
731+ self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_last.png',
732 translate(u'SlideController', u'Move to last'), self.onSlideSelectedLast)
733 self.Toolbar.addSeparator()
734- self.Toolbar.addToolbarButton("Close Sscreen", ":/slides/slide_close.png",
735+ self.Toolbar.addToolbarButton(u'Close Screen', u':/slides/slide_close.png',
736 translate(u'SlideController', u'Close Screen'), self.onBlankScreen)
737
738 self.Toolbar.setSizePolicy(sizeToolbarPolicy)
739
740- self.SlidePreview = QLabel(self.Splitter)
741- sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
742+ self.SlidePreview = QtGui.QLabel(self.Splitter)
743+ sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
744 sizePolicy.setHorizontalStretch(0)
745 sizePolicy.setVerticalStretch(0)
746 sizePolicy.setHeightForWidth(self.SlidePreview.sizePolicy().hasHeightForWidth())
747 self.SlidePreview.setSizePolicy(sizePolicy)
748- self.SlidePreview.setMinimumSize(QSize(250, 190))
749- self.SlidePreview.setFrameShape(QFrame.WinPanel)
750- self.SlidePreview.setFrameShadow(QFrame.Sunken)
751+ self.SlidePreview.setMinimumSize(QtCore.QSize(250, 190))
752+ self.SlidePreview.setFrameShape(QtGui.QFrame.WinPanel)
753+ self.SlidePreview.setFrameShadow(QtGui.QFrame.Sunken)
754 self.SlidePreview.setLineWidth(1)
755 self.SlidePreview.setScaledContents(True)
756- self.SlidePreview.setObjectName("SlidePreview")
757-
758- QObject.connect(self.PreviewListView,
759- SIGNAL("clicked(QModelIndex)"), self.onSlideSelected)
760+ self.SlidePreview.setObjectName(u'SlidePreview')
761+
762+ QtCore.QObject.connect(self.PreviewListView,
763+ QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
764+ QtCore.QObject.connect(self.PreviewListView,
765+ QtCore.SIGNAL(u'clicked(QListViewItem)'), self.onCurrentItemChanged)
766+
767+
768+
769+ def onCurrentItemChanged(self, current, previous):
770+ print u'Method slideControllerList currentItemChanged called', current, previous
771
772 def onSlideSelectedFirst(self):
773 row = self.PreviewListData.createIndex(0, 0)
774 if row.isValid():
775- self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
776+ self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
777 self.onSlideSelected(row)
778
779 def onSlideSelectedNext(self):
780@@ -182,10 +190,9 @@
781 rowNumber = index.row() + 1
782 row = self.PreviewListData.createIndex(rowNumber , 0)
783 if row.isValid():
784- self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
785+ self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
786 self.onSlideSelected(row)
787
788-
789 def onSlideSelectedPrevious(self):
790 indexes = self.PreviewListView.selectedIndexes()
791 rowNumber = 0
792@@ -196,13 +203,13 @@
793 rowNumber = index.row() - 1
794 row = self.PreviewListData.createIndex(rowNumber , 0)
795 if row.isValid():
796- self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
797+ self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
798 self.onSlideSelected(row)
799
800 def onSlideSelectedLast(self):
801 row = self.PreviewListData.createIndex(self.PreviewListData.rowCount() - 1 , 0)
802 if row.isValid():
803- self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
804+ self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
805 self.onSlideSelected(row)
806
807 def onBlankScreen(self):
808@@ -213,21 +220,25 @@
809 self.previewFrame(frame)
810
811 def previewFrame(self, frame):
812- self.SlidePreview.setPixmap(frame)
813+ self.SlidePreview.setPixmap(frame[0])
814 if self.isLive:
815- self.mainDisplay.frameView(frame)
816+ no = frame[1]
817+ LiveFrame = self.serviceitem.frames[no][u'image']
818+ self.mainDisplay.frameView(LiveFrame)
819
820 def addServiceItem(self, serviceitem):
821 log.debug(u'addServiceItem')
822 self.serviceitem = serviceitem
823 self.serviceitem.render()
824- self.PreviewListData.clearItems()
825+ self.PreviewListData.clear()
826+ framenumber = 0
827 for frame in self.serviceitem.frames:
828- self.PreviewListData.addRow(frame)
829+ self.PreviewListData.addRow(frame[u'image'], framenumber)
830+ framenumber += 1
831
832 row = self.PreviewListData.createIndex(0, 0)
833 if row.isValid():
834- self.PreviewListView.selectionModel().setCurrentIndex(row, QItemSelectionModel.SelectCurrent)
835+ self.PreviewListView.selectionModel().setCurrentIndex(row, QtGui.QItemSelectionModel.SelectCurrent)
836 self.onSlideSelected(row)
837
838 def render(self):
839
840=== modified file 'openlp/core/ui/test/test_service_manager.py'
841--- openlp/core/ui/test/test_service_manager.py 2009-03-04 21:57:18 +0000
842+++ openlp/core/ui/test/test_service_manager.py 2009-05-09 07:01:33 +0000
843@@ -25,7 +25,7 @@
844 mypath=os.path.split(os.path.abspath(__file__))[0]
845 sys.path.insert(0,(os.path.join(mypath, '..','..', '..','..')))
846 from openlp.core.ui import ServiceManager
847-from openlp.plugins.images import ImageServiceItem
848+from openlp.plugins.images.lib import ImageServiceItem
849
850 import logging
851 logging.basicConfig(filename="test_service_manager.log",level=logging.INFO, filemode="w")
852@@ -47,7 +47,7 @@
853 app = QtGui.QApplication([])
854 except UnboundLocalError:
855 app = QtGui.QApplication([])
856-
857+
858
859 def teardown_class(self):
860 pass
861@@ -84,7 +84,7 @@
862 assert lines[0].startswith("# <openlp.plugins.images.imageserviceitem.ImageServiceItem object")
863 assert lines[1] == "test.gif"
864 log.info("done")
865-
866+
867 def test_2items_as_separate_items(self):
868 # If nothing is selected when item is added, a new base service item is added
869 log.info("test_2items_as_separate_items")
870@@ -105,7 +105,7 @@
871 assert lines[3] == "test2.gif"
872 assert lines[4] == "test3.gif"
873 log.info("done")
874-
875+
876 def test_2items_merged(self):
877 # If the first object is selected when item is added it should be extended
878 log.info("test_2items_merged")
879@@ -134,7 +134,7 @@
880 # move to top, bottom
881 # new and save as
882 # deleting items
883-
884+
885 if __name__=="__main__":
886
887 t=TestServiceManager_base()
888
889=== modified file 'openlp/core/ui/thememanager.py'
890--- openlp/core/ui/thememanager.py 2009-05-04 08:15:48 +0000
891+++ openlp/core/ui/thememanager.py 2009-05-11 05:09:43 +0000
892@@ -72,7 +72,7 @@
893 preview = QPixmap(str(filename))
894 width = self.maximagewidth
895 height = self.rowheight
896- preview = preview.scaled(width, height, Qt.KeepAspectRatio)
897+ preview = preview.scaled(width, height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
898 realwidth = preview.width()
899 realheight = preview.height()
900 # and move it to the centre of the preview space
901
902=== modified file 'openlp/plugins/custom/customplugin.py'
903--- openlp/plugins/custom/customplugin.py 2009-04-10 06:06:41 +0000
904+++ openlp/plugins/custom/customplugin.py 2009-05-09 07:01:33 +0000
905@@ -60,3 +60,6 @@
906 if event.event_type == EventType.ThemeListChanged:
907 log.debug(u'New Theme request received')
908 self.edit_custom_form.loadThemes(self.theme_manager.getThemes())
909+ if event.event_type == EventType.LoadServiceItem and event.payload == 'Custom':
910+ log.debug(u'Load Service Item received')
911+ self.media_item.onCustomAddClick()
912
913=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
914--- openlp/plugins/custom/lib/mediaitem.py 2009-05-04 13:48:12 +0000
915+++ openlp/plugins/custom/lib/mediaitem.py 2009-05-09 07:01:33 +0000
916@@ -109,6 +109,8 @@
917 self.CustomListView.setAlternatingRowColors(True)
918 self.CustomListData = TextListData()
919 self.CustomListView.setModel(self.CustomListData)
920+ self.CustomListView.setDragEnabled(True)
921+ self.CustomListView .__class__.mouseMoveEvent =self.onMouseMoveEvent
922
923 self.PageLayout.addWidget(self.CustomListView)
924
925@@ -233,3 +235,27 @@
926 service_item.title = title
927 service_item.raw_slides = raw_slides
928 service_item.raw_footer = raw_footer
929+
930+ def onMouseMoveEvent(self, event):
931+ """
932+ Drag and drop eventDo not care what data is selected
933+ as the recepient will use events to request the data move
934+ just tell it what plugin to call
935+ """
936+ if event.buttons() != QtCore.Qt.LeftButton:
937+ return
938+
939+ items = self.CustomListView.selectedIndexes()
940+ if items == []:
941+ return
942+
943+ drag = QtGui.QDrag(self)
944+ mimeData = QtCore.QMimeData()
945+ drag.setMimeData(mimeData)
946+ for item in items:
947+ mimeData.setText(u'Custom')
948+
949+ dropAction = drag.start(QtCore.Qt.CopyAction)
950+
951+ if dropAction == QtCore.Qt.CopyAction:
952+ self.close()
953
954=== modified file 'openlp/plugins/images/__init__.py'
955--- openlp/plugins/images/__init__.py 2009-03-07 09:21:27 +0000
956+++ openlp/plugins/images/__init__.py 2009-05-11 05:09:43 +0000
957@@ -18,6 +18,6 @@
958 Place, Suite 330, Boston, MA 02111-1307 USA
959 """
960
961-from imageplugin import ImagePlugin
962-from imageserviceitem import ImageServiceItem
963+#from imageplugin import ImagePlugin
964+#from imageserviceitem import ImageServiceItem
965
966
967=== modified file 'openlp/plugins/images/lib/imageserviceitem.py'
968--- openlp/plugins/images/lib/imageserviceitem.py 2009-03-17 05:05:04 +0000
969+++ openlp/plugins/images/lib/imageserviceitem.py 2009-05-09 07:01:33 +0000
970@@ -39,7 +39,7 @@
971 it simply tells the slide controller to use it???
972
973 It contains 1 or more images
974-
975+
976 """
977 global log
978 log=logging.getLogger("ImageServiceItem")
979@@ -56,7 +56,7 @@
980 # c.uniformItemSizes=True
981 # c.setModel(self.imgs)
982 # c.setGeometry(0,0,200,200)
983-
984+
985 def render(self):
986 """
987 The render method is what the plugin uses to render its meda to the
988@@ -64,7 +64,7 @@
989 """
990 # render the "image chooser first"
991 # for f in self.imgs:
992-# fl , nm = os.path.split(str(f))
993+# fl , nm = os.path.split(str(f))
994 # c = self.slide_controller.rowCount()
995 # self.slide_controller.setRowCount(c+1)
996 # twi = QtGui.QTableWidgetItem(str(f))
997@@ -72,7 +72,7 @@
998 # twi = QtGui.QTableWidgetItem(str(nm))
999 # self.slide_controller.setItem(c , 1, twi)
1000 # self.slide_controller.setRowHeight(c, 80)
1001-
1002+
1003 # render the preview screen here
1004
1005 def get_parent_node(self):
1006@@ -92,7 +92,7 @@
1007 log.info("add Item..."+str(data))
1008 for filename in data.get_file_list():
1009 self.add(filename)
1010-
1011+
1012
1013 def get_oos_text(self):
1014 """
1015@@ -100,7 +100,7 @@
1016 """
1017 log.info("Get oos text")
1018 log.info(str(self.imgs))
1019- log.info(str(self.imgs.get_file_list()))
1020+# log.info(str(self.imgs.get_file_list()))
1021 return '\n'.join(self.imgs.get_file_list())
1022
1023 def set_from_oos(self, text):
1024@@ -111,4 +111,4 @@
1025 files=text.split('\n')
1026 for f in files:
1027 self.imgs.addRow(f)
1028-
1029+
1030
1031=== modified file 'openlp/plugins/images/lib/listwithpreviews.py'
1032--- openlp/plugins/images/lib/listwithpreviews.py 2009-03-08 12:41:07 +0000
1033+++ openlp/plugins/images/lib/listwithpreviews.py 2009-05-11 05:09:43 +0000
1034@@ -29,7 +29,7 @@
1035 if os.path.exists(filename):
1036 preview = QPixmap(str(filename))
1037 w=self.maximagewidth;h=self.rowheight
1038- preview = preview.scaled(w,h, Qt.KeepAspectRatio)
1039+ preview = preview.scaled(w,h, Qt.KeepAspectRatio, Qt.SmoothTransformation)
1040 realw=preview.width(); realh=preview.height()
1041 # and move it to the centre of the preview space
1042 p=QPixmap(w,h)
1043
1044=== removed file 'resources/.openlp/data/bible/afr1953.sqlite'
1045Binary files resources/.openlp/data/bible/afr1953.sqlite 2009-05-01 16:29:36 +0000 and resources/.openlp/data/bible/afr1953.sqlite 1970-01-01 00:00:00 +0000 differ