src/eric7/Templates/TemplatePropertiesDialog.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/Templates/TemplatePropertiesDialog.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,234 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2005 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the templates properties dialog.
+"""
+
+from PyQt6.QtCore import pyqtSlot, Qt, QRegularExpression
+from PyQt6.QtGui import QRegularExpressionValidator
+from PyQt6.QtWidgets import QDialog
+
+from .Ui_TemplatePropertiesDialog import Ui_TemplatePropertiesDialog
+
+from EricWidgets import EricMessageBox
+
+import Preferences
+
+
+class TemplatePropertiesDialog(QDialog, Ui_TemplatePropertiesDialog):
+    """
+    Class implementing the templates properties dialog.
+    """
+    def __init__(self, parent, groupMode=False, itm=None):
+        """
+        Constructor
+        
+        @param parent the parent widget (QWidget)
+        @param groupMode flag indicating group mode (boolean)
+        @param itm item (TemplateEntry or TemplateGroup) to
+            read the data from
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.templateEdit.setFont(Preferences.getTemplates("EditorFont"))
+        
+        if not groupMode:
+            self.nameEdit.setWhatsThis(self.tr(
+                """<b>Template name<b><p>Enter the name of the template."""
+                """ Templates may be autocompleted upon this name."""
+                """ In order to support autocompletion. the template name"""
+                """ must only consist of letters (a-z and A-Z),"""
+                """ digits (0-9) and underscores (_).</p>"""
+            ))
+            self.__nameValidator = QRegularExpressionValidator(
+                QRegularExpression("[a-zA-Z0-9_]+"), self.nameEdit)
+            self.nameEdit.setValidator(self.__nameValidator)
+        
+        import QScintilla.Lexers
+        self.languages = [("All", self.tr("All"))]
+        supportedLanguages = QScintilla.Lexers.getSupportedLanguages()
+        languages = sorted(supportedLanguages.keys())
+        for language in languages:
+            self.languages.append((language, supportedLanguages[language][0]))
+        
+        self.groupMode = groupMode
+        if groupMode:
+            self.groupLabel.setText(self.tr("Language:"))
+            for lang, langDisp in self.languages:
+                self.groupCombo.addItem(
+                    QScintilla.Lexers.getLanguageIcon(lang, False),
+                    langDisp)
+            self.templateLabel.setEnabled(False)
+            self.templateEdit.setEnabled(False)
+            self.templateEdit.setPlainText(self.tr("GROUP"))
+            self.helpButton.setEnabled(False)
+            self.descriptionLabel.hide()
+            self.descriptionEdit.hide()
+        else:
+            groups = []
+            for group in parent.getGroupNames():
+                groups.append(group)
+            self.groupCombo.addItems(groups)
+        
+        if itm is not None:
+            self.nameEdit.setText(itm.getName())
+            if groupMode:
+                language = itm.getLanguage()
+                for lang, langDisp in self.languages:
+                    if language == lang:
+                        self.setSelectedGroup(langDisp)
+                        break
+            else:
+                self.setSelectedGroup(itm.getGroupName())
+                self.templateEdit.setPlainText(itm.getTemplateText())
+                self.descriptionEdit.setText(itm.getDescription())
+            
+            self.nameEdit.selectAll()
+        
+        self.__helpDialog = None
+
+    def keyPressEvent(self, ev):
+        """
+        Protected method to handle the user pressing the escape key.
+        
+        @param ev key event (QKeyEvent)
+        """
+        if ev.key() == Qt.Key.Key_Escape:
+            res = EricMessageBox.yesNo(
+                self,
+                self.tr("Close dialog"),
+                self.tr("""Do you really want to close the dialog?"""))
+            if not res:
+                self.reject()
+    
+    @pyqtSlot()
+    def on_helpButton_clicked(self):
+        """
+        Private slot to show some help.
+        """
+        if self.__helpDialog is None:
+            from EricWidgets.EricSimpleHelpDialog import EricSimpleHelpDialog
+            self.__helpDialog = EricSimpleHelpDialog(
+                title=self.tr("Template Help"),
+                label=self.tr("<b>Template Help</b>"),
+                helpStr=self.tr(
+                    """<p>To use variables in a template, you just have to"""
+                    """ enclose the variable name with $-characters. When"""
+                    """ you use the template, you will then be asked for a"""
+                    """ value for this variable.</p>"""
+                    """<p>Example template: This is a $VAR$</p>"""
+                    """<p>When you use this template you will be prompted"""
+                    """ for a value for the variable $VAR$. Any occurrences"""
+                    """ of $VAR$ will then be replaced with whatever you've"""
+                    """ entered.</p>"""
+                    """<p>If you need a single $-character in a template,"""
+                    """ which is not used to enclose a variable, type"""
+                    """ $$(two dollar characters) instead. They will"""
+                    """ automatically be replaced with a single $-character"""
+                    """ when you use the template.</p>"""
+                    """<p>If you want a variables contents to be treated"""
+                    """ specially, the variable name must be followed by a"""
+                    """ ':' and one formatting specifier (e.g. $VAR:ml$)."""
+                    """ The supported specifiers are:"""
+                    """<table>"""
+                    """<tr><td>ml</td><td>Specifies a multiline formatting."""
+                    """ The first line of the variable contents is prefixed"""
+                    """ with the string occurring before the variable on"""
+                    """ the same line of the template. All other lines are"""
+                    """ prefixed by the same amount of whitespace as the"""
+                    """ line containing the variable."""
+                    """</td></tr>"""
+                    """<tr><td>rl</td><td>Specifies a repeated line"""
+                    """ formatting. Each line of the variable contents is"""
+                    """ prefixed with the string occurring before the"""
+                    """ variable on the same line of the template."""
+                    """</td></tr>"""
+                    """</table></p>"""
+                    """<p>The following predefined variables may be used"""
+                    """ in a template:"""
+                    """<table>"""
+                    """<tr><td>date</td>"""
+                    """<td>today's date in ISO format (YYYY-MM-DD)</td></tr>"""
+                    """<tr><td>year</td>"""
+                    """<td>the current year</td></tr>"""
+                    """<tr><td>time</td>"""
+                    """<td>current time in ISO format (hh:mm:ss)</td></tr>"""
+                    """<tr><td>project_name</td>"""
+                    """<td>the name of the project (if any)</td></tr>"""
+                    """<tr><td>project_path</td>"""
+                    """<td>the path of the project (if any)</td></tr>"""
+                    """<tr><td>path_name</td>"""
+                    """<td>full path of the current file</td></tr>"""
+                    """<tr><td>path_name_rel</td>"""
+                    """<td>project relative path of the current file</td>"""
+                    """</tr>"""
+                    """<tr><td>dir_name</td>"""
+                    """<td>full path of the current file's directory</td>"""
+                    """</tr>"""
+                    """<tr><td>dir_name_rel</td>"""
+                    """<td>project relative path of the current file's"""
+                    """ directory</td></tr>"""
+                    """<tr><td>file_name</td>"""
+                    """<td>the current file's name (without directory)"""
+                    """</td></tr>"""
+                    """<tr><td>base_name</td>"""
+                    """<td>like <i>file_name</i>, but without extension"""
+                    """</td></tr>"""
+                    """<tr><td>ext</td>"""
+                    """<td>the extension of the current file</td></tr>"""
+                    """<tr><td>cur_select</td>"""
+                    """<td>the currently selected text</td></tr>"""
+                    """<tr><td>insertion</td>"""
+                    """<td>Sets insertion point for cursor after template is"""
+                    """ inserted.</td>"""
+                    """</tr>"""
+                    """<tr><td>select_start</td>"""
+                    """<td>Sets span of selected text in template after"""
+                    """ template is inserted (used together with"""
+                    """ 'select_end').</td></tr>"""
+                    """<tr><td>select_end</td>"""
+                    """<td>Sets span of selected text in template after"""
+                    """ template is inserted (used together with"""
+                    """ 'select_start')."""
+                    """</td></tr>"""
+                    """<tr><td>clipboard</td>"""
+                    """<td>the text of the clipboard</td></tr>"""
+                    """</table></p>"""
+                    """<p>If you want to change the default delimiter to"""
+                    """ anything different, please use the configuration"""
+                    """ dialog to do so.</p>"""
+                ),
+                parent=self)
+        self.__helpDialog.show()
+        
+    def setSelectedGroup(self, name):
+        """
+        Public method to select a group.
+        
+        @param name name of the group to be selected (string)
+        """
+        index = self.groupCombo.findText(name)
+        self.groupCombo.setCurrentIndex(index)
+
+    def getData(self):
+        """
+        Public method to get the data entered into the dialog.
+        
+        @return a tuple of two strings (name, language), if the dialog is in
+            group mode, and a tuple of four strings (name, description, group
+            name, template) otherwise.
+        """
+        if self.groupMode:
+            return (self.nameEdit.text(),
+                    self.languages[self.groupCombo.currentIndex()][0]
+                    )
+        else:
+            return (self.nameEdit.text(),
+                    self.descriptionEdit.text(),
+                    self.groupCombo.currentText(),
+                    self.templateEdit.toPlainText()
+                    )

eric ide

mercurial