From 56c69bd8e80135d19390cc7e7fb5247bc105a29b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 21 Nov 2009 14:32:19 +0000 Subject: [PATCH] Fix up renderer to protect it from Gushie --- openlp/core/lib/renderer.py | 56 +++++++++++-------- openlp/core/ui/amendthemeform.py | 95 +++++++++++++++++--------------- openlp/core/ui/mainwindow.py | 2 +- 3 files changed, 85 insertions(+), 68 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 4ca653303..b8d9b7172 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -168,35 +168,45 @@ class Renderer(object): line_width = self._rect.width() - self._right_margin #number of lines on a page - adjust for rounding up. page_length = int(self._rect.height() / metrics.height() - 2 ) - 1 + #Average number of characters in line ave_line_width = line_width / metrics.averageCharWidth() - ave_line_width = int(ave_line_width + (ave_line_width * 1)) + #Maximum size of a character + max_char_width = metrics.maxWidth() + #Min size of a character + min_char_width = metrics.width(u'i') + char_per_line = line_width / min_char_width log.debug(u'Page Length area height %s , metrics %s , lines %s' % (int(self._rect.height()), metrics.height(), page_length )) split_pages = [] page = [] split_lines = [] + count = 0 for line in text: #Must be a blank line so keep it. if len(line) == 0: line = u' ' while len(line) > 0: - if len(line) > ave_line_width: - pos = line.find(u' ', ave_line_width) - split_text = line[:pos] - else: - pos = len(line) - split_text = line - while metrics.width(split_text, -1) > line_width: - #Find the next space to the left - pos = line[:pos].rfind(u' ') - #no more spaces found - if pos == 0: - split_text = line + pos = char_per_line + split_text = line[:pos] + #line needs splitting + if metrics.width(split_text, -1) > line_width: + #We have no spaces + if split_text.find(u' ') == -1: + #Move back 1 char at a time till it fits while metrics.width(split_text, -1) > line_width: split_text = split_text[:-1] - pos = len(split_text) + pos = len(split_text) else: - split_text = line[:pos] + #We have spaces so split at previous one + while metrics.width(split_text, -1) > line_width: + pos = split_text.rfind(u' ') + #no more spaces and we are still too long + if pos == -1: + while metrics.width(split_text, -1) > line_width: + split_text = split_text[:-1] + pos = len(split_text) + else: + split_text = line[:pos] split_lines.append(split_text) line = line[pos:].lstrip() #if we have more text add up to 10 spaces on the front. @@ -450,32 +460,32 @@ class Renderer(object): draw=True, color = self._theme.display_shadow_color) if self._theme.display_outline: self._get_extent_and_render(line, footer, - (x+self._outline_offset, y), draw=True, + (x + self._outline_offset, y), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x, y+self._outline_offset), draw=True, + (x, y + self._outline_offset), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x, y-self._outline_offset), draw=True, + (x, y - self._outline_offset), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x-self._outline_offset, y), draw=True, + (x - self._outline_offset, y), draw=True, color = self._theme.display_outline_color) if self._outline_offset > 1: self._get_extent_and_render(line, footer, - (x+self._outline_offset, y+self._outline_offset), + (x + self._outline_offset, y + self._outline_offset), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x-self._outline_offset, y+self._outline_offset), + (x - self._outline_offset, y + self._outline_offset), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x+self._outline_offset, y-self._outline_offset), + (x + self._outline_offset, y - self._outline_offset), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x-self._outline_offset, y-self._outline_offset), + (x - self._outline_offset, y - self._outline_offset), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer,tlcorner=(x, y), diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index b3a1d49e7..187d5f6e2 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -189,21 +189,21 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.allowPreview = False self.paintUi(self.theme) self.allowPreview = True - self.previewTheme(self.theme) + self.previewTheme() def onImageToolButtonClicked(self): filename = QtGui.QFileDialog.getOpenFileName( - self, self.trUtf8(u'Open file')) + self, self.trUtf8('Open file')) if filename: self.ImageLineEdit.setText(filename) self.theme.background_filename = filename - self.previewTheme(self.theme) + self.previewTheme() # #Main Font Tab # def onFontMainComboBoxSelected(self): self.theme.font_main_name = self.FontMainComboBox.currentFont().family() - self.previewTheme(self.theme) + self.previewTheme() def onFontMainWeightComboBoxSelected(self, value): if value == 0: @@ -218,7 +218,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.theme.font_main_weight = u'Bold' self.theme.font_main_italics = True - self.previewTheme(self.theme) + self.previewTheme() def onFontMainColorPushButtonClicked(self): self.theme.font_main_color = QtGui.QColorDialog.getColor( @@ -226,12 +226,12 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.FontMainColorPushButton.setStyleSheet( u'background-color: %s' % unicode(self.theme.font_main_color)) - self.previewTheme(self.theme) + self.previewTheme() def onFontMainSizeSpinBoxChanged(self): if self.theme.font_main_proportion != self.FontMainSizeSpinBox.value(): self.theme.font_main_proportion = self.FontMainSizeSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontMainDefaultCheckBoxChanged(self, value): if value == 2: # checked @@ -252,41 +252,41 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.FontMainLineSpacingSpinBox.setValue( self.theme.font_main_indentation) self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onFontMainXSpinBoxChanged(self): if self.theme.font_main_x != self.FontMainXSpinBox.value(): self.theme.font_main_x = self.FontMainXSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontMainYSpinBoxChanged(self): if self.theme.font_main_y != self.FontMainYSpinBox.value(): self.theme.font_main_y = self.FontMainYSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontMainWidthSpinBoxChanged(self): if self.theme.font_main_width != self.FontMainWidthSpinBox.value(): self.theme.font_main_width = self.FontMainWidthSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontMainLineSpacingSpinBoxChanged(self): if self.theme.font_main_indentation != \ self.FontMainLineSpacingSpinBox.value(): self.theme.font_main_indentation = \ self.FontMainLineSpacingSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontMainHeightSpinBoxChanged(self): if self.theme.font_main_height != self.FontMainHeightSpinBox.value(): self.theme.font_main_height = self.FontMainHeightSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() # #Footer Font Tab # def onFontFooterComboBoxSelected(self): self.theme.font_footer_name = \ self.FontFooterComboBox.currentFont().family() - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterWeightComboBoxSelected(self, value): if value == 0: @@ -301,22 +301,21 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.theme.font_footer_weight = u'Bold' self.theme.font_footer_italics = True - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterColorPushButtonClicked(self): self.theme.font_footer_color = QtGui.QColorDialog.getColor( QtGui.QColor(self.theme.font_footer_color), self).name() - self.FontFooterColorPushButton.setStyleSheet( 'background-color: %s' % unicode(self.theme.font_footer_color)) - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterSizeSpinBoxChanged(self): if self.theme.font_footer_proportion != \ self.FontFooterSizeSpinBox.value(): self.theme.font_footer_proportion = \ self.FontFooterSizeSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterDefaultCheckBoxChanged(self, value): if value == 2: # checked @@ -336,29 +335,29 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.FontFooterHeightSpinBox.setValue( self.theme.font_footer_height) self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterXSpinBoxChanged(self): if self.theme.font_footer_x != self.FontFooterXSpinBox.value(): self.theme.font_footer_x = self.FontFooterXSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterYSpinBoxChanged(self): if self.theme.font_footer_y != self.FontFooterYSpinBox.value(): self.theme.font_footer_y = self.FontFooterYSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterWidthSpinBoxChanged(self): if self.theme.font_footer_width != self.FontFooterWidthSpinBox.value(): self.theme.font_footer_width = self.FontFooterWidthSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() def onFontFooterHeightSpinBoxChanged(self): if self.theme.font_footer_height != \ self.FontFooterHeightSpinBox.value(): self.theme.font_footer_height = \ self.FontFooterHeightSpinBox.value() - self.previewTheme(self.theme) + self.previewTheme() # #Background Tab # @@ -372,7 +371,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.theme.background_mode = u'transparent' self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onBackgroundTypeComboBoxSelected(self, currentIndex): self.setBackground(currentIndex, self.GradientComboBox.currentIndex()) @@ -397,7 +396,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.theme.background_type = u'image' self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onColor1PushButtonClicked(self): if self.theme.background_type == u'solid': @@ -412,14 +411,14 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): u'background-color: %s' % \ unicode(self.theme.background_startColor)) - self.previewTheme(self.theme) + self.previewTheme() def onColor2PushButtonClicked(self): self.theme.background_endColor = QtGui.QColorDialog.getColor( QtGui.QColor(self.theme.background_endColor), self).name() self.Color2PushButton.setStyleSheet( u'background-color: %s' % unicode(self.theme.background_endColor)) - self.previewTheme(self.theme) + self.previewTheme() # #Other Tab # @@ -429,14 +428,14 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.theme.display_outline = False self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onOutlineColorPushButtonClicked(self): self.theme.display_outline_color = QtGui.QColorDialog.getColor( QtGui.QColor(self.theme.display_outline_color), self).name() self.OutlineColorPushButton.setStyleSheet( u'background-color: %s' % unicode(self.theme.display_outline_color)) - self.previewTheme(self.theme) + self.previewTheme() def onShadowCheckBoxChanged(self, value): if value == 2: # checked @@ -444,24 +443,24 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.theme.display_shadow = False self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onShadowColorPushButtonClicked(self): self.theme.display_shadow_color = QtGui.QColorDialog.getColor( QtGui.QColor(self.theme.display_shadow_color), self).name() self.ShadowColorPushButton.setStyleSheet( u'background-color: %s' % unicode(self.theme.display_shadow_color)) - self.previewTheme(self.theme) + self.previewTheme() def onHorizontalComboBoxSelected(self, currentIndex): self.theme.display_horizontalAlign = currentIndex self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() def onVerticalComboBoxSelected(self, currentIndex): self.theme.display_verticalAlign = currentIndex self.stateChanging(self.theme) - self.previewTheme(self.theme) + self.previewTheme() # #Local Methods # @@ -654,18 +653,10 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.ShadowColorPushButton.setEnabled(False) - def previewTheme(self, theme): + def previewTheme(self): if self.allowPreview: #calculate main number of rows - main_weight = 50 - if self.theme.font_main_weight == u'Bold': - main_weight = 75 - mainFont = QtGui.QFont(self.theme.font_main_name, - self.theme.font_main_proportion, # size - main_weight, # weight - self.theme.font_main_italics)# italic - mainFont.setPixelSize(self.theme.font_main_proportion) - metrics = QtGui.QFontMetrics(mainFont) + metrics = self._getThemeMetrics() page_length = \ (self.FontMainHeightSpinBox.value() / metrics.height() - 2) - 1 log.debug(u'Page Length area height %s, metrics %s, lines %s' % @@ -673,6 +664,22 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): page_length)) page_length_text = unicode(self.trUtf8(u'Slide Height is %s rows')) self.FontMainLinesPageLabel.setText(page_length_text % page_length) - frame = self.thememanager.generateImage(theme) + #a=c + frame = self.thememanager.generateImage(self.theme) self.ThemePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) + def _getThemeMetrics(self): + main_weight = 50 + if self.theme.font_main_weight == u'Bold': + main_weight = 75 + mainFont = QtGui.QFont(self.theme.font_main_name, + self.theme.font_main_proportion, # size + main_weight, # weight + self.theme.font_main_italics)# italic + mainFont.setPixelSize(self.theme.font_main_proportion) + metrics = QtGui.QFontMetrics(mainFont) + #Validate that the screen width is big enough to display the text + if self.theme.font_main_width < metrics.maxWidth() * 2 + 64: + self.theme.font_main_width = metrics.maxWidth() * 2 + 64 + self.FontMainWidthSpinBox.setValue(self.theme.font_main_width) + return metrics diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 347f7fbed..901bfe985 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -584,7 +584,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.trUtf8(u'The Main Display has been blanked out'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok) - self.LiveController.blackPushButton.setChecked(True) + #self.LiveController.blackPushButton.setChecked(True) def onHelpAboutItemClicked(self): """