diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index bbed2b4a9..c752c6d7d 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -190,10 +190,11 @@ class ThemeXML(object): self.background_filename = os.path.join(path, self.theme_name, self.background_filename) - def new_document(self, name): + def _new_document(self, name): """ Create a new theme XML document. """ + self.theme_xml = Document() self.theme = self.theme_xml.createElement(u'theme') self.theme_xml.appendChild(self.theme) self.theme.setAttribute(u'version', u'2.0') @@ -218,10 +219,9 @@ class ThemeXML(object): The color of the background. """ background = self.theme_xml.createElement(u'background') - background.setAttribute(u'mode', u'opaque') background.setAttribute(u'type', u'solid') self.theme.appendChild(background) - self.child_element(background, u'color', bkcolor) + self.child_element(background, u'color', unicode(bkcolor)) def add_background_gradient(self, startcolor, endcolor, direction): """ @@ -237,15 +237,14 @@ class ThemeXML(object): The direction of the gradient. """ background = self.theme_xml.createElement(u'background') - background.setAttribute(u'mode', u'opaque') background.setAttribute(u'type', u'gradient') self.theme.appendChild(background) # Create startColor element - self.child_element(background, u'startColor', startcolor) + self.child_element(background, u'startColor', unicode(startcolor)) # Create endColor element - self.child_element(background, u'endColor', endcolor) + self.child_element(background, u'endColor', unicode(endcolor)) # Create direction element - self.child_element(background, u'direction', direction) + self.child_element(background, u'direction', unicode(direction)) def add_background_image(self, filename): """ @@ -255,7 +254,6 @@ class ThemeXML(object): The file name of the image. """ background = self.theme_xml.createElement(u'background') - background.setAttribute(u'mode', u'opaque') background.setAttribute(u'type', u'image') self.theme.appendChild(background) # Create Filename element @@ -329,22 +327,22 @@ class ThemeXML(object): # Create Font color element self.child_element(background, u'color', color) # Create Proportion name element - self.child_element(background, u'size', proportion) + self.child_element(background, u'size', unicode(proportion)) # Create weight name element - self.child_element(background, u'bold', bold) + self.child_element(background, u'bold', unicode(bold)) # Create italics name element - self.child_element(background, u'italics', italics) + self.child_element(background, u'italics', unicode(italics)) # Create indentation name element self.child_element( background, u'line_adjustment', unicode(line_adjustment)) # Create Location element element = self.theme_xml.createElement(u'location') - element.setAttribute(u'override', override) + element.setAttribute(u'override', unicode(override)) if override == u'True': - element.setAttribute(u'x', xpos) - element.setAttribute(u'y', ypos) - element.setAttribute(u'width', width) - element.setAttribute(u'height', height) + element.setAttribute(u'x', unicode(xpos)) + element.setAttribute(u'y', unicode(ypos)) + element.setAttribute(u'width', unicode(width)) + element.setAttribute(u'height', unicode(height)) background.appendChild(element) # Shadow element = self.theme_xml.createElement(u'shadow') @@ -412,12 +410,14 @@ class ThemeXML(object): """ Print out the XML string. """ + self._build_xml_from_attrs() return self.theme_xml.toxml(u'utf-8').decode(u'utf-8') def extract_formatted_xml(self): """ Pull out the XML string formatted for human consumption """ + self._build_xml_from_attrs() return self.theme_xml.toprettyxml(indent=u' ', newl=u'\n', encoding=u'utf-8') @@ -550,13 +550,16 @@ class ThemeXML(object): s1 = re.sub(u'(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub(u'([a-z0-9])([A-Z])', r'\1_\2', s1).lower() - def build_xml_from_attrs(self, ): + def _build_xml_from_attrs(self): """ Build the XML from the varables in the object """ - if self.background_type == BackgroundType.Solid: + self._new_document(self.theme_name) + if self.background_type == \ + BackgroundType.to_string(BackgroundType.Solid): self.add_background_solid(self.background_color) - elif self.background_type == BackgroundType.Gradient: + elif self.background_type == \ + BackgroundType.to_string(BackgroundType.Gradient): self.add_background_gradient( self.background_start_color, self.background_end_color, @@ -567,9 +570,9 @@ class ThemeXML(object): self.add_background_image(filename) self.add_font(self.font_main_name, self.font_main_color, - self.font_main_proportion, + self.font_main_size, self.font_main_override, u'main', - self.font_main_weight, + self.font_main_bold, self.font_main_italics, self.font_main_line_adjustment, self.font_main_x, @@ -584,9 +587,9 @@ class ThemeXML(object): self.font_main_shadow_size) self.add_font(self.font_footer_name, self.font_footer_color, - self.font_footer_proportion, + self.font_footer_size, self.font_footer_override, u'footer', - self.font_footer_weight, + self.font_footer_bold, self.font_footer_italics, 0, # line adjustment self.font_footer_x, diff --git a/openlp/core/ui/themedialog.py b/openlp/core/ui/themedialog.py index df487e6e4..25e73e530 100644 --- a/openlp/core/ui/themedialog.py +++ b/openlp/core/ui/themedialog.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'themedialog.ui' # -# Created: Sat Oct 30 12:33:34 2010 +# Created: Thu Nov 4 18:12:37 2010 # by: PyQt4 UI code generator 4.7.4 # # WARNING! All changes made in this file will be lost! @@ -403,28 +403,26 @@ class Ui_ThemeDialog(object): ThemeDialog.addPage(self.areaPositionPage) self.previewPage = QtGui.QWizardPage() self.previewPage.setObjectName("previewPage") - self.previewLayout = QtGui.QGridLayout(self.previewPage) - self.previewLayout.setMargin(20) - self.previewLayout.setSpacing(8) - self.previewLayout.setObjectName("previewLayout") self.themeNameLabel = QtGui.QLabel(self.previewPage) + self.themeNameLabel.setGeometry(QtCore.QRect(20, 10, 82, 16)) self.themeNameLabel.setTextFormat(QtCore.Qt.PlainText) self.themeNameLabel.setObjectName("themeNameLabel") - self.previewLayout.addWidget(self.themeNameLabel, 0, 0, 1, 1) self.previewLabel = QtGui.QLabel(self.previewPage) + self.previewLabel.setGeometry(QtCore.QRect(250, 60, 48, 16)) self.previewLabel.setAlignment(QtCore.Qt.AlignCenter) self.previewLabel.setObjectName("previewLabel") - self.previewLayout.addWidget(self.previewLabel, 2, 0, 1, 2) self.themeNameEdit = QtGui.QLineEdit(self.previewPage) + self.themeNameEdit.setGeometry(QtCore.QRect(117, 4, 351, 23)) self.themeNameEdit.setObjectName("themeNameEdit") - self.previewLayout.addWidget(self.themeNameEdit, 0, 1, 1, 1) - self.previewBoxLayout = QtGui.QHBoxLayout() - self.previewBoxLayout.setSpacing(0) - self.previewBoxLayout.setContentsMargins(0, 0, -1, -1) - self.previewBoxLayout.setObjectName("previewBoxLayout") - spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) - self.previewBoxLayout.addItem(spacerItem2) - self.previewBoxLabel = QtGui.QLabel(self.previewPage) + self.groupBox = QtGui.QGroupBox(self.previewPage) + self.groupBox.setGeometry(QtCore.QRect(40, 80, 464, 214)) + self.groupBox.setTitle("") + self.groupBox.setObjectName("groupBox") + self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox) + self.horizontalLayout.setObjectName("horizontalLayout") + spacerItem2 = QtGui.QSpacerItem(58, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem2) + self.previewBoxLabel = QtGui.QLabel(self.groupBox) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -437,14 +435,14 @@ class Ui_ThemeDialog(object): self.previewBoxLabel.setText("") self.previewBoxLabel.setScaledContents(True) self.previewBoxLabel.setObjectName("previewBoxLabel") - self.previewBoxLayout.addWidget(self.previewBoxLabel) - spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) - self.previewBoxLayout.addItem(spacerItem3) - self.previewLayout.addLayout(self.previewBoxLayout, 3, 0, 1, 2) + self.horizontalLayout.addWidget(self.previewBoxLabel) + spacerItem3 = QtGui.QSpacerItem(78, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem3) ThemeDialog.addPage(self.previewPage) self.themeNameLabel.setBuddy(self.themeNameEdit) self.retranslateUi(ThemeDialog) + QtCore.QObject.connect(ThemeDialog, QtCore.SIGNAL("accepted()"), ThemeDialog.accept) QtCore.QMetaObject.connectSlotsByName(ThemeDialog) def retranslateUi(self, ThemeDialog): @@ -530,4 +528,3 @@ class Ui_ThemeDialog(object): self.previewPage.setSubTitle(QtGui.QApplication.translate("ThemeDialog", "View the theme and save it replacing the current one or change the name to create a new theme", None, QtGui.QApplication.UnicodeUTF8)) self.themeNameLabel.setText(QtGui.QApplication.translate("ThemeDialog", "Theme name:", None, QtGui.QApplication.UnicodeUTF8)) self.previewLabel.setText(QtGui.QApplication.translate("ThemeDialog", "Preview", None, QtGui.QApplication.UnicodeUTF8)) - diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index c5ea42519..c38715991 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -25,11 +25,12 @@ ############################################################################### import logging +import os from PyQt4 import QtCore, QtGui from openlp.core.lib import translate, theme, BackgroundType, BackgroundGradientType - +from openlp.core.utils import get_images_filter from themedialog import Ui_ThemeDialog log = logging.getLogger(__name__) @@ -101,6 +102,90 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): QtCore.SIGNAL(u'stateChanged(int)'), self.onFooterDefaultPositionCheckBox) + def setDefaults(self): + """ + Set up display at start of theme edit. + """ + self.restart() + self.setBackgroundTabValues() + self.setMainAreaTabValues() + self.setFooterAreaTabValues() + self.setAlignmentTabValues() + self.setPositionTabValues() + self.setPreviewTabValues() + # Set up field states + self.onOutlineCheckCheckBoxChanged(self.theme.font_main_outline) + self.onShadowCheckCheckBoxChanged(self.theme.font_main_shadow) + + def registerFields(self): + """ + Map field names to screen names, + """ + self.backgroundPage.registerField( + u'background_type', self.backgroundTypeComboBox) + self.backgroundPage.registerField( + u'color_1', self.color1PushButton) + self.backgroundPage.registerField( + u'color_2', self.color2PushButton) + self.backgroundPage.registerField( + u'background_image', self.imageLineEdit) + self.backgroundPage.registerField( + u'gradient', self.gradientComboBox) + self.mainAreaPage.registerField( + u'mainFontComboBox', self.mainFontComboBox) + self.mainAreaPage.registerField( + u'mainColorPushButton', self.mainColorPushButton) + self.mainAreaPage.registerField( + u'mainSizeSpinBox', self.mainSizeSpinBox) + self.mainAreaPage.registerField( + u'lineSpacingSpinBox', self.lineSpacingSpinBox) + self.mainAreaPage.registerField( + u'outlineCheckBox', self.outlineCheckBox) + self.mainAreaPage.registerField( + u'outlineColorPushButton', self.outlineColorPushButton) + self.mainAreaPage.registerField( + u'outlineSizeSpinBox', self.outlineSizeSpinBox) + self.mainAreaPage.registerField( + u'shadowCheckBox', self.shadowCheckBox) + self.mainAreaPage.registerField( + u'boldCheckBox', self.boldCheckBox) + self.mainAreaPage.registerField( + u'italicsCheckBox', self.italicsCheckBox) + self.mainAreaPage.registerField( + u'shadowColorPushButton', self.shadowColorPushButton) + self.mainAreaPage.registerField( + u'shadowSizeSpinBox', self.shadowSizeSpinBox) + self.mainAreaPage.registerField( + u'footerSizeSpinBox', self.footerSizeSpinBox) + self.areaPositionPage.registerField( + u'mainDefaultPosition', self.mainDefaultPositionCheckBox) + self.areaPositionPage.registerField( + u'mainPositionX', self.mainXSpinBox) + self.areaPositionPage.registerField( + u'mainPositionY', self.mainYSpinBox) + self.areaPositionPage.registerField( + u'mainPositionWidth', self.mainWidthSpinBox) + self.areaPositionPage.registerField( + u'mainPositionHeight', self.mainHeightSpinBox) + self.areaPositionPage.registerField( + u'footerDefaultPosition', self.footerDefaultPositionCheckBox) + self.areaPositionPage.registerField( + u'footerPositionX', self.footerXSpinBox) + self.areaPositionPage.registerField( + u'footerPositionY', self.footerYSpinBox) + self.areaPositionPage.registerField( + u'footerPositionWidth', self.footerWidthSpinBox) + self.areaPositionPage.registerField( + u'footerPositionHeight', self.footerHeightSpinBox) + self.backgroundPage.registerField( + u'horizontal', self.horizontalComboBox) + self.backgroundPage.registerField( + u'vertical', self.verticalComboBox) + self.backgroundPage.registerField( + u'slideTransition', self.transitionsCheckBox) + self.backgroundPage.registerField( + u'name', self.themeNameEdit) + def onOutlineCheckCheckBoxChanged(self, state): """ Change state as Outline check box changed @@ -149,7 +234,6 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): return QtGui.QWizard.exec_(self) def initializePage(self, id): - print id if id == 0: self.setBackgroundTabValues() elif id == 1: @@ -164,14 +248,13 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): frame = self.thememanager.generateImage(self.theme) self.previewBoxLabel.setPixmap(QtGui.QPixmap.fromImage(frame)) - def validateCurrentPage(self): - """ - Handle Tab specific code when moving between Tabs. - """ - print "CURRENT id", self.currentId() - # Preview Screen - self.updateTheme() - return True +# def validateCurrentPage(self): +# """ +# Handle Tab specific code when moving between Tabs. +# """ +# # Preview Screen +# self.updateTheme() +# return True def setBackgroundTabValues(self): """ @@ -326,90 +409,6 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): if len(self.theme.theme_name) > 1: self.themeNameEdit.setEnabled(False) - def setDefaults(self): - """ - Set up display at start of theme edit. - """ - self.restart() - self.setBackgroundTabValues() - self.setMainAreaTabValues() - self.setFooterAreaTabValues() - self.setAlignmentTabValues() - self.setPositionTabValues() - self.setPreviewTabValues() - # Set up field states - self.onOutlineCheckCheckBoxChanged(self.theme.font_main_outline) - self.onShadowCheckCheckBoxChanged(self.theme.font_main_shadow) - - def registerFields(self): - """ - Map field names to screen names, - """ - self.backgroundPage.registerField( - u'background_type', self.backgroundTypeComboBox) - self.backgroundPage.registerField( - u'color_1', self.color1PushButton) - self.backgroundPage.registerField( - u'color_2', self.color2PushButton) - self.backgroundPage.registerField( - u'background_image', self.imageLineEdit) - self.backgroundPage.registerField( - u'gradient', self.gradientComboBox) - self.mainAreaPage.registerField( - u'mainFontComboBox', self.mainFontComboBox) - self.mainAreaPage.registerField( - u'mainColorPushButton', self.mainColorPushButton) - self.mainAreaPage.registerField( - u'mainSizeSpinBox', self.mainSizeSpinBox) - self.mainAreaPage.registerField( - u'lineSpacingSpinBox', self.lineSpacingSpinBox) - self.mainAreaPage.registerField( - u'outlineCheckBox', self.outlineCheckBox) - self.mainAreaPage.registerField( - u'outlineColorPushButton', self.outlineColorPushButton) - self.mainAreaPage.registerField( - u'outlineSizeSpinBox', self.outlineSizeSpinBox) - self.mainAreaPage.registerField( - u'shadowCheckBox', self.shadowCheckBox) - self.mainAreaPage.registerField( - u'boldCheckBox', self.boldCheckBox) - self.mainAreaPage.registerField( - u'italicsCheckBox', self.italicsCheckBox) - self.mainAreaPage.registerField( - u'shadowColorPushButton', self.shadowColorPushButton) - self.mainAreaPage.registerField( - u'shadowSizeSpinBox', self.shadowSizeSpinBox) - self.mainAreaPage.registerField( - u'footerSizeSpinBox', self.footerSizeSpinBox) - self.areaPositionPage.registerField( - u'mainDefaultPosition', self.mainDefaultPositionCheckBox) - self.areaPositionPage.registerField( - u'mainPositionX', self.mainXSpinBox) - self.areaPositionPage.registerField( - u'mainPositionY', self.mainYSpinBox) - self.areaPositionPage.registerField( - u'mainPositionWidth', self.mainWidthSpinBox) - self.areaPositionPage.registerField( - u'mainPositionHeight', self.mainHeightSpinBox) - self.areaPositionPage.registerField( - u'footerDefaultPosition', self.footerDefaultPositionCheckBox) - self.areaPositionPage.registerField( - u'footerPositionX', self.footerXSpinBox) - self.areaPositionPage.registerField( - u'footerPositionY', self.footerYSpinBox) - self.areaPositionPage.registerField( - u'footerPositionWidth', self.footerWidthSpinBox) - self.areaPositionPage.registerField( - u'footerPositionHeight', self.footerHeightSpinBox) - self.backgroundPage.registerField( - u'horizontal', self.horizontalComboBox) - self.backgroundPage.registerField( - u'vertical', self.verticalComboBox) - self.backgroundPage.registerField( - u'slideTransition', self.transitionsCheckBox) - self.backgroundPage.registerField( - u'name', self.themeNameEdit) - def onBackgroundComboBox(self, index): """ Background style Combo box has changed. @@ -448,7 +447,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): translate('OpenLP.ThemeForm', 'Select Image'), u'', images_filter) if filename: - self.theme.background_filename = filename + self.theme.background_filename = unicode(filename) self.setBackgroundTabValues() def onMainFontComboBox(self): @@ -486,10 +485,14 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): self.field(u'mainSizeSpinBox').toInt()[0] self.theme.font_main_line_adjustment = \ self.field(u'lineSpacingSpinBox').toInt()[0] - self.theme.font_main_outline = \ + self.theme.font_main_outline_size = \ self.field(u'outlineSizeSpinBox').toInt()[0] self.theme.font_main_shadow_size = \ self.field(u'shadowSizeSpinBox').toInt()[0] + self.theme.font_main_bold = \ + self.field(u'boldCheckBox').toInt()[0] + self.theme.font_main_italics = \ + self.field(u'italicsCheckBox').toInt()[0] # footer page self.theme.font_footer_name = \ unicode(self.footerFontComboBox.currentFont().family()) @@ -518,6 +521,26 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeDialog): self.theme.theme_name = \ unicode(self.field(u'name').toString()) + def accept(self): + """ + Lets save the them as Finish has been pressed + """ + if not unicode(self.field(u'name').toString()): + return + self.updateTheme() + save_from = None + save_to = None + if self.theme.background_type == \ + BackgroundType.to_string(BackgroundType.Image): + filename = \ + os.path.split(unicode(self.theme.background_filename))[1] + save_to = os.path.join(self.path, self.theme.theme_name, filename) + save_from = self.theme.background_filename + #theme_xml = self.theme.extract_xml() + #pretty_theme = self.theme.extract_formatted_xml() + if self.thememanager.saveTheme(self.theme, save_from, save_to): + return QtGui.QDialog.accept(self) + def _colorButton(self, field): """ Handle Color buttons diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index debbcb582..588c20f22 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -299,7 +299,8 @@ class ThemeManager(QtGui.QWidget): # confirm deletion answer = QtGui.QMessageBox.question(self, translate('OpenLP.ThemeManager', 'Delete Confirmation'), - translate('OpenLP.ThemeManager', 'Delete theme?'), + unicode(translate('OpenLP.ThemeManager', 'Delete %s theme?')) + % theme, QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No) if answer == QtGui.QMessageBox.No: @@ -628,13 +629,14 @@ class ThemeManager(QtGui.QWidget): unicode(theme.WrapStyle), unicode(0)) return newtheme.extract_xml() - def saveTheme(self, name, theme_xml, theme_pretty_xml, image_from, - image_to): + def saveTheme(self, theme, image_from, image_to): """ Called by thememaintenance Dialog to save the theme and to trigger the reload of the theme list """ - log.debug(u'saveTheme %s %s', name, theme_xml) + name = theme.theme_name + theme_pretty_xml = theme.extract_formatted_xml() + log.debug(u'saveTheme %s %s', name, theme_pretty_xml) theme_dir = os.path.join(self.path, name) if not os.path.exists(theme_dir): os.mkdir(os.path.join(self.path, name)) @@ -683,7 +685,7 @@ class ThemeManager(QtGui.QWidget): unicode(image_to).encode(encoding)) except IOError: log.exception(u'Failed to save theme image') - self.generateAndSaveImage(self.path, name, theme_xml) + self.generateAndSaveImage(self.path, name, theme) self.loadThemes() # Check if we need to set a new service theme if editedServiceTheme: @@ -713,9 +715,10 @@ class ThemeManager(QtGui.QWidget): # the theme or to cancel the theme dialog completely. return False - def generateAndSaveImage(self, dir, name, theme_xml): - log.debug(u'generateAndSaveImage %s %s %s', dir, name, theme_xml) - theme = self.createThemeFromXml(theme_xml, dir) + def generateAndSaveImage(self, dir, name, theme): + log.debug(u'generateAndSaveImage %s %s', dir, name) + #theme = self.createThemeFromXml(theme_xml, dir) + theme_xml = theme.extract_xml() frame = self.generateImage(theme) samplepathname = os.path.join(self.path, name + u'.png') if os.path.exists(samplepathname): diff --git a/resources/forms/themedialog.ui b/resources/forms/themedialog.ui index 445b6c74b..130a1ab8d 100644 --- a/resources/forms/themedialog.ui +++ b/resources/forms/themedialog.ui @@ -983,110 +983,123 @@ p, li { white-space: pre-wrap; } View the theme and save it replacing the current one or change the name to create a new theme - - - 20 + + + + 20 + 10 + 82 + 16 + - - 8 + + Theme name: - - - - Theme name: - - - Qt::PlainText - - - themeNameEdit - - - - - - - Preview - - - Qt::AlignCenter - - - - - - - - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 300 - 200 - - - - QFrame::WinPanel - - - QFrame::Sunken - - - 1 - - - - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - + + Qt::PlainText + + + themeNameEdit + + + + + + 250 + 60 + 48 + 16 + + + + Preview + + + Qt::AlignCenter + + + + + + 117 + 4 + 351 + 23 + + + + + + + 40 + 80 + 464 + 214 + + + + + + + + + + Qt::Horizontal + + + + 58 + 20 + + + + + + + + + 0 + 0 + + + + + 300 + 200 + + + + QFrame::WinPanel + + + QFrame::Sunken + + + 1 + + + + + + true + + + + + + + Qt::Horizontal + + + + 78 + 20 + + + + + + @@ -1094,5 +1107,22 @@ p, li { white-space: pre-wrap; } - + + + ThemeDialog + accepted() + ThemeDialog + accept() + + + 455 + 368 + + + 483 + 401 + + + +