eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogWizardDialog.py

Thu, 30 Dec 2021 11:17:58 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 30 Dec 2021 11:17:58 +0100
branch
eric7
changeset 8881
54e42bc2437a
parent 8415
c6236bed1b50
permissions
-rw-r--r--

Updated copyright for 2022.

# -*- coding: utf-8 -*-

# Copyright (c) 2003 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the font dialog wizard dialog.
"""

import os

from PyQt6.QtCore import pyqtSlot
from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QFontDialog

from .Ui_FontDialogWizardDialog import Ui_FontDialogWizardDialog


class FontDialogWizardDialog(QDialog, Ui_FontDialogWizardDialog):
    """
    Class implementing the font dialog wizard dialog.
    
    It displays a dialog for entering the parameters
    for the QFontDialog code generator.
    """
    FontWeight2Code = {
        100: "Thin",
        200: "ExtraLight",
        300: "Light",
        400: "Normal",
        500: "Medium",
        600: "DemiBold",
        700: "Bold",
        800: "ExtraBold",
        900: "Black",
    }
    
    def __init__(self, parent=None):
        """
        Constructor
        
        @param parent parent widget (QWidget)
        """
        super().__init__(parent)
        self.setupUi(self)
        
        self.bTest = self.buttonBox.addButton(
            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
        
        self.font = None
        self.fontOptions = {
            "noNativeDialog": False,
            "scalableFonts": False,
            "nonScalableFonts": False,
            "monospacedFonts": False,
            "proportionalFonts": False,
        }
        
        msh = self.minimumSizeHint()
        self.resize(max(self.width(), msh.width()), msh.height())
        
    def on_buttonBox_clicked(self, button):
        """
        Private slot called by a button of the button box clicked.
        
        @param button button that was clicked (QAbstractButton)
        """
        if button == self.bTest:
            self.on_bTest_clicked()
    
    @pyqtSlot()
    def on_bTest_clicked(self):
        """
        Private method to test the selected options.
        """
        if self.font is None:
            QFontDialog.getFont()
        else:
            options = QFontDialog.FontDialogOption(0)
            if any(self.fontOptions.values()):
                if self.fontOptions["noNativeDialog"]:
                    options |= QFontDialog.FontDialogOption.DontUseNativeDialog
                if self.fontOptions["scalableFonts"]:
                    options |= QFontDialog.FontDialogOption.ScalableFonts
                if self.fontOptions["nonScalableFonts"]:
                    options |= QFontDialog.FontDialogOption.NonScalableFonts
                if self.fontOptions["monospacedFonts"]:
                    options |= QFontDialog.FontDialogOption.MonospacedFonts
                if self.fontOptions["proportionalFonts"]:
                    options |= QFontDialog.FontDialogOption.ProportionalFonts
            QFontDialog.getFont(
                self.font,
                self,
                self.eCaption.text(),
                options
            )
    
    def on_eVariable_textChanged(self, text):
        """
        Private slot to handle the textChanged signal of eVariable.
        
        @param text the new text (string)
        """
        if not text:
            self.bTest.setEnabled(True)
        else:
            self.bTest.setEnabled(False)
        
    @pyqtSlot()
    def on_fontButton_clicked(self):
        """
        Private slot to handle the button press to select a font via a
        font selection dialog.
        """
        if self.font is None:
            font, ok = QFontDialog.getFont()
        else:
            font, ok = QFontDialog.getFont(self.font)
        if ok:
            self.font = font
        else:
            self.font = None
    
    @pyqtSlot()
    def on_optionsButton_clicked(self):
        """
        Private slot to handle the selection of font dialog options.
        """
        from .FontDialogOptionsDialog import FontDialogOptionsDialog
        dlg = FontDialogOptionsDialog(self.fontOptions, self)
        if dlg.exec() == QDialog.DialogCode.Accepted:
            self.fontOptions = dlg.getOptions()
    
    def getCode(self, indLevel, indString):
        """
        Public method to get the source code.
        
        @param indLevel indentation level (int)
        @param indString string used for indentation (space or tab) (string)
        @return generated code (string)
        """
        # calculate our indentation level and the indentation string
        il = indLevel + 1
        istring = il * indString
        estring = os.linesep + indLevel * indString
        
        # generate the code
        resvar = self.eResultVar.text()
        if not resvar:
            resvar = "font"
        title = self.eCaption.text()
        if self.parentSelf.isChecked():
            parent = "self"
        elif self.parentNone.isChecked():
            parent = "None"
        elif self.parentOther.isChecked():
            parent = self.parentEdit.text()
            if parent == "":
                parent = "None"
        
        code = '{0}, ok = QFontDialog.getFont('.format(resvar)
        if self.eVariable.text() or self.font is not None:
            if title or parent != "None":
                code += '{0}{1}'.format(os.linesep, istring)
            if not self.eVariable.text():
                if self.font is not None:
                    code += (
                        'QFont(["{0}"], {1:d}, QFont.Weight.{2}, {3})'
                        .format(
                            self.font.family(),
                            self.font.pointSize(),
                            FontDialogWizardDialog.FontWeight2Code[
                                self.font.weight()],
                            "True" if self.font.italic() else "False")
                    )
            else:
                code += self.eVariable.text()
            if title:
                code += ',{0}{1}{2}'.format(
                    os.linesep, istring, parent)
                code += ',{0}{1}self.tr("{2}")'.format(
                    os.linesep, istring, title)
            elif parent != "None":
                code += ',{0}{1}{2}'.format(
                    os.linesep, istring, parent)
            if any(self.fontOptions.values()):
                options = []
                if self.fontOptions["noNativeDialog"]:
                    options.append(
                        "QFontDialog.FontDialogOption.DontUseNativeDialog")
                if self.fontOptions["scalableFonts"]:
                    options.append(
                        "QFontDialog.FontDialogOption.ScalableFonts")
                if self.fontOptions["nonScalableFonts"]:
                    options.append(
                        "QFontDialog.FontDialogOption.NonScalableFonts")
                if self.fontOptions["monospacedFonts"]:
                    options.append(
                        "QFontDialog.FontDialogOption.MonospacedFonts")
                if self.fontOptions["proportionalFonts"]:
                    options.append(
                        "QFontDialog.FontDialogOption.ProportionalFonts")
                fontOptionsString = (
                    ' |{0}{1}'.format(os.linesep, istring).join(options)
                )
                code += ',{0}{1}{2}'.format(
                    os.linesep, istring, fontOptionsString)
        code += '{0}){0}'.format(estring)
        
        return code

eric ide

mercurial