From 445c63ce8b848712e16efc72d444192e6971fab5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 12 Jun 2011 20:38:04 +0200 Subject: [PATCH 01/76] --- openlp/core/lib/renderer.py | 162 ++++++++++++++++++--------------- openlp/core/lib/serviceitem.py | 4 + 2 files changed, 95 insertions(+), 71 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index f9af00f6e..decf30435 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -324,34 +324,28 @@ class Renderer(object): """ log.debug(u'_paginate_slide - Start') - line_end = u'' + line_end = u' ' if line_break: line_end = u'
' formatted = [] + raw_text = u'' html_text = u'' - styled_text = u'' - line_count = 0 - for line in lines: - if line_count != -1: - line_count += 1 - styled_line = expand_tags(line) + line_end - styled_text += styled_line - html = self.page_shell + styled_text + HTML_END - self.web.setHtml(html) - # Text too long so go to next page. - if self.web_frame.contentsSize().height() > self.page_height: - if force_page and line_count > 0: - Receiver.send_message(u'theme_line_count', line_count - 1) - line_count = -1 - while html_text.endswith(u'
'): - html_text = html_text[:-4] - formatted.append(html_text) - html_text = u'' - styled_text = styled_line - html_text += line + line_end - while html_text.endswith(u'
'): - html_text = html_text[:-4] - formatted.append(html_text) + html_words = map(expand_tags, lines) + html = self.page_shell + u''.join(html_words) + HTML_END + self.web.setHtml(html) + # Text too long so go to next page. + if self.web_frame.contentsSize().height() > self.page_height: + lines = [u'%s
' % line for line in lines] + html_text, raw_text, index = self._binary_chop( + formatted, html_text, raw_text, lines, line_end) + if force_page: + Receiver.send_message(u'theme_line_count', index + 1) + else: + formatted.append(line_end.join(html_words)) + while raw_text.endswith(u'
'): + raw_text = raw_text[:-4] + if raw_text: + formatted.append(raw_text) log.debug(u'_paginate_slide - End') return formatted @@ -408,53 +402,8 @@ class Renderer(object): # Figure out how many words of the line will fit on screen by # using the algorithm known as "binary chop". raw_words = self._words_split(line) - html_words = [expand_tags(word) for word in raw_words] - smallest_index = 0 - highest_index = len(html_words) - 1 - index = int(highest_index / 2) - while True: - html = self.page_shell + previous_html + \ - u''.join(html_words[:index + 1]).strip() + HTML_END - self.web.setHtml(html) - if self.web_frame.contentsSize().height() > \ - self.page_height: - # We know that it does not fit, so change/calculate the - # new index and highest_index accordingly. - highest_index = index - index = int(index - (index - smallest_index) / 2) - else: - smallest_index = index - index = int(index + (highest_index - index) / 2) - # We found the number of words which will fit. - if smallest_index == index or highest_index == index: - index = smallest_index - formatted.append(previous_raw.rstrip(u'
') + - u''.join(raw_words[:index + 1])) - previous_html = u'' - previous_raw = u'' - else: - continue - # Check if the rest of the line fits on the slide. If it - # does we do not have to do the much more intensive "word by - # word" checking. - html = self.page_shell + \ - u''.join(html_words[index + 1:]).strip() + HTML_END - self.web.setHtml(html) - if self.web_frame.contentsSize().height() <= \ - self.page_height: - previous_html = \ - u''.join(html_words[index + 1:]).strip() + line_end - previous_raw = \ - u''.join(raw_words[index + 1:]).strip() + line_end - break - else: - # The other words do not fit, thus reset the indexes, - # create a new list and continue with "word by word". - raw_words = raw_words[index + 1:] - html_words = html_words[index + 1:] - smallest_index = 0 - highest_index = len(html_words) - 1 - index = int(highest_index / 2) + previous_html, previous_raw, index = self._binary_chop( + formatted, previous_html, previous_raw, raw_words, line_end, u'
') else: previous_html += styled_line + line_end previous_raw += line + line_end @@ -464,6 +413,77 @@ class Renderer(object): log.debug(u'_paginate_slide_words - End') return formatted + def _binary_chop(self, formatted, previous_html, previous_raw, raw_text, + line_end): + """ + This implements the binary chop algorithm for faster rendering. However, + it is assumed that this method is **only** called, when the text to be + rendered does not fit as a whole. + + ``formatted`` + The list of slides. + + ``previous_html`` + The html text which is know to fit on a slide, but is not yet added + to the list of slides. + + ``previous_raw`` + The raw text (with display tags) which is know to fit on a slide, + but is not yet added to the list of slides. + + ``raw_text`` + The text which does not fit on a slide and needs to be processed + using the binary chop. The text can contain display tags. + + ``line_end`` + The + """ + html_words = map(expand_tags, raw_text) + smallest_index = 0 + highest_index = len(html_words) - 1 + index = int(highest_index / 2) + while True: + html = self.page_shell + previous_html + \ + separator.join(html_words[:index + 1]).strip() + HTML_END + self.web.setHtml(html) + if self.web_frame.contentsSize().height() > self.page_height: + # We know that it does not fit, so change/calculate the + # new index and highest_index accordingly. + highest_index = index + index = int(index - (index - smallest_index) / 2) + else: + smallest_index = index + index = int(index + (highest_index - index) / 2) + # We found the number of words which will fit. + if smallest_index == index or highest_index == index: + index = smallest_index + formatted.append(previous_raw.rstrip(u'
') + + u''.join(raw_text[:index + 1])) + previous_html = u'' + previous_raw = u'' + else: + continue + # Check if the rest of the line fits on the slide. If it + # does we do not have to do the much more intensive "word by + # word" checking. + html = self.page_shell + \ + u''.join(html_words[index + 1:]).strip() + HTML_END + self.web.setHtml(html) + if self.web_frame.contentsSize().height() <= self.page_height: + previous_html = \ + u''.join(html_words[index + 1:]).strip() + line_end + previous_raw = u''.join(raw_text[index + 1:]).strip() + line_end + break + else: + # The other words do not fit, thus reset the indexes, + # create a new list and continue with "word by word". + raw_text = raw_text[index + 1:] + html_words = html_words[index + 1:] + smallest_index = 0 + highest_index = len(html_words) - 1 + index = int(highest_index / 2) + return previous_html, previous_raw, index + def _words_split(self, line): """ Split the slide up by word so can wrap better diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index cf682abc6..62d29d8be 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -172,6 +172,9 @@ class ServiceItem(object): self.themedata = self.renderer.theme_data if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') + import time + import datetime + start = time.time() for slide in self._raw_frames: formatted = self.renderer \ .format_slide(slide[u'raw_slide'], line_break, self) @@ -184,6 +187,7 @@ class ServiceItem(object): u'html': html.replace(u'&nbsp;', u' '), u'verseTag': slide[u'verseTag'] }) + print unicode(datetime.timedelta(seconds=time.time() - start)) elif self.service_item_type == ServiceItemType.Image or \ self.service_item_type == ServiceItemType.Command: pass From d7ea2183426fc5e437312a41014cf224412ffeac Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 10:16:50 +0200 Subject: [PATCH 02/76] clean ups --- openlp/core/lib/renderer.py | 55 ++++++++++++++++------------------ openlp/core/lib/serviceitem.py | 6 ++-- 2 files changed, 27 insertions(+), 34 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 6d921f509..d25fb0aae 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -206,20 +206,24 @@ class Renderer(object): self._calculate_default(self.screens.current[u'size']) return preview - def format_slide(self, text, line_break, item): + def format_slide(self, text, item): """ Calculate how much text can fit on a slide. ``text`` The words to go on the slides. - ``line_break`` - Add line endings after each line of text used for bibles. + ``item`` + The service item object. """ log.debug(u'format slide') + # Add line endings after each line of text used for bibles. + line_end = u'
' + if item.is_capable(ItemCapabilities.NoLineBreaks): + line_end = u' ' # clean up line endings lines = self._lines_split(text) - pages = self._paginate_slide(lines, line_break, self.force_page) + pages = self._paginate_slide(lines, line_end) if len(pages) > 1: # Songs and Custom if item.is_capable(ItemCapabilities.AllowsVirtualSplit): @@ -228,12 +232,11 @@ class Renderer(object): pages = [] for slide in slides: lines = slide.strip(u'\n').split(u'\n') - new_pages = self._paginate_slide(lines, line_break, - self.force_page) + new_pages = self._paginate_slide(lines, line_end) pages.extend(new_pages) # Bibles elif item.is_capable(ItemCapabilities.AllowsWordSplit): - pages = self._paginate_slide_words(text, line_break) + pages = self._paginate_slide_words(text, line_end) return pages def _calculate_default(self, screen): @@ -241,7 +244,7 @@ class Renderer(object): Calculate the default dimentions of the screen. ``screen`` - The QSize of the screen. + The screen to calculate the default of. """ log.debug(u'_calculate default %s', screen) self.width = screen.width() @@ -308,25 +311,19 @@ class Renderer(object): (build_lyrics_format_css(self.theme_data, self.page_width, self.page_height), build_lyrics_outline_css(self.theme_data)) - def _paginate_slide(self, lines, line_break, force_page=False): + def _paginate_slide(self, lines, line_end): """ Figure out how much text can appear on a slide, using the current theme settings. ``lines`` - The words to be fitted on the slide split into lines. + The text to be fitted on the slide split into lines. - ``line_break`` + ``line_end`` Add line endings after each line of text (used for bibles). - - ``force_page`` - Flag to tell message lines in page. - """ log.debug(u'_paginate_slide - Start') - line_end = u'' - if line_break: - line_end = u'
' + #print line_end formatted = [] previous_html = u'' previous_raw = u'' @@ -336,11 +333,8 @@ class Renderer(object): self.web.setHtml(html) # Text too long so go to next page. if self.web_frame.contentsSize().height() > self.page_height: - html_text, previous_raw, index = self._binary_chop( - formatted, previous_html, previous_raw, html_lines, lines, - line_end) - if force_page: - Receiver.send_message(u'theme_line_count', index + 1) + html_text, previous_raw = self._binary_chop(formatted, + previous_html, previous_raw, html_lines, lines, line_end) else: previous_raw = u''.join(lines) while previous_raw.endswith(u'
'): @@ -350,7 +344,7 @@ class Renderer(object): log.debug(u'_paginate_slide - End') return formatted - def _paginate_slide_words(self, text, line_break): + def _paginate_slide_words(self, text, line_end): """ Figure out how much text can appear on a slide, using the current theme settings. This version is to handle text which needs to be split @@ -359,14 +353,11 @@ class Renderer(object): ``text`` The words to be fitted on the slide split into lines. - ``line_break`` + ``line_end`` Add line endings after each line of text used for bibles. """ log.debug(u'_paginate_slide_words - Start') - line_end = u' ' - if line_break: - line_end = u'
' formatted = [] previous_html = u'' previous_raw = u'' @@ -404,7 +395,7 @@ class Renderer(object): # using the algorithm known as "binary chop". raw_words = self._words_split(line) html_words = map(expand_tags, raw_text) - previous_html, previous_raw, index = self._binary_chop( + previous_html, previous_raw = self._binary_chop( formatted, previous_html, previous_raw, html_words, raw_words, line_end) else: @@ -466,6 +457,10 @@ class Renderer(object): u''.join(raw_list[:index + 1])) previous_html = u'' previous_raw = u'' + # Stop here as the theme line count was requested. + if self.force_page: + Receiver.send_message(u'theme_line_count', index + 1) + break else: continue # Check if the rest of the line fits on the slide. If it @@ -487,7 +482,7 @@ class Renderer(object): smallest_index = 0 highest_index = len(html_list) - 1 index = int(highest_index / 2) - return previous_html, previous_raw, index + return previous_html, previous_raw def _words_split(self, line): """ diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 1eb1a908b..6a8ba81c4 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -165,7 +165,6 @@ class ServiceItem(object): log.debug(u'Render called') self._display_frames = [] self.bg_image_bytes = None - line_break = not self.is_capable(ItemCapabilities.NoLineBreaks) theme = self.theme if self.theme else None self.main, self.footer = \ self.renderer.set_override_theme(theme, use_override) @@ -176,9 +175,8 @@ class ServiceItem(object): import datetime start = time.time() for slide in self._raw_frames: - formatted = self.renderer \ - .format_slide(slide[u'raw_slide'], line_break, self) - for page in formatted: + pages = self.renderer.format_slide(slide[u'raw_slide'], self) + for page in pages: page = page.replace(u'
', u'{br}') html = expand_tags(cgi.escape(page.rstrip())) self._display_frames.append({ From ded49f74a3e7951a77e01460b17068ebd5919842 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 11:05:22 +0200 Subject: [PATCH 03/76] clean ups --- openlp/core/lib/renderer.py | 39 +++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index d25fb0aae..b6061d474 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -214,7 +214,7 @@ class Renderer(object): The words to go on the slides. ``item`` - The service item object. + The :class:`~openlp.core.lib.serviceitem` item object. """ log.debug(u'format slide') # Add line endings after each line of text used for bibles. @@ -232,12 +232,16 @@ class Renderer(object): pages = [] for slide in slides: lines = slide.strip(u'\n').split(u'\n') - new_pages = self._paginate_slide(lines, line_end) - pages.extend(new_pages) + pages.extend(self._paginate_slide(lines, line_end)) # Bibles elif item.is_capable(ItemCapabilities.AllowsWordSplit): pages = self._paginate_slide_words(text, line_end) - return pages + new_pages = [] + for page in pages: + while page.endswith(u'
'): + page = page[:-4] + new_pages.append(page) + return new_pages def _calculate_default(self, screen): """ @@ -320,10 +324,9 @@ class Renderer(object): The text to be fitted on the slide split into lines. ``line_end`` - Add line endings after each line of text (used for bibles). + The text added after each line. Either ``u' '`` or ``u'
``. """ log.debug(u'_paginate_slide - Start') - #print line_end formatted = [] previous_html = u'' previous_raw = u'' @@ -337,8 +340,6 @@ class Renderer(object): previous_html, previous_raw, html_lines, lines, line_end) else: previous_raw = u''.join(lines) - while previous_raw.endswith(u'
'): - previous_raw = previous_raw[:-4] if previous_raw: formatted.append(previous_raw) log.debug(u'_paginate_slide - End') @@ -354,8 +355,8 @@ class Renderer(object): The words to be fitted on the slide split into lines. ``line_end`` - Add line endings after each line of text used for bibles. - + The text added after each line. Either ``u' '`` or ``u'
``. This + is needed for bibles. """ log.debug(u'_paginate_slide_words - Start') formatted = [] @@ -364,8 +365,8 @@ class Renderer(object): lines = text.split(u'\n') for line in lines: line = line.strip() - styled_line = expand_tags(line) - html = self.page_shell + previous_html + styled_line + HTML_END + html_line = expand_tags(line) + html = self.page_shell + previous_html + html_line + HTML_END self.web.setHtml(html) # Text too long so go to next page. if self.web_frame.contentsSize().height() > self.page_height: @@ -376,33 +377,29 @@ class Renderer(object): self.web.setHtml(html) if self.web_frame.contentsSize().height() <= \ self.page_height: - while previous_raw.endswith(u'
'): - previous_raw = previous_raw[:-4] formatted.append(previous_raw) previous_html = u'' previous_raw = u'' - html = self.page_shell + styled_line + HTML_END + html = self.page_shell + html_line + HTML_END self.web.setHtml(html) # Now check if the current verse will fit, if it does # not we have to start to process the verse word by # word. if self.web_frame.contentsSize().height() <= \ self.page_height: - previous_html = styled_line + line_end + previous_html = html_line + line_end previous_raw = line + line_end continue - # Figure out how many words of the line will fit on screen by - # using the algorithm known as "binary chop". + # Figure out how many words of the line will fit on screen as + # the line will not fit as a whole. raw_words = self._words_split(line) html_words = map(expand_tags, raw_text) previous_html, previous_raw = self._binary_chop( formatted, previous_html, previous_raw, html_words, raw_words, line_end) else: - previous_html += styled_line + line_end + previous_html += html_line + line_end previous_raw += line + line_end - while previous_raw.endswith(u'
'): - previous_raw = previous_raw[:-4] formatted.append(previous_raw) log.debug(u'_paginate_slide_words - End') return formatted From 772c36ed19a0b26ae79fbf42987875b04be059ac Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 11:47:18 +0200 Subject: [PATCH 04/76] more clean ups, doc --- openlp/core/lib/renderer.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index b6061d474..28bd8c513 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -101,7 +101,7 @@ class Renderer(object): The global-level theme to be set. ``theme_level`` - Defaults to *``ThemeLevel.Global``*. The theme level, can be + Defaults to ``ThemeLevel.Global``. The theme level, can be ``ThemeLevel.Global``, ``ThemeLevel.Service`` or ``ThemeLevel.Song``. """ @@ -205,6 +205,7 @@ class Renderer(object): # Reset the real screen size for subsequent render requests self._calculate_default(self.screens.current[u'size']) return preview + self.force_page = False def format_slide(self, text, item): """ @@ -214,7 +215,7 @@ class Renderer(object): The words to go on the slides. ``item`` - The :class:`~openlp.core.lib.serviceitem` item object. + The :class:`~openlp.core.lib.serviceitem.ServiceItem` item object. """ log.debug(u'format slide') # Add line endings after each line of text used for bibles. @@ -423,14 +424,16 @@ class Renderer(object): but is not yet added to the list of slides. (unicode string) ``html_list`` - + The text which does not fit on a slide and needs to be processed + using the binary chop. The text contains html. ``raw_list`` The text which does not fit on a slide and needs to be processed using the binary chop. The text can contain display tags. ``line_end`` - The + The text added after each line. Either ``u' '`` or ``u'
``. This + is needed for bibles. """ smallest_index = 0 highest_index = len(html_list) - 1 From f4c00009ed7da61375a903d3831909f0c2e9d0b2 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 13:20:47 +0200 Subject: [PATCH 05/76] made _binary_shop less 'word by word' specific --- openlp/core/lib/renderer.py | 38 ++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 28bd8c513..5c80ce71c 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -331,16 +331,16 @@ class Renderer(object): formatted = [] previous_html = u'' previous_raw = u'' - lines = [u'%s
' % line for line in lines] + separator = u'
' html_lines = map(expand_tags, lines) - html = self.page_shell + u''.join(html_lines) + HTML_END + html = self.page_shell + separator.join(html_lines) + HTML_END self.web.setHtml(html) # Text too long so go to next page. if self.web_frame.contentsSize().height() > self.page_height: html_text, previous_raw = self._binary_chop(formatted, - previous_html, previous_raw, html_lines, lines, line_end) + previous_html, previous_raw, html_lines, lines, separator, u'') else: - previous_raw = u''.join(lines) + previous_raw = separator.join(lines) if previous_raw: formatted.append(previous_raw) log.debug(u'_paginate_slide - End') @@ -394,10 +394,10 @@ class Renderer(object): # Figure out how many words of the line will fit on screen as # the line will not fit as a whole. raw_words = self._words_split(line) - html_words = map(expand_tags, raw_text) + html_words = map(expand_tags, raw_words) previous_html, previous_raw = self._binary_chop( formatted, previous_html, previous_raw, html_words, - raw_words, line_end) + raw_words, u' ', line_end) else: previous_html += html_line + line_end previous_raw += line + line_end @@ -406,7 +406,7 @@ class Renderer(object): return formatted def _binary_chop(self, formatted, previous_html, previous_raw, html_list, - raw_list, line_end): + raw_list, separator, line_end): """ This implements the binary chop algorithm for faster rendering. However, it is assumed that this method is **only** called, when the text to be @@ -431,16 +431,20 @@ class Renderer(object): The text which does not fit on a slide and needs to be processed using the binary chop. The text can contain display tags. + ``separator`` + The separator for the elements. For lines this is `u'
'`` and for + words this is u' '. + ``line_end`` - The text added after each line. Either ``u' '`` or ``u'
``. This - is needed for bibles. + The text added after each "element line". Either ``u' '`` or + ``u'
``. This is needed for bibles. """ smallest_index = 0 highest_index = len(html_list) - 1 index = int(highest_index / 2) while True: html = self.page_shell + previous_html + \ - u''.join(html_list[:index + 1]).strip() + HTML_END + separator.join(html_list[:index + 1]).strip() + HTML_END self.web.setHtml(html) if self.web_frame.contentsSize().height() > self.page_height: # We know that it does not fit, so change/calculate the @@ -454,7 +458,7 @@ class Renderer(object): if smallest_index == index or highest_index == index: index = smallest_index formatted.append(previous_raw.rstrip(u'
') + - u''.join(raw_list[:index + 1])) + separator.join(raw_list[:index + 1])) previous_html = u'' previous_raw = u'' # Stop here as the theme line count was requested. @@ -467,12 +471,13 @@ class Renderer(object): # does we do not have to do the much more intensive "word by # word" checking. html = self.page_shell + \ - u''.join(html_list[index + 1:]).strip() + HTML_END + separator.join(html_list[index + 1:]).strip() + HTML_END self.web.setHtml(html) if self.web_frame.contentsSize().height() <= self.page_height: - previous_html = \ - u''.join(html_list[index + 1:]).strip() + line_end - previous_raw = u''.join(raw_list[index + 1:]).strip() + line_end + previous_html = separator.join( + html_list[index + 1:]).strip() + line_end + previous_raw = separator.join( + raw_list[index + 1:]).strip() + line_end break else: # The other words do not fit, thus reset the indexes, @@ -490,8 +495,7 @@ class Renderer(object): """ # this parse we are to be wordy line = line.replace(u'\n', u' ') - words = line.split(u' ') - return [word + u' ' for word in words] + return line.split(u' ') def _lines_split(self, text): """ From f22e1385be9422e8178a6590d612522431f00a8d Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 13:26:06 +0200 Subject: [PATCH 06/76] _paginate_slide_words detects long verses itself --- openlp/core/lib/renderer.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 5c80ce71c..a6db56614 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -222,21 +222,23 @@ class Renderer(object): line_end = u'
' if item.is_capable(ItemCapabilities.NoLineBreaks): line_end = u' ' - # clean up line endings - lines = self._lines_split(text) - pages = self._paginate_slide(lines, line_end) - if len(pages) > 1: - # Songs and Custom - if item.is_capable(ItemCapabilities.AllowsVirtualSplit): - # Do not forget the line breaks ! - slides = text.split(u'[---]') - pages = [] - for slide in slides: - lines = slide.strip(u'\n').split(u'\n') - pages.extend(self._paginate_slide(lines, line_end)) - # Bibles - elif item.is_capable(ItemCapabilities.AllowsWordSplit): - pages = self._paginate_slide_words(text, line_end) + # Bibles + if item.is_capable(ItemCapabilities.AllowsWordSplit): + pages = self._paginate_slide_words(text, line_end) + else: + # Clean up line endings. + lines = self._lines_split(text) + pages = self._paginate_slide(lines, line_end) + #TODO: Maybe move the detection to _paginate_slide. + if len(pages) > 1: + # Songs and Custom + if item.is_capable(ItemCapabilities.AllowsVirtualSplit): + # Do not forget the line breaks! + slides = text.split(u'[---]') + pages = [] + for slide in slides: + lines = slide.strip(u'\n').split(u'\n') + pages.extend(self._paginate_slide(lines, line_end)) new_pages = [] for page in pages: while page.endswith(u'
'): From 9b10c81e7b7afac4c17105f93fe8ea3dee2f0d78 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 14:59:52 +0200 Subject: [PATCH 07/76] comments --- openlp/core/lib/renderer.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index a6db56614..04f8f0404 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -229,7 +229,6 @@ class Renderer(object): # Clean up line endings. lines = self._lines_split(text) pages = self._paginate_slide(lines, line_end) - #TODO: Maybe move the detection to _paginate_slide. if len(pages) > 1: # Songs and Custom if item.is_capable(ItemCapabilities.AllowsVirtualSplit): @@ -410,12 +409,13 @@ class Renderer(object): def _binary_chop(self, formatted, previous_html, previous_raw, html_list, raw_list, separator, line_end): """ - This implements the binary chop algorithm for faster rendering. However, - it is assumed that this method is **only** called, when the text to be - rendered does not fit as a whole. + This implements the binary chop algorithm for faster rendering. This + algorithm works line based (line by line) and word based (word by word). + It is assumed that this method is **only** called, when the lines/words to be + rendered do not fit as a whole. ``formatted`` - The list of slides. + The list to append any slides. ``previous_html`` The html text which is know to fit on a slide, but is not yet added @@ -426,12 +426,12 @@ class Renderer(object): but is not yet added to the list of slides. (unicode string) ``html_list`` - The text which does not fit on a slide and needs to be processed + The elements which do not fit on a slide and needs to be processed using the binary chop. The text contains html. ``raw_list`` - The text which does not fit on a slide and needs to be processed - using the binary chop. The text can contain display tags. + The elements which do not fit on a slide and needs to be processed + using the binary chop. The elements can contain display tags. ``separator`` The separator for the elements. For lines this is `u'
'`` and for @@ -469,9 +469,7 @@ class Renderer(object): break else: continue - # Check if the rest of the line fits on the slide. If it - # does we do not have to do the much more intensive "word by - # word" checking. + # Check if the remaining elements fit on the slide. html = self.page_shell + \ separator.join(html_list[index + 1:]).strip() + HTML_END self.web.setHtml(html) @@ -482,8 +480,8 @@ class Renderer(object): raw_list[index + 1:]).strip() + line_end break else: - # The other words do not fit, thus reset the indexes, - # create a new list and continue with "word by word". + # The remaining elements do not fit, thus reset the indexes, + # create a new list and continue. raw_list = raw_list[index + 1:] html_list = html_list[index + 1:] smallest_index = 0 From 24e737fa99d2d078c6154f15f2756d9983dbca0d Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 16:36:18 +0200 Subject: [PATCH 08/76] fixed long line --- openlp/core/lib/renderer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 04f8f0404..1ec6edfa6 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -73,6 +73,8 @@ class Renderer(object): self.screens = ScreenList.get_instance() self.service_theme = u'' self.theme_level = u'' + self._binary_chop( + ) self.override_background = None self.theme_data = None self.bg_frame = None @@ -411,8 +413,8 @@ class Renderer(object): """ This implements the binary chop algorithm for faster rendering. This algorithm works line based (line by line) and word based (word by word). - It is assumed that this method is **only** called, when the lines/words to be - rendered do not fit as a whole. + It is assumed that this method is **only** called, when the lines/words + to be rendered do not fit as a whole. ``formatted`` The list to append any slides. From 254cf20b9fbed6814b7e3eb11e08581e1429e64e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 16:41:52 +0200 Subject: [PATCH 09/76] fixed non sense --- openlp/core/lib/renderer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 1ec6edfa6..696d49095 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -73,8 +73,6 @@ class Renderer(object): self.screens = ScreenList.get_instance() self.service_theme = u'' self.theme_level = u'' - self._binary_chop( - ) self.override_background = None self.theme_data = None self.bg_frame = None From 7d5e349602727d8ccfb9a3b47b37e2ada46a7cf5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Jun 2011 17:19:49 +0200 Subject: [PATCH 10/76] removed test lines --- openlp/core/lib/serviceitem.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 6a8ba81c4..fa1b4b92b 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -171,9 +171,6 @@ class ServiceItem(object): self.themedata = self.renderer.theme_data if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') - import time - import datetime - start = time.time() for slide in self._raw_frames: pages = self.renderer.format_slide(slide[u'raw_slide'], self) for page in pages: @@ -185,7 +182,6 @@ class ServiceItem(object): u'html': html.replace(u'&nbsp;', u' '), u'verseTag': slide[u'verseTag'] }) - print unicode(datetime.timedelta(seconds=time.time() - start)) elif self.service_item_type == ServiceItemType.Image or \ self.service_item_type == ServiceItemType.Command: pass From bd6733eef13f63e0d6a82aced981051ae0942cb5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 14 Jun 2011 08:58:49 +0200 Subject: [PATCH 11/76] we can replace before splitting --- openlp/core/lib/renderer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 696d49095..a8f4e842f 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -503,5 +503,5 @@ class Renderer(object): """ # this parse we do not want to use this so remove it text = text.replace(u'\n[---]', u'') - lines = text.split(u'\n') - return [line.replace(u'[---]', u'') for line in lines] + text = text.replace(u'[---]', u'') + return text.split(u'\n') From 4d20334cce1d24d65732c5fb4178c12962badbed Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 23 Jun 2011 15:32:32 +0200 Subject: [PATCH 12/76] changed instance variable to camelCase as the class is Qt based --- openlp/core/lib/renderer.py | 14 +++++++------- openlp/core/lib/serviceitem.py | 2 +- openlp/core/ui/maindisplay.py | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index a8f4e842f..7c3189789 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -56,11 +56,11 @@ class Renderer(object): """ log.info(u'Renderer Loaded') - def __init__(self, image_manager, theme_manager): + def __init__(self, imageManager, theme_manager): """ Initialise the render manager. - ``image_manager`` + ``imageManager`` A ImageManager instance which takes care of e. g. caching and resizing images. @@ -69,7 +69,7 @@ class Renderer(object): """ log.debug(u'Initialisation started') self.theme_manager = theme_manager - self.image_manager = image_manager + self.imageManager = imageManager self.screens = ScreenList.get_instance() self.service_theme = u'' self.theme_level = u'' @@ -77,7 +77,7 @@ class Renderer(object): self.theme_data = None self.bg_frame = None self.force_page = False - self.display = MainDisplay(None, self.image_manager, False) + self.display = MainDisplay(None, self.imageManager, False) self.display.setup() def update_display(self): @@ -88,7 +88,7 @@ class Renderer(object): self._calculate_default(self.screens.current[u'size']) if self.display: self.display.close() - self.display = MainDisplay(None, self.image_manager, False) + self.display = MainDisplay(None, self.imageManager, False) self.display.setup() self.bg_frame = None self.theme_data = None @@ -167,7 +167,7 @@ class Renderer(object): self._build_text_rectangle(self.theme_data) # if No file do not update cache if self.theme_data.background_filename: - self.image_manager.add_image(self.theme_data.theme_name, + self.imageManager.add_image(self.theme_data.theme_name, self.theme_data.background_filename) return self._rect, self._rect_footer @@ -193,7 +193,7 @@ class Renderer(object): # make big page for theme edit dialog to get line count serviceItem.add_from_text(u'', VERSE + VERSE + VERSE) else: - self.image_manager.del_image(theme_data.theme_name) + self.imageManager.del_image(theme_data.theme_name) serviceItem.add_from_text(u'', VERSE) serviceItem.renderer = self serviceItem.raw_footer = FOOTER diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index ced78ad68..2ab09dbeb 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -208,7 +208,7 @@ class ServiceItem(object): """ self.service_item_type = ServiceItemType.Image self._raw_frames.append({u'title': title, u'path': path}) - self.renderer.image_manager.add_image(title, path) + self.renderer.imageManager.add_image(title, path) self._new_item() def add_from_text(self, title, raw_slide, verse_tag=None): diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index b661b1e49..1b9098816 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -48,13 +48,13 @@ class MainDisplay(QtGui.QGraphicsView): """ This is the display screen. """ - def __init__(self, parent, image_manager, live): + def __init__(self, parent, imageManager, live): if live: QtGui.QGraphicsView.__init__(self) else: QtGui.QGraphicsView.__init__(self, parent) self.isLive = live - self.image_manager = image_manager + self.imageManager = imageManager self.screens = ScreenList.get_instance() self.alertTab = None self.hideMode = None @@ -232,7 +232,7 @@ class MainDisplay(QtGui.QGraphicsView): """ API for replacement backgrounds so Images are added directly to cache """ - self.image_manager.add_image(name, path) + self.imageManager.add_image(name, path) self.image(name) if hasattr(self, u'serviceItem'): self.override[u'image'] = name @@ -247,7 +247,7 @@ class MainDisplay(QtGui.QGraphicsView): The name of the image to be displayed """ log.debug(u'image to display') - image = self.image_manager.get_image_bytes(name) + image = self.imageManager.get_image_bytes(name) self.resetVideo() self.displayImage(image) return self.preview() @@ -477,13 +477,13 @@ class MainDisplay(QtGui.QGraphicsView): self.override = {} else: # replace the background - background = self.image_manager. \ + background = self.imageManager. \ get_image_bytes(self.override[u'image']) if self.serviceItem.themedata.background_filename: - self.serviceItem.bg_image_bytes = self.image_manager. \ + self.serviceItem.bg_image_bytes = self.imageManager. \ get_image_bytes(self.serviceItem.themedata.theme_name) if image: - image_bytes = self.image_manager.get_image_bytes(image) + image_bytes = self.imageManager.get_image_bytes(image) else: image_bytes = None html = build_html(self.serviceItem, self.screen, self.alertTab, From 39caaca8d95e10feb86a69ac37171e41664583f8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 23 Jun 2011 16:34:43 +0200 Subject: [PATCH 13/76] comment fixes --- openlp/core/lib/renderer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 7c3189789..11653533c 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -412,7 +412,7 @@ class Renderer(object): This implements the binary chop algorithm for faster rendering. This algorithm works line based (line by line) and word based (word by word). It is assumed that this method is **only** called, when the lines/words - to be rendered do not fit as a whole. + to be rendered do **not** fit as a whole. ``formatted`` The list to append any slides. @@ -434,8 +434,8 @@ class Renderer(object): using the binary chop. The elements can contain display tags. ``separator`` - The separator for the elements. For lines this is `u'
'`` and for - words this is u' '. + The separator for the elements. For lines this is ``u'
'`` and + for words this is ``u' '``. ``line_end`` The text added after each "element line". Either ``u' '`` or From 74d2b2d25c7d43dd84dc16383b114bef0726855f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 27 Jun 2011 13:44:57 +0200 Subject: [PATCH 14/76] replaced
by
--- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/renderer.py | 16 ++++++++-------- openlp/core/lib/serviceitem.py | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 7fbd5243c..187226272 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -202,7 +202,7 @@ def clean_tags(text): """ Remove Tags from text for display """ - text = text.replace(u'
', u'\n') + text = text.replace(u'
', u'\n') text = text.replace(u'{br}', u'\n') text = text.replace(u' ', u' ') for tag in DisplayTags.get_html_tags(): diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 11653533c..3832cb75c 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -219,7 +219,7 @@ class Renderer(object): """ log.debug(u'format slide') # Add line endings after each line of text used for bibles. - line_end = u'
' + line_end = u'
' if item.is_capable(ItemCapabilities.NoLineBreaks): line_end = u' ' # Bibles @@ -240,7 +240,7 @@ class Renderer(object): pages.extend(self._paginate_slide(lines, line_end)) new_pages = [] for page in pages: - while page.endswith(u'
'): + while page.endswith(u'
'): page = page[:-4] new_pages.append(page) return new_pages @@ -326,13 +326,13 @@ class Renderer(object): The text to be fitted on the slide split into lines. ``line_end`` - The text added after each line. Either ``u' '`` or ``u'
``. + The text added after each line. Either ``u' '`` or ``u'
``. """ log.debug(u'_paginate_slide - Start') formatted = [] previous_html = u'' previous_raw = u'' - separator = u'
' + separator = u'
' html_lines = map(expand_tags, lines) html = self.page_shell + separator.join(html_lines) + HTML_END self.web.setHtml(html) @@ -357,7 +357,7 @@ class Renderer(object): The words to be fitted on the slide split into lines. ``line_end`` - The text added after each line. Either ``u' '`` or ``u'
``. This + The text added after each line. Either ``u' '`` or ``u'
``. This is needed for bibles. """ log.debug(u'_paginate_slide_words - Start') @@ -434,12 +434,12 @@ class Renderer(object): using the binary chop. The elements can contain display tags. ``separator`` - The separator for the elements. For lines this is ``u'
'`` and + The separator for the elements. For lines this is ``u'
'`` and for words this is ``u' '``. ``line_end`` The text added after each "element line". Either ``u' '`` or - ``u'
``. This is needed for bibles. + ``u'
``. This is needed for bibles. """ smallest_index = 0 highest_index = len(html_list) - 1 @@ -459,7 +459,7 @@ class Renderer(object): # We found the number of words which will fit. if smallest_index == index or highest_index == index: index = smallest_index - formatted.append(previous_raw.rstrip(u'
') + + formatted.append(previous_raw.rstrip(u'
') + separator.join(raw_list[:index + 1])) previous_html = u'' previous_raw = u'' diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 2ab09dbeb..e5a6c4033 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -174,7 +174,7 @@ class ServiceItem(object): for slide in self._raw_frames: pages = self.renderer.format_slide(slide[u'raw_slide'], self) for page in pages: - page = page.replace(u'
', u'{br}') + page = page.replace(u'
', u'{br}') html = expand_tags(cgi.escape(page.rstrip())) self._display_frames.append({ u'title': clean_tags(page), @@ -194,7 +194,7 @@ class ServiceItem(object): if self.raw_footer is None: self.raw_footer = [] self.foot_text = \ - u'
'.join([footer for footer in self.raw_footer if footer]) + u'
'.join([footer for footer in self.raw_footer if footer]) def add_from_image(self, path, title): """ From 86c0eea4733fdd2d79f92fa38c1cd93e58d0f263 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 27 Jun 2011 13:51:25 +0200 Subject: [PATCH 15/76] changed theme_manager to themeManager as it is Qt based --- openlp/core/lib/renderer.py | 10 +++++----- openlp/plugins/songs/forms/editsongform.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 3832cb75c..2b20900a9 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -56,7 +56,7 @@ class Renderer(object): """ log.info(u'Renderer Loaded') - def __init__(self, imageManager, theme_manager): + def __init__(self, imageManager, themeManager): """ Initialise the render manager. @@ -64,11 +64,11 @@ class Renderer(object): A ImageManager instance which takes care of e. g. caching and resizing images. - ``theme_manager`` + ``themeManager`` The ThemeManager instance, used to get the current theme details. """ log.debug(u'Initialisation started') - self.theme_manager = theme_manager + self.themeManager = themeManager self.imageManager = imageManager self.screens = ScreenList.get_instance() self.service_theme = u'' @@ -108,7 +108,7 @@ class Renderer(object): self.global_theme = global_theme self.theme_level = theme_level self.global_theme_data = \ - self.theme_manager.getThemeData(self.global_theme) + self.themeManager.getThemeData(self.global_theme) self.theme_data = None def set_service_theme(self, service_theme): @@ -162,7 +162,7 @@ class Renderer(object): if override_levels: self.theme_data = override_theme else: - self.theme_data = self.theme_manager.getThemeData(theme) + self.theme_data = self.themeManager.getThemeData(theme) self._calculate_default(self.screens.current[u'size']) self._build_text_rectangle(self.theme_data) # if No file do not update cache diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 05c891a55..171564b24 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -90,7 +90,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.onVerseListViewPressed) QtCore.QObject.connect(self.themeAddButton, QtCore.SIGNAL(u'clicked()'), - self.mediaitem.plugin.renderer.theme_manager.onAddTheme) + self.mediaitem.plugin.renderer.themeManager.onAddTheme) QtCore.QObject.connect(self.maintenanceButton, QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.QObject.connect(Receiver.get_receiver(), From 95743de19f5a76196ae36b396dc1b53a69b26e0f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 29 Jun 2011 09:38:04 +0200 Subject: [PATCH 16/76] more html fixes --- openlp/core/lib/displaytags.py | 2 +- openlp/core/lib/renderer.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/displaytags.py b/openlp/core/lib/displaytags.py index 95ce13bda..addab4d75 100644 --- a/openlp/core/lib/displaytags.py +++ b/openlp/core/lib/displaytags.py @@ -111,7 +111,7 @@ class DisplayTags(object): u'start html': u'', u'end tag': u'{/u}', u'end html': u'', u'protected': True}) base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Break'), - u'start tag': u'{br}', u'start html': u'
', u'end tag': u'', + u'start tag': u'{br}', u'start html': u'
', u'end tag': u'', u'end html': u'', u'protected': True}) DisplayTags.add_html_tags(base_tags) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 2b20900a9..4f4a3e4c9 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -241,7 +241,7 @@ class Renderer(object): new_pages = [] for page in pages: while page.endswith(u'
'): - page = page[:-4] + page = page[:-6] new_pages.append(page) return new_pages @@ -357,8 +357,8 @@ class Renderer(object): The words to be fitted on the slide split into lines. ``line_end`` - The text added after each line. Either ``u' '`` or ``u'
``. This - is needed for bibles. + The text added after each line. Either ``u' '`` or ``u'
``. + This is needed for bibles. """ log.debug(u'_paginate_slide_words - Start') formatted = [] From 68c1c86ac5acfcc571e93a5574e936b269447883 Mon Sep 17 00:00:00 2001 From: Matthias Hub Date: Wed, 13 Jul 2011 22:41:54 +0200 Subject: [PATCH 17/76] - fixed view adjustments for os x 10.6 - added compatibility with the file extension on os x - started to work on the "open with" file event on os x --- openlp.pyw | 23 +++++ resources/osx/Info.plist.master | 93 ++++++++++++++++++ .../osx/applescript-adjustview-10-5.master | 2 +- .../osx/applescript-adjustview-10-6.master | 14 ++- resources/osx/build.py | 12 ++- resources/osx/openlp-logo-with-text.icns | Bin resources/osx/openlp.spec.master | 2 +- 7 files changed, 135 insertions(+), 11 deletions(-) mode change 100755 => 100644 resources/osx/openlp-logo-with-text.icns diff --git a/openlp.pyw b/openlp.pyw index a39f6cf65..d1627a8a6 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -90,6 +90,7 @@ class OpenLP(QtGui.QApplication): """ Run the OpenLP application. """ + self.eventQueue = [] # On Windows, the args passed into the constructor are # ignored. Not very handy, so set the ones we want to use. self.args = args @@ -135,6 +136,9 @@ class OpenLP(QtGui.QApplication): VersionThread(self.mainWindow).start() Receiver.send_message(u'maindisplay_blank_check') self.mainWindow.appStartup() + # do a check for queued events + for e in self.eventQueue: + self.event(e) DelayStartThread(self.mainWindow).start() return self.exec_() @@ -180,6 +184,25 @@ class OpenLP(QtGui.QApplication): """ self.restoreOverrideCursor() + def event(self, event): + """ + Enables direct file opening on OS X + """ + if event.type() == QtCore.QEvent.FileOpen: + file_name = event.file() + log.debug(u'Got open file event for %s!', file_name) + log.error(file_name) + try: + self.mainWindow.serviceManagerContents.loadFile(file_name) + return True + except AttributeError, NameError: + log.debug(u'The main window is not initialized yet,\ + will queue event!') + self.eventQueue.append(event) + return False + else: + return QtGui.QApplication.event(self, event) + def main(): """ The main function which parses command line options and then runs diff --git a/resources/osx/Info.plist.master b/resources/osx/Info.plist.master index 45aab92a5..5fc3aa48f 100755 --- a/resources/osx/Info.plist.master +++ b/resources/osx/Info.plist.master @@ -2,6 +2,99 @@ + + CFBundleDocumentTypes + + + CFBundleTypeExtension + + osz + + CFBundleTypeIconFiles + + openlp-logo-with-text.icns + + CFBundleTypeName + OpenLP Service + CFBundleTypeRole + Viewer + LSHandlerRank + Owner + LSItemContentTypes + + org.openlp.osz + + + + CFBundleTypeExtension + + otz + + CFBundleTypeIconFiles + + openlp-logo-with-text.icns + + CFBundleTypeName + OpenLP Theme + CFBundleTypeRole + Viewer + LSHandlerRank + Owner + LSItemContentTypes + + org.openlp.otz + + + + + UTExportedTypeDeclarations + + + UTTypeIdentifier + org.openlp.osz + UTTypeDescription + OpenLP Service + UTTypeConformsTo + + public.data + public.content + + UTTypeTagSpecification + + public.filename-extension + + osz + + public.mime-type + + application/x-openlp-service + + + + + UTTypeIdentifier + org.openlp.otz + UTTypeDescription + OpenLP Theme + UTTypeConformsTo + + public.data + public.content + + UTTypeTagSpecification + + public.filename-extension + + otz + + public.mime-type + + application/x-openlp-theme + + + + + CFBundleIdentifier org.openlp CFBundleShortVersionString diff --git a/resources/osx/applescript-adjustview-10-5.master b/resources/osx/applescript-adjustview-10-5.master index abc0e5a8d..19be239d0 100755 --- a/resources/osx/applescript-adjustview-10-5.master +++ b/resources/osx/applescript-adjustview-10-5.master @@ -48,7 +48,7 @@ on run set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 128 - set background picture of theViewOptions to file ".installer-background.png" + set background picture of theViewOptions to file ".background:installer-background.png" if not exists file "Applications" then make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} end if diff --git a/resources/osx/applescript-adjustview-10-6.master b/resources/osx/applescript-adjustview-10-6.master index 2b5a0c000..170842564 100755 --- a/resources/osx/applescript-adjustview-10-6.master +++ b/resources/osx/applescript-adjustview-10-6.master @@ -49,15 +49,19 @@ on run set theViewOptions to the icon view options of container window set arrangement of theViewOptions to not arranged set icon size of theViewOptions to 128 - set background picture of theViewOptions to file ".installer-background.png" - make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} - delay 5 + set background picture of theViewOptions to file ".background:installer-background.png" + if not exists file "Applications" then + make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} + end if + delay 1 set position of item "%s" of container window to {160, 200} set position of item ".Trashes" of container window to {100, 500} - set position of item ".installer-background.png" of container window to {200, 500} + set position of item ".background" of container window to {200, 500} set position of item ".DS_Store" of container window to {400, 500} set position of item "Applications" of container window to {550, 200} - set position of item ".VolumeIcon.icns" of container window to {500, 500} + if exists file ".VolumeIcon.icns" then + set position of item ".VolumeIcon.icns" of container window to {500, 500} + end if set position of item ".fseventsd" of container window to {300, 500} if exists POSIX file ".SymAVx86QSFile" then set position of item ".SymAVx86QSFile" of container window to {600, 500} diff --git a/resources/osx/build.py b/resources/osx/build.py index ff7f6bdfd..38e56e42a 100644 --- a/resources/osx/build.py +++ b/resources/osx/build.py @@ -93,8 +93,12 @@ script_name = "build" def build_application(settings, app_name_lower, app_dir): logging.info('[%s] now building the app with pyinstaller at "%s"...', script_name, settings['pyinstaller_basedir']) - result = os.system('python %s/pyinstaller.py openlp.spec' \ - % settings['pyinstaller_basedir']) + full_python_dir = os.path.join('/opt/local/Library/Frameworks', + 'Python.framework/Versions/2.6/Resources/', + 'Python.app/Contents/MacOS/Python') + result = os.system('arch -i386 %s %s/pyinstaller.py openlp.spec' \ + % ( full_python_dir, + settings['pyinstaller_basedir']) ) if (result != 0): logging.error('[%s] The pyinstaller build reported an error, cannot \ continue!', script_name) @@ -219,10 +223,10 @@ def create_dmg(settings): sys.exit(1) logging.info('[%s] copying the background image...', script_name) - # os.mkdir(volume_basedir + '/.background') + os.mkdir(volume_basedir + '/.background') result = os.system('CpMac %s %s' % (settings['installer_backgroundimage_file'], - volume_basedir + '/.installer-background.png')) + volume_basedir + '/.background/installer-background.png')) if (result != 0): logging.error('[%s] could not copy the background image, dmg creation\ failed!', script_name) diff --git a/resources/osx/openlp-logo-with-text.icns b/resources/osx/openlp-logo-with-text.icns old mode 100755 new mode 100644 diff --git a/resources/osx/openlp.spec.master b/resources/osx/openlp.spec.master index 94aec2a60..eb743c40b 100755 --- a/resources/osx/openlp.spec.master +++ b/resources/osx/openlp.spec.master @@ -1,5 +1,5 @@ # -*- mode: python -*- -a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), '%(openlp_basedir)s/openlp.pyw'], +a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(CONFIGDIR,'support/useUnicode.py'), '%(openlp_basedir)s/openlp.pyw'], pathex=['%(pyinstaller_basedir)s'], hookspath=['%(openlp_basedir)s/resources/pyinstaller']) pyz = PYZ(a.pure) exe = EXE(pyz, From 47e43404aaab2684f0fe2cfb19db01784289df28 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 16 Jul 2011 11:00:30 +0200 Subject: [PATCH 18/76] - added doctype to html - added encoding to html - changed
to
- removed obsolete language attribute --- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/displaytags.py | 2 +- openlp/core/lib/htmlbuilder.py | 8 ++++-- openlp/core/lib/renderer.py | 45 +++++++++++++++++++++--------- openlp/core/lib/serviceitem.py | 6 ++-- openlp/core/ui/printserviceform.py | 2 +- openlp/core/ui/servicemanager.py | 2 +- 7 files changed, 44 insertions(+), 23 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 187226272..7fbd5243c 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -202,7 +202,7 @@ def clean_tags(text): """ Remove Tags from text for display """ - text = text.replace(u'
', u'\n') + text = text.replace(u'
', u'\n') text = text.replace(u'{br}', u'\n') text = text.replace(u' ', u' ') for tag in DisplayTags.get_html_tags(): diff --git a/openlp/core/lib/displaytags.py b/openlp/core/lib/displaytags.py index addab4d75..95ce13bda 100644 --- a/openlp/core/lib/displaytags.py +++ b/openlp/core/lib/displaytags.py @@ -111,7 +111,7 @@ class DisplayTags(object): u'start html': u'', u'end tag': u'{/u}', u'end html': u'', u'protected': True}) base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Break'), - u'start tag': u'{br}', u'start html': u'
', u'end tag': u'', + u'start tag': u'{br}', u'start html': u'
', u'end tag': u'', u'end html': u'', u'protected': True}) DisplayTags.add_html_tags(base_tags) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 1f50e0d65..295a6c1ad 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -35,8 +35,10 @@ from openlp.core.lib.theme import BackgroundType, BackgroundGradientType, \ log = logging.getLogger(__name__) HTMLSRC = u""" + + OpenLP Display - +
""" % \ (build_lyrics_format_css(self.theme_data, self.page_width, self.page_height), build_lyrics_outline_css(self.theme_data)) + self.web.setHtml(html) def _paginate_slide(self, lines, line_end): """ @@ -334,10 +340,8 @@ class Renderer(object): previous_raw = u'' separator = u'
' html_lines = map(expand_tags, lines) - html = self.page_shell + separator.join(html_lines) + HTML_END - self.web.setHtml(html) # Text too long so go to next page. - if self.web_frame.contentsSize().height() > self.page_height: + if self._text_fits_on_slide(separator.join(html_lines)): html_text, previous_raw = self._binary_chop(formatted, previous_html, previous_raw, html_lines, lines, separator, u'') else: @@ -368,27 +372,19 @@ class Renderer(object): for line in lines: line = line.strip() html_line = expand_tags(line) - html = self.page_shell + previous_html + html_line + HTML_END - self.web.setHtml(html) # Text too long so go to next page. - if self.web_frame.contentsSize().height() > self.page_height: + if self._text_fits_on_slide(previous_html + html_line): # Check if there was a verse before the current one and append # it, when it fits on the page. if previous_html: - html = self.page_shell + previous_html + HTML_END - self.web.setHtml(html) - if self.web_frame.contentsSize().height() <= \ - self.page_height: + if not self._text_fits_on_slide(previous_html): formatted.append(previous_raw) previous_html = u'' previous_raw = u'' - html = self.page_shell + html_line + HTML_END - self.web.setHtml(html) # Now check if the current verse will fit, if it does # not we have to start to process the verse word by # word. - if self.web_frame.contentsSize().height() <= \ - self.page_height: + if not self._text_fits_on_slide(html_line): previous_html = html_line + line_end previous_raw = line + line_end continue @@ -445,10 +441,8 @@ class Renderer(object): highest_index = len(html_list) - 1 index = int(highest_index / 2) while True: - html = self.page_shell + previous_html + \ - separator.join(html_list[:index + 1]).strip() + HTML_END - self.web.setHtml(html) - if self.web_frame.contentsSize().height() > self.page_height: + if self._text_fits_on_slide( + previous_html + separator.join(html_list[:index + 1]).strip()): # We know that it does not fit, so change/calculate the # new index and highest_index accordingly. highest_index = index @@ -470,10 +464,8 @@ class Renderer(object): else: continue # Check if the remaining elements fit on the slide. - html = self.page_shell + \ - separator.join(html_list[index + 1:]).strip() + HTML_END - self.web.setHtml(html) - if self.web_frame.contentsSize().height() <= self.page_height: + if not self._text_fits_on_slide( + separator.join(html_list[index + 1:]).strip()): previous_html = separator.join( html_list[index + 1:]).strip() + line_end previous_raw = separator.join( @@ -489,6 +481,18 @@ class Renderer(object): index = int(highest_index / 2) return previous_html, previous_raw + def _text_fits_on_slide(self, text): + """ + Checks if the given ``text`` fits on a slide. If it does, ``True`` is + returned, otherwise ``False``. + + ``text`` + The text to check. It can contain HTML tags. + """ + self.web_frame.evaluateJavaScript(u'show_text("%s")' % + text.replace(u'\\', u'\\\\').replace(u'\"', u'\\\"')) + return self.web_frame.contentsSize().height() > self.page_height + def _words_split(self, line): """ Split the slide up by word so can wrap better diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index d5603c31f..9904868ce 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -188,7 +188,7 @@ class MainDisplay(QtGui.QGraphicsView): while not self.webLoaded: Receiver.send_message(u'openlp_process_events') self.setGeometry(self.screen[u'size']) - self.frame.evaluateJavaScript(u'show_text("%s")' % \ + self.frame.evaluateJavaScript(u'show_text("%s")' % slide.replace(u'\\', u'\\\\').replace(u'\"', u'\\\"')) return self.preview() From 77f7581d22633f70421144ff4896425920643a50 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 30 Jul 2011 09:14:39 +0200 Subject: [PATCH 46/76] change 'Display Tag' strings to 'Formatting Tag' Fixes: https://launchpad.net/bugs/816382 --- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/shortcutlistdialog.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c88508672..f3a5e2cb9 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -404,7 +404,7 @@ class Ui_MainWindow(object): self.settingsShortcutsItem.setText( translate('OpenLP.MainWindow', 'Configure &Shortcuts...')) self.displayTagItem.setText( - translate('OpenLP.MainWindow', '&Configure Display Tags')) + translate('OpenLP.MainWindow', '&Configure Formatting Tags...')) self.settingsConfigureItem.setText( translate('OpenLP.MainWindow', '&Configure OpenLP...')) self.viewMediaManagerItem.setText( diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 6d877358f..a9b9b22cf 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -123,7 +123,7 @@ class Ui_ShortcutListDialog(object): def retranslateUi(self, shortcutListDialog): shortcutListDialog.setWindowTitle( - translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts')) + translate('OpenLP.ShortcutListDialog', 'Configure Shortcuts')) self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog', 'Select an action and click one of the buttons below to start ' 'capturing a new primary or alternate shortcut, respectively.')) From 06d32e51083b34c2d9dd1289b2c39994719d4e78 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 30 Jul 2011 09:19:16 +0200 Subject: [PATCH 47/76] change 'Display Tag' strings to 'Formatting Tag' Fixes: https://launchpad.net/bugs/816382 --- openlp/core/lib/displaytags.py | 2 +- openlp/core/lib/renderer.py | 4 ++-- openlp/core/ui/displaytagdialog.py | 2 +- openlp/core/ui/displaytagform.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openlp/core/lib/displaytags.py b/openlp/core/lib/displaytags.py index 95ce13bda..aa6f3b5a7 100644 --- a/openlp/core/lib/displaytags.py +++ b/openlp/core/lib/displaytags.py @@ -25,7 +25,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -Provide Html Tag management and Display Tag access class +Provide HTML Tag management and Formatting Tag access class """ from openlp.core.lib import translate diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index e9e28bcf6..1b94e7896 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -422,7 +422,7 @@ class Renderer(object): to the list of slides. (unicode string) ``previous_raw`` - The raw text (with display tags) which is know to fit on a slide, + The raw text (with formatting tags) which is know to fit on a slide, but is not yet added to the list of slides. (unicode string) ``html_list`` @@ -431,7 +431,7 @@ class Renderer(object): ``raw_list`` The elements which do not fit on a slide and needs to be processed - using the binary chop. The elements can contain display tags. + using the binary chop. The elements can contain formatting tags. ``separator`` The separator for the elements. For lines this is ``u'
'`` and diff --git a/openlp/core/ui/displaytagdialog.py b/openlp/core/ui/displaytagdialog.py index 328fcd137..093e0c167 100644 --- a/openlp/core/ui/displaytagdialog.py +++ b/openlp/core/ui/displaytagdialog.py @@ -122,7 +122,7 @@ class Ui_DisplayTagDialog(object): def retranslateUi(self, displayTagDialog): displayTagDialog.setWindowTitle(translate('OpenLP.displayTagDialog', - 'Configure Display Tags')) + 'Configure Formatting Tags')) self.editGroupBox.setTitle( translate('OpenLP.DisplayTagDialog', 'Edit Selection')) self.savePushButton.setText( diff --git a/openlp/core/ui/displaytagform.py b/openlp/core/ui/displaytagform.py index 22ac38f06..9456f1028 100644 --- a/openlp/core/ui/displaytagform.py +++ b/openlp/core/ui/displaytagform.py @@ -177,7 +177,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): def _saveTable(self): """ - Saves all display tags except protected ones. + Saves all formatting tags except protected ones. """ tags = [] for tag in DisplayTags.get_html_tags(): From c0976a4690f43655548c3c6dc3ece0edc0ff5e0f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 30 Jul 2011 09:34:37 +0200 Subject: [PATCH 48/76] moved files and changed code to reflect string changes Fixes: https://launchpad.net/bugs/816382 --- openlp/core/lib/__init__.py | 6 +-- .../lib/{displaytags.py => formattingtags.py} | 44 ++++++++-------- openlp/core/lib/spelltextedit.py | 6 +-- openlp/core/ui/__init__.py | 2 +- ...laytagdialog.py => formattingtagdialog.py} | 50 +++++++++---------- ...displaytagform.py => formattingtagform.py} | 48 +++++++++--------- openlp/core/ui/mainwindow.py | 21 ++++---- 7 files changed, 88 insertions(+), 89 deletions(-) rename openlp/core/lib/{displaytags.py => formattingtags.py} (78%) rename openlp/core/ui/{displaytagdialog.py => formattingtagdialog.py} (82%) rename openlp/core/ui/{displaytagform.py => formattingtagform.py} (87%) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 7fbd5243c..620d5dafd 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -205,7 +205,7 @@ def clean_tags(text): text = text.replace(u'
', u'\n') text = text.replace(u'{br}', u'\n') text = text.replace(u' ', u' ') - for tag in DisplayTags.get_html_tags(): + for tag in FormattingTags.get_html_tags(): text = text.replace(tag[u'start tag'], u'') text = text.replace(tag[u'end tag'], u'') return text @@ -214,7 +214,7 @@ def expand_tags(text): """ Expand tags HTML for display """ - for tag in DisplayTags.get_html_tags(): + for tag in FormattingTags.get_html_tags(): text = text.replace(tag[u'start tag'], tag[u'start html']) text = text.replace(tag[u'end tag'], tag[u'end html']) return text @@ -234,7 +234,7 @@ def check_directory_exists(dir): pass from listwidgetwithdnd import ListWidgetWithDnD -from displaytags import DisplayTags +from formattingtags import FormattingTags from eventreceiver import Receiver from spelltextedit import SpellTextEdit from settingsmanager import SettingsManager diff --git a/openlp/core/lib/displaytags.py b/openlp/core/lib/formattingtags.py similarity index 78% rename from openlp/core/lib/displaytags.py rename to openlp/core/lib/formattingtags.py index aa6f3b5a7..9fd42a605 100644 --- a/openlp/core/lib/displaytags.py +++ b/openlp/core/lib/formattingtags.py @@ -30,7 +30,7 @@ Provide HTML Tag management and Formatting Tag access class from openlp.core.lib import translate -class DisplayTags(object): +class FormattingTags(object): """ Static Class to HTML Tags to be access around the code the list is managed by the Options Tab. @@ -42,89 +42,89 @@ class DisplayTags(object): """ Provide access to the html_expands list. """ - return DisplayTags.html_expands + return FormattingTags.html_expands @staticmethod def reset_html_tags(): """ Resets the html_expands list. """ - DisplayTags.html_expands = [] + FormattingTags.html_expands = [] base_tags = [] # Append the base tags. # Hex Color tags from http://www.w3schools.com/html/html_colornames.asp - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Red'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Red'), u'start tag': u'{r}', u'start html': u'', u'end tag': u'{/r}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Black'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Black'), u'start tag': u'{b}', u'start html': u'', u'end tag': u'{/b}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Blue'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Blue'), u'start tag': u'{bl}', u'start html': u'', u'end tag': u'{/bl}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Yellow'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Yellow'), u'start tag': u'{y}', u'start html': u'', u'end tag': u'{/y}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Green'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Green'), u'start tag': u'{g}', u'start html': u'', u'end tag': u'{/g}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Pink'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Pink'), u'start tag': u'{pk}', u'start html': u'', u'end tag': u'{/pk}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Orange'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Orange'), u'start tag': u'{o}', u'start html': u'', u'end tag': u'{/o}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Purple'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Purple'), u'start tag': u'{pp}', u'start html': u'', u'end tag': u'{/pp}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'White'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'White'), u'start tag': u'{w}', u'start html': u'', u'end tag': u'{/w}', u'end html': u'', u'protected': True}) base_tags.append({ - u'desc': translate('OpenLP.DisplayTags', 'Superscript'), + u'desc': translate('OpenLP.FormattingTags', 'Superscript'), u'start tag': u'{su}', u'start html': u'', u'end tag': u'{/su}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Subscript'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Subscript'), u'start tag': u'{sb}', u'start html': u'', u'end tag': u'{/sb}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Paragraph'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Paragraph'), u'start tag': u'{p}', u'start html': u'

