Status: | Merged |
---|---|
Approved by: | Raoul Snyman |
Approved revision: | no longer in the revision history of the source branch. |
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michael Gorven (community) | Approve | ||
Raoul Snyman | Approve | ||
Review via email:
|
Commit message
Description of the change
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Tim Bentley (trb143) wrote : | # |
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Raoul Snyman (raoul-snyman) wrote : | # |
Just a note about making some things a little more Pythonic:
28 frame = QtGui.QPixmap(
29 self.renderer.
Could be written so:
28 self.renderer.
The usual style police ;-)
39 answer=
You don't really need BOTH of these? Surely just one can be used? And I prefer the top one, as it adds less pollution to the local namespace (I've noticed this in other code too).
64 from PyQt4 import QtCore, QtGui
65 from PyQt4.QtCore import *
66 from PyQt4.QtGui import *
- 439. By Raoul Snyman
-
Added images
- 440. By Raoul Snyman
-
Merged Jonathan Corwin's changes to the database migration script.
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Michael Gorven (mgorven) wrote : | # |
+ if type(icon) is QtGui.QIcon:
+ elif type(icon) is types.StringType or type(icon) is
types.UnicodeType:
I think the Right Way is isinstance(). Also, "basestring" matches both str and
unicode strings.
if isinstance(icon, QtGui.QIcon):
elif isinstance(icon, basestring):
review approve
- 441. By Tim Bentley
-
Start adding serviceitem code and SlideController code.
Fix some Theme bugs as well
Preview Diff
1 | === modified file 'openlp/core/lib/plugin.py' | |||
2 | --- openlp/core/lib/plugin.py 2009-04-25 06:11:15 +0000 | |||
3 | +++ openlp/core/lib/plugin.py 2009-05-02 18:56:27 +0000 | |||
4 | @@ -93,6 +93,7 @@ | |||
5 | 93 | self.theme_manager=plugin_helpers[u'theme'] | 93 | self.theme_manager=plugin_helpers[u'theme'] |
6 | 94 | self.event_manager=plugin_helpers[u'event'] | 94 | self.event_manager=plugin_helpers[u'event'] |
7 | 95 | self.render_manager=plugin_helpers[u'render'] | 95 | self.render_manager=plugin_helpers[u'render'] |
8 | 96 | self.service_manager=plugin_helpers[u'service'] | ||
9 | 96 | 97 | ||
10 | 97 | def check_pre_conditions(self): | 98 | def check_pre_conditions(self): |
11 | 98 | """ | 99 | """ |
12 | 99 | 100 | ||
13 | === modified file 'openlp/core/lib/rendermanager.py' | |||
14 | --- openlp/core/lib/rendermanager.py 2009-05-01 17:36:51 +0000 | |||
15 | +++ openlp/core/lib/rendermanager.py 2009-05-02 11:16:08 +0000 | |||
16 | @@ -76,7 +76,6 @@ | |||
17 | 76 | def generate_preview(self, themedata): | 76 | def generate_preview(self, themedata): |
18 | 77 | self.calculate_default(QtCore.QSize(800,600)) | 77 | self.calculate_default(QtCore.QSize(800,600)) |
19 | 78 | self.renderer.set_theme(themedata) | 78 | self.renderer.set_theme(themedata) |
20 | 79 | |||
21 | 80 | self.build_text_rectangle(themedata) | 79 | self.build_text_rectangle(themedata) |
22 | 81 | 80 | ||
23 | 82 | frame = QtGui.QPixmap(self.width, self.height) | 81 | frame = QtGui.QPixmap(self.width, self.height) |
24 | @@ -96,14 +95,19 @@ | |||
25 | 96 | 95 | ||
26 | 97 | def format_slide(self, words, footer): | 96 | def format_slide(self, words, footer): |
27 | 98 | self.calculate_default(QtCore.QSize(800,600)) | 97 | self.calculate_default(QtCore.QSize(800,600)) |
28 | 98 | frame = QtGui.QPixmap(self.width, self.height) | ||
29 | 99 | self.renderer.set_paint_dest(frame) | ||
30 | 99 | return self.renderer.format_slide(words, footer) | 100 | return self.renderer.format_slide(words, footer) |
31 | 100 | 101 | ||
32 | 101 | def generate_slide(self,main_text, footer_text, preview=True): | 102 | def generate_slide(self,main_text, footer_text, preview=True): |
33 | 102 | if preview == True: | 103 | if preview == True: |
34 | 103 | self.calculate_default(QtCore.QSize(800,600)) | 104 | self.calculate_default(QtCore.QSize(800,600)) |
35 | 104 | 105 | ||
36 | 106 | frame = QtGui.QPixmap(self.width, self.height) | ||
37 | 107 | self.renderer.set_paint_dest(frame) | ||
38 | 108 | |||
39 | 105 | answer=self.renderer.render_lines(main_text, footer_text) | 109 | answer=self.renderer.render_lines(main_text, footer_text) |
41 | 106 | return self.frame | 110 | return frame |
42 | 107 | 111 | ||
43 | 108 | def calculate_default(self, screen): | 112 | def calculate_default(self, screen): |
44 | 109 | self.width = screen.width() | 113 | self.width = screen.width() |
45 | 110 | 114 | ||
46 | === modified file 'openlp/core/lib/serviceitem.py' | |||
47 | --- openlp/core/lib/serviceitem.py 2009-03-04 21:54:00 +0000 | |||
48 | +++ openlp/core/lib/serviceitem.py 2009-05-02 18:56:27 +0000 | |||
49 | @@ -3,7 +3,7 @@ | |||
50 | 3 | """ | 3 | """ |
51 | 4 | OpenLP - Open Source Lyrics Projection | 4 | OpenLP - Open Source Lyrics Projection |
52 | 5 | Copyright (c) 2008 Raoul Snyman | 5 | Copyright (c) 2008 Raoul Snyman |
54 | 6 | Portions copyright (c) 2008 Martin Thompson, Tim Bentley | 6 | Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley |
55 | 7 | 7 | ||
56 | 8 | This program is free software; you can redistribute it and/or modify it under | 8 | This program is free software; you can redistribute it and/or modify it under |
57 | 9 | the terms of the GNU General Public License as published by the Free Software | 9 | the terms of the GNU General Public License as published by the Free Software |
58 | @@ -17,31 +17,68 @@ | |||
59 | 17 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple | 17 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple |
60 | 18 | Place, Suite 330, Boston, MA 02111-1307 USA | 18 | Place, Suite 330, Boston, MA 02111-1307 USA |
61 | 19 | """ | 19 | """ |
62 | 20 | import logging | ||
63 | 21 | import types | ||
64 | 22 | from PyQt4 import QtCore, QtGui | ||
65 | 20 | from PyQt4.QtCore import * | 23 | from PyQt4.QtCore import * |
66 | 21 | from PyQt4.QtGui import * | 24 | from PyQt4.QtGui import * |
67 | 22 | 25 | ||
69 | 23 | class ServiceItem(QAbstractItemModel): | 26 | class ServiceItem(): |
70 | 24 | """ | 27 | """ |
71 | 25 | The service item is a base class for the plugins to use to interact with | 28 | The service item is a base class for the plugins to use to interact with |
72 | 26 | the service manager, the slide controller, and the projection screen | 29 | the service manager, the slide controller, and the projection screen |
73 | 27 | compositor. | 30 | compositor. |
74 | 28 | """ | 31 | """ |
75 | 32 | global log | ||
76 | 33 | log=logging.getLogger(u'ServiceItem') | ||
77 | 34 | log.info(u'Service Item created') | ||
78 | 29 | 35 | ||
79 | 30 | def __init__(self, hostplugin): | 36 | def __init__(self, hostplugin): |
80 | 31 | """ | 37 | """ |
81 | 32 | Init Method | 38 | Init Method |
82 | 33 | """ | 39 | """ |
88 | 34 | self.plugin=hostplugin | 40 | self.plugin = hostplugin |
89 | 35 | self.shortname=hostplugin.name | 41 | self.shortname = hostplugin.name |
90 | 36 | self.items=[] | 42 | self.title = u'' |
91 | 37 | self.iconic_representation=None | 43 | self.items = [] |
92 | 38 | 44 | self.iconic_representation = None | |
93 | 45 | self.raw_slides = None | ||
94 | 46 | self.format_slides = [] | ||
95 | 47 | self.frames = [] | ||
96 | 48 | self.raw_footer = None | ||
97 | 49 | self.theme = None | ||
98 | 50 | log.debug(u'Service item created for %s', self.shortname) | ||
99 | 51 | |||
100 | 52 | def addIcon(self, icon): | ||
101 | 53 | ButtonIcon = None | ||
102 | 54 | if type(icon) is QtGui.QIcon: | ||
103 | 55 | ButtonIcon = icon | ||
104 | 56 | elif type(icon) is types.StringType or type(icon) is types.UnicodeType: | ||
105 | 57 | ButtonIcon = QtGui.QIcon() | ||
106 | 58 | if icon.startswith(u':/'): | ||
107 | 59 | ButtonIcon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, | ||
108 | 60 | QtGui.QIcon.Off) | ||
109 | 61 | else: | ||
110 | 62 | ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), | ||
111 | 63 | QtGui.QIcon.Normal, QtGui.QIcon.Off) | ||
112 | 64 | self.iconic_representation = ButtonIcon | ||
113 | 65 | |||
114 | 39 | def render(self): | 66 | def render(self): |
115 | 40 | """ | 67 | """ |
116 | 41 | The render method is what the plugin uses to render it's meda to the | 68 | The render method is what the plugin uses to render it's meda to the |
117 | 42 | screen. | 69 | screen. |
118 | 43 | """ | 70 | """ |
120 | 44 | pass | 71 | log.debug(u'Render called') |
121 | 72 | if self.theme == None: | ||
122 | 73 | self.render_manager.set_override_theme(None) | ||
123 | 74 | else: | ||
124 | 75 | self.render_manager.set_override_theme(self.theme) | ||
125 | 76 | |||
126 | 77 | for slide in self.raw_slides: | ||
127 | 78 | self.format_slides.append(self.render_manager.format_slide(slide, False)) | ||
128 | 79 | for slide in self.format_slides: | ||
129 | 80 | |||
130 | 81 | self.frames.append(self.render_manager.generate_slide(slide, self.raw_footer, False)) | ||
131 | 45 | 82 | ||
132 | 46 | def get_parent_node(self): | 83 | def get_parent_node(self): |
133 | 47 | """ | 84 | """ |
134 | @@ -64,7 +101,7 @@ | |||
135 | 64 | """ | 101 | """ |
136 | 65 | pass | 102 | pass |
137 | 66 | 103 | ||
139 | 67 | def set_from_plugin(self, data): | 104 | def set_from_plugin(self): |
140 | 68 | """ | 105 | """ |
141 | 69 | Takes data from the plugin media chooser | 106 | Takes data from the plugin media chooser |
142 | 70 | """ | 107 | """ |
143 | 71 | 108 | ||
144 | === modified file 'openlp/core/ui/maindisplay.py' | |||
145 | --- openlp/core/ui/maindisplay.py 2009-05-01 11:50:09 +0000 | |||
146 | +++ openlp/core/ui/maindisplay.py 2009-05-03 07:20:15 +0000 | |||
147 | @@ -45,14 +45,14 @@ | |||
148 | 45 | screen = scrn | 45 | screen = scrn |
149 | 46 | break | 46 | break |
150 | 47 | self.setGeometry(screen['size']) | 47 | self.setGeometry(screen['size']) |
151 | 48 | self.display.setGeometry(screen['size']) | ||
152 | 48 | if not screen['primary']: | 49 | if not screen['primary']: |
153 | 49 | self.showFullScreen() | 50 | self.showFullScreen() |
154 | 50 | else: | 51 | else: |
156 | 51 | self.hide() | 52 | self.showMinimized() |
157 | 52 | 53 | ||
158 | 53 | def frameView(self, frame): | 54 | def frameView(self, frame): |
161 | 54 | self.display.setGeometry(0, 0, imagesize.width(), imagesize.height()) | 55 | self.display.setPixmap(frame) |
160 | 55 | self.display.setPixmap(QtGui.QPixmap(frame)) | ||
162 | 56 | 56 | ||
163 | 57 | def kill(self): | 57 | def kill(self): |
164 | 58 | pass | 58 | pass |
165 | 59 | 59 | ||
166 | === modified file 'openlp/core/ui/mainwindow.py' | |||
167 | --- openlp/core/ui/mainwindow.py 2009-05-01 22:26:43 +0000 | |||
168 | +++ openlp/core/ui/mainwindow.py 2009-05-03 07:20:15 +0000 | |||
169 | @@ -60,8 +60,9 @@ | |||
170 | 60 | self.plugin_helpers[u'preview'] = self.PreviewController | 60 | self.plugin_helpers[u'preview'] = self.PreviewController |
171 | 61 | self.plugin_helpers[u'live'] = self.LiveController | 61 | self.plugin_helpers[u'live'] = self.LiveController |
172 | 62 | self.plugin_helpers[u'event'] = self.EventManager | 62 | self.plugin_helpers[u'event'] = self.EventManager |
174 | 63 | self.plugin_helpers[u'theme'] = self.ThemeManagerContents # Theme manger | 63 | self.plugin_helpers[u'theme'] = self.ThemeManagerContents |
175 | 64 | self.plugin_helpers[u'render'] = self.RenderManager | 64 | self.plugin_helpers[u'render'] = self.RenderManager |
176 | 65 | self.plugin_helpers[u'service'] = self.ServiceManagerContents | ||
177 | 65 | 66 | ||
178 | 66 | self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers, self.EventManager) | 67 | self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers, self.EventManager) |
179 | 67 | # hook methods have to happen after find_plugins. Find plugins needs the controllers | 68 | # hook methods have to happen after find_plugins. Find plugins needs the controllers |
180 | @@ -94,6 +95,12 @@ | |||
181 | 94 | self.ThemeManagerContents.serviceManager = self.ServiceManagerContents | 95 | self.ThemeManagerContents.serviceManager = self.ServiceManagerContents |
182 | 95 | self.ThemeManagerContents.loadThemes() | 96 | self.ThemeManagerContents.loadThemes() |
183 | 96 | 97 | ||
184 | 98 | # Initialise SlideControllers | ||
185 | 99 | log.info(u'Set Up SlideControllers') | ||
186 | 100 | self.PreviewController.isLive = False | ||
187 | 101 | self.LiveController.isLive = True | ||
188 | 102 | self.LiveController.mainDisplay = self.main_display | ||
189 | 103 | |||
190 | 97 | def setupUi(self): | 104 | def setupUi(self): |
191 | 98 | self.main_window.setObjectName(u'main_window') | 105 | self.main_window.setObjectName(u'main_window') |
192 | 99 | self.main_window.resize(1087, 847) | 106 | self.main_window.resize(1087, 847) |
193 | 100 | 107 | ||
194 | === modified file 'openlp/core/ui/servicemanager.py' | |||
195 | --- openlp/core/ui/servicemanager.py 2009-04-30 21:02:28 +0000 | |||
196 | +++ openlp/core/ui/servicemanager.py 2009-05-02 18:56:27 +0000 | |||
197 | @@ -46,20 +46,25 @@ | |||
198 | 46 | QAbstractItemModel.__init__(self) | 46 | QAbstractItemModel.__init__(self) |
199 | 47 | self.items=[] | 47 | self.items=[] |
200 | 48 | log.info("Starting") | 48 | log.info("Starting") |
201 | 49 | |||
202 | 49 | def columnCount(self, parent): | 50 | def columnCount(self, parent): |
203 | 50 | return 1; # always only a single column (for now) | 51 | return 1; # always only a single column (for now) |
204 | 52 | |||
205 | 51 | def rowCount(self, parent): | 53 | def rowCount(self, parent): |
206 | 52 | return len(self.items) | 54 | return len(self.items) |
207 | 55 | |||
208 | 53 | def insertRow(self, row, service_item): | 56 | def insertRow(self, row, service_item): |
211 | 54 | # self.beginInsertRows(QModelIndex(),row,row) | 57 | self.beginInsertRows(QModelIndex(),row,row) |
212 | 55 | log.info("insert row %d:%s"%(row,service_item)) | 58 | log.info("insert row %s:%s" % (row,service_item)) |
213 | 56 | self.items.insert(row, service_item) | 59 | self.items.insert(row, service_item) |
214 | 57 | log.info("Items: %s" % self.items) | 60 | log.info("Items: %s" % self.items) |
216 | 58 | # self.endInsertRows() | 61 | self.endInsertRows() |
217 | 62 | |||
218 | 59 | def removeRow(self, row): | 63 | def removeRow(self, row): |
219 | 60 | self.beginRemoveRows(QModelIndex(), row,row) | 64 | self.beginRemoveRows(QModelIndex(), row,row) |
220 | 61 | self.items.pop(row) | 65 | self.items.pop(row) |
221 | 62 | self.endRemoveRows() | 66 | self.endRemoveRows() |
222 | 67 | |||
223 | 63 | def addRow(self, item): | 68 | def addRow(self, item): |
224 | 64 | self.insertRow(len(self.items), item) | 69 | self.insertRow(len(self.items), item) |
225 | 65 | 70 | ||
226 | @@ -68,16 +73,18 @@ | |||
227 | 68 | 73 | ||
228 | 69 | def parent(self, index=QModelIndex()): | 74 | def parent(self, index=QModelIndex()): |
229 | 70 | return QModelIndex() # no children as yet | 75 | return QModelIndex() # no children as yet |
230 | 76 | |||
231 | 71 | def data(self, index, role): | 77 | def data(self, index, role): |
232 | 72 | """ | 78 | """ |
233 | 73 | Called by the service manager to draw us in the service window | 79 | Called by the service manager to draw us in the service window |
234 | 74 | """ | 80 | """ |
235 | 81 | log.debug(u'data %s %d', index, role) | ||
236 | 75 | row=index.row() | 82 | row=index.row() |
237 | 76 | if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! | 83 | if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! |
238 | 77 | return QVariant() | 84 | return QVariant() |
239 | 78 | item=self.items[row] | 85 | item=self.items[row] |
240 | 79 | if role==Qt.DisplayRole: | 86 | if role==Qt.DisplayRole: |
242 | 80 | retval= item.pluginname + ":" + item.shortname | 87 | retval= item.title + u':' + item.shortname |
243 | 81 | elif role == Qt.DecorationRole: | 88 | elif role == Qt.DecorationRole: |
244 | 82 | retval = item.iconic_representation | 89 | retval = item.iconic_representation |
245 | 83 | elif role == Qt.ToolTipRole: | 90 | elif role == Qt.ToolTipRole: |
246 | @@ -139,6 +146,7 @@ | |||
247 | 139 | self.service_data=ServiceData() | 146 | self.service_data=ServiceData() |
248 | 140 | self.TreeView.setModel(self.service_data) | 147 | self.TreeView.setModel(self.service_data) |
249 | 141 | self.Layout.addWidget(self.TreeView) | 148 | self.Layout.addWidget(self.TreeView) |
250 | 149 | |||
251 | 142 | QtCore.QObject.connect(self.ThemeComboBox, | 150 | QtCore.QObject.connect(self.ThemeComboBox, |
252 | 143 | QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected) | 151 | QtCore.SIGNAL("activated(int)"), self.onThemeComboBoxSelected) |
253 | 144 | 152 | ||
254 | @@ -159,6 +167,7 @@ | |||
255 | 159 | # if currently selected is of correct type, add it to it | 167 | # if currently selected is of correct type, add it to it |
256 | 160 | log.info("row:%d"%row) | 168 | log.info("row:%d"%row) |
257 | 161 | selected_item=self.service_data.item(row) | 169 | selected_item=self.service_data.item(row) |
258 | 170 | |||
259 | 162 | if type(selected_item) == type(item): | 171 | if type(selected_item) == type(item): |
260 | 163 | log.info("Add to existing item") | 172 | log.info("Add to existing item") |
261 | 164 | selected_item.add(item) | 173 | selected_item.add(item) |
262 | 165 | 174 | ||
263 | === modified file 'openlp/core/ui/slidecontroller.py' | |||
264 | --- openlp/core/ui/slidecontroller.py 2009-04-30 21:02:28 +0000 | |||
265 | +++ openlp/core/ui/slidecontroller.py 2009-05-03 07:20:15 +0000 | |||
266 | @@ -17,11 +17,92 @@ | |||
267 | 17 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple | 17 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple |
268 | 18 | Place, Suite 330, Boston, MA 02111-1307 USA | 18 | Place, Suite 330, Boston, MA 02111-1307 USA |
269 | 19 | """ | 19 | """ |
270 | 20 | import logging | ||
271 | 20 | import os | 21 | import os |
273 | 21 | from time import sleep | 22 | |
274 | 22 | from PyQt4 import QtCore, QtGui | 23 | from PyQt4 import QtCore, QtGui |
275 | 24 | from PyQt4.QtCore import * | ||
276 | 25 | from PyQt4.QtGui import * | ||
277 | 26 | |||
278 | 27 | class SlideData(QAbstractListModel): | ||
279 | 28 | """ | ||
280 | 29 | Tree of items for an order of Theme. | ||
281 | 30 | Includes methods for reading and writing the contents to an OOS file | ||
282 | 31 | Root contains a list of ThemeItems | ||
283 | 32 | """ | ||
284 | 33 | global log | ||
285 | 34 | log=logging.getLogger(u'SlideData') | ||
286 | 35 | |||
287 | 36 | def __init__(self): | ||
288 | 37 | QAbstractListModel.__init__(self) | ||
289 | 38 | self.items=[] | ||
290 | 39 | self.rowheight=50 | ||
291 | 40 | self.maximagewidth=self.rowheight*16/9.0; | ||
292 | 41 | log.info(u'Starting') | ||
293 | 42 | |||
294 | 43 | def clearItems(self): | ||
295 | 44 | self.items=[] | ||
296 | 45 | |||
297 | 46 | def columnCount(self, parent): | ||
298 | 47 | return 1 | ||
299 | 48 | |||
300 | 49 | def rowCount(self, parent): | ||
301 | 50 | return len(self.items) | ||
302 | 51 | |||
303 | 52 | def insertRow(self, row, frame): | ||
304 | 53 | self.beginInsertRows(QModelIndex(),row,row) | ||
305 | 54 | log.info(u'insert row %d' % row) | ||
306 | 55 | # create a preview image | ||
307 | 56 | frame1 = frame.scaled(QtCore.QSize(350,260)) | ||
308 | 57 | self.items.insert(row,(frame1)) | ||
309 | 58 | log.info(u'Items: %s' % self.items) | ||
310 | 59 | self.endInsertRows() | ||
311 | 60 | |||
312 | 61 | def removeRow(self, row): | ||
313 | 62 | self.beginRemoveRows(QModelIndex(), row,row) | ||
314 | 63 | self.items.pop(row) | ||
315 | 64 | self.endRemoveRows() | ||
316 | 65 | |||
317 | 66 | def addRow(self, frame): | ||
318 | 67 | self.insertRow(len(self.items), frame) | ||
319 | 68 | |||
320 | 69 | def data(self, index, role): | ||
321 | 70 | row=index.row() | ||
322 | 71 | if row > len(self.items): # if the last row is selected and deleted, we then get called with an empty row! | ||
323 | 72 | return QVariant() | ||
324 | 73 | # if role==Qt.DisplayRole: | ||
325 | 74 | # retval= self.items[row][1] | ||
326 | 75 | if role == Qt.DecorationRole: | ||
327 | 76 | retval= self.items[row]#[0] | ||
328 | 77 | else: | ||
329 | 78 | retval= QVariant() | ||
330 | 79 | # log.info("Returning"+ str(retval)) | ||
331 | 80 | if type(retval) is not type(QVariant): | ||
332 | 81 | return QVariant(retval) | ||
333 | 82 | else: | ||
334 | 83 | return retval | ||
335 | 84 | |||
336 | 85 | def __iter__(self): | ||
337 | 86 | for i in self.items: | ||
338 | 87 | yield i | ||
339 | 88 | |||
340 | 89 | def getValue(self, index): | ||
341 | 90 | row = index.row() | ||
342 | 91 | return self.items[row] | ||
343 | 92 | |||
344 | 93 | def getItem(self, row): | ||
345 | 94 | log.info(u'Get Item:%d -> %s' %(row, str(self.items))) | ||
346 | 95 | return self.items[row] | ||
347 | 96 | |||
348 | 97 | def getList(self): | ||
349 | 98 | filelist = [item[3] for item in self.items]; | ||
350 | 99 | return filelist | ||
351 | 100 | |||
352 | 23 | 101 | ||
353 | 24 | class SlideController(QtGui.QWidget): | 102 | class SlideController(QtGui.QWidget): |
354 | 103 | global log | ||
355 | 104 | log=logging.getLogger(u'SlideController') | ||
356 | 105 | |||
357 | 25 | def __init__(self, control_splitter): | 106 | def __init__(self, control_splitter): |
358 | 26 | QtGui.QWidget.__init__(self) | 107 | QtGui.QWidget.__init__(self) |
359 | 27 | self.Pane = QtGui.QWidget(control_splitter) | 108 | self.Pane = QtGui.QWidget(control_splitter) |
360 | @@ -33,18 +114,16 @@ | |||
361 | 33 | self.PaneLayout.setSpacing(50) | 114 | self.PaneLayout.setSpacing(50) |
362 | 34 | self.PaneLayout.setMargin(0) | 115 | self.PaneLayout.setMargin(0) |
363 | 35 | 116 | ||
364 | 36 | #self.VerseListView = QtGui.QListWidget(customEditDialog) | ||
365 | 37 | #self.VerseListView.setObjectName("VerseListView") | ||
366 | 38 | #self.horizontalLayout_4.addWidget(self.VerseListView) | ||
367 | 39 | |||
368 | 40 | self.Controller = QtGui.QScrollArea(self.Splitter) | 117 | self.Controller = QtGui.QScrollArea(self.Splitter) |
369 | 41 | self.Controller.setWidgetResizable(True) | 118 | self.Controller.setWidgetResizable(True) |
370 | 42 | 119 | ||
373 | 43 | self.ControllerContents = QtGui.QWidget(self.Controller) | 120 | self.PreviewListView = QtGui.QListView(self.Splitter) |
374 | 44 | self.ControllerContents.setGeometry(QtCore.QRect(0, 0, 228, 536)) | 121 | self.PreviewListView.setAlternatingRowColors(True) |
375 | 122 | self.PreviewListData = SlideData() | ||
376 | 123 | self.PreviewListView.setModel(self.PreviewListData) | ||
377 | 45 | self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536)) | 124 | self.Controller.setGeometry(QtCore.QRect(0, 0, 828, 536)) |
378 | 46 | 125 | ||
380 | 47 | self.Controller.setWidget(self.ControllerContents) | 126 | self.Controller.setWidget(self.PreviewListView) |
381 | 48 | 127 | ||
382 | 49 | self.SlidePreview = QtGui.QLabel(self.Splitter) | 128 | self.SlidePreview = QtGui.QLabel(self.Splitter) |
383 | 50 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) | 129 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) |
384 | @@ -59,9 +138,25 @@ | |||
385 | 59 | self.SlidePreview.setScaledContents(True) | 138 | self.SlidePreview.setScaledContents(True) |
386 | 60 | self.SlidePreview.setObjectName("SlidePreview") | 139 | self.SlidePreview.setObjectName("SlidePreview") |
387 | 61 | 140 | ||
388 | 141 | QtCore.QObject.connect(self.PreviewListView, | ||
389 | 142 | QtCore.SIGNAL("clicked(QModelIndex)"), self.onSlideSelected) | ||
390 | 143 | |||
391 | 144 | |||
392 | 145 | def onSlideSelected(self, index): | ||
393 | 146 | frame = self.PreviewListData.getValue(index) | ||
394 | 147 | self.previewFrame(frame) | ||
395 | 148 | |||
396 | 62 | def previewFrame(self, frame): | 149 | def previewFrame(self, frame): |
397 | 63 | self.SlidePreview.setPixmap(frame) | 150 | self.SlidePreview.setPixmap(frame) |
402 | 64 | 151 | if self.isLive: | |
403 | 65 | imageLabel = QtGui.QLabel() | 152 | self.mainDisplay.frameView(frame) |
404 | 66 | imageLabel.setPixmap(frame) | 153 | |
405 | 67 | self.Controller.setWidget(imageLabel) | 154 | def addServiceItem(self, serviceitem): |
406 | 155 | self.serviceitem = serviceitem | ||
407 | 156 | self.serviceitem.render() | ||
408 | 157 | self.PreviewListData.clearItems() | ||
409 | 158 | for frame in self.serviceitem.frames: | ||
410 | 159 | self.PreviewListData.addRow(frame) | ||
411 | 160 | |||
412 | 161 | def render(self): | ||
413 | 162 | pass | ||
414 | 68 | 163 | ||
415 | === modified file 'openlp/core/ui/thememanager.py' | |||
416 | --- openlp/core/ui/thememanager.py 2009-05-01 22:26:43 +0000 | |||
417 | +++ openlp/core/ui/thememanager.py 2009-05-02 18:56:27 +0000 | |||
418 | @@ -230,7 +230,17 @@ | |||
419 | 230 | def getThemeData(self, themename): | 230 | def getThemeData(self, themename): |
420 | 231 | log.debug(u'getthemedata for theme %s', themename) | 231 | log.debug(u'getthemedata for theme %s', themename) |
421 | 232 | xml_file = os.path.join(self.path, str(themename), str(themename) + u'.xml') | 232 | xml_file = os.path.join(self.path, str(themename), str(themename) + u'.xml') |
423 | 233 | xml = fileToXML(xml_file) | 233 | try: |
424 | 234 | xml = fileToXML(xml_file) | ||
425 | 235 | except: | ||
426 | 236 | newtheme = ThemeXML() | ||
427 | 237 | newtheme.new_document(u'New Theme') | ||
428 | 238 | newtheme.add_background_solid(str(u'#000000')) | ||
429 | 239 | newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(30), u'False') | ||
430 | 240 | newtheme.add_font(str(QFont().family()), str(u'#FFFFFF'), str(12), u'False', u'footer') | ||
431 | 241 | newtheme.add_display(u'False', str(u'#FFFFFF'), u'False', str(u'#FFFFFF'), | ||
432 | 242 | str(0), str(0), str(0)) | ||
433 | 243 | xml = newtheme.extract_xml() | ||
434 | 234 | theme = ThemeXML() | 244 | theme = ThemeXML() |
435 | 235 | theme.parse(xml) | 245 | theme.parse(xml) |
436 | 236 | return theme | 246 | return theme |
437 | 237 | 247 | ||
438 | === modified file 'openlp/plugins/bibles/lib/mediaitem.py' | |||
439 | --- openlp/plugins/bibles/lib/mediaitem.py 2009-04-29 19:07:13 +0000 | |||
440 | +++ openlp/plugins/bibles/lib/mediaitem.py 2009-05-02 18:56:27 +0000 | |||
441 | @@ -23,7 +23,7 @@ | |||
442 | 23 | 23 | ||
443 | 24 | from openlp.core import translate | 24 | from openlp.core import translate |
444 | 25 | from openlp.core.lib import MediaManagerItem, Receiver | 25 | from openlp.core.lib import MediaManagerItem, Receiver |
446 | 26 | from openlp.core.resources import * | 26 | from openlp.core.lib import ServiceItem |
447 | 27 | 27 | ||
448 | 28 | from openlp.plugins.bibles.forms import BibleImportForm | 28 | from openlp.plugins.bibles.forms import BibleImportForm |
449 | 29 | from openlp.plugins.bibles.lib import TextListData | 29 | from openlp.plugins.bibles.lib import TextListData |
450 | @@ -270,12 +270,6 @@ | |||
451 | 270 | self.bibleimportform.exec_() | 270 | self.bibleimportform.exec_() |
452 | 271 | pass | 271 | pass |
453 | 272 | 272 | ||
454 | 273 | def onBibleLiveClick(self): | ||
455 | 274 | pass | ||
456 | 275 | |||
457 | 276 | def onBibleAddClick(self): | ||
458 | 277 | pass | ||
459 | 278 | |||
460 | 279 | def onAdvancedFromVerse(self): | 273 | def onAdvancedFromVerse(self): |
461 | 280 | frm = self.AdvancedFromVerse.currentText() | 274 | frm = self.AdvancedFromVerse.currentText() |
462 | 281 | self.adjustComboBox(frm, self.verses, self.AdvancedToVerse) | 275 | self.adjustComboBox(frm, self.verses, self.AdvancedToVerse) |
463 | @@ -325,12 +319,33 @@ | |||
464 | 325 | if not self.search_results == None: | 319 | if not self.search_results == None: |
465 | 326 | self.displayResults(bible) | 320 | self.displayResults(bible) |
466 | 327 | 321 | ||
467 | 322 | def onBibleLiveClick(self): | ||
468 | 323 | service_item = ServiceItem(self.parent) | ||
469 | 324 | service_item.addIcon( ":/media/media_verse.png") | ||
470 | 325 | service_item.render_manager = self.parent.render_manager | ||
471 | 326 | self.generateSlideData(service_item) | ||
472 | 327 | self.parent.live_controller.addServiceItem(service_item) | ||
473 | 328 | |||
474 | 329 | def onBibleAddClick(self): | ||
475 | 330 | service_item = ServiceItem(self.parent) | ||
476 | 331 | service_item.addIcon( ":/media/media_verse.png") | ||
477 | 332 | service_item.render_manager = self.parent.render_manager | ||
478 | 333 | self.generateSlideData(service_item) | ||
479 | 334 | self.parent.service_manager.addServiceItem(service_item) | ||
480 | 335 | |||
481 | 328 | def onBiblePreviewClick(self): | 336 | def onBiblePreviewClick(self): |
482 | 337 | service_item = ServiceItem(self.parent) | ||
483 | 338 | service_item.addIcon( ":/media/media_verse.png") | ||
484 | 339 | service_item.render_manager = self.parent.render_manager | ||
485 | 340 | self.generateSlideData(service_item) | ||
486 | 341 | self.parent.preview_controller.addServiceItem(service_item) | ||
487 | 342 | |||
488 | 343 | def generateSlideData(self, service_item): | ||
489 | 329 | log.debug(u'Bible Preview Button pressed') | 344 | log.debug(u'Bible Preview Button pressed') |
490 | 330 | items = self.BibleListView.selectedIndexes() | 345 | items = self.BibleListView.selectedIndexes() |
491 | 331 | old_chapter = '' | 346 | old_chapter = '' |
494 | 332 | main_lines=[] | 347 | raw_slides=[] |
495 | 333 | footer_lines = [] | 348 | raw_footer = [] |
496 | 334 | for item in items: | 349 | for item in items: |
497 | 335 | text = self.BibleListData.getValue(item) | 350 | text = self.BibleListData.getValue(item) |
498 | 336 | verse = text[:text.find("(")] | 351 | verse = text[:text.find("(")] |
499 | @@ -351,13 +366,15 @@ | |||
500 | 351 | else: | 366 | else: |
501 | 352 | loc = self.formatVerse(old_chapter, chapter, verse, u'', u'') | 367 | loc = self.formatVerse(old_chapter, chapter, verse, u'', u'') |
502 | 353 | old_chapter = chapter | 368 | old_chapter = chapter |
510 | 354 | main_lines.append(loc + u' '+text) | 369 | raw_slides.append(loc + u' '+text) |
511 | 355 | if len(footer_lines) <= 1: | 370 | service_item.title = book + u' ' + loc |
512 | 356 | footer_lines.append(book) | 371 | if len(raw_footer) <= 1: |
513 | 357 | 372 | raw_footer.append(book) | |
514 | 358 | self.parent.render_manager.set_override_theme(None) | 373 | |
515 | 359 | frame=self.parent.render_manager.generate_slide(main_lines, footer_lines) | 374 | service_item.theme = None |
516 | 360 | self.parent.preview_controller.previewFrame(frame) | 375 | |
517 | 376 | service_item.raw_slides = raw_slides | ||
518 | 377 | service_item.raw_footer = raw_footer | ||
519 | 361 | 378 | ||
520 | 362 | def formatVerse(self, old_chapter, chapter, verse, opening, closing): | 379 | def formatVerse(self, old_chapter, chapter, verse, opening, closing): |
521 | 363 | loc = opening | 380 | loc = opening |
522 | 364 | 381 | ||
523 | === modified file 'openlp/plugins/custom/lib/mediaitem.py' | |||
524 | --- openlp/plugins/custom/lib/mediaitem.py 2009-04-30 21:02:28 +0000 | |||
525 | +++ openlp/plugins/custom/lib/mediaitem.py 2009-05-02 18:56:27 +0000 | |||
526 | @@ -24,6 +24,7 @@ | |||
527 | 24 | from openlp.core import translate | 24 | from openlp.core import translate |
528 | 25 | from openlp.core.lib import MediaManagerItem | 25 | from openlp.core.lib import MediaManagerItem |
529 | 26 | from openlp.core.lib import SongXMLParser | 26 | from openlp.core.lib import SongXMLParser |
530 | 27 | from openlp.core.lib import ServiceItem | ||
531 | 27 | 28 | ||
532 | 28 | from openlp.plugins.custom.lib import TextListData | 29 | from openlp.plugins.custom.lib import TextListData |
533 | 29 | 30 | ||
534 | @@ -37,6 +38,7 @@ | |||
535 | 37 | 38 | ||
536 | 38 | def __init__(self, parent, icon, title): | 39 | def __init__(self, parent, icon, title): |
537 | 39 | MediaManagerItem.__init__(self, parent, icon, title) | 40 | MediaManagerItem.__init__(self, parent, icon, title) |
538 | 41 | self.parent = parent | ||
539 | 40 | 42 | ||
540 | 41 | def setupUi(self): | 43 | def setupUi(self): |
541 | 42 | # Add a toolbar | 44 | # Add a toolbar |
542 | @@ -134,7 +136,7 @@ | |||
543 | 134 | translate('CustomMediaItem',u'&Show Live'), self.onCustomLiveClick)) | 136 | translate('CustomMediaItem',u'&Show Live'), self.onCustomLiveClick)) |
544 | 135 | self.CustomListView.addAction(self.contextMenuAction( | 137 | self.CustomListView.addAction(self.contextMenuAction( |
545 | 136 | self.CustomListView, ':/system/system_add.png', | 138 | self.CustomListView, ':/system/system_add.png', |
547 | 137 | translate('CustomMediaItem',u'&Add to Service'), self.onCustomEditClick)) | 139 | translate('CustomMediaItem',u'&Add to Service'), self.onCustomAddClick)) |
548 | 138 | 140 | ||
549 | 139 | # def retranslateUi(self): | 141 | # def retranslateUi(self): |
550 | 140 | # self.ClearTextButton.setText(translate('CustomMediaItem', u'Clear')) | 142 | # self.ClearTextButton.setText(translate('CustomMediaItem', u'Clear')) |
551 | @@ -185,9 +187,30 @@ | |||
552 | 185 | self.CustomListData.deleteRow(index) | 187 | self.CustomListData.deleteRow(index) |
553 | 186 | 188 | ||
554 | 187 | def onCustomPreviewClick(self): | 189 | def onCustomPreviewClick(self): |
555 | 190 | service_item = ServiceItem(self.parent) | ||
556 | 191 | service_item.addIcon( ":/media/media_song.png") | ||
557 | 192 | service_item.render_manager = self.parent.render_manager | ||
558 | 193 | self.generateSlideData(service_item) | ||
559 | 194 | self.parent.preview_controller.addServiceItem(service_item) | ||
560 | 195 | |||
561 | 196 | def onCustomLiveClick(self): | ||
562 | 197 | service_item = ServiceItem(self.parent) | ||
563 | 198 | service_item.addIcon( ":/media/media_song.png") | ||
564 | 199 | service_item.render_manager = self.parent.render_manager | ||
565 | 200 | self.generateSlideData(service_item) | ||
566 | 201 | self.parent.live_controller.addServiceItem(service_item) | ||
567 | 202 | |||
568 | 203 | def onCustomAddClick(self): | ||
569 | 204 | service_item = ServiceItem(self.parent) | ||
570 | 205 | service_item.addIcon( ":/media/media_song.png") | ||
571 | 206 | service_item.render_manager = self.parent.render_manager | ||
572 | 207 | self.generateSlideData(service_item) | ||
573 | 208 | self.parent.service_manager.addServiceItem(service_item) | ||
574 | 209 | |||
575 | 210 | def generateSlideData(self, service_item): | ||
576 | 188 | indexes = self.CustomListView.selectedIndexes() | 211 | indexes = self.CustomListView.selectedIndexes() |
579 | 189 | main_lines=[] | 212 | raw_slides =[] |
580 | 190 | footer_lines = [] | 213 | raw_footer = [] |
581 | 191 | slide = None | 214 | slide = None |
582 | 192 | theme = None | 215 | theme = None |
583 | 193 | for index in indexes: | 216 | for index in indexes: |
584 | @@ -196,25 +219,13 @@ | |||
585 | 196 | title = customSlide.title | 219 | title = customSlide.title |
586 | 197 | credit = customSlide.credits | 220 | credit = customSlide.credits |
587 | 198 | theme = customSlide.theme_name | 221 | theme = customSlide.theme_name |
593 | 199 | if len(theme) == 0 or theme == None: | 222 | if len(theme) is not 0 : |
594 | 200 | self.parent.render_manager.set_override_theme(None) | 223 | service_item.theme = theme |
590 | 201 | else: | ||
591 | 202 | self.parent.render_manager.set_override_theme(theme) | ||
592 | 203 | |||
595 | 204 | songXML=SongXMLParser(customSlide.text) | 224 | songXML=SongXMLParser(customSlide.text) |
596 | 205 | verseList = songXML.get_verses() | 225 | verseList = songXML.get_verses() |
597 | 206 | for verse in verseList: | 226 | for verse in verseList: |
612 | 207 | slide = self.parent.render_manager.format_slide(verse[1], False) | 227 | raw_slides.append(verse[1]) |
613 | 208 | print verse | 228 | raw_footer.append(title + u' '+ credit) |
614 | 209 | print slide | 229 | service_item.title = title |
615 | 210 | 230 | service_item.raw_slides = raw_slides | |
616 | 211 | footer_lines.append(title + u' '+ credit) | 231 | service_item.raw_footer = raw_footer |
603 | 212 | if slide is not None: | ||
604 | 213 | frame=self.parent.render_manager.generate_slide(slide, footer_lines, False) | ||
605 | 214 | self.parent.preview_controller.previewFrame(frame) | ||
606 | 215 | |||
607 | 216 | def onCustomLiveClick(self): | ||
608 | 217 | pass | ||
609 | 218 | |||
610 | 219 | def onCustomAddClick(self): | ||
611 | 220 | pass |
Add ServicingItem and Preview/Live Code
Start to add Items to ServiceManager (unstable)
Add selection for preview and live (if Live)