1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2014 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the eric plug-in wizard dialog.
8"""
9
10from PyQt5.QtCore import pyqtSlot, QDate
11from PyQt5.QtWidgets import QDialog, QDialogButtonBox
12
13from E5Gui.E5Application import e5App
14
15from .Ui_PluginWizardDialog import Ui_PluginWizardDialog
16
17from .Templates import (
18    mainTemplate, configTemplate0, configTemplate1, configTemplate2,
19    configTemplate3, onDemandTemplate, previewPixmapTemplate,
20    moduleSetupTemplate, exeDisplayDataTemplate, exeDisplayDataInfoTemplate,
21    exeDisplayDataListTemplate, apiFilesTemplate
22)
23
24
25class PluginWizardDialog(QDialog, Ui_PluginWizardDialog):
26    """
27    Class implementing the eric plug-in wizard dialog.
28    """
29    def __init__(self, parent=None):
30        """
31        Constructor
32
33        @param parent reference to the parent widget (QWidget)
34        """
35        super().__init__(parent)
36        self.setupUi(self)
37
38        self.dataTabWidget.setCurrentIndex(0)
39
40        self.__okButton = self.buttonBox.button(
41            QDialogButtonBox.StandardButton.Ok)
42        self.__okButton.setEnabled(False)
43
44        projectOpen = e5App().getObject("Project").isOpen()
45        self.projectButton.setEnabled(projectOpen)
46
47        self.nameEdit.textChanged.connect(self.__enableOkButton)
48        self.versionEdit.textChanged.connect(self.__enableOkButton)
49        self.authorEdit.textChanged.connect(self.__enableOkButton)
50        self.authorEmailEdit.textChanged.connect(self.__enableOkButton)
51        self.classNameEdit.textChanged.connect(self.__enableOkButton)
52        self.packageNameEdit.textChanged.connect(self.__enableOkButton)
53        self.shortDescriptionEdit.textChanged.connect(self.__enableOkButton)
54        self.longDescriptionEdit.textChanged.connect(self.__enableOkButton)
55        self.preferencesKeyEdit.textChanged.connect(self.__enableOkButton)
56        self.configurationGroup.toggled.connect(self.__enableOkButton)
57        self.autoActivateCheckBox.toggled.connect(self.__enableOkButton)
58        self.pluginTypeCombo.currentIndexChanged.connect(self.__enableOkButton)
59        self.pluginTypeNameEdit.textChanged.connect(self.__enableOkButton)
60
61        self.pluginTypeCombo.addItems(["", "viewmanager", "version_control"])
62
63    def __enableOkButton(self):
64        """
65        Private slot to set the state of the OK button.
66        """
67        enable = (
68            bool(self.nameEdit.text()) and
69            bool(self.versionEdit.text()) and
70            bool(self.authorEdit.text()) and
71            bool(self.authorEmailEdit.text()) and
72            bool(self.classNameEdit.text()) and
73            bool(self.packageNameEdit.text()) and
74            bool(self.shortDescriptionEdit.text()) and
75            bool(self.longDescriptionEdit.toPlainText())
76        )
77        if self.configurationGroup.isChecked():
78            enable = enable and bool(self.preferencesKeyEdit.text())
79        if not self.autoActivateCheckBox.isChecked():
80            enable = (enable and
81                      bool(self.pluginTypeCombo.currentText()) and
82                      bool(self.pluginTypeNameEdit.text())
83                      )
84
85        self.__okButton.setEnabled(enable)
86
87    @pyqtSlot()
88    def on_projectButton_clicked(self):
89        """
90        Private slot to populate some fields with data retrieved from the
91        current project.
92        """
93        project = e5App().getObject("Project")
94
95        try:
96            self.versionEdit.setText(project.getProjectVersion())
97            self.authorEdit.setText(project.getProjectAuthor())
98            self.authorEmailEdit.setText(project.getProjectAuthorEmail())
99            description = project.getProjectDescription()
100        except AttributeError:
101            self.versionEdit.setText(project.pdata["VERSION"][0])
102            self.authorEdit.setText(project.pdata["AUTHOR"][0])
103            self.authorEmailEdit.setText(project.pdata["EMAIL"][0])
104            description = project.pdata["DESCRIPTION"][0]
105
106        # summary is max. 55 characters long
107        summary = (description.split(".", 1)[0]
108                   .replace("\r", "").replace("\n", "") + ".")[:55]
109        self.shortDescriptionEdit.setText(summary)
110        self.longDescriptionEdit.setPlainText(description)
111
112        # prevent overwriting of entries by disabling the button
113        self.projectButton.setEnabled(False)
114
115    def getCode(self):
116        """
117        Public method to get the source code.
118
119        @return generated code (string)
120        """
121        templateData = {
122            "year": QDate.currentDate().year(),
123            "author": self.authorEdit.text(),
124            "email": self.authorEmailEdit.text(),
125            "name": self.nameEdit.text(),
126            "autoactivate": self.autoActivateCheckBox.isChecked(),
127            "deactivateable": self.deactivateableCheckBox.isChecked(),
128            "version": self.versionEdit.text(),
129            "className": self.classNameEdit.text(),
130            "packageName": self.packageNameEdit.text(),
131            "shortDescription": self.shortDescriptionEdit.text(),
132            "longDescription": self.longDescriptionEdit.toPlainText(),
133            "needsRestart": self.restartCheckBox.isChecked(),
134        }
135
136        if self.configurationGroup.isChecked():
137            templateData["config0"] = configTemplate0
138            templateData["config1"] = configTemplate1.format(
139                className=self.classNameEdit.text())
140            templateData["config2"] = configTemplate2.format(
141                preferencesKey=self.preferencesKeyEdit.text())
142            templateData["config3"] = configTemplate3
143        else:
144            templateData["config0"] = ""
145            templateData["config1"] = ""
146            templateData["config2"] = ""
147            templateData["config3"] = ""
148
149        if self.autoActivateCheckBox.isChecked():
150            templateData["onDemand"] = ""
151        else:
152            templateData["onDemand"] = onDemandTemplate.format(
153                pluginType=self.pluginTypeCombo.currentText(),
154                pluginTypename=self.pluginTypeNameEdit.text()
155            )
156
157        if self.pixmapCheckBox.isChecked():
158            templateData["preview"] = previewPixmapTemplate
159        else:
160            templateData["preview"] = ""
161
162        if self.moduleSetupCheckBox.isChecked():
163            templateData["modulesetup"] = moduleSetupTemplate
164        else:
165            templateData["modulesetup"] = ""
166
167        templateData["exeData"] = ""
168        if self.exeGroup.isChecked():
169            if self.exeRadioButton.isChecked():
170                templateData["exeData"] = exeDisplayDataTemplate
171            elif self.exeInfoRadioButton.isChecked():
172                templateData["exeData"] = exeDisplayDataInfoTemplate
173            elif self.exeListRadioButton.isChecked():
174                templateData["exeData"] = exeDisplayDataListTemplate
175
176        if self.apiFilesCheckBox.isChecked():
177            templateData["apiFiles"] = apiFilesTemplate
178        else:
179            templateData["apiFiles"] = ""
180
181        return mainTemplate.format(**templateData)
182
183    def packageName(self):
184        """
185        Public method to retrieve the plug-in package name.
186
187        @return plug-in package name (string)
188        """
189        if self.createPackageCheckBox.isChecked():
190            return self.packageNameEdit.text()
191        else:
192            return ""
193
194    @pyqtSlot(str)
195    def on_pluginTypeCombo_currentTextChanged(self, txt):
196        """
197        Private slot to react upon the selection of a plug-in type.
198
199        @param txt selected plug-in type (string)
200        """
201        self.pixmapCheckBox.setChecked(txt == "viewmanager")
202