Merge lp:~j-corwin/openlp/present into lp:openlp

Proposed by Jonathan Corwin
Status: Merged
Merged at revision: not available
Proposed branch: lp:~j-corwin/openlp/present
Merge into: lp:openlp
Diff against target: 302 lines
5 files modified
openlp/core/ui/slidecontroller.py (+31/-16)
openlp/plugins/presentations/lib/impresscontroller.py (+15/-8)
openlp/plugins/presentations/lib/messagelistener.py (+67/-9)
openlp/plugins/presentations/lib/powerpointcontroller.py (+7/-4)
openlp/plugins/presentations/lib/presentationcontroller.py (+9/-0)
To merge this branch: bzr merge lp:~j-corwin/openlp/present
Reviewer Review Type Date Requested Status
Raoul Snyman Approve
Tim Bentley Approve
Review via email: mp+12829@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Jonathan Corwin (j-corwin) wrote :

Add support for first/last/blank buttons for presentations. Plus fix a few issues.

Note, this has a hardcoded 96 DPI (the most common) for positioning the powerpoint. If anyone has any ideas on how to get the actual screen DPI, please let me know.

Revision history for this message
Tim Bentley (trb143) wrote :

Looks good and a big step forward.

review: Approve
Revision history for this message
Raoul Snyman (raoul-snyman) :
review: Approve
lp:~j-corwin/openlp/present updated
586. By Jonathan Corwin

