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

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

It's big.
Includes Martins changes - followed by changes to get things working
Highlights of this merge.
- New SlideController with plugable toolbars
- New Live toolbar for Images with working timer loop.
- Martin's changes to MediamanagerItem
- Removal of the need to use listitemswithpreview.
- Removal of duplicate methods.

Various other bug fixes.

Test run all plugins and add display situations.
Tested no gsm installed! Hummmm.

Revision history for this message
Martin Thompson (mjthompson) wrote :

Some nitpicks and queries:
8 + #replace the quotes with quotes
9 + line, replace("''", "'")
Do you need a "u" in front of the strings? Also, I find it easier to see what's going on in strings that are pure quote marks to actually escape the quotes (even though it's unnecessary).
Also, should it be line=line.replace(...)?

808 + self.SlidePreview.setFixedSize(QtCore.QSize(250, 210))
Should the slide preview be of fixed size? Does this cause it to be too big on lo-res screen?

873 +class MasterToolbar(QtCore.QObject):
874 + """
875 + Class from which all tollbars should extend
typo - tollbars -> toolbars.

1096 + #check to see file is in route directory
*root* directory?

The timer for the image lists: should the timeout be configurable as part of the OOS (different per service item), rather than in the plugin? Or is the settings tab just for a default?

review: Approve
Revision history for this message
Michael Gorven (mgorven) wrote :

On Sunday 05 July 2009 21:36:54 Martin Thompson wrote:
> Do you need a "u" in front of the strings?

YES! It makes it a Unicode string instead of a bytestring. All strings should
be Unicode unless they are entering or leaving the application. (Python 3
makes Unicode strings the default, by the way.)

Revision history for this message
Martin Thompson (mjthompson) wrote :

On Mon, Jul 06, 2009 at 04:12:09PM -0000 or thereabouts, Michael Gorven wrote:
> On Sunday 05 July 2009 21:36:54 Martin Thompson wrote:
> > Do you need a "u" in front of the strings?
>
> YES! It makes it a Unicode string instead of a bytestring. All strings should
> be Unicode unless they are entering or leaving the application. (Python 3
> makes Unicode strings the default, by the way.)

It was more of the "It think you *do* need a unicode string, but I'm
not sure if something weird is going on as it looks like 'old-stuff'
import code" - hence the query rather than a statement :)

Cheers,
Martin

--
<email address hidden>
  int deep_thought(void) {
    sleep (7.5e6*365*24*60*60); return 42;
  }

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cnvdb.py'
--- cnvdb.py 2009-06-25 19:42:22 +0000
+++ cnvdb.py 2009-07-02 19:10:14 +0000
@@ -30,6 +30,8 @@
30 infile = codecs.open(inname, 'r', encoding='iso-8859-1')30 infile = codecs.open(inname, 'r', encoding='iso-8859-1')
31 writefile = codecs.open(outname, 'w', encoding='utf-8')31 writefile = codecs.open(outname, 'w', encoding='utf-8')
32 for line in infile:32 for line in infile:
33 #replace the quotes with quotes
34 line, replace("''", "'")
33 writefile.write(line)35 writefile.write(line)
34 infile.close()36 infile.close()
35 writefile.close()37 writefile.close()
3638
=== modified file 'openlp/core/lib/listwithpreviews.py'
--- openlp/core/lib/listwithpreviews.py 2009-06-23 20:59:38 +0000
+++ openlp/core/lib/listwithpreviews.py 2009-06-30 20:35:53 +0000
@@ -35,14 +35,18 @@
35 self.items = []35 self.items = []
36 self.rowheight = 5036 self.rowheight = 50
37 self.maximagewidth = self.rowheight * 16 / 9.0;37 self.maximagewidth = self.rowheight * 16 / 9.0;
38 if new_preview_function is not None:38 self.preview_function = new_preview_function
39 self.make_preview=new_preview_function
40 else:
41 self.make_preview=self.preview_function
42 39
43 def preview_function(self, filename):40 def make_preview(self, filename):
44 if os.path.exists(filename):41 if os.path.exists(filename):
45 preview = QtGui.QImage(filename)42 if self.preview_function is not None:
43 preview=self.preview_function(filename)
44 else:
45 preview = QtGui.QImage(filename)
46 else:
47 preview = None
48
49 if preview is not None:
46 w = self.maximagewidth;50 w = self.maximagewidth;
47 h = self.rowheight51 h = self.rowheight
48 preview = preview.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)52 preview = preview.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
4953
=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py 2009-06-29 05:07:32 +0000
+++ openlp/core/lib/mediamanageritem.py 2009-07-04 05:52:30 +0000
@@ -23,14 +23,38 @@
23from PyQt4 import QtCore, QtGui23from PyQt4 import QtCore, QtGui
2424
25from openlp.core.lib.toolbar import *25from openlp.core.lib.toolbar import *
26from openlp.core.lib import translate26from openlp.core.lib import translate, contextMenuAction, contextMenuSeparator
27from listwithpreviews import ListWithPreviews
28from serviceitem import ServiceItem27from serviceitem import ServiceItem
2928
30class MediaManagerItem(QtGui.QWidget):29class MediaManagerItem(QtGui.QWidget):
31 """30 """
32 MediaManagerItem is a helper widget for plugins.31 MediaManagerItem is a helper widget for plugins.
32
33 None of the following *need* to be used, feel free to override
34 them cmopletely in your plugin's implementation. Alternatively, call them from your
35 plugin before or after you've done etra things that you need to.
36
37 The plugin will be assigned an icon called u':/media/media_' + 'self.ShortPluginName + u'image.png'
38 which needs to be available in the main resources in order for them to work, you need to have setup
39
40 self.TranslationContext
41 self.PluginTextShort # eg 'Image' for the image plugin
42 self.ConfigSection - where the items in the media manager are stored
43 this could potentially be self.PluginTextShort.lower()
44
45 self.OnNewPrompt=u'Select Image(s)'
46 self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)'
47 assumes that the new action is to load a file. If not, override onnew
48
49 self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD())
50 each plugin needs to inherit a class from this and pass that *class* (not an instance) to here
51 via the ListViewWithDnD_class member
52
53 self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually)
54 - no scaling required - that's done later
55 If this fn is not defined, a default will be used (treat the filename as an image)
33 """56 """
57
34 global log58 global log
35 log = logging.getLogger(u'MediaManagerItem')59 log = logging.getLogger(u'MediaManagerItem')
36 log.info(u'Media Item loaded')60 log.info(u'Media Item loaded')
@@ -84,61 +108,6 @@
84 """108 """
85 self.Toolbar.addSeparator()109 self.Toolbar.addSeparator()
86110
87 def contextMenuSeparator(self, base):
88 action = QtGui.QAction(u'', base)
89 action.setSeparator(True)
90 return action
91
92 def contextMenuAction(self, base, icon, text, slot):
93 """
94 Utility method to help build context menus for plugins
95 """
96 if type(icon) is QtGui.QIcon:
97 ButtonIcon = icon
98 elif type(icon) is types.StringType or type(icon) is types.UnicodeType:
99 ButtonIcon = QtGui.QIcon()
100 if icon.startswith(u':/'):
101 ButtonIcon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal,
102 QtGui.QIcon.Off)
103 else:
104 ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)),
105 QtGui.QIcon.Normal, QtGui.QIcon.Off)
106
107 action = QtGui.QAction(text, base)
108 action .setIcon(ButtonIcon)
109 QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot)
110 return action
111
112 ###########################################################################
113 ### None of the following *need* to be used, feel free to override
114 ### them cmopletely in your plugin's implementation. Alternatively, call them from your
115 ### plugin before or after you've done etra things that you need to.
116 ### in order for them to work, you need to have setup
117 # self.TranslationContext
118 # self.PluginTextShort # eg "Image" for the image plugin
119 # self.ConfigSection - where the items in the media manager are stored
120 # this could potentially be self.PluginTextShort.lower()
121 # self.IconPath=u'images/images' - allows specific icons to be used
122 # self.hasFileIcon - Is the file Icon required
123 # self.hasEditIcon - Is the edit Icon required
124 # self.hasNewIcon - Is the new Icon required
125 #
126 # self.OnNewPrompt=u'Select Image(s)'
127 # self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)'
128 # assumes that the new action is to load a file. If not, override onnew
129 # self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD())
130 # each plugin needs to inherit a class from this and pass that *class* (not an instance) to here
131 # via the ListViewWithDnD_class member
132 # The assumption is that given that at least two plugins are of the form
133 # "text with an icon" then all this will help
134 # even for plugins of another sort, the setup of the right-click menu, common toolbar
135 # will help to keep things consistent and ease the creation of new plugins
136
137 # also a set of completely consistent action anesm then exist
138 # (onPreviewClick() is always called that, rather than having the
139 # name of the plugin added in as well... I regard that as a
140 # feature, I guess others might differ!)
141
142 def setupUi(self):111 def setupUi(self):
143 # Add a toolbar112 # Add a toolbar
144 self.addToolbar()113 self.addToolbar()
@@ -168,7 +137,7 @@
168 u':'+self.IconPath+ u'_delete.png', self.onDeleteClick, self.PluginTextShort+u'DeleteItem')137 u':'+self.IconPath+ u'_delete.png', self.onDeleteClick, self.PluginTextShort+u'DeleteItem')
169 ## Separator Line ##138 ## Separator Line ##
170 self.addToolbarSeparator()139 self.addToolbarSeparator()
171 ## Preview Button ##140 ## Preview ##
172 self.addToolbarButton(141 self.addToolbarButton(
173 translate(self.TranslationContext, u'Preview '+self.PluginTextShort),142 translate(self.TranslationContext, u'Preview '+self.PluginTextShort),
174 translate(self.TranslationContext, u'Preview the selected item'),143 translate(self.TranslationContext, u'Preview the selected item'),
@@ -178,7 +147,7 @@
178 translate(self.TranslationContext, u'Go Live'),147 translate(self.TranslationContext, u'Go Live'),
179 translate(self.TranslationContext, u'Send the selected item live'),148 translate(self.TranslationContext, u'Send the selected item live'),
180 u':/system/system_live.png', self.onLiveClick, u'LiveItem')149 u':/system/system_live.png', self.onLiveClick, u'LiveItem')
181 ## Add Button ##150 ## Add to service Button ##
182 self.addToolbarButton(151 self.addToolbarButton(
183 translate(self.TranslationContext, u'Add '+self.PluginTextShort+u' To Service'),152 translate(self.TranslationContext, u'Add '+self.PluginTextShort+u' To Service'),
184 translate(self.TranslationContext, u'Add the selected item(s) to the service'),153 translate(self.TranslationContext, u'Add the selected item(s) to the service'),
@@ -199,26 +168,29 @@
199 #define and add the context menu168 #define and add the context menu
200 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)169 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
201 if self.hasEditIcon:170 if self.hasEditIcon:
202 self.ListView.addAction(self.contextMenuAction(self.ListView,171 self.ListView.addAction(contextMenuAction(self.ListView,
203 ':' +self.IconPath+u'_new.png',172 ':' +self.IconPath+u'_new.png',
204 translate(self.TranslationContext, u'&Edit '+self.PluginTextShort),173 translate(self.TranslationContext, u'&Edit '+self.PluginTextShort),
205 self.onEditClick))174 self.onEditClick))
206 self.ListView.addAction(self.contextMenuSeparator(self.SongListWidget))175 self.ListView.addAction(self.contextMenuSeparator(self.SongListWidget))
207 self.ListView.addAction(self.contextMenuAction(176 self.ListView.addAction(contextMenuAction(
208 self.ListView, ':/system/system_preview.png',177 self.ListView, ':/system/system_preview.png',
209 translate(self.TranslationContext, u'&Preview '+self.PluginTextShort),178 translate(self.TranslationContext, u'&Preview '+self.PluginTextShort),
210 self.onPreviewClick))179 self.onPreviewClick))
211 self.ListView.addAction(self.contextMenuAction(180 self.ListView.addAction(contextMenuAction(
212 self.ListView, ':/system/system_live.png',181 self.ListView, ':/system/system_live.png',
213 translate(self.TranslationContext, u'&Show Live'),182 translate(self.TranslationContext, u'&Show Live'),
214 self.onLiveClick))183 self.onLiveClick))
215 self.ListView.addAction(self.contextMenuAction(184 self.ListView.addAction(contextMenuAction(
216 self.ListView, ':/system/system_add.png',185 self.ListView, ':/system/system_add.png',
217 translate(self.TranslationContext, u'&Add to Service'),186 translate(self.TranslationContext, u'&Add to Service'),
218 self.onAddClick))187 self.onAddClick))
219 QtCore.QObject.connect(self.ListView,188 QtCore.QObject.connect(self.ListView,
220 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick)189 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick)
221190
191 def initialise(self):
192 pass
193
222 def addHeaderBar(self):194 def addHeaderBar(self):
223 pass195 pass
224196
@@ -232,12 +204,15 @@
232 self.loadList(files)204 self.loadList(files)
233 dir, filename = os.path.split(unicode(files[0]))205 dir, filename = os.path.split(unicode(files[0]))
234 self.parent.config.set_last_dir(dir)206 self.parent.config.set_last_dir(dir)
235 #self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList())207 self.parent.config.set_list(self.ConfigSection, self.getFileList())
236208
237 def getFileList(self):209 def getFileList(self):
238 count = 0210 count = 0
239 while count < len(self.ListView):211 filelist = []
240 filelist = [set.ListView.item(count).text()]212 while count < self.ListView.count():
213 bitem = self.ListView.item(count)
214 filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
215 filelist.append(filename)
241 count += 1216 count += 1
242 return filelist217 return filelist
243218
@@ -257,7 +232,7 @@
257 raise NotImplementedError(u'MediaManagerItem.generateSlideData needs to be defined by the plugin')232 raise NotImplementedError(u'MediaManagerItem.generateSlideData needs to be defined by the plugin')
258233
259 def onPreviewClick(self):234 def onPreviewClick(self):
260 log.debug(self.PluginTextShort+u'Preview Requested')235 log.debug(self.PluginTextShort+u' Preview Requested')
261 service_item = ServiceItem(self.parent)236 service_item = ServiceItem(self.parent)
262 service_item.addIcon(u':/media/media_'+self.PluginTextShort.lower()+u'.png')237 service_item.addIcon(u':/media/media_'+self.PluginTextShort.lower()+u'.png')
263 self.generateSlideData(service_item)238 self.generateSlideData(service_item)
264239
=== modified file 'openlp/core/lib/rendermanager.py'
--- openlp/core/lib/rendermanager.py 2009-06-20 11:23:34 +0000
+++ openlp/core/lib/rendermanager.py 2009-07-02 19:04:50 +0000
@@ -155,8 +155,12 @@
155155
156 def calculate_default(self, screen):156 def calculate_default(self, screen):
157 log.debug(u'calculate default %s' , screen)157 log.debug(u'calculate default %s' , screen)
158 self.width = screen.width()158 if self.current_display == 0:
159 self.height = screen.height()159 self.width = 1024
160 self.height = 768
161 else:
162 self.width = screen.width()
163 self.height = screen.height()
160 log.debug(u'calculate default %d,%d' , self.width, self.height)164 log.debug(u'calculate default %d,%d' , self.width, self.height)
161 # 90% is start of footer165 # 90% is start of footer
162 self.footer_start = int(self.height * 0.90)166 self.footer_start = int(self.height * 0.90)
163167
=== modified file 'openlp/core/resources.py'
--- openlp/core/resources.py 2009-05-03 15:35:34 +0000
+++ openlp/core/resources.py 2009-07-03 19:08:21 +0000
@@ -2,8 +2,8 @@
22
3# Resource object code3# Resource object code
4#4#
5# Created: Sun May 3 17:32:20 20095# Created: Fri Jul 3 19:41:53 2009
6# by: The Resource Compiler for PyQt (Qt v4.4.3)6# by: The Resource Compiler for PyQt (Qt v4.5.0)
7#7#
8# WARNING! All changes made in this file will be lost!8# WARNING! All changes made in this file will be lost!
99
@@ -316,6 +316,69 @@
316\x18\x56\x6a\x9d\x81\x33\x40\x02\x7c\xfb\x53\xca\xd4\x39\x03\xa8\316\x18\x56\x6a\x9d\x81\x33\x40\x02\x7c\xfb\x53\xca\xd4\x39\x03\xa8\
317\x5f\xd3\x56\x89\xec\x63\x12\x58\x4f\x00\x00\x00\x00\x49\x45\x4e\317\x5f\xd3\x56\x89\xec\x63\x12\x58\x4f\x00\x00\x00\x00\x49\x45\x4e\
318\x44\xae\x42\x60\x82\318\x44\xae\x42\x60\x82\
319\x00\x00\x03\xcf\
320\x89\
321\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
322\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
323\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
324\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x01\xbb\x00\x00\x01\xbb\
325\x01\x3a\xec\xe3\xe2\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
326\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
327\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x03\x4c\x49\x44\
328\x41\x54\x78\xda\x75\x53\x4d\x48\x5b\x69\x14\x3d\xdf\xcb\x33\xe6\
329\x47\x13\x4d\x34\x71\x14\x89\x12\xa5\xa9\x05\xed\xc6\x38\x95\x31\
330\xa2\x03\xaf\x2a\x43\x70\x53\xb5\x60\x53\x5a\x90\xb6\x48\x97\xa9\
331\xa5\xed\xa2\x5d\x76\x31\x1d\x98\x42\x5b\xc6\xc5\xd0\x01\x45\xe3\
332\x60\x19\x28\x48\xa3\xcc\x80\x53\xc4\x2e\x52\xa5\xf5\x17\x34\xd1\
333\x1a\x11\x6d\xcc\x7f\x62\x34\x3f\xaf\x97\xb7\x90\x76\xd1\x03\x1f\
334\xef\x2d\xbe\x7b\xee\x3d\xe7\x9e\x8f\x89\xa2\x88\xef\xa1\xb9\xb9\
335\xd9\x30\x37\x37\x77\x80\xaf\x30\x30\x30\xf0\x50\xad\x56\xff\x18\
336\x89\x44\xe2\x54\x7b\xfb\x1b\x82\xe9\xe9\x69\xb9\xdb\xed\x9e\x09\
337\x04\x02\xe7\x73\xb9\x5c\x81\xc1\x60\x60\xf4\xcd\x06\x83\xc1\x50\
338\x32\x99\x74\x8d\x8f\x8f\x0f\xfe\x31\x3c\x9c\xfc\xa9\xa9\x69\xa1\
339\x5d\x10\x2e\xda\x6c\xb6\x5f\x4f\x09\xba\xbb\xbb\x7f\x29\x2e\x2e\
340\x76\x59\xad\x56\xa5\x56\xa3\x11\xb7\xb7\xb7\x73\xd1\x48\x04\x2a\
341\xb5\x1a\x96\x33\x16\xae\xc5\x66\x63\x4f\x7e\x7b\xf2\xf9\x72\x6f\
342\x6f\x49\x95\xc9\xc4\x9c\x77\xee\xee\xce\xfc\x3b\xf3\xa7\x44\x30\
343\x38\x38\x68\xdd\xd9\xd9\x99\x7f\x70\xef\x3e\x7b\xfb\xf6\xff\xac\
344\x51\xa7\x93\xe5\xab\x54\xd0\x68\x34\x08\x85\x42\x88\x46\xa3\x58\
345\x5b\x5f\xcf\x5c\xee\xef\xe7\x7d\x5e\x9f\x38\x39\x39\x39\x27\x42\
346\x1c\x1d\x1b\x1b\x7b\x26\x11\x38\x1c\x8e\xe8\xad\x1b\x37\x0b\xbd\
347\x9b\x1b\x62\x43\x7d\x3d\x2b\xcc\x64\xa0\x2a\x2f\xc7\x29\x18\xc3\
348\xc7\xa5\x25\x2c\x2e\x2e\xe6\x7e\x16\x04\x6e\x6f\x6f\x6f\xa5\xa3\
349\xa3\xe3\x1c\x08\x5c\x5b\x5b\xdb\xa3\x6c\x36\x5b\x18\x09\x05\xd3\
350\x17\x05\x81\x29\x94\x4a\x28\x0c\x06\xc4\xd6\xd6\xc0\xc9\x64\xd2\
351\x09\xd2\x14\x0a\x85\x02\x8e\x2b\x57\xb8\xbf\x5e\xbe\x3c\x69\xb2\
352\x36\xd5\xb5\xb7\xb7\x9f\x07\x41\xd6\xda\xda\x3a\xec\xe8\x77\xe8\
353\xaa\xaa\x4c\x32\x9e\xe7\x11\x0d\x06\x91\x4f\xba\x63\x2b\x2b\xd0\
354\x9a\xcd\xd8\x3f\x38\x40\x98\xbc\x38\x4a\xa5\xb0\xfd\xe9\x13\xaa\
355\xab\xab\xd9\x1b\xb7\x9b\xf5\xf5\xf5\x71\xf4\xff\x9a\x0f\x87\xc3\
356\xe5\x99\x6c\x46\x34\x1a\x8d\x2c\x1e\x8f\xa3\x98\x74\x2b\xa9\x5b\
357\xea\xec\x59\x3c\xbf\x7a\x15\x3a\xbb\x1d\x3b\x7e\x3f\xf4\x7a\x3d\
358\xe4\x72\x39\x68\x43\x5c\x2c\x16\x83\x4a\xa1\xba\x44\x0d\x23\x3c\
359\x99\x24\x26\x12\x71\x70\x1c\x27\x99\x96\x21\xfd\x7c\x5e\x1e\xd6\
360\x77\x77\x91\x28\x2b\x43\x1e\x91\xf6\xf4\xf4\xa0\xb4\xb4\x54\x92\
361\x91\x4e\xa7\xe1\xf1\x78\xf0\xea\x9f\x57\x45\x95\x95\x95\x39\x2e\
362\x95\x4a\xed\x52\x28\xd8\x21\x8d\xce\x88\x44\x9e\x9f\x2f\x91\x95\
363\x57\x54\x20\xa5\xd3\xa1\xb3\xb3\x13\x35\x35\x35\x98\x9a\x9a\x42\
364\x22\x91\x00\x65\x03\xe4\x1b\x2c\x16\x0b\xb3\xdb\xed\x15\xdc\xe1\
365\xe1\xe1\x7f\x89\x44\x12\xef\x17\x16\x4e\x64\x64\xd8\xf1\xf1\xb1\
366\x44\xb0\xb5\xb5\x85\x92\x92\x12\xa9\xb3\x92\x8c\xf5\x7a\xbd\x18\
367\x1a\x1a\xc2\xc8\xc8\x08\x68\x74\x08\x82\x00\x6a\x7e\x81\xdf\xd8\
368\xd8\xb8\x49\x46\x5e\xa3\x20\xc9\x3f\x07\x02\xe0\x18\x83\xba\xa0\
369\x00\xd4\x4d\xba\x48\x64\xd2\x99\x9d\x9d\xc5\xf2\xf2\xb2\x94\x89\
370\x96\x96\x16\xc9\x13\x92\xab\xe7\x40\xf0\xfb\xfd\x8e\x78\x2c\x8e\
371\xdf\x9f\x3e\x15\x43\xe1\x70\x86\x0a\x60\x24\xfd\xfb\xfb\xfb\x92\
372\x27\x94\x15\x89\x8c\x02\x87\x89\x89\x09\x98\x4c\x26\xac\xd1\x9a\
373\xc9\x0f\xcf\x69\x94\xcd\x66\xf3\xe3\xeb\xd7\xae\x3b\xd3\x99\x34\
374\x4b\x1d\x1d\xe5\x6a\x6b\x6b\xb3\xf3\xef\xde\xf1\x34\x19\xa3\x9d\
375\xc3\xe7\xf3\xa1\xae\xae\x0e\x20\x50\x6e\xe0\x74\x3a\x41\x81\xba\
376\xf4\xcd\x63\xa2\xa2\x1f\xa8\xe0\x43\x91\xb6\x48\xaf\x50\x2a\xd8\
377\xe6\xe6\xa6\x34\x32\x49\x44\x57\x57\x17\xb4\x5a\x2d\x56\x57\x57\
378\x31\x3a\x3a\x0a\x2a\x7e\x41\x51\xbe\xf5\xdd\xe7\xdc\xd8\xd8\x58\
379\xd6\xd0\xd0\xd0\x49\x5e\xcc\x53\xc7\x7b\x00\x2e\x30\xc6\xf4\x74\
380\xdf\x03\xe0\x85\xcb\xe5\xfa\x1b\x84\x2f\x2c\xec\x8e\x1c\x74\xf5\
381\x29\x98\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
319\x00\x00\x02\x02\382\x00\x00\x02\x02\
320\x89\383\x89\
321\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\384\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -488,6 +551,54 @@
488\x8c\xb1\x50\x08\xd9\x60\x8c\x45\xd6\x9a\x08\x00\xfe\x06\x5b\x7b\551\x8c\xb1\x50\x08\xd9\x60\x8c\x45\xd6\x9a\x08\x00\xfe\x06\x5b\x7b\
489\x9e\x53\x59\xbb\x17\xfa\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\552\x9e\x53\x59\xbb\x17\xfa\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
490\x60\x82\553\x60\x82\
554\x00\x00\x02\xd2\
555\x89\
556\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
557\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
558\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
559\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x01\xbb\x00\x00\x01\xbb\
560\x01\x3a\xec\xe3\xe2\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
561\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
562\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x4f\x49\x44\
563\x41\x54\x78\xda\xa5\x93\xcb\x4f\x13\x51\x14\x87\xbf\x3b\x33\x1d\
564\x5a\x5b\x0c\x19\xc0\x42\xa0\xe5\x61\x13\x17\x24\xa8\x71\x65\x8c\
565\x1b\x8d\x89\x3b\x57\xee\x64\xa7\x0b\x1f\x7b\x48\x7c\x9b\xe0\x42\
566\x4d\x8c\x8f\x3f\x42\x57\x2e\x5d\x68\x74\x61\x0a\xa8\x41\x40\x5d\
567\xb0\xd0\x50\x1e\xa2\xb5\x0d\x8f\x4e\xa1\x32\x33\x9d\xeb\x1d\x26\
568\x4e\x0a\x5b\x4f\x72\x72\xef\xe6\xfb\xf2\x3b\x77\xce\x08\x29\x25\
569\xff\x53\x06\xbb\x6a\x4e\x88\xc1\x55\x78\x66\xe6\x72\xc9\xa6\x5c\
570\x2e\x16\x4b\xa7\x75\xb7\x58\xac\x3b\xb3\xb3\xf6\x9e\x42\xe1\x6c\
571\x9f\x94\x9f\x77\x08\x76\xc3\xa5\x6c\x36\xdf\x79\x77\x34\xd5\x64\
572\x59\x08\xa1\x81\xa6\x21\x3d\x17\xa7\x62\x77\x2e\x0f\x0f\xe7\x11\
573\xe2\x58\xa3\x24\x18\x21\x82\x17\xbb\xbb\xf2\x3d\x37\x6e\xa6\xcc\
574\x8d\x2a\xb2\x5e\x07\xcf\xc3\x57\xa7\xef\xba\xd4\x7d\x1f\x69\xb5\
575\xb2\x74\xff\x5e\x35\xf3\x63\x39\x92\x68\xff\xe0\xb9\x8e\xf4\x58\
576\xcf\xed\x5b\x29\xbd\x5c\x42\x28\x48\x57\x2d\x2a\x15\x74\xd5\x86\
577\x82\x0d\x29\x91\xdf\xbf\x91\x1d\x19\x4e\x15\x3a\x3a\xc6\x02\x86\
578\x48\x60\x18\xcf\x7b\xaf\x5f\x4d\x6a\xf3\x0b\xe8\xbe\x4f\xdb\xb9\
579\x21\x5a\x87\x86\xd4\x3d\x10\x79\xb4\x9f\xbf\x40\xe7\xc5\x4b\x98\
580\x02\xdc\xc9\x49\x7a\xaf\x8d\x24\x03\x26\x7a\x83\x9a\xe7\x25\xaa\
581\x1f\x26\x68\x69\x69\x43\x98\x26\x38\x0e\x46\x26\x83\x75\xf9\x0a\
582\xc1\x88\x31\x75\x77\x0b\x73\xe8\xab\xab\x18\x2a\xd1\xc6\xfb\x89\
583\x6d\x26\x4a\xe0\x80\x60\xb3\x8a\x56\x59\x47\x2f\xfe\x62\x65\xf4\
584\x0e\xee\xc2\x3c\x46\x77\x46\xc1\x59\xdc\xc5\x05\xd6\x9f\x3c\x26\
585\xae\x44\xcd\x03\x03\x18\xba\xd8\x66\xa2\x04\x1e\x88\x95\xfc\x5b\
586\x9a\x8c\x66\xea\xc9\x24\x7a\x36\x1b\x3e\x22\x61\x49\xd7\x65\x63\
587\xfa\x13\xde\xf4\x14\x75\xdb\x66\x2d\x11\x32\x8d\x09\x90\x9b\x36\
588\xfc\x5c\xc6\x5d\x5f\xa3\xfd\xc1\x43\xcc\xbe\x7e\xfe\x7c\xfd\xb2\
589\xdd\x66\xff\x7e\xd2\x8f\x9e\xe2\x27\xe2\x88\x00\xd2\x43\x26\x4a\
590\x20\x61\xab\xa6\xb3\xa3\xb6\x14\xb8\x78\xfa\x24\xbe\xef\xd3\xf3\
591\xf2\x35\x9a\x69\x22\x01\x01\x54\xf4\x90\x89\xf6\x60\x4a\x88\x83\
592\xef\x62\x8c\x0f\x36\x93\xe8\xb2\x41\xdb\xd7\x1e\xda\x83\x4f\x0a\
593\xb8\x96\x05\x7a\x0c\x7e\x17\x59\x4a\xc1\x8c\x4d\xed\xb8\xcb\xd1\
594\xc3\x52\xce\x44\x8b\x14\x48\xde\x98\x8c\x1f\xd9\x4b\x22\x53\x21\
595\x8c\x2a\xc2\x53\x02\xbe\x84\xa5\x16\xc1\xc7\x35\x59\x3b\xe1\x84\
596\x70\xe3\x26\x46\x92\x57\x4a\x72\xc0\x57\x49\x52\x49\x62\xf1\x38\
597\xba\x61\x50\xf7\x3c\xca\x08\x26\x57\xca\xb5\x53\x0d\xf0\x6e\x41\
598\x24\x19\x87\x17\xea\x27\x4a\xc4\x2d\x4b\x0b\x66\xf7\x1d\x07\xaf\
599\x54\xaa\x1d\x2a\x97\xcf\x44\x70\xa3\xe0\x7f\xea\x2f\xb2\x2a\x1f\
600\x46\x55\x40\xa7\x1e\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
601\x82\
491\x00\x00\x02\xf9\602\x00\x00\x02\xf9\
492\x89\603\x89\
493\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\604\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -53362,13 +53473,17 @@
53362\x00\x72\x00\x65\x00\x73\x00\x65\x00\x6e\x00\x74\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x5f\x00\x6c\x00\x6f\x00\x61\x00\x64\53473\x00\x72\x00\x65\x00\x73\x00\x65\x00\x6e\x00\x74\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x5f\x00\x6c\x00\x6f\x00\x61\x00\x64\
53363\x00\x2e\x00\x70\x00\x6e\x00\x67\53474\x00\x2e\x00\x70\x00\x6e\x00\x67\
53364\x00\x0f\53475\x00\x0f\
53365\x0c\x7b\x40\x27\53476\x0c\xcb\x28\x47\
53366\x00\x6d\53477\x00\x6d\
53367\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x76\x00\x65\x00\x72\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\53478\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x62\x00\x69\x00\x62\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
53368\x00\x0f\53479\x00\x0f\
53369\x02\x3b\x21\xc7\53480\x02\x3b\x21\xc7\
53370\x00\x6d\53481\x00\x6d\
53371\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x69\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\53482\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x69\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
53483\x00\x0e\
53484\x0b\x6a\xa6\xe7\
53485\x00\x6d\
53486\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x74\x00\x69\x00\x6d\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
53372\x00\x10\53487\x00\x10\
53373\x05\xab\xe0\xa7\53488\x05\xab\xe0\xa7\
53374\x00\x6d\53489\x00\x6d\
@@ -53387,6 +53502,10 @@
53387\x00\x6d\53502\x00\x6d\
53388\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x76\x00\x69\x00\x64\x00\x65\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\53503\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x76\x00\x69\x00\x64\x00\x65\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
53389\x00\x0e\53504\x00\x0e\
53505\x0c\x3d\xa6\xe7\
53506\x00\x6d\
53507\x00\x65\x00\x64\x00\x69\x00\x61\x00\x5f\x00\x73\x00\x74\x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\
53508\x00\x0e\
53390\x06\xf2\xcf\x27\53509\x06\xf2\xcf\x27\
53391\x00\x73\53510\x00\x73\
53392\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x5f\x00\x61\x00\x64\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\53511\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x5f\x00\x61\x00\x64\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
@@ -53661,9 +53780,9 @@
5366153780
53662qt_resource_struct = "\53781qt_resource_struct = "\
53663\x00\x00\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x01\53782\x00\x00\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00\x01\
53664\x00\x00\x00\xa6\x00\x02\x00\x00\x00\x06\x00\x00\x00\x54\53783\x00\x00\x00\xa6\x00\x02\x00\x00\x00\x06\x00\x00\x00\x56\
53665\x00\x00\x00\x38\x00\x02\x00\x00\x00\x04\x00\x00\x00\x50\53784\x00\x00\x00\x38\x00\x02\x00\x00\x00\x04\x00\x00\x00\x52\
53666\x00\x00\x01\x02\x00\x02\x00\x00\x00\x06\x00\x00\x00\x4a\53785\x00\x00\x01\x02\x00\x02\x00\x00\x00\x08\x00\x00\x00\x4a\
53667\x00\x00\x00\x5c\x00\x02\x00\x00\x00\x04\x00\x00\x00\x46\53786\x00\x00\x00\x5c\x00\x02\x00\x00\x00\x04\x00\x00\x00\x46\
53668\x00\x00\x00\x4c\x00\x02\x00\x00\x00\x02\x00\x00\x00\x44\53787\x00\x00\x00\x4c\x00\x02\x00\x00\x00\x02\x00\x00\x00\x44\
53669\x00\x00\x01\x12\x00\x02\x00\x00\x00\x02\x00\x00\x00\x42\53788\x00\x00\x01\x12\x00\x02\x00\x00\x00\x02\x00\x00\x00\x42\
@@ -53678,78 +53797,80 @@
53678\x00\x00\x00\xda\x00\x02\x00\x00\x00\x08\x00\x00\x00\x17\53797\x00\x00\x00\xda\x00\x02\x00\x00\x00\x08\x00\x00\x00\x17\
53679\x00\x00\x00\x24\x00\x02\x00\x00\x00\x04\x00\x00\x00\x13\53798\x00\x00\x00\x24\x00\x02\x00\x00\x00\x04\x00\x00\x00\x13\
53680\x00\x00\x00\xc6\x00\x02\x00\x00\x00\x01\x00\x00\x00\x12\53799\x00\x00\x00\xc6\x00\x02\x00\x00\x00\x01\x00\x00\x00\x12\
53681\x00\x00\x06\x14\x00\x00\x00\x00\x00\x01\x00\x00\x4e\x96\53800\x00\x00\x06\x58\x00\x00\x00\x00\x00\x01\x00\x00\x55\x3f\
53682\x00\x00\x0b\x16\x00\x00\x00\x00\x00\x01\x00\x0c\xd7\x8d\53801\x00\x00\x0b\x5a\x00\x00\x00\x00\x00\x01\x00\x0c\xde\x36\
53683\x00\x00\x0b\x4a\x00\x00\x00\x00\x00\x01\x00\x0c\xda\xef\53802\x00\x00\x0b\x8e\x00\x00\x00\x00\x00\x01\x00\x0c\xe1\x98\
53684\x00\x00\x0b\x72\x00\x00\x00\x00\x00\x01\x00\x0c\xdd\x8d\53803\x00\x00\x0b\xb6\x00\x00\x00\x00\x00\x01\x00\x0c\xe4\x36\
53685\x00\x00\x0b\xa0\x00\x00\x00\x00\x00\x01\x00\x0c\xe0\xa1\53804\x00\x00\x0b\xe4\x00\x00\x00\x00\x00\x01\x00\x0c\xe7\x4a\
53686\x00\x00\x05\x78\x00\x00\x00\x00\x00\x01\x00\x00\x44\x52\53805\x00\x00\x05\xbc\x00\x00\x00\x00\x00\x01\x00\x00\x4a\xfb\
53687\x00\x00\x05\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x46\x89\53806\x00\x00\x05\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x4d\x32\
53688\x00\x00\x05\xea\x00\x00\x00\x00\x00\x01\x00\x00\x4b\xcb\53807\x00\x00\x06\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x52\x74\
53689\x00\x00\x05\x54\x00\x00\x00\x00\x00\x01\x00\x00\x42\x0b\53808\x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x00\x48\xb4\
53690\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xda\53809\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x00\x41\x83\
53691\x00\x00\x05\x08\x00\x00\x00\x00\x00\x01\x00\x00\x3d\x81\53810\x00\x00\x05\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x44\x2a\
53692\x00\x00\x05\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x3f\xf4\53811\x00\x00\x05\x72\x00\x00\x00\x00\x00\x01\x00\x00\x46\x9d\
53693\x00\x00\x05\xc8\x00\x00\x00\x00\x00\x01\x00\x00\x49\x27\53812\x00\x00\x06\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xd0\
53694\x00\x00\x01\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\53813\x00\x00\x01\x4c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
53695\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x05\xe6\53814\x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x05\xe6\
53696\x00\x00\x01\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x02\xfe\53815\x00\x00\x01\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x02\xfe\
53697\x00\x00\x08\xa0\x00\x00\x00\x00\x00\x01\x00\x04\x89\xa2\53816\x00\x00\x08\xe4\x00\x00\x00\x00\x00\x01\x00\x04\x90\x4b\
53698\x00\x00\x09\x00\x00\x00\x00\x00\x00\x01\x00\x0a\x79\x20\53817\x00\x00\x09\x44\x00\x00\x00\x00\x00\x01\x00\x0a\x7f\xc9\
53699\x00\x00\x08\xd0\x00\x00\x00\x00\x00\x01\x00\x04\xfa\xa6\53818\x00\x00\x09\x14\x00\x00\x00\x00\x00\x01\x00\x05\x01\x4f\
53700\x00\x00\x09\x20\x00\x00\x00\x00\x00\x01\x00\x0b\xa7\x3a\53819\x00\x00\x09\x64\x00\x00\x00\x00\x00\x01\x00\x0b\xad\xe3\
53701\x00\x00\x08\x6a\x00\x00\x00\x00\x00\x01\x00\x04\x4e\xd1\53820\x00\x00\x08\xae\x00\x00\x00\x00\x00\x01\x00\x04\x55\x7a\
53702\x00\x00\x08\x22\x00\x00\x00\x00\x00\x01\x00\x04\x4a\x1c\53821\x00\x00\x08\x66\x00\x00\x00\x00\x00\x01\x00\x04\x50\xc5\
53703\x00\x00\x08\x48\x00\x00\x00\x00\x00\x01\x00\x04\x4c\xba\53822\x00\x00\x08\x8c\x00\x00\x00\x00\x00\x01\x00\x04\x53\x63\
53704\x00\x00\x04\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x34\x45\53823\x00\x00\x04\xde\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xee\
53705\x00\x00\x03\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x1f\x4e\53824\x00\x00\x03\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x25\xf7\
53706\x00\x00\x03\xde\x00\x00\x00\x00\x00\x01\x00\x00\x26\x32\53825\x00\x00\x04\x22\x00\x00\x00\x00\x00\x01\x00\x00\x2c\xdb\
53707\x00\x00\x04\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x5c\53826\x00\x00\x04\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x32\x05\
53708\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x51\53827\x00\x00\x03\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x22\xfa\
53709\x00\x00\x03\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x21\x1e\53828\x00\x00\x03\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x27\xc7\
53710\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x00\x30\x68\53829\x00\x00\x04\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x37\x11\
53711\x00\x00\x04\xc0\x00\x00\x00\x00\x00\x01\x00\x00\x37\x27\53830\x00\x00\x05\x04\x00\x00\x00\x00\x00\x01\x00\x00\x3d\xd0\
53712\x00\x00\x04\x02\x00\x00\x00\x00\x00\x01\x00\x00\x28\xe6\53831\x00\x00\x04\x46\x00\x00\x00\x00\x00\x01\x00\x00\x2f\x8f\
53713\x00\x00\x03\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x23\x82\53832\x00\x00\x03\xec\x00\x00\x00\x00\x00\x01\x00\x00\x2a\x2b\
53714\x00\x00\x06\x6c\x00\x00\x00\x00\x00\x01\x00\x02\xf2\x16\53833\x00\x00\x06\xb0\x00\x00\x00\x00\x00\x01\x00\x02\xf8\xbf\
53715\x00\x00\x06\xd4\x00\x00\x00\x00\x00\x01\x00\x02\xfb\xa5\53834\x00\x00\x07\x18\x00\x00\x00\x00\x00\x01\x00\x03\x02\x4e\
53716\x00\x00\x06\x8c\x00\x00\x00\x00\x00\x01\x00\x02\xf5\xf3\53835\x00\x00\x06\xd0\x00\x00\x00\x00\x00\x01\x00\x02\xfc\x9c\
53717\x00\x00\x06\xb2\x00\x00\x00\x00\x00\x01\x00\x02\xf8\x6b\53836\x00\x00\x06\xf6\x00\x00\x00\x00\x00\x01\x00\x02\xff\x14\
53718\x00\x00\x06\x46\x00\x00\x00\x00\x00\x01\x00\x02\xef\x78\53837\x00\x00\x06\x8a\x00\x00\x00\x00\x00\x01\x00\x02\xf6\x21\
53719\x00\x00\x0c\x50\x00\x00\x00\x00\x00\x01\x00\x0c\xed\x2b\53838\x00\x00\x0c\x94\x00\x00\x00\x00\x00\x01\x00\x0c\xf3\xd4\
53720\x00\x00\x0b\xe6\x00\x00\x00\x00\x00\x01\x00\x0c\xe5\x56\53839\x00\x00\x0c\x2a\x00\x00\x00\x00\x00\x01\x00\x0c\xeb\xff\
53721\x00\x00\x0c\x0a\x00\x00\x00\x00\x00\x01\x00\x0c\xe7\xe7\53840\x00\x00\x0c\x4e\x00\x00\x00\x00\x00\x01\x00\x0c\xee\x90\
53722\x00\x00\x0c\x2c\x00\x00\x00\x00\x00\x01\x00\x0c\xe9\xfa\53841\x00\x00\x0c\x70\x00\x00\x00\x00\x00\x01\x00\x0c\xf0\xa3\
53723\x00\x00\x0b\xc4\x00\x00\x00\x00\x00\x01\x00\x0c\xe2\xb8\53842\x00\x00\x0c\x08\x00\x00\x00\x00\x00\x01\x00\x0c\xe9\x61\
53724\x00\x00\x09\x7c\x00\x00\x00\x00\x00\x01\x00\x0c\xba\xc3\53843\x00\x00\x09\xc0\x00\x00\x00\x00\x00\x01\x00\x0c\xc1\x6c\
53725\x00\x00\x09\x56\x00\x00\x00\x00\x00\x01\x00\x0c\xb8\x25\53844\x00\x00\x09\x9a\x00\x00\x00\x00\x00\x01\x00\x0c\xbe\xce\
53726\x00\x00\x0c\x9e\x00\x00\x00\x00\x00\x01\x00\x0c\xf1\xcf\53845\x00\x00\x0c\xe2\x00\x00\x00\x00\x00\x01\x00\x0c\xf8\x78\
53727\x00\x00\x0c\xc6\x00\x00\x00\x00\x00\x01\x00\x0c\xf4\x6d\53846\x00\x00\x0d\x0a\x00\x00\x00\x00\x00\x01\x00\x0c\xfb\x16\
53728\x00\x00\x0c\x7a\x00\x00\x00\x00\x00\x01\x00\x0c\xef\x2f\53847\x00\x00\x0c\xbe\x00\x00\x00\x00\x00\x01\x00\x0c\xf5\xd8\
53729\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x09\x05\53848\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x09\x05\
53730\x00\x00\x02\x12\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xa3\53849\x00\x00\x02\x12\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xa3\
53731\x00\x00\x0a\x24\x00\x00\x00\x00\x00\x01\x00\x0c\xc6\xe1\53850\x00\x00\x0a\x68\x00\x00\x00\x00\x00\x01\x00\x0c\xcd\x8a\
53732\x00\x00\x0a\x48\x00\x00\x00\x00\x00\x01\x00\x0c\xc9\xdf\53851\x00\x00\x0a\x8c\x00\x00\x00\x00\x00\x01\x00\x0c\xd0\x88\
53733\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x00\x0c\xc4\x43\53852\x00\x00\x0a\x44\x00\x00\x00\x00\x00\x01\x00\x0c\xca\xec\
53734\x00\x00\x09\x9e\x00\x00\x00\x00\x00\x01\x00\x0c\xbc\xda\53853\x00\x00\x09\xe2\x00\x00\x00\x00\x00\x01\x00\x0c\xc3\x83\
53735\x00\x00\x09\xdc\x00\x00\x00\x00\x00\x01\x00\x0c\xc1\xc1\53854\x00\x00\x0a\x20\x00\x00\x00\x00\x00\x01\x00\x0c\xc8\x6a\
53736\x00\x00\x09\xbc\x00\x00\x00\x00\x00\x01\x00\x0c\xbf\x21\53855\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x01\x00\x0c\xc5\xca\
53737\x00\x00\x02\x66\x00\x00\x00\x00\x00\x01\x00\x00\x10\x0c\53856\x00\x00\x02\x66\x00\x00\x00\x00\x00\x01\x00\x00\x10\x0c\
53738\x00\x00\x02\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x14\x2c\53857\x00\x00\x02\xd2\x00\x00\x00\x00\x00\x01\x00\x00\x17\xff\
53739\x00\x00\x02\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x16\x57\53858\x00\x00\x03\x04\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x2a\
53859\x00\x00\x02\xac\x00\x00\x00\x00\x00\x01\x00\x00\x15\xf9\
53740\x00\x00\x02\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x12\x26\53860\x00\x00\x02\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x12\x26\
53861\x00\x00\x03\x4a\x00\x00\x00\x00\x00\x01\x00\x00\x20\x24\
53741\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xba\53862\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xba\
53742\x00\x00\x03\x04\x00\x00\x00\x00\x00\x01\x00\x00\x18\xba\53863\x00\x00\x03\x26\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x8d\
53743\x00\x00\x0a\x68\x00\x00\x00\x00\x00\x01\x00\x0c\xcc\x62\53864\x00\x00\x0a\xac\x00\x00\x00\x00\x00\x01\x00\x0c\xd3\x0b\
53744\x00\x00\x0a\xca\x00\x00\x00\x00\x00\x01\x00\x0c\xd2\xd8\53865\x00\x00\x0b\x0e\x00\x00\x00\x00\x00\x01\x00\x0c\xd9\x81\
53745\x00\x00\x0a\x9c\x00\x00\x00\x00\x00\x01\x00\x0c\xcf\xc4\53866\x00\x00\x0a\xe0\x00\x00\x00\x00\x00\x01\x00\x0c\xd6\x6d\
53746\x00\x00\x0a\xf2\x00\x00\x00\x00\x00\x01\x00\x0c\xd5\x76\53867\x00\x00\x0b\x36\x00\x00\x00\x00\x00\x01\x00\x0c\xdc\x1f\
53747\x00\x00\x07\x8a\x00\x00\x00\x00\x00\x01\x00\x03\x37\xfb\53868\x00\x00\x07\xce\x00\x00\x00\x00\x00\x01\x00\x03\x3e\xa4\
53748\x00\x00\x07\x2a\x00\x00\x00\x00\x00\x01\x00\x03\x08\xbb\53869\x00\x00\x07\x6e\x00\x00\x00\x00\x00\x01\x00\x03\x0f\x64\
53749\x00\x00\x06\xfa\x00\x00\x00\x00\x00\x01\x00\x02\xfe\x27\53870\x00\x00\x07\x3e\x00\x00\x00\x00\x00\x01\x00\x03\x04\xd0\
53750\x00\x00\x07\x5a\x00\x00\x00\x00\x00\x01\x00\x03\x1d\xf0\53871\x00\x00\x07\x9e\x00\x00\x00\x00\x00\x01\x00\x03\x24\x99\
53751\x00\x00\x07\xba\x00\x00\x00\x00\x00\x01\x00\x03\x3c\x18\53872\x00\x00\x07\xfe\x00\x00\x00\x00\x00\x01\x00\x03\x42\xc1\
53752\x00\x00\x07\xee\x00\x00\x00\x00\x00\x01\x00\x04\x04\xb1\53873\x00\x00\x08\x32\x00\x00\x00\x00\x00\x01\x00\x04\x0b\x5a\
53753"53874"
5375453875
53755def qInitResources():53876def qInitResources():
5375653877
=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py 2009-06-29 05:07:32 +0000
+++ openlp/core/ui/__init__.py 2009-07-03 19:08:21 +0000
@@ -17,7 +17,7 @@
17this program; if not, write to the Free Software Foundation, Inc., 59 Temple17this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18Place, Suite 330, Boston, MA 02111-1307 USA18Place, Suite 330, Boston, MA 02111-1307 USA
19"""19"""
20from slidecontroller import BaseToolbar20from slidecontroller import MasterToolbar
21from slidecontrollermanager import SlideControllerManager21from slidecontrollermanager import SlideControllerManager
22from maindisplay import MainDisplay22from maindisplay import MainDisplay
23from amendthemeform import AmendThemeForm23from amendthemeform import AmendThemeForm
@@ -33,5 +33,5 @@
33from thememanager import ThemeManager33from thememanager import ThemeManager
34from mainwindow import MainWindow34from mainwindow import MainWindow
3535
36__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'BaseToolbar'36__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MasterToolbar'
37 'MainWindow', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', 'AmendThemeForm']37 'MainWindow', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', 'AmendThemeForm']
3838
=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py 2009-06-17 05:11:16 +0000
+++ openlp/core/ui/maindisplay.py 2009-07-03 19:08:21 +0000
@@ -78,7 +78,7 @@
78 def blankDisplay(self):78 def blankDisplay(self):
79 if not self.displayBlank:79 if not self.displayBlank:
80 self.displayBlank = True80 self.displayBlank = True
81 self.display.setPixmap(self.blankFrame)81 self.display.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame))
82 else:82 else:
83 self.displayBlank = False83 self.displayBlank = False
84 self.frameView(self.frame)84 self.frameView(self.frame)
8585
=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py 2009-06-29 05:07:32 +0000
+++ openlp/core/ui/mainwindow.py 2009-07-03 19:08:21 +0000
@@ -205,7 +205,7 @@
205 self.MediaManagerDock.setWindowIcon(icon)205 self.MediaManagerDock.setWindowIcon(icon)
206 self.MediaManagerDock.setFloating(False)206 self.MediaManagerDock.setFloating(False)
207 self.MediaManagerDock.setObjectName(u'MediaManagerDock')207 self.MediaManagerDock.setObjectName(u'MediaManagerDock')
208 self.MediaManagerDock.setMinimumWidth(250)208 self.MediaManagerDock.setMinimumWidth(300)
209 self.MediaManagerContents = QtGui.QWidget()209 self.MediaManagerContents = QtGui.QWidget()
210 self.MediaManagerContents.setObjectName(u'MediaManagerContents')210 self.MediaManagerContents.setObjectName(u'MediaManagerContents')
211 self.MediaManagerLayout = QtGui.QHBoxLayout(self.MediaManagerContents)211 self.MediaManagerLayout = QtGui.QHBoxLayout(self.MediaManagerContents)
@@ -227,7 +227,7 @@
227 self.ServiceManagerDock.setFeatures(227 self.ServiceManagerDock.setFeatures(
228 QtGui.QDockWidget.AllDockWidgetFeatures)228 QtGui.QDockWidget.AllDockWidgetFeatures)
229 self.ServiceManagerDock.setObjectName(u'ServiceManagerDock')229 self.ServiceManagerDock.setObjectName(u'ServiceManagerDock')
230 self.ServiceManagerDock.setMinimumWidth(250)230 self.ServiceManagerDock.setMinimumWidth(300)
231 self.ServiceManagerContents = ServiceManager(self)231 self.ServiceManagerContents = ServiceManager(self)
232 self.ServiceManagerDock.setWidget(self.ServiceManagerContents)232 self.ServiceManagerDock.setWidget(self.ServiceManagerContents)
233 self.mainWindow.addDockWidget(233 self.mainWindow.addDockWidget(
234234
=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py 2009-06-29 05:07:32 +0000
+++ openlp/core/ui/slidecontroller.py 2009-07-03 20:32:33 +0000
@@ -21,100 +21,28 @@
21import os21import os
2222
23from PyQt4 import QtCore, QtGui23from PyQt4 import QtCore, QtGui
24from openlp.core.lib import OpenLPToolbar, translate24from openlp.core.lib import OpenLPToolbar, translate, buildIcon
2525
26class SlideData(QtCore.QAbstractListModel):26class SlideList(QtGui.QTableWidget):
27 """
28 List of frames to be displayed on the list and the main display.
29 """
30 global log
31 log = logging.getLogger(u'SlideData')
32
33 def __init__(self):
34 QtCore.QAbstractListModel.__init__(self)
35 self.items = []
36 self.rowheight = 50
37 self.maximagewidth = self.rowheight * 16 / 9.0;
38 log.info(u'Starting')
39
40 def clear(self):
41 self.items = []
42
43 def columnCount(self, parent):
44 return 1
45
46 def rowCount(self, parent=None):
47 return len(self.items)
48
49 def insertRow(self, row, frame, framenumber):
50 self.beginInsertRows(QtCore.QModelIndex(), row, row)
51 log.info(u'insert row %d' % row)
52 # create a preview image
53 frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio,
54 QtCore.Qt.SmoothTransformation)
55 self.items.insert(row, (frame1, framenumber))
56 log.info(u'Item loaded')
57 self.endInsertRows()
58
59 def removeRow(self, row):
60 self.beginRemoveRows(QtCore.QModelIndex(), row, row)
61 self.items.pop(row)
62 self.endRemoveRows()
63
64 def addRow(self, frame, framenumber):
65 self.insertRow(len(self.items), frame, framenumber)
66
67 def data(self, index, role):
68 row = index.row()
69 if row > len(self.items):
70 # if the last row is selected and deleted, we then get called with
71 # an empty row!
72 return QtCore.QVariant()
73 if role == QtCore.Qt.DecorationRole:
74 retval = self.items[row][0]
75 else:
76 retval = QtCore.QVariant()
77 if type(retval) is not type(QtCore.QVariant):
78 return QtCore.QVariant(retval)
79 else:
80 return retval
81
82 def __iter__(self):
83 for item in self.items:
84 yield item
85
86 def getValue(self, index):
87 row = index.row()
88 return self.items[row]
89
90 def getItem(self, row):
91 log.info(u'Get Item:%d -> %s' %(row, unicode(self.items)))
92 return self.items[row]
93
94 def getList(self):
95 filelist = [item[3] for item in self.items];
96 return filelist
97
98class SlideList(QtGui.QListView):
9927
100 def __init__(self,parent=None,name=None):28 def __init__(self,parent=None,name=None):
101 QtGui.QListView.__init__(self,parent.Controller)29 QtGui.QTableWidget.__init__(self,parent.Controller)
102 self.parent = parent30 self.parent = parent
10331
104 def keyPressEvent(self, event):32 def keyPressEvent(self, event):
105 if type(event) == QtGui.QKeyEvent:33 if type(event) == QtGui.QKeyEvent:
106 #here accept the event and do something34 #here accept the event and do something
107 if event.key() == QtCore.Qt.Key_Up:35 if event.key() == QtCore.Qt.Key_Up:
108 self.parent.onSlideSelectedPrevious()36 self.parent.BaseToolbar.onSlideSelectedPrevious()
109 event.accept()37 event.accept()
110 elif event.key() == QtCore.Qt.Key_Down:38 elif event.key() == QtCore.Qt.Key_Down:
111 self.parent.onSlideSelectedNext()39 self.parent.BaseToolbar.onSlideSelectedNext()
112 event.accept()40 event.accept()
113 elif event.key() == QtCore.Qt.Key_PageUp:41 elif event.key() == QtCore.Qt.Key_PageUp:
114 self.parent.onSlideSelectedFirst()42 self.parent.BaseToolbar.onSlideSelectedFirst()
115 event.accept()43 event.accept()
116 elif event.key() == QtCore.Qt.Key_PageDown:44 elif event.key() == QtCore.Qt.Key_PageDown:
117 self.parent.onSlideSelectedLast()45 self.parent.BaseToolbar.onSlideSelectedLast()
118 event.accept()46 event.accept()
119 event.ignore()47 event.ignore()
120 else:48 else:
@@ -132,6 +60,7 @@
132 """60 """
133 Set up the Slide Controller.61 Set up the Slide Controller.
134 """62 """
63 self.toolbarList = {}
135 QtGui.QWidget.__init__(self, parent.mainWindow)64 QtGui.QWidget.__init__(self, parent.mainWindow)
136 self.isLive = isLive65 self.isLive = isLive
137 self.parent = parent66 self.parent = parent
@@ -145,7 +74,7 @@
145 self.PanelLayout.setMargin(0)74 self.PanelLayout.setMargin(0)
146 # Actual controller section75 # Actual controller section
147 self.Controller = QtGui.QWidget(self.Splitter)76 self.Controller = QtGui.QWidget(self.Splitter)
148 self.Controller.setGeometry(QtCore.QRect(0, 0, 800, 536))77 self.Controller.setGeometry(QtCore.QRect(0, 0, 100, 536))
149 self.Controller.setSizePolicy(78 self.Controller.setSizePolicy(
150 QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,79 QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
151 QtGui.QSizePolicy.Maximum))80 QtGui.QSizePolicy.Maximum))
@@ -153,21 +82,17 @@
153 self.ControllerLayout.setSpacing(0)82 self.ControllerLayout.setSpacing(0)
154 self.ControllerLayout.setMargin(0)83 self.ControllerLayout.setMargin(0)
155 # Controller list view84 # Controller list view
156 self.PreviewListView = SlideList(self)85 self.PreviewListWidget = SlideList(self)
157 self.PreviewListView.setUniformItemSizes(True)86 self.PreviewListWidget.setColumnCount(1)
158 self.PreviewListView.setIconSize(QtCore.QSize(250, 190))87 self.PreviewListWidget.horizontalHeader().setVisible(False)
159 self.PreviewListData = SlideData()88 self.PreviewListWidget.verticalHeader().setVisible(False)
160 self.PreviewListView.isLive = self.isLive89 self.PreviewListWidget.setColumnWidth(1, self.Controller.width())
161 if QtCore.QT_VERSION_STR > u'4.4.0':90 self.PreviewListWidget.isLive = self.isLive
162 self.PreviewListView.setFlow(1)91 self.PreviewListWidget.setObjectName(u'PreviewListWidget')
163 self.PreviewListView.setViewMode(1)92 self.ControllerLayout.addWidget(self.PreviewListWidget)
164 self.PreviewListView.setWrapping(False)
165 self.PreviewListView.setModel(self.PreviewListData)
166 self.PreviewListView.setSpacing(0)
167 self.PreviewListView.setObjectName(u'PreviewListView')
168 self.ControllerLayout.addWidget(self.PreviewListView)
169 # Plugin the Base Toolbar class93 # Plugin the Base Toolbar class
170 self.BaseToolbar = BaseToolbar(self.isLive)94 self.BaseToolbar = MasterToolbar(self.isLive)
95 self.registerToolbar(u'master', self.BaseToolbar)
171 self.Toolbar = self.BaseToolbar.getToolbar()96 self.Toolbar = self.BaseToolbar.getToolbar()
172 self.ControllerLayout.addWidget(self.Toolbar)97 self.ControllerLayout.addWidget(self.Toolbar)
173 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,98 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
@@ -179,7 +104,7 @@
179 self.Toolbar.setSizePolicy(sizeToolbarPolicy)104 self.Toolbar.setSizePolicy(sizeToolbarPolicy)
180 # Screen preview area105 # Screen preview area
181 self.PreviewFrame = QtGui.QFrame(self.Splitter)106 self.PreviewFrame = QtGui.QFrame(self.Splitter)
182 self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 250, 190))107 self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 280, 190))
183 self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy(108 self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy(
184 QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum))109 QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum))
185 self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)110 self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel)
@@ -197,44 +122,83 @@
197 sizePolicy.setHeightForWidth(122 sizePolicy.setHeightForWidth(
198 self.SlidePreview.sizePolicy().hasHeightForWidth())123 self.SlidePreview.sizePolicy().hasHeightForWidth())
199 self.SlidePreview.setSizePolicy(sizePolicy)124 self.SlidePreview.setSizePolicy(sizePolicy)
200 self.SlidePreview.setMinimumSize(QtCore.QSize(280, 210))125 self.SlidePreview.setFixedSize(QtCore.QSize(250, 210))
201 self.SlidePreview.setFrameShape(QtGui.QFrame.Box)126 self.SlidePreview.setFrameShape(QtGui.QFrame.Box)
202 self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)127 self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)
203 self.SlidePreview.setLineWidth(1)128 self.SlidePreview.setLineWidth(1)
204 self.SlidePreview.setScaledContents(True)129 self.SlidePreview.setScaledContents(True)
205 self.SlidePreview.setObjectName(u'SlidePreview')130 self.SlidePreview.setObjectName(u'SlidePreview')
206 self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1)131 self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1)
207 QtCore.QObject.connect(self.PreviewListView,132 # Signals
133 QtCore.QObject.connect(self.PreviewListWidget,
208 QtCore.SIGNAL(u'clicked(QModelIndex)'), self.BaseToolbar.onSlideSelected)134 QtCore.SIGNAL(u'clicked(QModelIndex)'), self.BaseToolbar.onSlideSelected)
209 QtCore.QObject.connect(self.PreviewListView,135 QtCore.QObject.connect(self.PreviewListWidget,
210 QtCore.SIGNAL(u'activated(QModelIndex)'), self.BaseToolbar.onSlideSelected)136 QtCore.SIGNAL(u'activated(QModelIndex)'), self.BaseToolbar.onSlideSelected)
211 # Add Late Arrivals137 # Add Late Arrivals
212 self.BaseToolbar.PreviewListView = self.PreviewListView138 self.BaseToolbar.PreviewListWidget = self.PreviewListWidget
213 self.BaseToolbar.PreviewListData = self.PreviewListData
214 self.BaseToolbar.SlidePreview = self.SlidePreview139 self.BaseToolbar.SlidePreview = self.SlidePreview
215 self.BaseToolbar.mainDisplay = self.parent.mainDisplay140 self.BaseToolbar.mainDisplay = self.parent.mainDisplay
216141
142 def registerToolbar(self, handle,controller):
143 #store the handle name in lower case so no probems later
144 self.toolbarList[handle.lower()] = controller
145
146 def retrieveToolbar(self, handle):
147 """
148 Find the toolbar and return master if none present
149 Add extra information back into toolbar class
150 """
151 try:
152 toolbar = self.toolbarList[handle.lower()]
153 except:
154 toolbar = self.toolbarList[u'master']
155 toolbar.PreviewListWidget = self.PreviewListWidget
156 toolbar.SlidePreview = self.SlidePreview
157 toolbar.mainDisplay = self.parent.mainDisplay
158 return toolbar
159
217 def addServiceItem(self, item):160 def addServiceItem(self, item):
161 """
162 helper method to pass item to correct toolbar
163 """
164 self.BaseToolbar = self.retrieveToolbar(item.shortname)
165 self.ControllerLayout.removeWidget(self.Toolbar)
166 #remove the old toolbar
167 self.Toolbar.clear()
168 self.Toolbar = self.BaseToolbar.getToolbar()
169 self.ControllerLayout.addWidget(self.Toolbar)
218 self.BaseToolbar.addServiceItem(item)170 self.BaseToolbar.addServiceItem(item)
219171
220 def addServiceManagerItem(self, item, slideno):172 def addServiceManagerItem(self, item, slideno):
173 """
174 helper method to pass item to correct toolbar
175 """
176 self.BaseToolbar = self.retrieveToolbar(item.shortname)
177 self.ControllerLayout.removeWidget(self.Toolbar)
178 #remove the old toolbar
179 self.Toolbar.clear()
180 self.Toolbar = self.BaseToolbar.getToolbar()
181 self.ControllerLayout.addWidget(self.Toolbar)
221 self.BaseToolbar.addServiceManagerItem(item, slideno)182 self.BaseToolbar.addServiceManagerItem(item, slideno)
222183
223class BaseToolbar(object):184class MasterToolbar(QtCore.QObject):
224185 """
186 Class from which all tollbars should extend
187 """
225 def __init__(self, isLive):188 def __init__(self, isLive):
226 self.Toolbar = None189 self.Toolbar = None
227 self.PreviewListView = QtGui.QListWidget()190 QtCore.QObject.__init__(self)
228 self.PreviewListData = None191 self.PreviewListWidget = QtGui.QListWidget()
229 self.isLive = isLive192 self.isLive = isLive
193
194 def getToolbar(self):
195 #define toolbar here as it needs to be redefined each time
196 #as the clear destroys it.
230 self.defineToolbar()197 self.defineToolbar()
231
232 def getToolbar(self):
233 return self.Toolbar198 return self.Toolbar
234199
235 def defineToolbar(self):200 def defineToolbar(self):
236 # Controller toolbar201 # Controller toolbar
237 #self.Toolbar = OpenLPToolbar(self.Controller)
238 self.Toolbar = OpenLPToolbar(self)202 self.Toolbar = OpenLPToolbar(self)
239 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,203 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
240 QtGui.QSizePolicy.Fixed)204 QtGui.QSizePolicy.Fixed)
@@ -249,11 +213,11 @@
249 u':/slides/slide_first.png',213 u':/slides/slide_first.png',
250 translate(u'SlideController', u'Move to first'),214 translate(u'SlideController', u'Move to first'),
251 self.onSlideSelectedFirst)215 self.onSlideSelectedFirst)
252 self.Toolbar.addToolbarButton(u'Last Slide',216 self.Toolbar.addToolbarButton(u'Previous Slide',
253 u':/slides/slide_previous.png',217 u':/slides/slide_previous.png',
254 translate(u'SlideController', u'Move to previous'),218 translate(u'SlideController', u'Move to previous'),
255 self.onSlideSelectedPrevious)219 self.onSlideSelectedPrevious)
256 self.Toolbar.addToolbarButton(u'First Slide',220 self.Toolbar.addToolbarButton(u'Next Slide',
257 u':/slides/slide_next.png',221 u':/slides/slide_next.png',
258 translate(u'SlideController', u'Move to next'),222 translate(u'SlideController', u'Move to next'),
259 self.onSlideSelectedNext)223 self.onSlideSelectedNext)
@@ -272,56 +236,35 @@
272 """236 """
273 Go to the first slide.237 Go to the first slide.
274 """238 """
275 row = self.PreviewListData.createIndex(0, 0)239 self.PreviewListWidget.selectRow(0)
276 if row.isValid():240 self.onSlideSelected()
277 self.PreviewListView.selectionModel().setCurrentIndex(row,
278 QtGui.QItemSelectionModel.SelectCurrent)
279 self.onSlideSelected(row)
280241
281 def onSlideSelectedNext(self):242 def onSlideSelectedNext(self):
282 """243 """
283 Go to the next slide.244 Go to the next slide.
284 """245 """
285 indexes = self.PreviewListView.selectedIndexes()246 row = self.PreviewListWidget.currentRow() + 1
286 rowNumber = 0247 if row == self.PreviewListWidget.rowCount():
287 for index in indexes:248 row = 0
288 if index.row() == self.PreviewListData.rowCount() - 1:249 self.PreviewListWidget.selectRow(row)
289 rowNumber = 0250 self.onSlideSelected()
290 else:
291 rowNumber = index.row() + 1
292 row = self.PreviewListData.createIndex(rowNumber, 0)
293 if row.isValid():
294 self.PreviewListView.selectionModel().setCurrentIndex(row,
295 QtGui.QItemSelectionModel.SelectCurrent)
296 self.onSlideSelected(row)
297251
298 def onSlideSelectedPrevious(self):252 def onSlideSelectedPrevious(self):
299 """253 """
300 Go to the previous slide.254 Go to the previous slide.
301 """255 """
302 indexes = self.PreviewListView.selectedIndexes()256 row = self.PreviewListWidget.currentRow() - 1
303 rowNumber = 0257 if row == -1:
304 for index in indexes:258 row = self.PreviewListWidget.rowCount() - 1
305 if index.row() == 0:259 self.PreviewListWidget.selectRow(row)
306 rowNumber = self.PreviewListData.rowCount() - 1260 self.onSlideSelected()
307 else:
308 rowNumber = index.row() - 1
309 row = self.PreviewListData.createIndex(rowNumber, 0)
310 if row.isValid():
311 self.PreviewListView.selectionModel().setCurrentIndex(row,
312 QtGui.QItemSelectionModel.SelectCurrent)
313 self.onSlideSelected(row)
314261
315 def onSlideSelectedLast(self):262 def onSlideSelectedLast(self):
316 """263 """
317 Go to the last slide.264 Go to the last slide.
318 """265 """
319 row = self.PreviewListData.createIndex(266 self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1)
320 self.PreviewListData.rowCount() - 1, 0)267 self.onSlideSelected()
321 if row.isValid():
322 self.PreviewListView.selectionModel().setCurrentIndex(row,
323 QtGui.QItemSelectionModel.SelectCurrent)
324 self.onSlideSelected(row)
325268
326 def onBlankScreen(self):269 def onBlankScreen(self):
327 """270 """
@@ -329,54 +272,56 @@
329 """272 """
330 self.mainDisplay.blankDisplay()273 self.mainDisplay.blankDisplay()
331274
332 def onSlideSelected(self, index):275 def onSlideSelected(self):
333 """276 """
334 Generate the preview when you click on a slide.277 Generate the preview when you click on a slide.
335 """278 if this is the Live Controller also display on the screen
336 frame = self.PreviewListData.getValue(index)279 """
337 self.previewFrame(frame)280 row = self.PreviewListWidget.currentRow()
338281 if row > -1 and row < self.PreviewListWidget.rowCount():
339 def previewFrame(self, frame):282 label = self.PreviewListWidget.cellWidget(row, 0)
340 """283 smallframe = label.pixmap()
341 Generates a preview of the current slide.284 frame = self.serviceitem.frames[row][u'image']
342 """285 self.SlidePreview.setPixmap(smallframe)
343 self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[0]))286 if self.isLive:
344 if self.isLive:287 self.mainDisplay.frameView(frame)
345 no = frame[1]288
346 LiveFrame = self.serviceitem.frames[no][u'image']289 def addServiceItem(self, serviceitem, slideno = 1):
347 self.mainDisplay.frameView(LiveFrame)290 """
348291 Loads a ServiceItem into the system from plugins
349 def addServiceItem(self, serviceitem):292 Display the first slide
350 """
351 Loads a ServiceItem.
352 """293 """
353 log.debug(u'add Service Item')294 log.debug(u'add Service Item')
354 self.serviceitem = serviceitem295 serviceitem.render()
355 self.serviceitem.render()296 self.addServiceManagerItem(serviceitem, 0)
356 self.PreviewListData.clear()
357 framenumber = 0
358 for frame in self.serviceitem.frames:
359 self.PreviewListData.addRow(frame[u'image'], framenumber)
360 framenumber += 1
361 row = self.PreviewListData.createIndex(0, 0)
362 if row.isValid():
363 self.PreviewListView.selectionModel().setCurrentIndex(row,
364 QtGui.QItemSelectionModel.SelectCurrent)
365 self.onSlideSelected(row)
366297
367 def addServiceManagerItem(self, serviceitem, slideno):298 def addServiceManagerItem(self, serviceitem, slideno):
368 """299 """
369 Loads a ServiceManagerItem.300 Loads a ServiceItem into the system from ServiceManager
301 Display the Slide Passed
370 """302 """
371 log.debug(u'add Service Manager Item')303 log.debug(u'add Service Manager Item')
372 self.PreviewListData.clear()304 self.PreviewListWidget.clear()
305 self.PreviewListWidget.setRowCount(0)
373 self.serviceitem = serviceitem306 self.serviceitem = serviceitem
374 framenumber = 0307 framenumber = 0
375 for frame in self.serviceitem.frames:308 for frame in self.serviceitem.frames:
376 self.PreviewListData.addRow(frame[u'image'], framenumber)309 self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1)
310 pixmap = QtGui.QPixmap.fromImage(frame[u'image'])
311 item = QtGui.QTableWidgetItem()
312 label = QtGui.QLabel()
313 label.setMargin(15)
314 label.setScaledContents(True)
315 width = 300
316 height = width * pixmap.height() / pixmap.width()
317 label.setPixmap(pixmap)
318 self.PreviewListWidget.setCellWidget(framenumber, 0,label)
319 self.PreviewListWidget.setItem( framenumber, 0, item)
320 self.PreviewListWidget.setRowHeight(framenumber, height)
321 self.PreviewListWidget.setColumnWidth(0, width)
377 framenumber += 1322 framenumber += 1
378 row = self.PreviewListData.createIndex(slideno, 0)323 if slideno > self.PreviewListWidget.rowCount():
379 if row.isValid():324 self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount())
380 self.PreviewListView.selectionModel().setCurrentIndex(row,325 else:
381 QtGui.QItemSelectionModel.SelectCurrent)326 self.PreviewListWidget.selectRow(slideno)
382 self.onSlideSelected(row)327 self.onSlideSelected()
383328
=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py 2009-06-29 05:07:32 +0000
+++ openlp/core/ui/thememanager.py 2009-07-02 19:04:50 +0000
@@ -177,7 +177,6 @@
177 items = self.ThemeListView.selectedIndexes()177 items = self.ThemeListView.selectedIndexes()
178 if len(items) > 0:178 if len(items) > 0:
179 for item in items:179 for item in items:
180 print item
181 data = self.themeData.getValue(item)180 data = self.themeData.getValue(item)
182 self.amendThemeForm.loadTheme(data[3])181 self.amendThemeForm.loadTheme(data[3])
183 self.amendThemeForm.exec_()182 self.amendThemeForm.exec_()
@@ -222,7 +221,10 @@
222 for root, dirs, files in os.walk(self.path):221 for root, dirs, files in os.walk(self.path):
223 for name in files:222 for name in files:
224 if name.endswith(u'.png'):223 if name.endswith(u'.png'):
225 self.themeData.addRow(os.path.join(self.path, name))224 #check to see file is in route directory
225 theme = os.path.join(self.path, name)
226 if os.path.exists(theme):
227 self.themeData.addRow(theme)
226 self.parent.EventManager.post_event(Event(EventType.ThemeListChanged))228 self.parent.EventManager.post_event(Event(EventType.ThemeListChanged))
227 self.parent.ServiceManagerContents.updateThemeList(self.getThemes())229 self.parent.ServiceManagerContents.updateThemeList(self.getThemes())
228 self.parent.settingsForm.ThemesTab.updateThemeList(self.getThemes())230 self.parent.settingsForm.ThemesTab.updateThemeList(self.getThemes())
229231
=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py 2009-06-26 17:51:43 +0000
+++ openlp/plugins/bibles/bibleplugin.py 2009-07-03 20:32:33 +0000
@@ -37,7 +37,7 @@
37 self.weight = -937 self.weight = -9
38 # Create the plugin icon38 # Create the plugin icon
39 self.icon = QtGui.QIcon()39 self.icon = QtGui.QIcon()
40 self.icon.addPixmap(QtGui.QPixmap(u':/media/media_verse.png'),40 self.icon.addPixmap(QtGui.QPixmap(u':/media/media_bible.png'),
41 QtGui.QIcon.Normal, QtGui.QIcon.Off)41 QtGui.QIcon.Normal, QtGui.QIcon.Off)
42 #Register the bible Manager42 #Register the bible Manager
43 self.biblemanager = BibleManager(self.config)43 self.biblemanager = BibleManager(self.config)
4444
=== modified file 'openlp/plugins/bibles/lib/manager.py'
--- openlp/plugins/bibles/lib/manager.py 2009-06-20 19:11:17 +0000
+++ openlp/plugins/bibles/lib/manager.py 2009-07-03 20:32:33 +0000
@@ -245,7 +245,7 @@
245 log.debug(u'get_verse_text : new book')245 log.debug(u'get_verse_text : new book')
246 for chapter in range(schapter, echapter+1):246 for chapter in range(schapter, echapter+1):
247 search_results = self.bible_http_cache [bible].get_bible_chapter(bible, 0, bookname, chapter)247 search_results = self.bible_http_cache [bible].get_bible_chapter(bible, 0, bookname, chapter)
248 if search_results.has_verse_list() :248 if search_results.has_verselist() :
249 ## We have found a book of the bible lets check to see if it was there.249 ## We have found a book of the bible lets check to see if it was there.
250 ## By reusing the returned book name we get a correct book.250 ## By reusing the returned book name we get a correct book.
251 ## For example it is possible to request ac and get Acts back.251 ## For example it is possible to request ac and get Acts back.
252252
=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py 2009-06-29 05:07:32 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py 2009-07-04 05:52:30 +0000
@@ -21,7 +21,7 @@
2121
22from PyQt4 import QtCore, QtGui22from PyQt4 import QtCore, QtGui
2323
24from openlp.core.lib import ServiceItem, MediaManagerItem, Receiver, translate24from openlp.core.lib import ServiceItem, MediaManagerItem, Receiver, translate, contextMenuAction, contextMenuSeparator
25from openlp.plugins.bibles.forms import BibleImportForm25from openlp.plugins.bibles.forms import BibleImportForm
2626
27class BibleList(QtGui.QListWidget):27class BibleList(QtGui.QListWidget):
@@ -215,13 +215,13 @@
215 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick)215 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick)
216 # Context Menus216 # Context Menus
217 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)217 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
218 self.ListView.addAction(self.contextMenuAction(218 self.ListView.addAction(contextMenuAction(
219 self.ListView, u':/system/system_preview.png',219 self.ListView, u':/system/system_preview.png',
220 translate(u'BibleMediaItem',u'&Preview Verse'), self.onPreviewClick))220 translate(u'BibleMediaItem',u'&Preview Verse'), self.onPreviewClick))
221 self.ListView.addAction(self.contextMenuAction(221 self.ListView.addAction(contextMenuAction(
222 self.ListView, u':/system/system_live.png',222 self.ListView, u':/system/system_live.png',
223 translate(u'BibleMediaItem',u'&Show Live'), self.onLiveClick))223 translate(u'BibleMediaItem',u'&Show Live'), self.onLiveClick))
224 self.ListView.addAction(self.contextMenuAction(224 self.ListView.addAction(contextMenuAction(
225 self.ListView, u':/system/system_add.png',225 self.ListView, u':/system/system_add.png',
226 translate(u'BibleMediaItem',u'&Add to Service'), self.onAddClick))226 translate(u'BibleMediaItem',u'&Add to Service'), self.onAddClick))
227227
228228
=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py 2009-06-27 19:55:55 +0000
+++ openlp/plugins/custom/lib/mediaitem.py 2009-07-04 05:52:30 +0000
@@ -21,7 +21,7 @@
2121
22from PyQt4 import QtCore, QtGui22from PyQt4 import QtCore, QtGui
2323
24from openlp.core.lib import MediaManagerItem, SongXMLParser, ServiceItem, translate24from openlp.core.lib import MediaManagerItem, SongXMLParser, ServiceItem, translate, contextMenuAction, contextMenuSeparator
2525
26class CustomList(QtGui.QListWidget):26class CustomList(QtGui.QListWidget):
2727
@@ -114,17 +114,17 @@
114 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onCustomPreviewClick)114 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onCustomPreviewClick)
115 #define and add the context menu115 #define and add the context menu
116 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)116 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
117 self.ListView.addAction(self.contextMenuAction(self.ListView,117 self.ListView.addAction(contextMenuAction(self.ListView,
118 ':/custom/custom_edit.png', translate(u'CustomMediaItem', u'&Edit Custom'),118 ':/custom/custom_edit.png', translate(u'CustomMediaItem', u'&Edit Custom'),
119 self.onCustomEditClick))119 self.onCustomEditClick))
120 self.ListView.addAction(self.contextMenuSeparator(self.ListView))120 self.ListView.addAction(contextMenuSeparator(self.ListView))
121 self.ListView.addAction(self.contextMenuAction(121 self.ListView.addAction(contextMenuAction(
122 self.ListView, ':/system/system_preview.png',122 self.ListView, ':/system/system_preview.png',
123 translate(u'CustomMediaItem',u'&Preview Custom'), self.onCustomPreviewClick))123 translate(u'CustomMediaItem',u'&Preview Custom'), self.onCustomPreviewClick))
124 self.ListView.addAction(self.contextMenuAction(124 self.ListView.addAction(contextMenuAction(
125 self.ListView, ':/system/system_live.png',125 self.ListView, ':/system/system_live.png',
126 translate(u'CustomMediaItem',u'&Show Live'), self.onCustomLiveClick))126 translate(u'CustomMediaItem',u'&Show Live'), self.onCustomLiveClick))
127 self.ListView.addAction(self.contextMenuAction(127 self.ListView.addAction(contextMenuAction(
128 self.ListView, ':/system/system_add.png',128 self.ListView, ':/system/system_add.png',
129 translate(u'CustomMediaItem',u'&Add to Service'), self.onCustomAddClick))129 translate(u'CustomMediaItem',u'&Add to Service'), self.onCustomAddClick))
130130
131131
=== modified file 'openlp/plugins/images/imageplugin.py'
--- openlp/plugins/images/imageplugin.py 2009-06-27 15:33:03 +0000
+++ openlp/plugins/images/imageplugin.py 2009-07-03 20:32:33 +0000
@@ -22,7 +22,7 @@
22from PyQt4 import QtCore, QtGui22from PyQt4 import QtCore, QtGui
2323
24from openlp.core.lib import Plugin, Event, EventType24from openlp.core.lib import Plugin, Event, EventType
25from openlp.plugins.images.lib import ImageMediaItem25from openlp.plugins.images.lib import ImageMediaItem, ImageTab
2626
27class ImagePlugin(Plugin):27class ImagePlugin(Plugin):
28 global log28 global log
@@ -40,6 +40,10 @@
40 # passed with drag and drop messages40 # passed with drag and drop messages
41 self.dnd_id = u'Image'41 self.dnd_id = u'Image'
4242
43 def get_settings_tab(self):
44 self.ImageTab = ImageTab()
45 return self.ImageTab
46
43 def get_media_manager_item(self):47 def get_media_manager_item(self):
44 # Create the MediaManagerItem object48 # Create the MediaManagerItem object
45 self.media_item = ImageMediaItem(self, self.icon, u'Images')49 self.media_item = ImageMediaItem(self, self.icon, u'Images')
4650
=== modified file 'openlp/plugins/images/lib/__init__.py'
--- openlp/plugins/images/lib/__init__.py 2009-06-29 05:07:32 +0000
+++ openlp/plugins/images/lib/__init__.py 2009-07-03 20:32:33 +0000
@@ -19,3 +19,4 @@
19"""19"""
20from mediaitem import ImageMediaItem20from mediaitem import ImageMediaItem
21from imageslidecontroller import ImageToolbar21from imageslidecontroller import ImageToolbar
22from imagetab import ImageTab
2223
=== modified file 'openlp/plugins/images/lib/imageslidecontroller.py'
--- openlp/plugins/images/lib/imageslidecontroller.py 2009-06-29 05:07:32 +0000
+++ openlp/plugins/images/lib/imageslidecontroller.py 2009-07-03 20:32:33 +0000
@@ -22,23 +22,20 @@
2222
23from PyQt4 import QtCore, QtGui23from PyQt4 import QtCore, QtGui
24from openlp.core.lib import OpenLPToolbar, translate24from openlp.core.lib import OpenLPToolbar, translate
25from openlp.core.ui.slidecontroller import BaseToolbar25from openlp.core.ui.slidecontroller import MasterToolbar
2626
27class ImageToolbar(BaseToolbar):27class ImageToolbar(MasterToolbar):
2828
29 def __init__(self, isLive):29 def __init__(self, parent, isLive):
30 MasterToolbar.__init__(self, isLive)
31 self.parent = parent
30 self.Toolbar = None32 self.Toolbar = None
31 self.PreviewListView = QtGui.QListWidget()
32 self.PreviewListData = None
33 self.isLive = isLive33 self.isLive = isLive
34 self.defineToolbar()34 self.defineToolbar()
3535
36 def getToolbar(self):
37 return self.Toolbar
38
39 def defineToolbar(self):36 def defineToolbar(self):
40 # Controller toolbar37 # Controller toolbar
41 #self.Toolbar = OpenLPToolbar(self.Controller)38 self.Toolbar = OpenLPToolbar(self)
42 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,39 sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
43 QtGui.QSizePolicy.Fixed)40 QtGui.QSizePolicy.Fixed)
44 sizeToolbarPolicy.setHorizontalStretch(0)41 sizeToolbarPolicy.setHorizontalStretch(0)
@@ -50,11 +47,11 @@
50 u':/slides/slide_first.png',47 u':/slides/slide_first.png',
51 translate(u'SlideController', u'Move to first'),48 translate(u'SlideController', u'Move to first'),
52 self.onSlideSelectedFirst)49 self.onSlideSelectedFirst)
53 self.Toolbar.addToolbarButton(u'Last Slide',50 self.Toolbar.addToolbarButton(u'Previous Slide',
54 u':/slides/slide_previous.png',51 u':/slides/slide_previous.png',
55 translate(u'SlideController', u'Move to previous'),52 translate(u'SlideController', u'Move to previous'),
56 self.onSlideSelectedPrevious)53 self.onSlideSelectedPrevious)
57 self.Toolbar.addToolbarButton(u'First Slide',54 self.Toolbar.addToolbarButton(u'Next Slide',
58 u':/slides/slide_next.png',55 u':/slides/slide_next.png',
59 translate(u'SlideController', u'Move to next'),56 translate(u'SlideController', u'Move to next'),
60 self.onSlideSelectedNext)57 self.onSlideSelectedNext)
@@ -70,34 +67,29 @@
70 self.onBlankScreen)67 self.onBlankScreen)
71 self.Toolbar.addSeparator()68 self.Toolbar.addSeparator()
72 self.Toolbar.addToolbarButton(u'Start Loop',69 self.Toolbar.addToolbarButton(u'Start Loop',
73 u':/slides/slide_last.png',70 u':/media/media_time.png',
74 translate(u'SlideController', u'Start continuous loop'),71 translate(u'SlideController', u'Start continuous loop'),
75 self.onStartLoop)72 self.onStartLoop)
76 self.Toolbar.addToolbarButton(u'Stop Loop',73 self.Toolbar.addToolbarButton(u'Stop Loop',
77 u':/slides/slide_last.png',74 u':/media/media_stop.png',
78 translate(u'SlideController', u'Start continuous loop'),75 translate(u'SlideController', u'Stop continuous loop'),
79 self.onStopLoop)76 self.onStopLoop)
80 self.Toolbar.setSizePolicy(sizeToolbarPolicy)77 self.Toolbar.setSizePolicy(sizeToolbarPolicy)
81 self.ControllerLayout.addWidget(self.Toolbar)
8278
83 def onStartLoop(self):79 def onStartLoop(self):
84 """80 """
85 Go to the last slide.81 Go to the last slide.
86 """82 """
87 row = self.PreviewListData.createIndex(83 delay = self.parent.parent.ImageTab.loop_delay
88 self.PreviewListData.rowCount() - 1, 0)84 self.timer_id = self.startTimer(delay * 1000)
89 if row.isValid():
90 self.PreviewListView.selectionModel().setCurrentIndex(row,
91 QtGui.QItemSelectionModel.SelectCurrent)
92 self.onSlideSelected(row)
9385
94 def onStopLoop(self):86 def onStopLoop(self):
95 """87 """
96 Go to the last slide.88 Go to the last slide.
97 """89 """
98 row = self.PreviewListData.createIndex(90 self.killTimer(self.timer_id)
99 self.PreviewListData.rowCount() - 1, 0)91
100 if row.isValid():92 def timerEvent(self, event):
101 self.PreviewListView.selectionModel().setCurrentIndex(row,93 if event.timerId() == self.timer_id:
102 QtGui.QItemSelectionModel.SelectCurrent)94 self.onSlideSelectedNext()
103 self.onSlideSelected(row)95
10496
=== added file 'openlp/plugins/images/lib/imagetab.py'
--- openlp/plugins/images/lib/imagetab.py 1970-01-01 00:00:00 +0000
+++ openlp/plugins/images/lib/imagetab.py 2009-07-03 20:33:41 +0000
@@ -0,0 +1,69 @@
1# -*- coding: utf-8 -*-
2# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
3"""
4OpenLP - Open Source Lyrics Projection
5Copyright (c) 2008 Raoul Snyman
6Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley,
7
8This program is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free Software
10Foundation; version 2 of the License.
11
12This program is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License along with
17this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18Place, Suite 330, Boston, MA 02111-1307 USA
19"""
20
21from PyQt4 import QtCore, QtGui
22
23from openlp.core.lib import SettingsTab, str_to_bool, translate
24
25class ImageTab(SettingsTab):
26 """
27 ImageTab is the Image settings tab in the settings dialog.
28 """
29 def __init__(self):
30 SettingsTab.__init__(self, translate(u'ImageTab', u'Image'), u'Image')
31
32 def setupUi(self):
33 self.setObjectName(u'ImageTab')
34 self.ImageLayout = QtGui.QFormLayout(self)
35 self.ImageLayout.setObjectName(u'ImageLayout')
36 self.ImageModeGroupBox = QtGui.QGroupBox(self)
37 self.ImageModeGroupBox.setObjectName(u'ImageModeGroupBox')
38 self.TimeoutLayout = QtGui.QHBoxLayout(self.ImageModeGroupBox)
39 self.TimeoutLayout.setSpacing(8)
40 self.TimeoutLayout.setMargin(0)
41 self.TimeoutLayout.setObjectName(u'TimeoutLayout')
42 self.TimeoutLabel = QtGui.QLabel(self.ImageModeGroupBox)
43 self.TimeoutLabel.setObjectName(u'TimeoutLabel')
44 self.TimeoutLayout.addWidget(self.TimeoutLabel)
45 self.TimeoutSpinBox = QtGui.QSpinBox(self.ImageModeGroupBox)
46 self.TimeoutSpinBox.setMaximum(180)
47 self.TimeoutSpinBox.setObjectName(u'TimeoutSpinBox')
48 self.TimeoutLayout.addWidget(self.TimeoutSpinBox)
49 self.TimeoutSpacer = QtGui.QSpacerItem(147, 20,
50 QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
51 self.TimeoutLayout.addItem(self.TimeoutSpacer)
52
53 self.ImageLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.ImageModeGroupBox)
54 # Signals and slots
55 QtCore.QObject.connect(self.TimeoutSpinBox,
56 QtCore.SIGNAL(u'valueChanged(int)'), self.onTimeoutSpinBoxChanged)
57
58 def retranslateUi(self):
59 self.TimeoutLabel.setText(translate(u'ImageTab', u'Slide Loop Delay:'))
60
61 def onTimeoutSpinBoxChanged(self):
62 self.loop_delay = self.TimeoutSpinBox.value()
63
64 def load(self):
65 self.loop_delay = int(self.config.get_config(u'loop delay', 5))
66 self.TimeoutSpinBox.setValue(self.loop_delay)
67
68 def save(self):
69 self.config.set_config(u'loop delay', self.loop_delay)
070
=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py 2009-06-29 05:13:06 +0000
+++ openlp/plugins/images/lib/mediaitem.py 2009-07-04 05:52:30 +0000
@@ -53,12 +53,12 @@
53 # this next is a class, not an instance of a class - it will53 # this next is a class, not an instance of a class - it will
54 # be instanced by the base MediaManagerItem54 # be instanced by the base MediaManagerItem
55 self.ListViewWithDnD_class = ImageListView55 self.ListViewWithDnD_class = ImageListView
56 self.ServiceItemIconName = u':/media/media_image.png'
57
56 MediaManagerItem.__init__(self, parent, icon, title)58 MediaManagerItem.__init__(self, parent, icon, title)
57 #create and install our own slide controllers59 #create and install our own slide controller toolbar
58 #a=c60 imageToolbar = ImageToolbar(self, True)
59# live_controller = ImageSlideController(self.parent.slideManager.parent, True)61 parent.live_controller.registerToolbar(self.ConfigSection, imageToolbar)
60# preview_controller = ImageSlideController(self.parent.slideManager.parent)
61# self.parent.slideManager.add_controllers(u'image', preview_controller, live_controller)
6262
63 def initialise(self):63 def initialise(self):
64 self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)64 self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
6565
=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py 2009-06-16 18:21:24 +0000
+++ openlp/plugins/media/lib/mediaitem.py 2009-07-04 05:52:30 +0000
@@ -19,6 +19,12 @@
19"""19"""
20import logging20import logging
21import os21import os
22import tempfile
23try:
24 import gst
25except:
26 log = logging.getLogger(u'MediaMediaItemSetup')
27 log.warning(u'Can\'t generate Videos previews - import gst failed');
2228
23from PyQt4 import QtCore, QtGui29from PyQt4 import QtCore, QtGui
2430
@@ -26,6 +32,13 @@
2632
27from openlp.plugins.media.lib import MediaTab33from openlp.plugins.media.lib import MediaTab
28from openlp.plugins.media.lib import FileListData34from openlp.plugins.media.lib import FileListData
35# from listwithpreviews import ListWithPreviews
36from openlp.core.lib import MediaManagerItem, ServiceItem, translate, BaseListWithDnD, buildIcon
37
38class MediaListView(BaseListWithDnD):
39 def __init__(self, parent=None):
40 self.PluginName = u'Media'
41 BaseListWithDnD.__init__(self, parent)
2942
30class MediaMediaItem(MediaManagerItem):43class MediaMediaItem(MediaManagerItem):
31 """44 """
@@ -36,100 +49,98 @@
36 log.info(u'Media Media Item loaded')49 log.info(u'Media Media Item loaded')
3750
38 def __init__(self, parent, icon, title):51 def __init__(self, parent, icon, title):
52 self.TranslationContext = u'MediaPlugin'
53 self.hasFileIcon = True
54 self.hasNewIcon = False
55 self.hasEditIcon = False
56 self.IconPath = u'images/image'
57 self.PluginTextShort = u'Media'
58 self.ConfigSection = u'images'
59 self.OnNewPrompt = u'Select Media(s)'
60 self.OnNewFileMasks = u'Videos (*.avi *.mpeg *.mpg *.mp4);;Audio (*.ogg *.mp3 *.wma);;All files (*)'
61 # this next is a class, not an instance of a class - it will
62 # be instanced by the base MediaManagerItem
63 self.ListViewWithDnD_class = MediaListView
64 #self.ServiceItemIconName = u':/media/media_image.png'
65 self.PreviewFunction = self.video_get_preview
39 MediaManagerItem.__init__(self, parent, icon, title)66 MediaManagerItem.__init__(self, parent, icon, title)
4067
41 def setupUi(self):68 def video_get_preview(self, filename):
42 # Add a toolbar69 """Gets a preview of the first frame of a video file using
43 self.addToolbar()70 GSTREAMER (non-portable??? - Can't figure out how to do with
44 # Create buttons for the toolbar71 Phonon - returns a QImage"""
45 ## New Media Button ##72 try:
46 self.addToolbarButton(73 # Define your pipeline, just as you would at the command prompt.
47 translate(u'MediaMediaItem',u'New Media'),74 # This is much easier than trying to create and link each gstreamer element in Python.
48 translate(u'MediaMediaItem',u'Load Media into openlp.org'),75 # This is great for pipelines that end with a filesink (i.e. there is no audible or visual output)
49 ':/videos/video_load.png', self.onMediaNewClick, 'MediaNewItem')76 log.info ("Video preview %s"%( filename))
50 ## Delete Media Button ##77 outfile=tempfile.NamedTemporaryFile(suffix='.png')
51 self.addToolbarButton(78 cmd=u'filesrc location="%s" ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s"'% (filename, outfile.name)
52 translate(u'MediaMediaItem',u'Delete Media'),79 pipe = gst.parse_launch(cmd)
53 translate(u'MediaMediaItem',u'Delete the selected Media item'),80 # Get a reference to the pipeline's bus
54 ':/videos/video_delete.png', self.onMediaDeleteClick, 'MediaDeleteItem')81 bus = pipe.get_bus()
55 ## Separator Line ##82
56 self.addToolbarSeparator()83 # Set the pipeline's state to PLAYING
57 ## Preview Media Button ##84 pipe.set_state(gst.STATE_PLAYING)
58 self.addToolbarButton(85
59 translate(u'MediaMediaItem',u'Preview Media'),86 # Listen to the pipeline's bus indefinitely until we receive a EOS (end of stream) message.
60 translate(u'MediaMediaItem',u'Preview the selected Media item'),87 # This is a super important step, or the pipeline might not work as expected. For example,
61 ':/system/system_preview.png', self.onMediaPreviewClick, 'MediaPreviewItem')88 # in my example pipeline above, the pngenc will not export an actual image unless you have
62 ## Live Media Button ##89 # this line of code. It just exports a 0 byte png file. So... don't forget this step.
63 self.addToolbarButton(90 bus.poll(gst.MESSAGE_EOS, -1)
64 translate(u'MediaMediaItem',u'Go Live'),91 img = QtGui.QImage(outfile.name)
65 translate(u'MediaMediaItem',u'Send the selected Media item live'),92 outfile.close()
66 ':/system/system_live.png', self.onMediaLiveClick, 'MediaLiveItem')93# os.unlink(outfile.name)
67 ## Add Media Button ##94 pipe.set_state(gst.STATE_NULL)
68 self.addToolbarButton(95 return img
69 translate(u'MediaMediaItem',u'Add Media To Service'),96 except:
70 translate(u'MediaMediaItem',u'Add the selected Media items(s) to the service'),97 log.info("Can't generate video preview for some reason");
71 ':/system/system_add.png',self.onMediaAddClick, 'MediaAddItem')98 import sys
72 ## Add the Medialist widget ##99 print sys.exc_info()
73100 return None
74 self.MediaListView = QtGui.QListView()101
75 self.MediaListView.setAlternatingRowColors(True)102 def generateSlideData(self, service_item):
76 self.MediaListData = FileListData()103 indexes = self.ListView.selectedIndexes()
77 self.MediaListView.setModel(self.MediaListData)104 service_item.title = u'Media'
78
79 self.PageLayout.addWidget(self.MediaListView)
80
81 #define and add the context menu
82 self.MediaListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
83
84 self.MediaListView.addAction(self.contextMenuAction(
85 self.MediaListView, ':/system/system_preview.png',
86 translate(u'MediaMediaItem',u'&Preview Media'), self.onMediaPreviewClick))
87 self.MediaListView.addAction(self.contextMenuAction(
88 self.MediaListView, ':/system/system_live.png',
89 translate(u'MediaMediaItem',u'&Show Live'), self.onMediaLiveClick))
90 self.MediaListView.addAction(self.contextMenuAction(
91 self.MediaListView, ':/system/system_add.png',
92 translate(u'MediaMediaItem',u'&Add to Service'), self.onMediaAddClick))
93
94 def initialise(self):
95 list = self.parent.config.load_list(u'Media')
96 self.loadMediaList(list)
97
98 def onMediaNewClick(self):
99 files = QtGui.QFileDialog.getOpenFileNames(None,
100 translate(u'MediaMediaItem', u'Select Media(s) items'),
101 self.parent.config.get_last_dir(),
102 u'Videos (*.avi *.mpeg);;Audio (*.mp3 *.ogg *.wma);;All files (*)')
103 if len(files) > 0:
104 self.loadMediaList(files)
105 dir, filename = os.path.split(unicode(files[0]))
106 self.parent.config.set_last_dir(dir)
107 self.parent.config.set_list(u'media', self.MediaListData.getFileList())
108
109 def getFileList(self):
110 filelist = [item[0] for item in self.MediaListView];
111 return filelist
112
113 def loadMediaList(self, list):
114 for files in list:
115 self.MediaListData.addRow(files)
116
117 def onMediaDeleteClick(self):
118 indexes = self.MediaListView.selectedIndexes()
119 for index in indexes:105 for index in indexes:
120 current_row = int(index.row())106 filename = self.ListData.getFilename(index)
121 self.MediaListData.removeRow(current_row)107 frame = QtGui.QImage(unicode(filename))
122 self.parent.config.set_list(u'media', self.MediaListData.getFileList())108 (path, name) = os.path.split(filename)
109 service_item.add_from_image(path, name, frame)
123110
124 def onMediaPreviewClick(self):111 def onPreviewClick(self):
125 log.debug(u'Media Preview Button pressed')112 log.debug(u'Media Preview Button pressed')
126 items = self.MediaListView.selectedIndexes()113 items = self.ListView.selectedIndexes()
127 for item in items:114 for item in items:
128 text = self.MediaListData.getValue(item)115 text = self.ListData.getValue(item)
129 print text116 print text
130117
131 def onMediaLiveClick(self):118 def onMediaLiveClick(self):
119 log.debug(u'Media Live Button pressed')
132 pass120 pass
133121
134 def onMediaAddClick(self):
135 pass
136\ No newline at end of file122\ No newline at end of file
123 def initialise(self):
124 self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
125 self.ListView.setIconSize(QtCore.QSize(88,50))
126 self.loadList(self.parent.config.load_list(self.ConfigSection))
127
128 def onDeleteClick(self):
129 item = self.ListView.currentItem()
130 if item is not None:
131 item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
132 row = self.ListView.row(item)
133 self.ListView.takeItem(row)
134 self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList())
135
136 def loadList(self, list):
137 for file in list:
138 (path, filename) = os.path.split(unicode(file))
139 item_name = QtGui.QListWidgetItem(filename)
140 img = self.video_get_preview(file)
141 #item_name.setIcon(buildIcon(file))
142 item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
143 self.ListView.addItem(item_name)
144
145# def onMediaAddClick(self):
146# log.debug(u'Media Add Button pressed')
147# pass
137148
=== modified file 'openlp/plugins/media/mediaplugin.py'
--- openlp/plugins/media/mediaplugin.py 2009-06-26 17:51:43 +0000
+++ openlp/plugins/media/mediaplugin.py 2009-07-04 05:52:30 +0000
@@ -22,7 +22,6 @@
2222
23from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab23from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab
24from openlp.plugins.media.lib import MediaTab,MediaMediaItem24from openlp.plugins.media.lib import MediaTab,MediaMediaItem
25
26class MediaPlugin(Plugin):25class MediaPlugin(Plugin):
2726
28 def __init__(self, plugin_helpers):27 def __init__(self, plugin_helpers):
2928
=== removed file 'openlp/plugins/media/video_render.py'
--- openlp/plugins/media/video_render.py 2009-06-22 20:44:35 +0000
+++ openlp/plugins/media/video_render.py 1970-01-01 00:00:00 +0000
@@ -1,70 +0,0 @@
1# -*- coding: utf-8 -*-
2# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
3"""
4OpenLP - Open Source Lyrics Projection
5Copyright (c) 2008 Raoul Snyman
6Portions copyright (c) 2008 Martin Thompson, Tim Bentley,
7
8This program is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free Software
10Foundation; version 2 of the License.
11
12This program is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License along with
17this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18Place, Suite 330, Boston, MA 02111-1307 USA
19"""
20import os
21from PyQt4 import QtCore, QtGui
22
23# xxx this needs a try, except once we've decided what to do if it fails
24from PyQt4.phonon import Phonon
25
26# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab
27# from openlp.plugins.media.lib import MediaTab,MediaMediaItem
28
29"""Renders a video to some surface or other """
30
31class w(QtGui.QMainWindow):
32 def __init__(self, parent=None):
33 super(QtGui.QMainWindow, self).__init__(parent)
34 self.resize(640,480)
35 self.setWindowTitle(u'simple media player')
36 self.show()
37
38if __name__==u'__main__':
39 app = QtGui.QApplication([])
40# widget = QtGui.QWidget()
41# widget.resize(320, 240)
42# widget.setWindowTitle(u'simple')
43# widget.show()
44# QCore.QCoreApplication.setApplicationName(u'OpenLP')
45 mainwindow=w()
46 widget=QtGui.QWidget(mainwindow)
47 mainwindow.setCentralWidget(widget)
48 widget.setLayout(QtGui.QVBoxLayout(widget))
49# videofile=u'r-128.rm'
50 videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg'
51 source=Phonon.MediaSource(videofile)
52
53 media=Phonon.MediaObject(widget)
54 media.setCurrentSource(source)
55
56 video=Phonon.VideoWidget(widget)
57 audio=Phonon.AudioOutput(Phonon.MusicCategory)
58# controller=Phonon.MediaController(media)
59 Phonon.createPath(media, video);
60 Phonon.createPath(media, audio);
61# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget)
62 slider=Phonon.SeekSlider(media, mainwindow)
63 widget.layout().addWidget(slider)
64 widget.layout().addWidget(video)
65 slider.show()
66
67 video.show()
68 media.play()
69 app.exec_()
70
710
=== modified file 'openlp/plugins/presentations/lib/impresscom.py'
--- openlp/plugins/presentations/lib/impresscom.py 2009-06-26 19:06:28 +0000
+++ openlp/plugins/presentations/lib/impresscom.py 2009-07-02 19:04:50 +0000
@@ -57,7 +57,7 @@
57 self.createApp()57 self.createApp()
5858
59 def startOpenoffice(self):59 def startOpenoffice(self):
60 cmd = u'openoffice.org -nologo -norestore -minimized -impress' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"'60 cmd = u'openoffice.org -nologo -norestore -invisible -minimized -impress' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"'
61 retval = subprocess.Popen(cmd, shell=True)61 retval = subprocess.Popen(cmd, shell=True)
62 self.oopid = retval.pid62 self.oopid = retval.pid
6363
6464
=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py 2009-06-27 19:55:55 +0000
+++ openlp/plugins/songs/lib/mediaitem.py 2009-07-04 05:52:30 +0000
@@ -20,7 +20,7 @@
20import logging20import logging
2121
22from PyQt4 import QtCore, QtGui22from PyQt4 import QtCore, QtGui
23from openlp.core.lib import MediaManagerItem, translate, ServiceItem, SongXMLParser23from openlp.core.lib import MediaManagerItem, translate, ServiceItem, SongXMLParser , contextMenuAction, contextMenuSeparator
2424
25from openlp.plugins.songs.forms import EditSongForm25from openlp.plugins.songs.forms import EditSongForm
2626
@@ -138,17 +138,17 @@
138 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onSongPreviewClick)138 QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onSongPreviewClick)
139 #define and add the context menu139 #define and add the context menu
140 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)140 self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
141 self.ListView.addAction(self.contextMenuAction(self.ListView,141 self.ListView.addAction(contextMenuAction(self.ListView,
142 ':/songs/song_new.png', translate(u'SongMediaItem', u'&Edit Song'),142 ':/songs/song_new.png', translate(u'SongMediaItem', u'&Edit Song'),
143 self.onSongEditClick))143 self.onSongEditClick))
144 self.ListView.addAction(self.contextMenuSeparator(self.ListView))144 self.ListView.addAction(contextMenuSeparator(self.ListView))
145 self.ListView.addAction(self.contextMenuAction(self.ListView,145 self.ListView.addAction(contextMenuAction(self.ListView,
146 ':/system/system_preview.png', translate(u'SongMediaItem', u'&Preview Song'),146 ':/system/system_preview.png', translate(u'SongMediaItem', u'&Preview Song'),
147 self.onSongPreviewClick))147 self.onSongPreviewClick))
148 self.ListView.addAction(self.contextMenuAction(self.ListView,148 self.ListView.addAction(contextMenuAction(self.ListView,
149 ':/system/system_live.png', translate(u'SongMediaItem', u'&Show Live'),149 ':/system/system_live.png', translate(u'SongMediaItem', u'&Show Live'),
150 self.onSongLiveClick))150 self.onSongLiveClick))
151 self.ListView.addAction(self.contextMenuAction(self.ListView,151 self.ListView.addAction(contextMenuAction(self.ListView,
152 ':/system/system_add.png', translate(u'SongMediaItem', u'&Add to Service'),152 ':/system/system_add.png', translate(u'SongMediaItem', u'&Add to Service'),
153 self.onSongAddClick))153 self.onSongAddClick))
154154
155155
=== renamed file 'resources/images/media_verse.png' => 'resources/images/media_bible.png'
=== added file 'resources/images/media_stop.png'
156Binary files resources/images/media_stop.png 1970-01-01 00:00:00 +0000 and resources/images/media_stop.png 2009-07-03 19:08:21 +0000 differ156Binary files resources/images/media_stop.png 1970-01-01 00:00:00 +0000 and resources/images/media_stop.png 2009-07-03 19:08:21 +0000 differ
=== added file 'resources/images/media_time.png'
157Binary files resources/images/media_time.png 1970-01-01 00:00:00 +0000 and resources/images/media_time.png 2009-07-03 19:08:21 +0000 differ157Binary files resources/images/media_time.png 1970-01-01 00:00:00 +0000 and resources/images/media_time.png 2009-07-03 19:08:21 +0000 differ
=== modified file 'resources/images/openlp-2.qrc'
--- resources/images/openlp-2.qrc 2009-05-03 15:35:34 +0000
+++ resources/images/openlp-2.qrc 2009-07-03 19:08:21 +0000
@@ -86,8 +86,10 @@
86 <file>media_presentation.png</file>86 <file>media_presentation.png</file>
87 <file>media_image.png</file>87 <file>media_image.png</file>
88 <file>media_song.png</file>88 <file>media_song.png</file>
89 <file>media_verse.png</file>89 <file>media_bible.png</file>
90 <file>media_video.png</file>90 <file>media_video.png</file>
91 <file>media_time.png</file>
92 <file>media_stop.png</file>
91 </qresource>93 </qresource>
92 <qresource prefix="messagebox" >94 <qresource prefix="messagebox" >
93 <file>messagebox_critical.png</file>95 <file>messagebox_critical.png</file>