', u'end tag': u'{/p}', u'end html': u'

', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Bold'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Bold'), u'start tag': u'{st}', u'start html': u'', u'end tag': u'{/st}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Italics'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Italics'), u'start tag': u'{it}', u'start html': u'', u'end tag': u'{/it}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Underline'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Underline'), u'start tag': u'{u}', u'start html': u'', u'end tag': u'{/u}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Break'), + base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Break'), u'start tag': u'{br}', u'start html': u'
', u'end tag': u'', u'end html': u'', u'protected': True}) - DisplayTags.add_html_tags(base_tags) + FormattingTags.add_html_tags(base_tags) @staticmethod def add_html_tags(tags): """ Add a list of tags to the list """ - DisplayTags.html_expands.extend(tags) + FormattingTags.html_expands.extend(tags) @staticmethod def remove_html_tag(tag_id): """ Removes an individual html_expands tag. """ - DisplayTags.html_expands.pop(tag_id) + FormattingTags.html_expands.pop(tag_id) diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 0d277b9fe..b0bb61e92 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -39,7 +39,7 @@ except ImportError: from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate, DisplayTags +from openlp.core.lib import translate, FormattingTags from openlp.core.lib.ui import checkable_action log = logging.getLogger(__name__) @@ -114,7 +114,7 @@ class SpellTextEdit(QtGui.QPlainTextEdit): popupMenu.insertMenu(popupMenu.actions()[0], spell_menu) tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', 'Formatting Tags')) - for html in DisplayTags.get_html_tags(): + for html in FormattingTags.get_html_tags(): action = SpellAction(html[u'desc'], tagMenu) action.correct.connect(self.htmlTag) tagMenu.addAction(action) @@ -148,7 +148,7 @@ class SpellTextEdit(QtGui.QPlainTextEdit): """ Replaces the selected text with word. """ - for html in DisplayTags.get_html_tags(): + for html in FormattingTags.get_html_tags(): if tag == html[u'desc']: cursor = self.textCursor() if self.textCursor().hasSelection(): diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 7aebcb1df..e754480e0 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -69,7 +69,7 @@ from advancedtab import AdvancedTab from aboutform import AboutForm from pluginform import PluginForm from settingsform import SettingsForm -from displaytagform import DisplayTagForm +from formattingtagform import FormattingTagForm from shortcutlistform import ShortcutListForm from mediadockmanager import MediaDockManager from servicemanager import ServiceManager diff --git a/openlp/core/ui/displaytagdialog.py b/openlp/core/ui/formattingtagdialog.py similarity index 82% rename from openlp/core/ui/displaytagdialog.py rename to openlp/core/ui/formattingtagdialog.py index 093e0c167..186f4739b 100644 --- a/openlp/core/ui/displaytagdialog.py +++ b/openlp/core/ui/formattingtagdialog.py @@ -30,15 +30,15 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate from openlp.core.lib.ui import UiStrings -class Ui_DisplayTagDialog(object): +class Ui_FormattingTagDialog(object): - def setupUi(self, displayTagDialog): - displayTagDialog.setObjectName(u'displayTagDialog') - displayTagDialog.resize(725, 548) - self.listdataGridLayout = QtGui.QGridLayout(displayTagDialog) + def setupUi(self, formattingTagDialog): + formattingTagDialog.setObjectName(u'formattingTagDialog') + formattingTagDialog.resize(725, 548) + self.listdataGridLayout = QtGui.QGridLayout(formattingTagDialog) self.listdataGridLayout.setMargin(8) self.listdataGridLayout.setObjectName(u'listdataGridLayout') - self.tagTableWidget = QtGui.QTableWidget(displayTagDialog) + self.tagTableWidget = QtGui.QTableWidget(formattingTagDialog) self.tagTableWidget.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff) self.tagTableWidget.setEditTriggers( @@ -67,11 +67,11 @@ class Ui_DisplayTagDialog(object): spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) - self.deletePushButton = QtGui.QPushButton(displayTagDialog) + self.deletePushButton = QtGui.QPushButton(formattingTagDialog) self.deletePushButton.setObjectName(u'deletePushButton') self.horizontalLayout.addWidget(self.deletePushButton) self.listdataGridLayout.addLayout(self.horizontalLayout, 1, 0, 1, 1) - self.editGroupBox = QtGui.QGroupBox(displayTagDialog) + self.editGroupBox = QtGui.QGroupBox(formattingTagDialog) self.editGroupBox.setObjectName(u'editGroupBox') self.dataGridLayout = QtGui.QGridLayout(self.editGroupBox) self.dataGridLayout.setObjectName(u'dataGridLayout') @@ -112,38 +112,38 @@ class Ui_DisplayTagDialog(object): self.savePushButton.setObjectName(u'savePushButton') self.dataGridLayout.addWidget(self.savePushButton, 4, 2, 1, 1) self.listdataGridLayout.addWidget(self.editGroupBox, 2, 0, 1, 1) - self.buttonBox = QtGui.QDialogButtonBox(displayTagDialog) - self.buttonBox.setObjectName('displayTagDialogButtonBox') + self.buttonBox = QtGui.QDialogButtonBox(formattingTagDialog) + self.buttonBox.setObjectName('formattingTagDialogButtonBox') self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.listdataGridLayout.addWidget(self.buttonBox, 3, 0, 1, 1) - self.retranslateUi(displayTagDialog) - QtCore.QMetaObject.connectSlotsByName(displayTagDialog) + self.retranslateUi(formattingTagDialog) + QtCore.QMetaObject.connectSlotsByName(formattingTagDialog) - def retranslateUi(self, displayTagDialog): - displayTagDialog.setWindowTitle(translate('OpenLP.displayTagDialog', - 'Configure Formatting Tags')) + def retranslateUi(self, formattingTagDialog): + formattingTagDialog.setWindowTitle(translate( + 'OpenLP.FormattingTagDialog', 'Configure Formatting Tags')) self.editGroupBox.setTitle( - translate('OpenLP.DisplayTagDialog', 'Edit Selection')) + translate('OpenLP.FormattingTagDialog', 'Edit Selection')) self.savePushButton.setText( - translate('OpenLP.DisplayTagDialog', 'Save')) + translate('OpenLP.FormattingTagDialog', 'Save')) self.descriptionLabel.setText( - translate('OpenLP.DisplayTagDialog', 'Description')) - self.tagLabel.setText(translate('OpenLP.DisplayTagDialog', 'Tag')) + translate('OpenLP.FormattingTagDialog', 'Description')) + self.tagLabel.setText(translate('OpenLP.FormattingTagDialog', 'Tag')) self.startTagLabel.setText( - translate('OpenLP.DisplayTagDialog', 'Start tag')) + translate('OpenLP.FormattingTagDialog', 'Start tag')) self.endTagLabel.setText( - translate('OpenLP.DisplayTagDialog', 'End tag')) + translate('OpenLP.FormattingTagDialog', 'End tag')) self.deletePushButton.setText(UiStrings().Delete) self.newPushButton.setText(UiStrings().New) self.tagTableWidget.horizontalHeaderItem(0).setText( - translate('OpenLP.DisplayTagDialog', 'Description')) + translate('OpenLP.FormattingTagDialog', 'Description')) self.tagTableWidget.horizontalHeaderItem(1).setText( - translate('OpenLP.DisplayTagDialog', 'Tag Id')) + translate('OpenLP.FormattingTagDialog', 'Tag Id')) self.tagTableWidget.horizontalHeaderItem(2).setText( - translate('OpenLP.DisplayTagDialog', 'Start HTML')) + translate('OpenLP.FormattingTagDialog', 'Start HTML')) self.tagTableWidget.horizontalHeaderItem(3).setText( - translate('OpenLP.DisplayTagDialog', 'End HTML')) + translate('OpenLP.FormattingTagDialog', 'End HTML')) self.tagTableWidget.setColumnWidth(0, 120) self.tagTableWidget.setColumnWidth(1, 80) self.tagTableWidget.setColumnWidth(2, 330) diff --git a/openlp/core/ui/displaytagform.py b/openlp/core/ui/formattingtagform.py similarity index 87% rename from openlp/core/ui/displaytagform.py rename to openlp/core/ui/formattingtagform.py index 9456f1028..7312ffa7b 100644 --- a/openlp/core/ui/displaytagform.py +++ b/openlp/core/ui/formattingtagform.py @@ -25,22 +25,22 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`DisplayTagTab` provides an Tag Edit facility. The Base set are -protected and included each time loaded. Custom tags can be defined and saved. -The Custom Tag arrays are saved in a pickle so QSettings works on them. Base +The :mod:`DisplayTagTab` provides an Tag Edit facility. The Base set are +protected and included each time loaded. Custom tags can be defined and saved. +The Custom Tag arrays are saved in a pickle so QSettings works on them. Base Tags cannot be changed. """ import cPickle from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate, DisplayTags +from openlp.core.lib import translate, FormattingTags from openlp.core.lib.ui import critical_error_message_box -from openlp.core.ui.displaytagdialog import Ui_DisplayTagDialog +from openlp.core.ui.formattingtagdialog import Ui_FormattingTagDialog -class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): +class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): """ - The :class:`DisplayTagTab` manages the settings tab . + The :class:`FormattingTagForm` manages the settings tab . """ def __init__(self, parent): """ @@ -48,7 +48,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) - self._loadDisplayTags() + self._loadFormattingTags() QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onRowSelected) QtCore.QObject.connect(self.newPushButton, @@ -65,19 +65,20 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): Load Display and set field state. """ # Create initial copy from master - self._loadDisplayTags() + self._loadFormattingTags() self._resetTable() self.selected = -1 return QtGui.QDialog.exec_(self) - def _loadDisplayTags(self): + def _loadFormattingTags(self): """ Load the Tags from store so can be used in the system or used to update the display. If Cancel was selected this is needed to reset the dsiplay to the correct version. """ # Initial Load of the Tags - DisplayTags.reset_html_tags() + FormattingTags.reset_html_tags() + # Formatting Tags where also known as display tags. user_expands = QtCore.QSettings().value(u'displayTags/html_tags', QtCore.QVariant(u'')).toString() # cPickle only accepts str not unicode strings @@ -85,14 +86,14 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): if user_expands_string: user_tags = cPickle.loads(user_expands_string) # If we have some user ones added them as well - DisplayTags.add_html_tags(user_tags) + FormattingTags.add_html_tags(user_tags) def onRowSelected(self): """ Table Row selected so display items and set field state. """ row = self.tagTableWidget.currentRow() - html = DisplayTags.get_html_tags()[row] + html = FormattingTags.get_html_tags()[row] self.selected = row self.descriptionLineEdit.setText(html[u'desc']) self.tagLineEdit.setText(self._strip(html[u'start tag'])) @@ -117,7 +118,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): """ Add a new tag to list only if it is not a duplicate. """ - for html in DisplayTags.get_html_tags(): + for html in FormattingTags.get_html_tags(): if self._strip(html[u'start tag']) == u'n': critical_error_message_box( translate('OpenLP.DisplayTagTab', 'Update Error'), @@ -133,7 +134,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): u'end html': translate('OpenLP.DisplayTagTab', ''), u'protected': False } - DisplayTags.add_html_tags([tag]) + FormattingTags.add_html_tags([tag]) self._resetTable() # Highlight new row self.tagTableWidget.selectRow(self.tagTableWidget.rowCount() - 1) @@ -145,7 +146,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): Delete selected custom tag. """ if self.selected != -1: - DisplayTags.remove_html_tag(self.selected) + FormattingTags.remove_html_tag(self.selected) self.selected = -1 self._resetTable() self._saveTable() @@ -154,7 +155,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): """ Update Custom Tag details if not duplicate and save the data. """ - html_expands = DisplayTags.get_html_tags() + html_expands = FormattingTags.get_html_tags() if self.selected != -1: html = html_expands[self.selected] tag = unicode(self.tagLineEdit.text()) @@ -180,15 +181,12 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): Saves all formatting tags except protected ones. """ tags = [] - for tag in DisplayTags.get_html_tags(): + for tag in FormattingTags.get_html_tags(): if not tag[u'protected']: tags.append(tag) - if tags: - QtCore.QSettings().setValue(u'displayTags/html_tags', - QtCore.QVariant(cPickle.dumps(tags))) - else: - QtCore.QSettings().setValue(u'displayTags/html_tags', - QtCore.QVariant(u'')) + # Formatting Tags where also known as display tags. + QtCore.QSettings().setValue(u'displayTags/html_tags', + QtCore.QVariant(cPickle.dumps(tags) if tags else u'')) def _resetTable(self): """ @@ -199,7 +197,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): self.newPushButton.setEnabled(True) self.savePushButton.setEnabled(False) self.deletePushButton.setEnabled(False) - for linenumber, html in enumerate(DisplayTags.get_html_tags()): + for linenumber, html in enumerate(FormattingTags.get_html_tags()): self.tagTableWidget.setRowCount( self.tagTableWidget.rowCount() + 1) self.tagTableWidget.setItem(linenumber, 0, diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index f3a5e2cb9..16691e5a0 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -38,7 +38,7 @@ from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \ icon_action, shortcut_action from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ThemeManager, SlideController, PluginForm, MediaDockManager, \ - ShortcutListForm, DisplayTagForm + ShortcutListForm, FormattingTagForm from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ get_application_version, delete_file from openlp.core.utils.actions import ActionList, CategoryOrder @@ -269,7 +269,8 @@ class Ui_MainWindow(object): u'settingsShortcutsItem', u':/system/system_configure_shortcuts.png', category=UiStrings().Settings) - self.displayTagItem = icon_action(mainWindow, + # Formatting Tags where also known as display tags. + self.formattingTagItem = icon_action(mainWindow, u'displayTagItem', u':/system/tag_editor.png', category=UiStrings().Settings) self.settingsConfigureItem = icon_action(mainWindow, @@ -315,11 +316,11 @@ class Ui_MainWindow(object): add_actions(self.settingsMenu, (self.settingsPluginListItem, self.settingsLanguageMenu.menuAction(), None, self.settingsConfigureItem, self.settingsShortcutsItem, - self.displayTagItem)) + self.formattingTagItem)) else: add_actions(self.settingsMenu, (self.settingsPluginListItem, self.settingsLanguageMenu.menuAction(), None, - self.displayTagItem, self.settingsShortcutsItem, + self.formattingTagItem, self.settingsShortcutsItem, self.settingsConfigureItem)) add_actions(self.toolsMenu, (self.toolsAddToolItem, None)) add_actions(self.toolsMenu, (self.toolsOpenDataFolder, None)) @@ -403,7 +404,7 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', '&Language')) self.settingsShortcutsItem.setText( translate('OpenLP.MainWindow', 'Configure &Shortcuts...')) - self.displayTagItem.setText( + self.formattingTagItem.setText( translate('OpenLP.MainWindow', '&Configure Formatting Tags...')) self.settingsConfigureItem.setText( translate('OpenLP.MainWindow', '&Configure OpenLP...')) @@ -511,7 +512,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.serviceNotSaved = False self.aboutForm = AboutForm(self) self.settingsForm = SettingsForm(self, self) - self.displayTagForm = DisplayTagForm(self) + self.formattingTagForm = FormattingTagForm(self) self.shortcutForm = ShortcutListForm(self) self.recentFiles = QtCore.QStringList() # Set up the path with plugins @@ -548,8 +549,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'triggered()'), self.onToolsOpenDataFolderClicked) QtCore.QObject.connect(self.updateThemeImages, QtCore.SIGNAL(u'triggered()'), self.onUpdateThemeImages) - QtCore.QObject.connect(self.displayTagItem, - QtCore.SIGNAL(u'triggered()'), self.onDisplayTagItemClicked) + QtCore.QObject.connect(self.formattingTagItem, + QtCore.SIGNAL(u'triggered()'), self.onFormattingTagItemClicked) QtCore.QObject.connect(self.settingsConfigureItem, QtCore.SIGNAL(u'triggered()'), self.onSettingsConfigureItemClicked) QtCore.QObject.connect(self.settingsShortcutsItem, @@ -788,11 +789,11 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ self.themeManagerContents.updatePreviewImages() - def onDisplayTagItemClicked(self): + def onFormattingTagItemClicked(self): """ Show the Settings dialog """ - self.displayTagForm.exec_() + self.formattingTagForm.exec_() def onSettingsConfigureItemClicked(self): """ From b3896d880bd7f222cd01557d9fd2af7d7bd0b49f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 30 Jul 2011 09:40:34 +0200 Subject: [PATCH 49/76] spelling --- openlp/core/ui/formattingtagform.py | 6 +++--- openlp/core/ui/mainwindow.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/formattingtagform.py b/openlp/core/ui/formattingtagform.py index 7312ffa7b..b3fda20ba 100644 --- a/openlp/core/ui/formattingtagform.py +++ b/openlp/core/ui/formattingtagform.py @@ -25,7 +25,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`DisplayTagTab` provides an Tag Edit facility. The Base set are +The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are protected and included each time loaded. Custom tags can be defined and saved. The Custom Tag arrays are saved in a pickle so QSettings works on them. Base Tags cannot be changed. @@ -78,7 +78,7 @@ class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): """ # Initial Load of the Tags FormattingTags.reset_html_tags() - # Formatting Tags where also known as display tags. + # Formatting Tags were also known as display tags. user_expands = QtCore.QSettings().value(u'displayTags/html_tags', QtCore.QVariant(u'')).toString() # cPickle only accepts str not unicode strings @@ -184,7 +184,7 @@ class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): for tag in FormattingTags.get_html_tags(): if not tag[u'protected']: tags.append(tag) - # Formatting Tags where also known as display tags. + # Formatting Tags were also known as display tags. QtCore.QSettings().setValue(u'displayTags/html_tags', QtCore.QVariant(cPickle.dumps(tags) if tags else u'')) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 16691e5a0..8beb21eac 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -269,7 +269,7 @@ class Ui_MainWindow(object): u'settingsShortcutsItem', u':/system/system_configure_shortcuts.png', category=UiStrings().Settings) - # Formatting Tags where also known as display tags. + # Formatting Tags were also known as display tags. self.formattingTagItem = icon_action(mainWindow, u'displayTagItem', u':/system/tag_editor.png', category=UiStrings().Settings) From 4f195a4721a3253f0cea101f2a26fde0d0a03797 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 30 Jul 2011 09:43:19 +0200 Subject: [PATCH 50/76] changed translate context --- openlp/core/ui/formattingtagform.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/core/ui/formattingtagform.py b/openlp/core/ui/formattingtagform.py index b3fda20ba..2a8625b1a 100644 --- a/openlp/core/ui/formattingtagform.py +++ b/openlp/core/ui/formattingtagform.py @@ -121,17 +121,17 @@ class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): for html in FormattingTags.get_html_tags(): if self._strip(html[u'start tag']) == u'n': critical_error_message_box( - translate('OpenLP.DisplayTagTab', 'Update Error'), - translate('OpenLP.DisplayTagTab', + translate('OpenLP.FormattingTagForm', 'Update Error'), + translate('OpenLP.FormattingTagForm', 'Tag "n" already defined.')) return # Add new tag to list tag = { - u'desc': translate('OpenLP.DisplayTagTab', 'New Tag'), + u'desc': translate('OpenLP.FormattingTagForm', 'New Tag'), u'start tag': u'{n}', - u'start html': translate('OpenLP.DisplayTagTab', ''), + u'start html': translate('OpenLP.FormattingTagForm', ''), u'end tag': u'{/n}', - u'end html': translate('OpenLP.DisplayTagTab', ''), + u'end html': translate('OpenLP.FormattingTagForm', ''), u'protected': False } FormattingTags.add_html_tags([tag]) @@ -163,8 +163,8 @@ class FormattingTagForm(QtGui.QDialog, Ui_FormattingTagDialog): if self._strip(html1[u'start tag']) == tag and \ linenumber != self.selected: critical_error_message_box( - translate('OpenLP.DisplayTagTab', 'Update Error'), - unicode(translate('OpenLP.DisplayTagTab', + translate('OpenLP.FormattingTagForm', 'Update Error'), + unicode(translate('OpenLP.FormattingTagForm', 'Tag %s already defined.')) % tag) return html[u'desc'] = unicode(self.descriptionLineEdit.text()) From 5e91aa7aee0d7bdc7006dabfa8f0273cd6385102 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 30 Jul 2011 10:07:48 +0200 Subject: [PATCH 51/76] fixed long lines --- openlp/core/lib/formattingtags.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/formattingtags.py b/openlp/core/lib/formattingtags.py index 9fd42a605..ae9d5c1cf 100644 --- a/openlp/core/lib/formattingtags.py +++ b/openlp/core/lib/formattingtags.py @@ -93,20 +93,24 @@ class FormattingTags(object): u'desc': translate('OpenLP.FormattingTags', 'Superscript'), u'start tag': u'{su}', u'start html': u'', u'end tag': u'{/su}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Subscript'), + base_tags.append({ + u'desc': translate('OpenLP.FormattingTags', 'Subscript'), u'start tag': u'{sb}', u'start html': u'', u'end tag': u'{/sb}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Paragraph'), + base_tags.append({ + u'desc': translate('OpenLP.FormattingTags', 'Paragraph'), u'start tag': u'{p}', u'start html': u'

', u'end tag': u'{/p}', u'end html': u'

', u'protected': True}) base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Bold'), u'start tag': u'{st}', u'start html': u'', u'end tag': u'{/st}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Italics'), + base_tags.append({ + u'desc': translate('OpenLP.FormattingTags', 'Italics'), u'start tag': u'{it}', u'start html': u'', u'end tag': u'{/it}', u'end html': u'', u'protected': True}) - base_tags.append({u'desc': translate('OpenLP.FormattingTags', 'Underline'), + base_tags.append({ + u'desc': translate('OpenLP.FormattingTags', 'Underline'), u'start tag': u'{u}', u'start html': u'', u'end tag': u'{/u}', u'end html': u'', u'protected': True}) From c608a0750dad4ca1418988cd6932c8b8a752874a Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Mon, 1 Aug 2011 21:58:10 -0400 Subject: [PATCH 52/76] Modified firsttimeform to include existing themes when wizard is re-run --- openlp/core/ui/firsttimeform.py | 36 +++++++++++++++++++++++++++++---- openlp/core/ui/mainwindow.py | 2 +- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index e5d434180..71c18044e 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -157,10 +157,28 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): item = self.themesListWidget.item(iter) if item.checkState() == QtCore.Qt.Checked: self.themeComboBox.addItem(item.text()) + #Check if this is a re-run of the wizard. If so, add existing themes to list + self.has_run_wizard = QtCore.QSettings().value( + u'general/has run wizard', QtCore.QVariant(False)).toBool() + if self.has_run_wizard: + #If themes already exist, add them to the list + self.theme_list = self.parent().themeManagerContents.getThemes() + for theme in self.theme_list: + index = self.themeComboBox.findText(theme) + if index == -1: + self.themeComboBox.addItem(theme) + default_theme = unicode(QtCore.QSettings().value( + u'themes/global theme', + QtCore.QVariant(u'')).toString()) + #Pre-select the current default theme + index = self.themeComboBox.findText(default_theme) + self.themeComboBox.setCurrentIndex(index) elif pageId == FirstTimePage.Progress: + Receiver.send_message(u'cursor_busy') self._preWizard() self._performWizard() self._postWizard() + Receiver.send_message(u'cursor_normal') def updateScreenListCombo(self): """ @@ -249,11 +267,21 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): """ if self.max_progress: self.progressBar.setValue(self.progressBar.maximum()) - self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Download complete. Click the finish button to start OpenLP.')) + if self.has_run_wizard: + self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Download complete.' + ' Click the finish button to return to OpenLP.')) + else: + self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Download complete.' + ' Click the finish button to start OpenLP.')) else: - self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', - 'Click the finish button to start OpenLP.')) + if self.has_run_wizard: + self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Click the finish button to return to OpenLP.')) + else: + self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', + 'Click the finish button to start OpenLP.')) self.finishButton.setVisible(True) self.finishButton.setEnabled(True) self.cancelButton.setVisible(False) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 69626cae8..7de14594a 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -748,7 +748,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): return Receiver.send_message(u'cursor_busy') screens = ScreenList.get_instance() - if FirstTimeForm(screens).exec_() == QtGui.QDialog.Accepted: + if FirstTimeForm(screens, self).exec_() == QtGui.QDialog.Accepted: self.firstTime() for plugin in self.pluginManager.plugins: self.activePlugin = plugin From 644706a62a6558a76e072e2dbf4f3e0d91077337 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 2 Aug 2011 06:07:09 +0100 Subject: [PATCH 53/76] Fix review comments and cleanups --- openlp/core/lib/listwidgetwithdnd.py | 17 +++++-- openlp/core/lib/mediamanageritem.py | 50 +++++++++++-------- openlp/plugins/images/lib/mediaitem.py | 2 - openlp/plugins/media/lib/mediaitem.py | 2 - openlp/plugins/presentations/lib/mediaitem.py | 2 - 5 files changed, 42 insertions(+), 31 deletions(-) diff --git a/openlp/core/lib/listwidgetwithdnd.py b/openlp/core/lib/listwidgetwithdnd.py index 69bd67fdd..8474821a4 100644 --- a/openlp/core/lib/listwidgetwithdnd.py +++ b/openlp/core/lib/listwidgetwithdnd.py @@ -51,6 +51,9 @@ class ListWidgetWithDnD(QtGui.QListWidget): """ self.setAcceptDrops(True) self.setDragDropMode(QtGui.QAbstractItemView.DragDrop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%s_dnd' % self.mimeDataText), + self.parent().loadFile) def mouseMoveEvent(self, event): """ @@ -71,7 +74,7 @@ class ListWidgetWithDnD(QtGui.QListWidget): drag.start(QtCore.Qt.CopyAction) def dragEnterEvent(self, event): - if event.mimeData().hasUrls: + if event.mimeData().hasUrls(): event.accept() else: event.ignore() @@ -93,9 +96,15 @@ class ListWidgetWithDnD(QtGui.QListWidget): if event.mimeData().hasUrls(): event.setDropAction(QtCore.Qt.CopyAction) event.accept() + files = [] for url in event.mimeData().urls(): - if os.path.isfile(url.toLocalFile()): - Receiver.send_message(u'%s_dnd' % self.mimeDataText, - url.toLocalFile()) + localFile = unicode(url.toLocalFile()) + if os.path.isfile(localFile): + files.append(localFile) + elif os.path.isdir(localFile): + listing = os.listdir(localFile) + for file in listing: + files.append(os.path.join(localFile,file)) + Receiver.send_message(u'%s_dnd' % self.mimeDataText,files) else: event.ignore() diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 2b2e8c6e3..7852a0d5c 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -341,25 +341,31 @@ class MediaManagerItem(QtGui.QWidget): self.validateAndLoad(files) Receiver.send_message(u'cursor_normal') - def loadFile(self, filename): + def loadFile(self, files): """ - Turn file from Drag and Drop into a array so the Validate code - can runn it. + Turn file from Drag and Drop into an array so the Validate code + can run it. - ``filename`` - The file to be loaded + ``files`` + The list of files to be loaded """ - filename = unicode(filename) - type = filename.split(u'.')[-1] - if type.lower() not in self.onNewFileMasks: - critical_error_message_box( - translate('OpenLP.MediaManagerItem', - 'Invalid File Type'), - unicode(translate('OpenLP.MediaManagerItem', - 'Invalid File %s.\nSuffix not supported')) - % filename) - else: - self.validateAndLoad([filename]) + newFiles = [] + errorShown = False + for file in files: + type = file.split(u'.')[-1] + if type.lower() not in self.onNewFileMasks: + if not errorShown: + critical_error_message_box( + translate('OpenLP.MediaManagerItem', + 'Invalid File Type'), + unicode(translate('OpenLP.MediaManagerItem', + 'Invalid File %s.\nSuffix not supported')) + % file) + errorShown = True + else: + newFiles.append(file) + if file: + self.validateAndLoad(newFiles) def validateAndLoad(self, files): """ @@ -373,14 +379,11 @@ class MediaManagerItem(QtGui.QWidget): for count in range(0, self.listView.count()): names.append(self.listView.item(count).text()) newFiles = [] + duplicatesFound = False for file in files: filename = os.path.split(unicode(file))[1] if filename in names: - critical_error_message_box( - UiStrings().Duplicate, - unicode(translate('OpenLP.MediaManagerItem', - 'Duplicate filename %s.\nThis filename is already in ' - 'the list')) % filename) + duplicatesFound = True else: newFiles.append(file) self.loadList(newFiles) @@ -388,6 +391,11 @@ class MediaManagerItem(QtGui.QWidget): SettingsManager.set_last_dir(self.settingsSection, lastDir) SettingsManager.set_list(self.settingsSection, self.settingsSection, self.getFileList()) + if duplicatesFound: + critical_error_message_box( + UiStrings().Duplicate, + unicode(translate('OpenLP.MediaManagerItem', + 'Duplicate files found on import and ignored.'))) def contextMenu(self, point): item = self.listView.itemAt(point) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 09811ead7..acd420880 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -54,8 +54,6 @@ class ImageMediaItem(MediaManagerItem): QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged) # Allow DnD from the desktop self.listView.activateDnD() - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'images_dnd'), self.loadFile) def retranslateUi(self): self.onNewPrompt = translate('ImagePlugin.MediaItem', diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 54682dbf6..e3c36bd77 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -63,8 +63,6 @@ class MediaMediaItem(MediaManagerItem): self.createPhonon) # Allow DnD from the desktop self.listView.activateDnD() - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_dnd'), self.loadFile) def retranslateUi(self): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index abd597c6c..85721c65d 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -60,8 +60,6 @@ class PresentationMediaItem(MediaManagerItem): QtCore.SIGNAL(u'mediaitem_presentation_rebuild'), self.rebuild) # Allow DnD from the desktop self.listView.activateDnD() - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'presentations_dnd'), self.loadFile) def retranslateUi(self): """ From af8a89dfd4f1e2f87b1cea18c4514912211bec3e Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Tue, 2 Aug 2011 08:51:41 -0400 Subject: [PATCH 54/76] fixed come comments --- openlp/core/ui/firsttimeform.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index 71c18044e..f5a2563e5 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -157,11 +157,11 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): item = self.themesListWidget.item(iter) if item.checkState() == QtCore.Qt.Checked: self.themeComboBox.addItem(item.text()) - #Check if this is a re-run of the wizard. If so, add existing themes to list + # Check if this is a re-run of the wizard. If so, add existing themes to list self.has_run_wizard = QtCore.QSettings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() if self.has_run_wizard: - #If themes already exist, add them to the list + # If themes already exist, add them to the list self.theme_list = self.parent().themeManagerContents.getThemes() for theme in self.theme_list: index = self.themeComboBox.findText(theme) @@ -170,7 +170,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): default_theme = unicode(QtCore.QSettings().value( u'themes/global theme', QtCore.QVariant(u'')).toString()) - #Pre-select the current default theme + # Pre-select the current default theme index = self.themeComboBox.findText(default_theme) self.themeComboBox.setCurrentIndex(index) elif pageId == FirstTimePage.Progress: From 0b4616542934b24a8a8860aebeee688716e8964f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 2 Aug 2011 19:17:07 +0100 Subject: [PATCH 55/76] Last set of fixes --- openlp/core/lib/mediamanageritem.py | 11 ++++---- openlp/core/ui/servicemanager.py | 31 +++++++++++++++------ openlp/plugins/songusage/songusageplugin.py | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 7852a0d5c..a721fabf6 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -386,11 +386,12 @@ class MediaManagerItem(QtGui.QWidget): duplicatesFound = True else: newFiles.append(file) - self.loadList(newFiles) - lastDir = os.path.split(unicode(files[0]))[0] - SettingsManager.set_last_dir(self.settingsSection, lastDir) - SettingsManager.set_list(self.settingsSection, - self.settingsSection, self.getFileList()) + if newFiles: + self.loadList(newFiles) + lastDir = os.path.split(unicode(files[0]))[0] + SettingsManager.set_last_dir(self.settingsSection, lastDir) + SettingsManager.set_list(self.settingsSection, + self.settingsSection, self.getFileList()) if duplicatesFound: critical_error_message_box( UiStrings().Duplicate, diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 6d86097f2..0755a0143 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -408,20 +408,33 @@ class ServiceManager(QtGui.QWidget): return False self.newFile() - def onLoadServiceClicked(self): + def onLoadServiceClicked(self, loadFile=None): + """ + Loads the service file and saves the existing one it there is one + unchanged + + ``loadFile`` + The service file to the loaded. Will be None is from menu so + selection will be required. + """ if self.isModified(): result = self.saveModifiedService() if result == QtGui.QMessageBox.Cancel: return False elif result == QtGui.QMessageBox.Save: self.saveFile() - fileName = unicode(QtGui.QFileDialog.getOpenFileName(self.mainwindow, - translate('OpenLP.ServiceManager', 'Open File'), - SettingsManager.get_last_dir( - self.mainwindow.serviceSettingsSection), - translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz)'))) - if not fileName: - return False + if not loadFile: + fileName = unicode(QtGui.QFileDialog.getOpenFileName( + self.mainwindow, + translate('OpenLP.ServiceManager', 'Open File'), + SettingsManager.get_last_dir( + self.mainwindow.serviceSettingsSection), + translate('OpenLP.ServiceManager', + 'OpenLP Service Files (*.osz)'))) + if not fileName: + return False + else: + fileName = loadFile SettingsManager.set_last_dir(self.mainwindow.serviceSettingsSection, split_filename(fileName)[0]) self.loadFile(fileName) @@ -1245,7 +1258,7 @@ class ServiceManager(QtGui.QWidget): for url in event.mimeData().urls(): filename = unicode(url.toLocalFile()) if filename.endswith(u'.osz'): - self.loadFile(filename) + self.onLoadServiceClicked(filename) elif event.mimeData().hasText(): plugin = unicode(event.mimeData().text()) item = self.serviceManagerList.itemAt(event.pos()) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index a657d700d..4ca23aeb0 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -91,8 +91,8 @@ class SongUsagePlugin(Plugin): self.toolsMenu.addAction(self.songUsageMenu.menuAction()) self.songUsageMenu.addAction(self.songUsageStatus) self.songUsageMenu.addSeparator() - self.songUsageMenu.addAction(self.songUsageDelete) self.songUsageMenu.addAction(self.songUsageReport) + self.songUsageMenu.addAction(self.songUsageDelete) self.songUsageActiveButton = QtGui.QToolButton( self.formparent.statusBar) self.songUsageActiveButton.setCheckable(True) From af7ff7c6be8e222d23b7b51abbcc272c85eb01a7 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Wed, 3 Aug 2011 09:19:43 -0400 Subject: [PATCH 56/76] changed some comments, removed a variable using functioin inline --- openlp/core/ui/firsttimeform.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index f5a2563e5..4beebfde6 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -157,20 +157,19 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard): item = self.themesListWidget.item(iter) if item.checkState() == QtCore.Qt.Checked: self.themeComboBox.addItem(item.text()) - # Check if this is a re-run of the wizard. If so, add existing themes to list + # Check if this is a re-run of the wizard. self.has_run_wizard = QtCore.QSettings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() if self.has_run_wizard: - # If themes already exist, add them to the list - self.theme_list = self.parent().themeManagerContents.getThemes() - for theme in self.theme_list: + # Add any existing themes to list. + for theme in self.parent().themeManagerContents.getThemes(): index = self.themeComboBox.findText(theme) if index == -1: self.themeComboBox.addItem(theme) default_theme = unicode(QtCore.QSettings().value( u'themes/global theme', QtCore.QVariant(u'')).toString()) - # Pre-select the current default theme + # Pre-select the current default theme. index = self.themeComboBox.findText(default_theme) self.themeComboBox.setCurrentIndex(index) elif pageId == FirstTimePage.Progress: From 5ff39a7d83cd9c67295dd435bf234a72f77ef340 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 3 Aug 2011 16:52:29 +0100 Subject: [PATCH 57/76] Fix missing() --- openlp/core/lib/listwidgetwithdnd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/listwidgetwithdnd.py b/openlp/core/lib/listwidgetwithdnd.py index 8474821a4..69fb23092 100644 --- a/openlp/core/lib/listwidgetwithdnd.py +++ b/openlp/core/lib/listwidgetwithdnd.py @@ -80,7 +80,7 @@ class ListWidgetWithDnD(QtGui.QListWidget): event.ignore() def dragMoveEvent(self, event): - if event.mimeData().hasUrls: + if event.mimeData().hasUrls(): event.setDropAction(QtCore.Qt.CopyAction) event.accept() else: From 7f440527f84ad96320521691ea31378f536b4dfd Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Wed, 3 Aug 2011 14:49:47 -0400 Subject: [PATCH 58/76] modified servicemanager to check for missing files during service save --- openlp/core/ui/servicemanager.py | 61 ++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 351e5bbc6..721d50d6e 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -465,10 +465,13 @@ class ServiceManager(QtGui.QWidget): service = [] write_list = [] total_size = 0 + abort_save = False Receiver.send_message(u'cursor_busy') # Number of items + 1 to zip it self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) for item in self.serviceItems: + if abort_save: + continue self.mainwindow.incrementProgressBar() service.append({u'serviceitem': item[u'service_item'].get_service_repr()}) @@ -482,25 +485,45 @@ class ServiceManager(QtGui.QWidget): # Only write a file once if path_from in write_list: continue - file_size = os.path.getsize(path_from) - size_limit = 52428800 # 50MiB - #if file_size > size_limit: - # # File exeeds size_limit bytes, ask user - # message = unicode(translate('OpenLP.ServiceManager', - # 'Do you want to include \n%.1f MB file "%s"\n' - # 'into the service file?\nThis may take some time.\n\n' - # 'Please note that you need to\ntake care of that file' - # ' yourself,\nif you leave it out.')) % \ - # (file_size/1048576, os.path.split(path_from)[1]) - # ans = QtGui.QMessageBox.question(self.mainwindow, - # translate('OpenLP.ServiceManager', 'Including Large ' - # 'File'), message, QtGui.QMessageBox.StandardButtons( - # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), - # QtGui.QMessageBox.Ok) - # if ans == QtGui.QMessageBox.Cancel: - # continue - write_list.append(path_from) - total_size += file_size + if not os.path.isfile(path_from): + Receiver.send_message(u'cursor_normal') + title = unicode(translate('OpenLP.ServiceManager', + 'Service File Missing')) + message = unicode(translate('OpenLP.ServiceManager', + 'File missing from service\n\n %s \n\n' + 'Continue saving?' % path_from )) + ans = QtGui.QMessageBox.critical(self, title, message, + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) + if ans == QtGui.QMessageBox.No: + abort_save = True + continue + Receiver.send_message(u'cursor_busy') + else: + file_size = os.path.getsize(path_from) + size_limit = 52428800 # 50MiB + #if file_size > size_limit: + # # File exeeds size_limit bytes, ask user + # message = unicode(translate('OpenLP.ServiceManager', + # 'Do you want to include \n%.1f MB file "%s"\n' + # 'into the service file?\nThis may take some time.\n\n' + # 'Please note that you need to\ntake care of that file' + # ' yourself,\nif you leave it out.')) % \ + # (file_size/1048576, os.path.split(path_from)[1]) + # ans = QtGui.QMessageBox.question(self.mainwindow, + # translate('OpenLP.ServiceManager', 'Including Large ' + # 'File'), message, QtGui.QMessageBox.StandardButtons( + # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), + # QtGui.QMessageBox.Ok) + # if ans == QtGui.QMessageBox.Cancel: + # continue + write_list.append(path_from) + total_size += file_size + if abort_save: + self._fileName = u'' + self.mainwindow.finishedProgressBar() + Receiver.send_message(u'cursor_normal') + return False log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % total_size) service_content = cPickle.dumps(service) From b4e776b92c7d96acc69fe0815fe6f0afdde4dc02 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Thu, 4 Aug 2011 09:43:05 -0400 Subject: [PATCH 59/76] removed un-needed code --- openlp/core/ui/servicemanager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 721d50d6e..8b5d93c5e 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -485,7 +485,7 @@ class ServiceManager(QtGui.QWidget): # Only write a file once if path_from in write_list: continue - if not os.path.isfile(path_from): + if not os.path.exists(path_from): Receiver.send_message(u'cursor_normal') title = unicode(translate('OpenLP.ServiceManager', 'Service File Missing')) @@ -520,7 +520,6 @@ class ServiceManager(QtGui.QWidget): write_list.append(path_from) total_size += file_size if abort_save: - self._fileName = u'' self.mainwindow.finishedProgressBar() Receiver.send_message(u'cursor_normal') return False From 8876a12deb08f86cce1447957b892115b39ed645 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 5 Aug 2011 09:41:20 +0200 Subject: [PATCH 60/76] updated docstring --- openlp/core/lib/renderer.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index ce7f84778..b41e89c26 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -243,19 +243,17 @@ class Renderer(object): new_pages.append(page) return new_pages - def _calculate_default(self, screen): + def _calculate_default(self, size): """ Calculate the default dimentions of the screen. - ``screen`` - The screen to calculate the default of. + ``size`` + The screen's size to calculate the default of (``QtCore.QRect``). """ - log.debug(u'_calculate default %s', screen) - self.width = screen.width() - self.height = screen.height() + self.width = size.width() + self.height = size.height() self.screen_ratio = float(self.height) / float(self.width) - log.debug(u'calculate default %d, %d, %f', - self.width, self.height, self.screen_ratio) + log.debug(u'_calculate default %s, %f' % (size, self.screen_ratio)) # 90% is start of footer self.footer_start = int(self.height * 0.90) @@ -316,8 +314,8 @@ class Renderer(object): // work as expected. return document.all.main.offsetHeight; } - +
""" % \ (build_lyrics_format_css(self.theme_data, self.page_width, self.page_height), build_lyrics_outline_css(self.theme_data)) From f4eb21eb05bdd29dfad053731f243ae40a4669ee Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 5 Aug 2011 10:10:53 +0200 Subject: [PATCH 61/76] more docstrings, clean ups --- openlp/core/lib/renderer.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index b41e89c26..911891693 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -222,7 +222,7 @@ class Renderer(object): line_end = u' ' # Bibles if item.is_capable(ItemCapabilities.AllowsWordSplit): - pages = self._paginate_slide_words(text, line_end) + pages = self._paginate_slide_words(text.split(u'\n'), line_end) else: # Clean up line endings. lines = self._lines_split(text) @@ -310,9 +310,10 @@ class Renderer(object): function show_text(newtext) { var main = document.getElementById('main'); main.innerHTML = newtext; - // We have to return something, otherwise the renderer does not - // work as expected. - return document.all.main.offsetHeight; + // We need to be sure that the page is loaded, that is why we + // return the element's height (even though we do not use the + // returned value). + return main.offsetHeight; } @@ -325,6 +326,8 @@ class Renderer(object): """ Figure out how much text can appear on a slide, using the current theme settings. + **Note:** The smallest possible "unit" of text for a slide is one line. + If the line is too long it will be cut off when displayed. ``lines`` The text to be fitted on the slide split into lines. @@ -349,24 +352,25 @@ class Renderer(object): log.debug(u'_paginate_slide - End') return formatted - def _paginate_slide_words(self, text, line_end): + def _paginate_slide_words(self, lines, line_end): """ Figure out how much text can appear on a slide, using the current - theme settings. This version is to handle text which needs to be split - into words to get it to fit. + theme settings. + **Note:** The smallest possible "unit" of text for a slide is one word. + If one line is too long it will be processed word by word. This is + sometimes need for **bible** verses. - ``text`` - The words to be fitted on the slide split into lines. + ``lines`` + The text to be fitted on the slide split into lines. ``line_end`` The text added after each line. Either ``u' '`` or ``u'
``. - This is needed for bibles. + This is needed for **bibles**. """ log.debug(u'_paginate_slide_words - Start') formatted = [] previous_html = u'' previous_raw = u'' - lines = text.split(u'\n') for line in lines: line = line.strip() html_line = expand_tags(line) @@ -481,7 +485,7 @@ class Renderer(object): def _text_fits_on_slide(self, text): """ - Checks if the given ``text`` fits on a slide. If it does, ``True`` is + Checks if the given ``text`` fits on a slide. If it does ``True`` is returned, otherwise ``False``. ``text`` From d8008df9029f610f3be1f8b6c648f208ab45150c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 5 Aug 2011 10:43:32 +0200 Subject: [PATCH 62/76] do not pass instance variable as argument --- openlp/core/lib/renderer.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 911891693..3174e4df8 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -83,7 +83,7 @@ class Renderer(object): Updates the render manager's information about the current screen. """ log.debug(u'Update Display') - self._calculate_default(self.screens.current[u'size']) + self._calculate_default() if self.display: self.display.close() self.display = MainDisplay(None, self.imageManager, False) @@ -161,7 +161,7 @@ class Renderer(object): self.theme_data = override_theme else: self.theme_data = self.themeManager.getThemeData(theme) - self._calculate_default(self.screens.current[u'size']) + self._calculate_default() self._build_text_rectangle(self.theme_data) # if No file do not update cache if self.theme_data.background_filename: @@ -183,7 +183,7 @@ class Renderer(object): # save value for use in format_slide self.force_page = force_page # set the default image size for previews - self._calculate_default(self.screens.preview[u'size']) + self._calculate_default() # build a service item to generate preview serviceItem = ServiceItem() serviceItem.theme = theme_data @@ -201,7 +201,7 @@ class Renderer(object): raw_html = serviceItem.get_rendered_frame(0) preview = self.display.text(raw_html) # Reset the real screen size for subsequent render requests - self._calculate_default(self.screens.current[u'size']) + self._calculate_default() return preview self.force_page = False @@ -243,13 +243,11 @@ class Renderer(object): new_pages.append(page) return new_pages - def _calculate_default(self, size): + def _calculate_default(self): """ Calculate the default dimentions of the screen. - - ``size`` - The screen's size to calculate the default of (``QtCore.QRect``). """ + size = self.screens.current[u'size'] self.width = size.width() self.height = size.height() self.screen_ratio = float(self.height) / float(self.width) From 6ce4e7beab8b5fd4ca13db5d4109d88e0d1aaf51 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 5 Aug 2011 10:47:31 +0200 Subject: [PATCH 63/76] changed varialbe name --- openlp/core/lib/renderer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 3174e4df8..ac7e95c4c 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -247,11 +247,12 @@ class Renderer(object): """ Calculate the default dimentions of the screen. """ - size = self.screens.current[u'size'] - self.width = size.width() - self.height = size.height() + screen_size = self.screens.current[u'size'] + self.width = screen_size.width() + self.height = screen_size.height() self.screen_ratio = float(self.height) / float(self.width) - log.debug(u'_calculate default %s, %f' % (size, self.screen_ratio)) + log.debug(u'_calculate default %s, %f' % (screen_size, + self.screen_ratio)) # 90% is start of footer self.footer_start = int(self.height * 0.90) From 6c7c27a7c9720539655c32c90cc36c2413f55b85 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 5 Aug 2011 13:21:39 +0200 Subject: [PATCH 64/76] fixed bug #816186; fixed comments; fixed list comprehension Fixes: https://launchpad.net/bugs/816186 --- openlp/plugins/songs/forms/songimportform.py | 3 +- openlp/plugins/songs/lib/olp1import.py | 37 +++++++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 4ab60d360..52524b838 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -699,7 +699,8 @@ class SongImportForm(OpenLPWizard): elif source_format == SongFormat.OpenLP1: # Import an openlp.org database importer = self.plugin.importSongs(SongFormat.OpenLP1, - filename=unicode(self.openLP1FilenameEdit.text()) + filename=unicode(self.openLP1FilenameEdit.text()), + plugin=self.plugin ) elif source_format == SongFormat.OpenLyrics: # Import OpenLyrics songs diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 423f5ece0..de7264a5b 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -57,6 +57,8 @@ class OpenLP1SongImport(SongImport): The database providing the data to import. """ SongImport.__init__(self, manager, **kwargs) + self.available_themes = \ + kwargs[u'plugin'].formparent.themeManagerContents.getThemes() def do_import(self): """ @@ -70,27 +72,34 @@ class OpenLP1SongImport(SongImport): encoding = self.get_encoding() if not encoding: return - # Connect to the database + # Connect to the database. connection = sqlite.connect(self.import_source, mode=0444, encoding=(encoding, 'replace')) cursor = connection.cursor() - # Determine if we're using a new or an old DB + # Determine if we're using a new or an old DB. cursor.execute(u'SELECT name FROM sqlite_master ' u'WHERE type = \'table\' AND name = \'tracks\'') new_db = len(cursor.fetchall()) > 0 - # "cache" our list of authors + # "cache" our list of authors. cursor.execute(u'-- types int, unicode') cursor.execute(u'SELECT authorid, authorname FROM authors') authors = cursor.fetchall() if new_db: - # "cache" our list of tracks + # "cache" our list of tracks. cursor.execute(u'-- types int, unicode') cursor.execute(u'SELECT trackid, fulltrackname FROM tracks') tracks = cursor.fetchall() - # Import the songs - cursor.execute(u'-- types int, unicode, unicode, unicode') + # "cache" our list of themes. + cursor.execute(u'-- types int, unicode') + cursor.execute(u'SELECT settingsid, settingsname FROM settings') + themes = {} + for theme_id, theme_name in cursor.fetchall(): + if theme_name in self.available_themes: + themes[theme_id] = theme_name + # Import the songs. + cursor.execute(u'-- types int, unicode, unicode, unicode, int') cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, ' - u'copyrightinfo FROM songs') + u'copyrightinfo, settingsid FROM songs') songs = cursor.fetchall() self.import_wizard.progressBar.setMaximum(len(songs)) for song in songs: @@ -101,8 +110,12 @@ class OpenLP1SongImport(SongImport): self.title = song[1] lyrics = song[2].replace(u'\r\n', u'\n') self.add_copyright(song[3]) + if themes.has_key(song[4]): + self.theme_name = themes[song[4]] verses = lyrics.split(u'\n\n') - [self.add_verse(verse.strip()) for verse in verses if verse.strip()] + for verse in verses: + if verse.strip(): + self.add_verse(verse.strip()) cursor.execute(u'-- types int') cursor.execute(u'SELECT authorid FROM songauthors ' u'WHERE songid = %s' % song_id) @@ -137,12 +150,12 @@ class OpenLP1SongImport(SongImport): """ Detect character encoding of an openlp.org 1.x song database. """ - # Connect to the database + # Connect to the database. connection = sqlite.connect(self.import_source, mode=0444) cursor = connection.cursor() detector = UniversalDetector() - # detect charset by authors + # Detect charset by authors. cursor.execute(u'SELECT authorname FROM authors') authors = cursor.fetchall() for author in authors: @@ -150,7 +163,7 @@ class OpenLP1SongImport(SongImport): if detector.done: detector.close() return detector.result[u'encoding'] - # detect charset by songs + # Detect charset by songs. cursor.execute(u'SELECT songtitle, copyrightinfo, ' u'lyrics || \'\' AS lyrics FROM songs') songs = cursor.fetchall() @@ -160,7 +173,7 @@ class OpenLP1SongImport(SongImport): if detector.done: detector.close() return detector.result[u'encoding'] - # detect charset by songs + # Detect charset by songs. cursor.execute(u'SELECT name FROM sqlite_master ' u'WHERE type = \'table\' AND name = \'tracks\'') if len(cursor.fetchall()) > 0: From a66f7f3365a1fa59f07441469ff8e258b4485242 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Fri, 5 Aug 2011 17:53:56 -0400 Subject: [PATCH 65/76] removed un-needed commented code. fixed dialog "no" answer --- openlp/core/ui/servicemanager.py | 31 ++++--------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 8b5d93c5e..6d4ae6ec0 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -465,13 +465,10 @@ class ServiceManager(QtGui.QWidget): service = [] write_list = [] total_size = 0 - abort_save = False Receiver.send_message(u'cursor_busy') # Number of items + 1 to zip it self.mainwindow.displayProgressBar(len(self.serviceItems) + 1) for item in self.serviceItems: - if abort_save: - continue self.mainwindow.incrementProgressBar() service.append({u'serviceitem': item[u'service_item'].get_service_repr()}) @@ -492,37 +489,17 @@ class ServiceManager(QtGui.QWidget): message = unicode(translate('OpenLP.ServiceManager', 'File missing from service\n\n %s \n\n' 'Continue saving?' % path_from )) - ans = QtGui.QMessageBox.critical(self, title, message, + answer = QtGui.QMessageBox.critical(self, title, message, QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) - if ans == QtGui.QMessageBox.No: - abort_save = True - continue + if answer == QtGui.QMessageBox.No: + self.mainwindow.finishedProgressBar() + return False Receiver.send_message(u'cursor_busy') else: file_size = os.path.getsize(path_from) - size_limit = 52428800 # 50MiB - #if file_size > size_limit: - # # File exeeds size_limit bytes, ask user - # message = unicode(translate('OpenLP.ServiceManager', - # 'Do you want to include \n%.1f MB file "%s"\n' - # 'into the service file?\nThis may take some time.\n\n' - # 'Please note that you need to\ntake care of that file' - # ' yourself,\nif you leave it out.')) % \ - # (file_size/1048576, os.path.split(path_from)[1]) - # ans = QtGui.QMessageBox.question(self.mainwindow, - # translate('OpenLP.ServiceManager', 'Including Large ' - # 'File'), message, QtGui.QMessageBox.StandardButtons( - # QtGui.QMessageBox.Ok|QtGui.QMessageBox.Cancel), - # QtGui.QMessageBox.Ok) - # if ans == QtGui.QMessageBox.Cancel: - # continue write_list.append(path_from) total_size += file_size - if abort_save: - self.mainwindow.finishedProgressBar() - Receiver.send_message(u'cursor_normal') - return False log.debug(u'ServiceManager.saveFile - ZIP contents size is %i bytes' % total_size) service_content = cPickle.dumps(service) From 271e5341f88989c55eb27abf5a881ed2fe278ac0 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Fri, 5 Aug 2011 18:09:51 -0400 Subject: [PATCH 66/76] modified code to delete/move item selected, not first match in list --- openlp/core/ui/serviceitemeditform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/serviceitemeditform.py b/openlp/core/ui/serviceitemeditform.py index f19638e43..974133c3d 100644 --- a/openlp/core/ui/serviceitemeditform.py +++ b/openlp/core/ui/serviceitemeditform.py @@ -79,7 +79,7 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog): if not item: return row = self.listWidget.row(item) - self.itemList.remove(self.itemList[row]) + self.itemList.pop(row) self.loadData() if row == self.listWidget.count(): self.listWidget.setCurrentRow(row - 1) @@ -109,7 +109,7 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog): return row = self.listWidget.row(item) temp = self.itemList[row] - self.itemList.remove(self.itemList[row]) + self.itemList.pop(row) if direction == u'up': row -= 1 else: From c27d50bddafaecca41133a59bdaf5953f99cde92 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 8 Aug 2011 08:30:25 +0200 Subject: [PATCH 67/76] fixed link to 'Contributing' site --- openlp/core/ui/aboutform.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index 2909503f6..4e031656c 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -61,6 +61,5 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog): Launch a web browser and go to the contribute page on the site. """ import webbrowser - url = u'http://www.openlp.org/en/documentation/introduction/' \ - + u'contributing.html' + url = u'http://openlp.org/en/documentation/introduction/contributing' webbrowser.open_new(url) From 2c6d14cfc8fbd68a2b942d255c5d283584e7aeaf Mon Sep 17 00:00:00 2001 From: Chris Blake Date: Mon, 8 Aug 2011 12:59:56 -0400 Subject: [PATCH 68/76] fixed bug #817674 'Export Song - Song list appears to be random order ' Fixes: https://launchpad.net/bugs/817674 --- openlp/plugins/songs/forms/songexportform.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index 3432c8846..1e86c74a1 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -249,6 +249,7 @@ class SongExportForm(OpenLPWizard): # Load the list of songs. Receiver.send_message(u'cursor_busy') songs = self.plugin.manager.get_all_objects(Song) + songs.sort(key=lambda custom: custom.title.lower()) for song in songs: authors = u', '.join([author.display_name for author in song.authors]) From e75631d7f579e2f4990f89626a310703801c238a Mon Sep 17 00:00:00 2001 From: Chris Blake Date: Mon, 8 Aug 2011 13:30:45 -0400 Subject: [PATCH 69/76] fixed bug #817674 'Export Song - Song list appears to be random order ' Fixes: https://launchpad.net/bugs/817674 --- openlp/plugins/songs/forms/songexportform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index 1e86c74a1..a654db486 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -249,7 +249,7 @@ class SongExportForm(OpenLPWizard): # Load the list of songs. Receiver.send_message(u'cursor_busy') songs = self.plugin.manager.get_all_objects(Song) - songs.sort(key=lambda custom: custom.title.lower()) + songs.sort(key=lambda song: song.title.lower()) for song in songs: authors = u', '.join([author.display_name for author in song.authors]) From 95f75ce26664d501c60a89263aceca8467f08be3 Mon Sep 17 00:00:00 2001 From: Chris Blake Date: Mon, 8 Aug 2011 15:15:45 -0400 Subject: [PATCH 70/76] fixed bug #817674 'Export Song - Song list appears to be random order ' Fixes: https://launchpad.net/bugs/817674 --- openlp/plugins/songs/forms/songexportform.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index a654db486..90c3b0275 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -28,6 +28,7 @@ The :mod:`songexportform` module provides the wizard for exporting songs to the OpenLyrics format. """ +import locale import logging from PyQt4 import QtCore, QtGui @@ -249,7 +250,7 @@ class SongExportForm(OpenLPWizard): # Load the list of songs. Receiver.send_message(u'cursor_busy') songs = self.plugin.manager.get_all_objects(Song) - songs.sort(key=lambda song: song.title.lower()) + songs.sort(cmp=locale.strcoll, key=lambda song: song.title.lower()) for song in songs: authors = u', '.join([author.display_name for author in song.authors]) From c0978d8e2235b88ae950fad20416890e2b0b4766 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Wed, 10 Aug 2011 17:29:44 -0400 Subject: [PATCH 71/76] Added code to skip-all missing files during service save --- openlp/core/ui/servicemanager.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 6d4ae6ec0..bd4035d54 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -474,6 +474,7 @@ class ServiceManager(QtGui.QWidget): item[u'service_item'].get_service_repr()}) if not item[u'service_item'].uses_file(): continue + skipMissing = False for frame in item[u'service_item'].get_frames(): if item[u'service_item'].is_image(): path_from = frame[u'path'] @@ -483,19 +484,24 @@ class ServiceManager(QtGui.QWidget): if path_from in write_list: continue if not os.path.exists(path_from): - Receiver.send_message(u'cursor_normal') - title = unicode(translate('OpenLP.ServiceManager', - 'Service File Missing')) - message = unicode(translate('OpenLP.ServiceManager', - 'File missing from service\n\n %s \n\n' - 'Continue saving?' % path_from )) - answer = QtGui.QMessageBox.critical(self, title, message, - QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) - if answer == QtGui.QMessageBox.No: - self.mainwindow.finishedProgressBar() - return False - Receiver.send_message(u'cursor_busy') + if not skipMissing: + Receiver.send_message(u'cursor_normal') + title = unicode(translate('OpenLP.ServiceManager', + 'Service File Missing')) + message = unicode(translate('OpenLP.ServiceManager', + 'File missing from service\n\n %s \n\n' + 'Continue saving?' % path_from )) + answer = QtGui.QMessageBox.critical(self, title, + message, + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | + QtGui.QMessageBox.YesToAll)) + if answer == QtGui.QMessageBox.No: + self.mainwindow.finishedProgressBar() + return False + if answer == QtGui.QMessageBox.YesToAll: + skipMissing = True + Receiver.send_message(u'cursor_busy') else: file_size = os.path.getsize(path_from) write_list.append(path_from) From ba02eb6a98a096d2895330107b465611264c934a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 11 Aug 2011 11:01:25 +0200 Subject: [PATCH 72/76] moved recent files to a menu (bug #818794) Fixes: https://launchpad.net/bugs/818794 --- openlp/core/ui/mainwindow.py | 57 +++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c7ff6c52a..510a94dfd 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -109,6 +109,8 @@ class Ui_MainWindow(object): self.menuBar.setObjectName(u'menuBar') self.fileMenu = QtGui.QMenu(self.menuBar) self.fileMenu.setObjectName(u'fileMenu') + self.recentFilesMenu = QtGui.QMenu(self.fileMenu) + self.recentFilesMenu.setObjectName(u'recentFilesMenu') self.fileImportMenu = QtGui.QMenu(self.fileMenu) self.fileImportMenu.setObjectName(u'fileImportMenu') self.fileExportMenu = QtGui.QMenu(self.fileMenu) @@ -302,10 +304,11 @@ class Ui_MainWindow(object): (self.importThemeItem, self.importLanguageItem)) add_actions(self.fileExportMenu, (self.exportThemeItem, self.exportLanguageItem)) - self.fileMenuActions = (self.fileNewItem, self.fileOpenItem, + add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem, self.fileSaveItem, self.fileSaveAsItem, None, - self.printServiceOrderItem, None, self.fileImportMenu.menuAction(), - self.fileExportMenu.menuAction(), self.fileExitItem) + self.recentFilesMenu.menuAction(), None, self.printServiceOrderItem, + None, self.fileImportMenu.menuAction(), + self.fileExportMenu.menuAction(), self.fileExitItem)) add_actions(self.viewModeMenu, (self.modeDefaultItem, self.modeSetupItem, self.modeLiveItem)) add_actions(self.viewMenu, (self.viewModeMenu.menuAction(), @@ -346,7 +349,7 @@ class Ui_MainWindow(object): self.mediaToolBox.setCurrentIndex(0) # Connect up some signals and slots QtCore.QObject.connect(self.fileMenu, - QtCore.SIGNAL(u'aboutToShow()'), self.updateFileMenu) + QtCore.SIGNAL(u'aboutToShow()'), self.updateRecentFilesMenu) QtCore.QMetaObject.connectSlotsByName(mainWindow) # Hide the entry, as it does not have any functionality yet. self.toolsAddToolItem.setVisible(False) @@ -363,6 +366,8 @@ class Ui_MainWindow(object): self.fileMenu.setTitle(translate('OpenLP.MainWindow', '&File')) self.fileImportMenu.setTitle(translate('OpenLP.MainWindow', '&Import')) self.fileExportMenu.setTitle(translate('OpenLP.MainWindow', '&Export')) + self.recentFilesMenu.setTitle( + translate('OpenLP.MainWindow', '&Recent Files')) self.viewMenu.setTitle(translate('OpenLP.MainWindow', '&View')) self.viewModeMenu.setTitle(translate('OpenLP.MainWindow', 'M&ode')) self.toolsMenu.setTitle(translate('OpenLP.MainWindow', '&Tools')) @@ -534,8 +539,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.setupUi(self) # Load settings after setupUi so default UI sizes are overwritten self.loadSettings() - # Once settings are loaded update FileMenu with recentFiles - self.updateFileMenu() + # Once settings are loaded update the menu with the recent files. + self.updateRecentFilesMenu() self.pluginForm = PluginForm(self) # Set up signals and slots QtCore.QObject.connect(self.importThemeItem, @@ -1137,30 +1142,36 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QVariant(self.controlSplitter.saveState())) settings.endGroup() - def updateFileMenu(self): + def updateRecentFilesMenu(self): """ - Updates the file menu with the latest list of service files accessed. + Updates the recent file menu with the latest list of service files + accessed. """ recentFileCount = QtCore.QSettings().value( u'advanced/recent file count', QtCore.QVariant(4)).toInt()[0] - self.fileMenu.clear() - add_actions(self.fileMenu, self.fileMenuActions[:-1]) existingRecentFiles = [recentFile for recentFile in self.recentFiles if QtCore.QFile.exists(recentFile)] recentFilesToDisplay = existingRecentFiles[0:recentFileCount] - if recentFilesToDisplay: - self.fileMenu.addSeparator() - for fileId, filename in enumerate(recentFilesToDisplay): - log.debug('Recent file name: %s', filename) - action = base_action(self, u'') - action.setText(u'&%d %s' % - (fileId + 1, QtCore.QFileInfo(filename).fileName())) - action.setData(QtCore.QVariant(filename)) - self.connect(action, QtCore.SIGNAL(u'triggered()'), - self.serviceManagerContents.onRecentServiceClicked) - self.fileMenu.addAction(action) - self.fileMenu.addSeparator() - self.fileMenu.addAction(self.fileMenuActions[-1]) + self.recentFilesMenu.clear() + for fileId, filename in enumerate(recentFilesToDisplay): + log.debug('Recent file name: %s', filename) + action = base_action(self, u'') + action.setText(u'&%d %s' % + (fileId + 1, QtCore.QFileInfo(filename).fileName())) + action.setData(QtCore.QVariant(filename)) + self.connect(action, QtCore.SIGNAL(u'triggered()'), + self.serviceManagerContents.onRecentServiceClicked) + self.recentFilesMenu.addAction(action) + clearRecentFilesAction = base_action(self, u'') + clearRecentFilesAction.setText( + translate('OpenLP.MainWindow', 'Clear List', + 'Clear List of recent files')) + clearRecentFilesAction.setStatusTip( + translate('OpenLP.MainWindow', 'Clear the list of recent files.')) + add_actions(self.recentFilesMenu, (None, clearRecentFilesAction)) + self.connect(clearRecentFilesAction, QtCore.SIGNAL(u'triggered()'), + self.recentFiles.clear) + clearRecentFilesAction.setEnabled(not self.recentFiles.isEmpty()) def addRecentFile(self, filename): """ From 8a926b01e1da1a27894edfcafa649662381d38e5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 13 Aug 2011 12:49:53 +0200 Subject: [PATCH 73/76] Auto-completer does not work immediately after importing/upgrading a bible (bug #825181) Fixes: https://launchpad.net/bugs/825181 --- openlp/plugins/bibles/lib/mediaitem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 82ee4430c..e47375298 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -395,6 +395,7 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'Reloading Bibles') self.plugin.manager.reload_bibles() self.loadBibles() + self.updateAutoCompleter() def initialiseAdvancedBible(self, bible): """ From 17e397ffa8dc2269f8217c3fab753ae698dc895f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 14 Aug 2011 15:05:39 +0200 Subject: [PATCH 74/76] added spellchecker to service notes dialog (bug #825979); escape texts in various places (bug #825983) Fixes: https://launchpad.net/bugs/825983, https://launchpad.net/bugs/825979 --- openlp/core/lib/spelltextedit.py | 20 +++++++++++--------- openlp/core/ui/printservicedialog.py | 2 +- openlp/core/ui/printserviceform.py | 21 ++++++++++++--------- openlp/core/ui/servicemanager.py | 6 +++++- openlp/core/ui/servicenoteform.py | 4 ++-- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index b0bb61e92..e9b5e64f7 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -48,9 +48,10 @@ class SpellTextEdit(QtGui.QPlainTextEdit): """ Spell checking widget based on QPlanTextEdit. """ - def __init__(self, *args): + def __init__(self, parent=None, formatting_tags_allowed=True): global ENCHANT_AVAILABLE - QtGui.QPlainTextEdit.__init__(self, *args) + QtGui.QPlainTextEdit.__init__(self, parent) + self.formattingTagsAllowed = formatting_tags_allowed # Default dictionary based on the current locale. if ENCHANT_AVAILABLE: try: @@ -110,16 +111,17 @@ class SpellTextEdit(QtGui.QPlainTextEdit): spell_menu.addAction(action) # Only add the spelling suggests to the menu if there are # suggestions. - if len(spell_menu.actions()): + if spell_menu.actions(): popupMenu.insertMenu(popupMenu.actions()[0], spell_menu) tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', 'Formatting Tags')) - for html in FormattingTags.get_html_tags(): - action = SpellAction(html[u'desc'], tagMenu) - action.correct.connect(self.htmlTag) - tagMenu.addAction(action) - popupMenu.insertSeparator(popupMenu.actions()[0]) - popupMenu.insertMenu(popupMenu.actions()[0], tagMenu) + if self.formattingTagsAllowed: + for html in FormattingTags.get_html_tags(): + action = SpellAction(html[u'desc'], tagMenu) + action.correct.connect(self.htmlTag) + tagMenu.addAction(action) + popupMenu.insertSeparator(popupMenu.actions()[0]) + popupMenu.insertMenu(popupMenu.actions()[0], tagMenu) popupMenu.exec_(event.globalPos()) def setLanguage(self, action): diff --git a/openlp/core/ui/printservicedialog.py b/openlp/core/ui/printservicedialog.py index b0065df99..8287ef02a 100644 --- a/openlp/core/ui/printservicedialog.py +++ b/openlp/core/ui/printservicedialog.py @@ -108,7 +108,7 @@ class Ui_PrintServiceDialog(object): self.footerLabel = QtGui.QLabel(self.optionsWidget) self.footerLabel.setObjectName(u'footerLabel') self.optionsLayout.addWidget(self.footerLabel) - self.footerTextEdit = SpellTextEdit(self.optionsWidget) + self.footerTextEdit = SpellTextEdit(self.optionsWidget, False) self.footerTextEdit.setObjectName(u'footerTextEdit') self.optionsLayout.addWidget(self.footerTextEdit) self.optionsGroupBox = QtGui.QGroupBox() diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index f50237619..55fc6eb3c 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -24,6 +24,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import cgi import datetime import os @@ -183,7 +184,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): self._addElement(u'style', custom_css, html_data.head, attribute=(u'type', u'text/css')) self._addElement(u'body', parent=html_data) - self._addElement(u'h1', unicode(self.titleLineEdit.text()), + self._addElement(u'h1', cgi.escape(unicode(self.titleLineEdit.text())), html_data.body, classId=u'serviceTitle') for index, item in enumerate(self.serviceManager.serviceItems): self._addPreviewItem(html_data.body, item[u'service_item'], index) @@ -193,8 +194,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): classId=u'customNotes') self._addElement(u'span', translate('OpenLP.ServiceManager', 'Custom Service Notes: '), div, classId=u'customNotesTitle') - self._addElement(u'span', self.footerTextEdit.toPlainText(), div, - classId=u'customNotesText') + self._addElement(u'span', + cgi.escape(self.footerTextEdit.toPlainText()), + div, classId=u'customNotesText') self.document.setHtml(html.tostring(html_data)) self.previewWidget.updatePreview() @@ -204,8 +206,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): item_title = self._addElement(u'h2', parent=div, classId=u'itemTitle') self._addElement(u'img', parent=item_title, attribute=(u'src', item.icon)) - self._addElement(u'span', u' ' + item.get_display_title(), - item_title) + self._addElement(u'span', + u' ' + cgi.escape(item.get_display_title()), item_title) if self.slideTextCheckBox.isChecked(): # Add the text of the service item. if item.is_text(): @@ -230,8 +232,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): foot_text = item.foot_text foot_text = foot_text.partition(u'
')[2] if foot_text: - foot = self._addElement(u'div', foot_text, parent=div, - classId=u'itemFooter') + foot_text = cgi.escape(foot_text.replace(u'
', u'\n')) + self._addElement(u'div', foot_text.replace(u'\n', u'
'), + parent=div, classId=u'itemFooter') # Add service items' notes. if self.notesCheckBox.isChecked(): if item.notes: @@ -239,8 +242,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): self._addElement(u'span', translate('OpenLP.ServiceManager', 'Notes: '), p, classId=u'itemNotesTitle') - notes = self._addElement(u'span', - item.notes.replace(u'\n', u'
'), p, + self._addElement(u'span', + cgi.escape(unicode(item.notes)).replace(u'\n', u'
'), p, classId=u'itemNotesText') # Add play length of media files. if item.is_media() and self.metaDataCheckBox.isChecked(): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 0ef45af12..3ab2e9239 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -24,6 +24,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import cgi import cPickle import logging import os @@ -719,6 +720,9 @@ class ServiceManager(QtGui.QWidget): self.setModified() def onStartTimeForm(self): + """ + Opens a dialog to type in service item notes. + """ item = self.findServiceItem()[0] self.startTimeForm.item = self.serviceItems[item] if self.startTimeForm.exec_(): @@ -957,7 +961,7 @@ class ServiceManager(QtGui.QWidget): if serviceitem.notes: tips.append(u'%s: %s' % (unicode(translate('OpenLP.ServiceManager', 'Notes')), - unicode(serviceitem.notes))) + cgi.escape(unicode(serviceitem.notes)))) if item[u'service_item'] \ .is_capable(ItemCapabilities.AllowsVariableStartTime): tips.append(item[u'service_item'].get_media_time()) diff --git a/openlp/core/ui/servicenoteform.py b/openlp/core/ui/servicenoteform.py index 3bc55e242..ddfcb3381 100644 --- a/openlp/core/ui/servicenoteform.py +++ b/openlp/core/ui/servicenoteform.py @@ -27,7 +27,7 @@ from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate +from openlp.core.lib import translate, SpellTextEdit from openlp.core.lib.ui import create_accept_reject_button_box class ServiceNoteForm(QtGui.QDialog): @@ -52,7 +52,7 @@ class ServiceNoteForm(QtGui.QDialog): self.dialogLayout.setContentsMargins(8, 8, 8, 8) self.dialogLayout.setSpacing(8) self.dialogLayout.setObjectName(u'verticalLayout') - self.textEdit = QtGui.QTextEdit(self) + self.textEdit = SpellTextEdit(self, False) self.textEdit.setObjectName(u'textEdit') self.dialogLayout.addWidget(self.textEdit) self.dialogLayout.addWidget(create_accept_reject_button_box(self)) From 41b3bde91933c780be06f9b0e79bf000b2a6b9ba Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 14 Aug 2011 15:11:41 +0200 Subject: [PATCH 75/76] changed underscore varialbe to camelCase --- openlp/core/lib/spelltextedit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index e9b5e64f7..25e4e24ae 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -48,10 +48,10 @@ class SpellTextEdit(QtGui.QPlainTextEdit): """ Spell checking widget based on QPlanTextEdit. """ - def __init__(self, parent=None, formatting_tags_allowed=True): + def __init__(self, parent=None, formattingTagsAllowed=True): global ENCHANT_AVAILABLE QtGui.QPlainTextEdit.__init__(self, parent) - self.formattingTagsAllowed = formatting_tags_allowed + self.formattingTagsAllowed = formattingTagsAllowed # Default dictionary based on the current locale. if ENCHANT_AVAILABLE: try: From ca5c8d9a0b5359d619ca589119c1ba0a52c8ffb6 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 16 Aug 2011 23:19:57 +0200 Subject: [PATCH 76/76] Fixed bug #802146: Couldn't import some SongShowPlus files. Rearranged the file menu as well to be in a more logical order, and to look a little nicer. Fixes: https://launchpad.net/bugs/802146 --- openlp/core/ui/mainwindow.py | 8 ++++---- openlp/plugins/songs/lib/songshowplusimport.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 510a94dfd..d9c8111bb 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -305,10 +305,10 @@ class Ui_MainWindow(object): add_actions(self.fileExportMenu, (self.exportThemeItem, self.exportLanguageItem)) add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem, - self.fileSaveItem, self.fileSaveAsItem, None, - self.recentFilesMenu.menuAction(), None, self.printServiceOrderItem, - None, self.fileImportMenu.menuAction(), - self.fileExportMenu.menuAction(), self.fileExitItem)) + self.fileSaveItem, self.fileSaveAsItem, + self.recentFilesMenu.menuAction(), None, + self.fileImportMenu.menuAction(), self.fileExportMenu.menuAction(), + None, self.printServiceOrderItem, self.fileExitItem)) add_actions(self.viewModeMenu, (self.modeDefaultItem, self.modeSetupItem, self.modeLiveItem)) add_actions(self.viewMenu, (self.viewModeMenu.menuAction(), diff --git a/openlp/plugins/songs/lib/songshowplusimport.py b/openlp/plugins/songs/lib/songshowplusimport.py index 7f7527c6d..c50df8752 100644 --- a/openlp/plugins/songs/lib/songshowplusimport.py +++ b/openlp/plugins/songs/lib/songshowplusimport.py @@ -102,7 +102,6 @@ class SongShowPlusImport(SongImport): if not isinstance(self.import_source, list): return self.import_wizard.progressBar.setMaximum(len(self.import_source)) - for file in self.import_source: self.sspVerseOrderList = [] otherCount = 0 @@ -111,7 +110,6 @@ class SongShowPlusImport(SongImport): self.import_wizard.incrementProgressBar( WizardStrings.ImportingType % file_name, 0) songData = open(file, 'rb') - while True: blockKey, = struct.unpack("I", songData.read(4)) # The file ends with 4 NUL's @@ -126,8 +124,9 @@ class SongShowPlusImport(SongImport): songData.read(2)) verseName = songData.read(verseNameLength) lengthDescriptorSize, = struct.unpack("B", songData.read(1)) + log.debug(lengthDescriptorSize) # Detect if/how long the length descriptor is - if lengthDescriptorSize == 12: + if lengthDescriptorSize == 12 or lengthDescriptorSize == 20: lengthDescriptor, = struct.unpack("I", songData.read(4)) elif lengthDescriptorSize == 2: lengthDescriptor = 1 @@ -135,6 +134,7 @@ class SongShowPlusImport(SongImport): lengthDescriptor = 0 else: lengthDescriptor, = struct.unpack("B", songData.read(1)) + log.debug(lengthDescriptorSize) data = songData.read(lengthDescriptor) if blockKey == TITLE: self.title = unicode(data, u'cp1252')