Presentation updates

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py 2009-10-01 23:43:16 +0000
+++ openlp/core/ui/slidecontroller.py 2009-10-03 19:30:22 +0000
@@ -269,7 +269,7 @@
269 if item.service_item_type == ServiceType.Command:269 if item.service_item_type == ServiceType.Command:
270 Receiver().send_message(u'%s_start' % item.name.lower(), \270 Receiver().send_message(u'%s_start' % item.name.lower(), \
271 [item.shortname, item.service_item_path,271 [item.shortname, item.service_item_path,
272 item.service_frames[0][u'title']])272 item.service_frames[0][u'title'], slideno])
273 else:273 else:
274 self.displayServiceManagerItems(item, slideno)274 self.displayServiceManagerItems(item, slideno)
275275
@@ -321,14 +321,23 @@
321 """321 """
322 Go to the first slide.322 Go to the first slide.
323 """323 """
324 self.PreviewListWidget.selectRow(0)324 if self.commandItem.service_item_type == ServiceType.Command:
325 self.onSlideSelected()325 Receiver().send_message(u'%s_first'% self.commandItem.name.lower())
326 else:
327 self.PreviewListWidget.selectRow(0)
328 self.onSlideSelected()
326329
327 def onBlankScreen(self):330 def onBlankScreen(self, blanked):
328 """331 """
329 Blank the screen.332 Blank the screen.
330 """333 """
331 self.parent.mainDisplay.blankDisplay()334 if self.commandItem.service_item_type == ServiceType.Command:
335 if blanked:
336 Receiver().send_message(u'%s_blank'% self.commandItem.name.lower())
337 else:
338 Receiver().send_message(u'%s_unblank'% self.commandItem.name.lower())
339 else:
340 self.parent.mainDisplay.blankDisplay()
332341
333 def onSlideSelected(self):342 def onSlideSelected(self):
334 """343 """
@@ -337,15 +346,18 @@
337 """346 """
338 row = self.PreviewListWidget.currentRow()347 row = self.PreviewListWidget.currentRow()
339 if row > -1 and row < self.PreviewListWidget.rowCount():348 if row > -1 and row < self.PreviewListWidget.rowCount():
340 #label = self.PreviewListWidget.cellWidget(row, 0)349 if self.commandItem.service_item_type == ServiceType.Command:
341 frame = self.serviceitem.frames[row][u'image']350 Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row])
342 before = time.time()351 else:
343 if frame is None:352 #label = self.PreviewListWidget.cellWidget(row, 0)
344 frame = self.serviceitem.render_individual(row)353 frame = self.serviceitem.frames[row][u'image']
345 self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame))354 before = time.time()
346 log.info(u'Slide Rendering took %4s' % (time.time() - before))355 if frame is None:
347 if self.isLive:356 frame = self.serviceitem.render_individual(row)
348 self.parent.mainDisplay.frameView(frame)357 self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame))
358 log.info(u'Slide Rendering took %4s' % (time.time() - before))
359 if self.isLive:
360 self.parent.mainDisplay.frameView(frame)
349361
350 def onSlideSelectedNext(self):362 def onSlideSelectedNext(self):
351 """363 """
@@ -378,8 +390,11 @@
378 """390 """
379 Go to the last slide.391 Go to the last slide.
380 """392 """
381 self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1)393 if self.commandItem.service_item_type == ServiceType.Command:
382 self.onSlideSelected()394 Receiver().send_message(u'%s_last'% self.commandItem.name.lower())
395 else:
396 self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1)
397 self.onSlideSelected()
383398
384 def onStartLoop(self):399 def onStartLoop(self):
385 """400 """
386401
=== modified file 'openlp/plugins/presentations/lib/impresscontroller.py'
--- openlp/plugins/presentations/lib/impresscontroller.py 2009-09-30 19:37:45 +0000
+++ openlp/plugins/presentations/lib/impresscontroller.py 2009-10-03 19:30:22 +0000
@@ -118,6 +118,7 @@
118 self.document = desktop.loadComponentFromURL(118 self.document = desktop.loadComponentFromURL(
119 url, "_blank", 0, properties)119 url, "_blank", 0, properties)
120 self.presentation = self.document.getPresentation()120 self.presentation = self.document.getPresentation()
121 self.presentation.Display = self.plugin.render_manager.current_display + 1
121 self.presentation.start()122 self.presentation.start()
122 self.controller = \123 self.controller = \
123 desktop.getCurrentComponent().Presentation.getController()124 desktop.getCurrentComponent().Presentation.getController()
@@ -178,32 +179,38 @@
178 self.document = None179 self.document = None
179180
180 def is_loaded(self):181 def is_loaded(self):
181 return self.presentation is not None and self.document is not None182 return self.presentation is not None \
183 and self.document is not None \
184 and self.controller is not None
182185
183 def is_active(self):186 def is_active(self):
184 if not self.is_loaded():187 if not self.is_loaded():
185 return False188 return False
186 return self.presentation.isRunning() and self.presentation.isActive()189 return self.controller.isRunning() and self.controller.isActive()
187190
188 def unblank_screen(self):191 def unblank_screen(self):
189 return self.presentation.resume()192 return self.controller.resume()
190193
191 def blank_screen(self):194 def blank_screen(self):
192 self.presentation.blankScreen(0)195 self.controller.blankScreen(0)
193196
194 def stop_presentation(self):197 def stop_presentation(self):
195 self.presentation.deactivate()198 self.controller.deactivate()
196 # self.presdoc.end()199 # self.presdoc.end()
197200
198 def start_presentation(self):201 def start_presentation(self):
199 self.presentation.activate()202 self.controller.activate()
203 self.goto_slide(1)
200 # self.presdoc.start()204 # self.presdoc.start()
201205
202 def get_slide_number(self):206 def get_slide_number(self):
203 return self.presentation.getCurrentSlideIndex207 return self.controller.getCurrentSlideIndex()
208
209 def get_slide_count(self):
210 return self.controller.getSlideCount()
204211
205 def goto_slide(self, slideno):212 def goto_slide(self, slideno):
206 self.presentation.gotoSlideIndex(slideno)213 self.controller.gotoSlideIndex(slideno-1)
207214
208 def next_step(self):215 def next_step(self):
209 """216 """
210217
=== modified file 'openlp/plugins/presentations/lib/messagelistener.py'
--- openlp/plugins/presentations/lib/messagelistener.py 2009-09-28 20:45:04 +0000
+++ openlp/plugins/presentations/lib/messagelistener.py 2009-10-03 19:30:22 +0000
@@ -36,19 +36,25 @@
36 def __init__(self, controllers):36 def __init__(self, controllers):
37 self.controllers = controllers37 self.controllers = controllers
38 self.handler = None38 self.handler = None
3939 # messages are sent from core.ui.slidecontroller
40 QtCore.QObject.connect(Receiver.get_receiver(),40 QtCore.QObject.connect(Receiver.get_receiver(),
41 QtCore.SIGNAL(u'presentations_start'), self.startup)41 QtCore.SIGNAL(u'presentations_start'), self.startup)
42 QtCore.QObject.connect(Receiver.get_receiver(),42 QtCore.QObject.connect(Receiver.get_receiver(),
43 QtCore.SIGNAL(u'presentations_stop'), self.shutDown)43 QtCore.SIGNAL(u'presentations_stop'), self.shutdown)
44 QtCore.QObject.connect(Receiver.get_receiver(),44 QtCore.QObject.connect(Receiver.get_receiver(),
45 QtCore.SIGNAL(u'presentations_first'), self.next)45 QtCore.SIGNAL(u'presentations_first'), self.first)
46 QtCore.QObject.connect(Receiver.get_receiver(),46 QtCore.QObject.connect(Receiver.get_receiver(),
47 QtCore.SIGNAL(u'presentations_previous'), self.previous)47 QtCore.SIGNAL(u'presentations_previous'), self.previous)
48 QtCore.QObject.connect(Receiver.get_receiver(),48 QtCore.QObject.connect(Receiver.get_receiver(),
49 QtCore.SIGNAL(u'presentations_next'), self.next)49 QtCore.SIGNAL(u'presentations_next'), self.next)
50 QtCore.QObject.connect(Receiver.get_receiver(),50 QtCore.QObject.connect(Receiver.get_receiver(),
51 QtCore.SIGNAL(u'presentations_last'), self.next)51 QtCore.SIGNAL(u'presentations_last'), self.last)
52 QtCore.QObject.connect(Receiver.get_receiver(),
53 QtCore.SIGNAL(u'presentations_slide'), self.slide)
54 QtCore.QObject.connect(Receiver.get_receiver(),
55 QtCore.SIGNAL(u'presentations_blank'), self.blank)
56 QtCore.QObject.connect(Receiver.get_receiver(),
57 QtCore.SIGNAL(u'presentations_unblank'), self.unblank)
5258
53 def startup(self, message):59 def startup(self, message):
54 """60 """
@@ -56,25 +62,77 @@
56 Save the handler as any new presentations start here62 Save the handler as any new presentations start here
57 """63 """
58 self.handler, file = self.decodeMessage(message)64 self.handler, file = self.decodeMessage(message)
59 self.controllers[self.handler].load_presentation(file)65 self.controller = self.controllers[self.handler]
66 if self.controller.is_loaded():
67 self.shutdown()
68 self.controller.load_presentation(file)
69
70 def slide(self, message):
71 #if not self.controller.is_loaded():
72 # return
73 #if not self.controller.is_active():
74 # self.controller.start_presentation()
75 self.controller.goto_slide(message[0])
76
77 def first(self, message):
78 """
79 Based on the handler passed at startup triggers the first slide
80 """
81 #if not self.controller.is_loaded():
82 # return
83 self.controller.start_presentation()
84
85 def last(self, message):
86 """
87 Based on the handler passed at startup triggers the first slide
88 """
89 #if not self.controller.is_loaded():
90 # return
91 #if not self.controller.is_active():
92 # self.controller.start_presentation()
93 self.controller.goto_slide(self.controller.get_slide_count())
6094
61 def next(self, message):95 def next(self, message):
62 """96 """
63 Based on the handler passed at startup triggers the next slide event97 Based on the handler passed at startup triggers the next slide event
64 """98 """
65 self.controllers[self.handler].next_step()99 #if not self.controller.is_loaded():
100 # return
101 #if not self.controller.is_active():
102 # self.controller.start_presentation()
103 # self.controller.goto_slide(self.controller.current_slide)
104 self.controller.next_step()
66105
67 def previous(self, message):106 def previous(self, message):
68 """107 """
69 Based on the handler passed at startup triggers the previous slide event108 Based on the handler passed at startup triggers the previous slide event
70 """109 """
71 self.controllers[self.handler].previous_step()110 #if not self.controller.is_loaded():
111 # return
112 #if not self.controller.is_active():
113 # self.controller.start_presentation()
114 # self.controller.goto_slide(self.controller.current_slide)
115 self.controller.previous_step()
72116
73 def shutDown(self, message):117 def shutdown(self, message):
74 """118 """
75 Based on the handler passed at startup triggers slide show to shut down119 Based on the handler passed at startup triggers slide show to shut down
76 """120 """
77 self.controllers[self.handler].close_presentation()121 self.controller.close_presentation()
122
123 def blank(self):
124 #if not self.controller.is_loaded():
125 # return
126 #if not self.controller.is_active():
127 # self.controller.start_presentation()
128 self.controller.blank_screen()
129
130 def unblank(self):
131 #if not self.controller.is_loaded():
132 # return
133 #if not self.controller.is_active():
134 # self.controller.start_presentation()
135 self.controller.unblank_screen()
78136
79 def decodeMessage(self, message):137 def decodeMessage(self, message):
80 """138 """
81139
=== modified file 'openlp/plugins/presentations/lib/powerpointcontroller.py'
--- openlp/plugins/presentations/lib/powerpointcontroller.py 2009-09-30 19:26:51 +0000
+++ openlp/plugins/presentations/lib/powerpointcontroller.py 2009-10-03 19:30:22 +0000
@@ -153,12 +153,15 @@
153 Starts a presentation from the beginning153 Starts a presentation from the beginning
154 """ 154 """
155 self.presentation.SlideShowSettings.Run()155 self.presentation.SlideShowSettings.Run()
156 self.presentation.SlideShowWindow.View.GotoSlide(1)
156 rendermanager = self.plugin.render_manager157 rendermanager = self.plugin.render_manager
157 rect = rendermanager.screen_list[rendermanager.current_display][u'size']158 rect = rendermanager.screen_list[rendermanager.current_display][u'size']
158 self.presentation.SlideShowWindow.Top = rect.y() 159 dpi = 96 # This assumption is good some of the time, but not
159 self.presentation.SlideShowWindow.Height = rect.height() 160 # all, but I don't know how to get the screen DPI yet
160 self.presentation.SlideShowWindow.Left = rect.x() 161 self.presentation.SlideShowWindow.Top = rect.y() * 72 / dpi
161 self.presentation.SlideShowWindow.Width = rect.width() 162 self.presentation.SlideShowWindow.Height = rect.height() * 72 / dpi
163 self.presentation.SlideShowWindow.Left = rect.x() * 72 / dpi
164 self.presentation.SlideShowWindow.Width = rect.width() * 72 / dpi
162165
163 def get_slide_number(self):166 def get_slide_number(self):
164 """167 """
165168
=== modified file 'openlp/plugins/presentations/lib/presentationcontroller.py'
--- openlp/plugins/presentations/lib/presentationcontroller.py 2009-09-30 19:26:51 +0000
+++ openlp/plugins/presentations/lib/presentationcontroller.py 2009-10-03 19:30:22 +0000
@@ -29,6 +29,15 @@
29 It creates the runtime environment, loads and closes the presentation as29 It creates the runtime environment, loads and closes the presentation as
30 well as triggering the correct activities based on the users input30 well as triggering the correct activities based on the users input
3131
32 To create a new controller, take a copy of this file and name it
33 so it ends in controller.py, i.e. foobarcontroller.py
34 Make sure it inhetits PresentationController
35 Then fill in the blanks. If possible try and make sure it loads
36 on all platforms, using for example os.name checks, although
37 __init__ and check_available should always work.
38 See impresscontroller, powerpointcontroller or pptviewcontroller
39 for examples.
40
32 **Basic Attributes**41 **Basic Attributes**
3342
34 ``name``43 ``name``