--- a/WizardDataUriEncoder/DataUriEncoderWizardDialog.py Wed Jun 02 17:20:11 2021 +0200 +++ b/WizardDataUriEncoder/DataUriEncoderWizardDialog.py Wed Jun 02 17:30:01 2021 +0200 @@ -7,42 +7,57 @@ Module implementing the base64 data URI encoder wizard dialog. """ -import os -import mimetypes import base64 +import codecs +import datetime import getpass -import datetime +import mimetypes +import os -from PyQt5.QtCore import pyqtSlot -from PyQt5.QtWidgets import ( +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import ( QDialog, QDialogButtonBox, QApplication, QInputDialog ) -from E5Gui.E5Completers import E5FileCompleter -from E5Gui import E5FileDialog, E5MessageBox +from EricWidgets import EricMessageBox +from EricWidgets.EricPathPicker import EricPathPickerModes from .Ui_DataUriEncoderWizardDialog import Ui_DataUriEncoderWizardDialog import Preferences import Utilities -import UI.PixmapCache -Python3Template = """#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from base64 import b64decode -from io import BytesIO - -#metadata -__author__ = '{0}' -__date__ = '{1}' - - -embedded_file = BytesIO(b64decode({2})) -print(embedded_file.read()) -""" - +DataUriTemplates = { + "Python3": "\n".join([ + "#!/usr/bin/env python3", + "# -*- coding: utf-8 -*-", + "", + "from base64 import b64decode", + "from io import BytesIO", + "", + "#metadata", + "__author__ = '{0}'", + "__date__ = '{1}'", + "", + "", + "embedded_file = BytesIO(b64decode(", + " {2}", + "))", + "print(embedded_file.read())", + ]), + + "CSS": + "html, body {{ margin:0; padding:0; background: url({0})" + " no-repeat center center fixed; background-size:cover" + " }}", + + "HTML": '<img src={0} alt="{1}" title="{1}"/>', + + "JavaScript": "var embedded_file = window.atob({0}); ", + + "QML": "Image {{ source: {0} }} " +} class DataUriEncoderWizardDialog(QDialog, Ui_DataUriEncoderWizardDialog): """ @@ -52,65 +67,45 @@ """ Constructor - @param parent reference to the parent widget (QWidget) + @param parent reference to the parent widget + @type QWidget """ super().__init__(parent) self.setupUi(self) - self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) + self.buttonBox.button( + QDialogButtonBox.StandardButton.Ok).setEnabled(False) - self.__fileCompleter = E5FileCompleter(self.fileEdit) - - self.fileButton.setIcon(UI.PixmapCache.getIcon("open.png")) + self.filePicker.setWindowTitle(self.tr("Data URI Encoder")) + self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) + self.filePicker.setFilters(self.tr( + "Audio Files (*.flac *.mp3 *.ogg *.wav *.weba *.wma);;" + "Image Files (*.gif *.ico *.jpg *.png *.svg *.tif *.webp" + " *.xpm);;" + "Video Files (*.3gp *.avi *.flv *.mp4 *.ogv *.webm *.wmv);;" + "All Files (*)" + )) + self.filePicker.setDefaultDirectory( + Preferences.getMultiProject("Workspace") or + Utilities.getHomeDir() + ) self.embeddingComboBox.addItems([ - self.tr('Do not generate code'), # 0 - self.tr('Generate Python3 embed code'), # 1 - self.tr('Generate CSS embed code'), # 2 - self.tr('Generate HTML embed code'), # 3 - self.tr('Generate JS embed code'), # 4 - self.tr('Generate QML embed code'), # 5 + self.tr('Do not generate code'), # 0 + self.tr('Generate Python3 embedding code'), # 1 + self.tr('Generate CSS embedding code'), # 2 + self.tr('Generate HTML embedding code'), # 3 + self.tr('Generate JavaScript embedding code'), # 4 + self.tr('Generate QML embedding code'), # 5 ]) - def __getStartDir(self): - """ - Private method to get the start directory for selection dialogs. - - @return start directory (string) - """ - return (Preferences.getMultiProject("Workspace") or - Utilities.getHomeDir()) - - @pyqtSlot() - def on_fileButton_clicked(self): - """ - Private slot to select the file to be encoded via a selection dialog. - """ - start = ( - Utilities.fromNativeSeparators(self.fileEdit.text()) or - self.__getStartDir() - ) - inputFile = E5FileDialog.getOpenFileName( - self, - self.tr("Data URI Encoder"), - start, - self.tr( - "Audio Files (*.flac *.mp3 *.ogg *.wav *.weba *.wma);;" - "Image Files (*.gif *.ico *.jpg *.png *.svg *.tif *.webp" - " *.xpm);;" - "Video Files (*.3gp *.avi *.flv *.mp4 *.ogv *.webm *.wmv);;" - "All Files (*)" - ) - ) - if inputFile: - self.fileEdit.setText(Utilities.toNativeSeparators(inputFile)) - @pyqtSlot(int) def on_embeddingComboBox_currentIndexChanged(self, index): """ Private slot to handle the selection of an embedding method. - @param index index of the selected entry (integer) + @param index index of the selected entry + @type int """ if index in [2, 3]: self.encryptCheckBox.setChecked(False) @@ -124,23 +119,22 @@ """ Private slot to encode the contents of the given file. """ - filepath = Utilities.toNativeSeparators(self.fileEdit.text().strip()) + filepath = self.filePicker.text().strip() mime = mimetypes.guess_type(filepath, strict=False) mimetype = mime if mime is not None else self.__askMime() if os.path.getsize(filepath) // 1024 // 1024 >= 1: - res = E5MessageBox.warning( + res = EricMessageBox.warning( self, self.tr("Data URI Encoder"), self.tr( """The file size is > 1 Megabyte. Encoding this will""" """ take some time depending on your CPU processing""" """ power!"""), - E5MessageBox.StandardButtons( - E5MessageBox.Cancel | - E5MessageBox.Ok), - E5MessageBox.Cancel) - if res == E5MessageBox.Cancel: + EricMessageBox.Cancel | + EricMessageBox.Ok, + EricMessageBox.Cancel) + if res == EricMessageBox.Cancel: return try: @@ -153,7 +147,7 @@ base64.b64encode(f.read()).decode() ) except OSError as err: - E5MessageBox.critical( + EricMessageBox.critical( self, self.tr("Data URI Encoder"), self.tr( @@ -161,23 +155,21 @@ """<p>Reason: {1}</p>""").format(filepath, str(err))) return if self.embeddingComboBox.currentIndex() == 1: # Python 3 - output = Python3Template.format( + output = DataUriTemplates["Python3"].format( getpass.getuser(), datetime.datetime.now().isoformat().split('.')[0], output) elif self.embeddingComboBox.currentIndex() == 2: # CSS - output = ('html, body {{ margin:0; padding:0; background: url({0})' - ' no-repeat center center fixed; background-size:cover' - ' }}'.format(output)) + output = DataUriTemplates["CSS"].format(output) elif self.embeddingComboBox.currentIndex() == 3: # HTML - output = '<img src={0} alt="{1}" title="{1}"/>'.format( + output = DataUriTemplates["HTML"].format( output, os.path.basename(filepath)) elif self.embeddingComboBox.currentIndex() == 4: # JS - output = 'var embedded_file = window.atob({0}); '.format(output) + output = DataUriTemplates["JavaScript"].format(output) elif self.embeddingComboBox.currentIndex() == 5: # QML - output = 'Image {{ source: {0} }} '.format(output) + output = DataUriTemplates["QML"].format(output) if self.encryptCheckBox.isChecked(): - output = output.encode('rot_13') + output = codecs.encode(output, 'rot_13') self.outputTextEdit.setPlainText(output) @@ -195,14 +187,16 @@ """ enable = bool(self.outputTextEdit.toPlainText()) self.copyButton.setEnabled(enable) - self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enable) + self.buttonBox.button( + QDialogButtonBox.StandardButton.Ok).setEnabled(enable) @pyqtSlot(str) - def on_fileEdit_textChanged(self, txt): + def on_filePicker_textChanged(self, txt): """ Private slot to handle the editing of the file name. - @param txt current file name (string) + @param txt current file name + @type str """ self.encodeButton.setEnabled(bool(txt) and os.path.isfile(txt)) @@ -210,7 +204,8 @@ """ Private method to get the mime type from the user. - @return entered mime type (string) + @return entered mime type + @rtype str """ mimetypesList = [""] + list(sorted( set(mimetypes.types_map.values()).union( @@ -234,6 +229,7 @@ """ Public method to get the code. - @return generated code (string) + @return generated code + @rtype str """ return self.outputTextEdit.toPlainText()