<commit_before>import datetime

from PyQt4 import QtGui, QtCore

from epubcreator.misc import language, gui_utils, settings_store
from epubcreator.gui.forms import basic_metadata_widget_ui, additional_metadata_widget_ui
from epubcreator.epubbase import ebook_metadata, images
from epubcreator.gui import image_edit, author_data_edit


class BasicMetadata(QtGui.QWidget, basic_metadata_widget_ui.Ui_BasicMetadata):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        # Un objeto CoverImage.
        self._coverImage = None

        # Una vez cargada una imagen en el label, no puedo recuperar el texto de información
        # que tenía, por eso me lo guardo en caso de que al método setCoverImage se le pase
        # None como parámetro.
        self._coverImageText = self.coverImage.text()

        self._populateCoverModificationOptions()
        self._populateLanguages()

        # Por defecto, el combobox del lenguaje muestra "español".
        self.languageInput.setCurrentIndex(self.languageInput.findText(language.Language.getLanguageName("es")))

        # En el campo id del libro solo pueden ingresar números.
        self.idInput.setValidator(QtGui.QIntValidator(self))

        self._connectSignals()

    def getTitle(self):
        return self.titleInput.text().strip()

    def getSubtitle(self):
        return self.subtitleInput.text().strip()

    def getAuthors(self):
        """
        Retorna los autores ingresados por el usuario.

        @return: una lista de Person.
        """
        authors = []

        for i in range(self.authorsList.count()):
            person = self.authorsList.item(i).data(QtCore.Qt.UserRole)
            authors.append(person)

        return authors

    def getCoverModification(self):
        return self.coverModificationInput.currentText().strip()

    def getCoverDesigner(self):
        return self.coverDesignerInput.text().strip()

    def getLanguageCode(self):
        return language.Language.getLanguageCode(self.languageInput.currentText())

    def getBookId(self):
        return self.idInput.text().strip()

    def getSynopsis(self):
        return self.synopsisInput.toPlainText().strip()

    def getCoverImage(self):
        """
        Retorna un objeto CoverImage.
        """
        return self._coverImage

    def setCoverImage(self, coverImage):
        """
        Setea la imagen de cubierta.

        @param coverImage: un objeto CoverImage.
        """
        self._coverImage = coverImage

        if coverImage:
            self._refreshCoverImage()
        else:
            self.coverImage.setText(self._coverImageText)
            self.editCoverImageButton.setEnabled(False)

    def _populateCoverModificationOptions(self):
        for i, option in enumerate(ebook_metadata.Metadata.COVER_MODIFICATION_OPTIONS):
            self.coverModificationInput.addItem(option[0])
            self.coverModificationInput.setItemData(i, gui_utils.formatTextForTooltip(option[1]), QtCore.Qt.ToolTipRole)

    def _populateLanguages(self):
        for languageName in language.Language.getSortedLanguagesNames():
            self.languageInput.addItem(languageName)

    def _changeCoverImage(self):
        imgFilter = "Imágenes ({0})".format(" ".join(("*.{0}".format(f[0]) for f in images.CoverImage.SUPPORTED_FORMATS if not f[1])))
        imageName = QtGui.QFileDialog.getOpenFileName(self, "Seleccionar Imagen", filter=imgFilter)

        if imageName:
            settings = settings_store.SettingsStore()

            try:
                image = images.CoverImage(imageName, allowProcessing=settings.allowImageProcessing)
            except images.InvalidDimensionsError:
                gui_utils.displayStdErrorDialog("La imagen de cubierta seleccionada no tiene las dimensiones requeridas, que deben ser "
                                                "de {0}px de ancho y {1}px de alto. Si desea que la imagen se redimensione "
                                                "automáticamente, habilite la opción para permitir el procesamiento de las imágenes desde el "
                                                "menú Preferencias.".format(images.CoverImage.WIDTH, images.CoverImage.HEIGHT))
                return
            except images.MaxSizeExceededError:
                gui_utils.displayStdErrorDialog("La imagen de cubierta excede el tamaño máximo permitido, que debe "
                                                "ser menor o igual a {0} kB. Si desea que la calidad de la imagen se ajuste automáticamente "
                                                "para reducir su tamaño, habilite la opción para permitir el procesamiento de las imágenes "
                                                "desde el menú Preferencias.".format(images.CoverImage.MAX_SIZE_IN_BYTES // 1000))
                return
            except images.ProgressiveImageError:
                gui_utils.displayStdErrorDialog("La imagen de cubierta no puede ser abierta porque fue guardada en modo progresivo. Guárdela de "
                                                "manera normal y vuelva a abrirla, o habilite la opción para permitir el procesamiento de las "
                                                "imágenes desde el menú Preferencias.")
                return

            self.setCoverImage(image)

            if settings.allowImageProcessing:
                self.editCoverImageButton.setEnabled(True)

    def _refreshCoverImage(self):
        pixmap = QtGui.QPixmap()
        pixmap.loadFromData(self._coverImage.toBytes())
        self.coverImage.setPixmap(pixmap)

    def _editCoverImage(self):
        clonedCoverImage = self._coverImage.clone()

        if image_edit.ImageEdit(clonedCoverImage, parent=self).exec() == QtGui.QDialog.Accepted:
            self.setCoverImage(clonedCoverImage)

    def _addAuthorToList(self):
        name = self.authorInput.text().strip()
        fileAs = self.authorFileAsInput.text().strip()

        if name and fileAs:
            # Compruebo que el nombre del autor no haya sido agregado ya a la lista.
            for i in range(self.authorsList.count()):
                if self.authorsList.item(i).data(QtCore.Qt.UserRole).name == name:
                    return

            item = QtGui.QListWidgetItem("{0} --> {1}".format(name, fileAs))
            item.setData(QtCore.Qt.UserRole, ebook_metadata.Person(name, fileAs))
            self.authorsList.addItem(item)

            self.authorInput.clear()
            self.authorFileAsInput.clear()

    def _removeSelectedAuthorFromList(self):
        if self.authorsList.currentItem() is not None:
            self.authorsList.takeItem(self.authorsList.row(self.authorsList.currentItem()))

    def _editAuthorData(self, author):
        clonedAuthor = author.clone()<commit_msg>Corrige ubicación incorrecta del título del groupbox en el form para editar imagen, debido a que al momento de crearlo el parent pasado como parámetro no era un window, sino un widget, lo que ocasionaba problema en la geometría del form.<commit_after>import datetime

from PyQt4 import QtGui, QtCore

from epubcreator.misc import language, gui_utils, settings_store
from epubcreator.gui.forms import basic_metadata_widget_ui, additional_metadata_widget_ui
from epubcreator.epubbase import ebook_metadata, images
from epubcreator.gui import image_edit, author_data_edit


class BasicMetadata(QtGui.QWidget, basic_metadata_widget_ui.Ui_BasicMetadata):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        # Un objeto CoverImage.
        self._coverImage = None

        # Una vez cargada una imagen en el label, no puedo recuperar el texto de información
        # que tenía, por eso me lo guardo en caso de que al método setCoverImage se le pase
        # None como parámetro.
        self._coverImageText = self.coverImage.text()

        self._populateCoverModificationOptions()
        self._populateLanguages()

        # Por defecto, el combobox del lenguaje muestra "español".
        self.languageInput.setCurrentIndex(self.languageInput.findText(language.Language.getLanguageName("es")))

        # En el campo id del libro solo pueden ingresar números.
        self.idInput.setValidator(QtGui.QIntValidator(self))

        self._connectSignals()

    def getTitle(self):
        return self.titleInput.text().strip()

    def getSubtitle(self):
        return self.subtitleInput.text().strip()

    def getAuthors(self):
        """
        Retorna los autores ingresados por el usuario.

        @return: una lista de Person.
        """
        authors = []

        for i in range(self.authorsList.count()):
            person = self.authorsList.item(i).data(QtCore.Qt.UserRole)
            authors.append(person)

        return authors

    def getCoverModification(self):
        return self.coverModificationInput.currentText().strip()

    def getCoverDesigner(self):
        return self.coverDesignerInput.text().strip()

    def getLanguageCode(self):
        return language.Language.getLanguageCode(self.languageInput.currentText())

    def getBookId(self):
        return self.idInput.text().strip()

    def getSynopsis(self):
        return self.synopsisInput.toPlainText().strip()

    def getCoverImage(self):
        """
        Retorna un objeto CoverImage.
        """
        return self._coverImage

    def setCoverImage(self, coverImage):
        """
        Setea la imagen de cubierta.

        @param coverImage: un objeto CoverImage.
        """
        self._coverImage = coverImage

        if coverImage:
            self._refreshCoverImage()
        else:
            self.coverImage.setText(self._coverImageText)
            self.editCoverImageButton.setEnabled(False)

    def _populateCoverModificationOptions(self):
        for i, option in enumerate(ebook_metadata.Metadata.COVER_MODIFICATION_OPTIONS):
            self.coverModificationInput.addItem(option[0])
            self.coverModificationInput.setItemData(i, gui_utils.formatTextForTooltip(option[1]), QtCore.Qt.ToolTipRole)

    def _populateLanguages(self):
        for languageName in language.Language.getSortedLanguagesNames():
            self.languageInput.addItem(languageName)

    def _changeCoverImage(self):
        imgFilter = "Imágenes ({0})".format(" ".join(("*.{0}".format(f[0]) for f in images.CoverImage.SUPPORTED_FORMATS if not f[1])))
        imageName = QtGui.QFileDialog.getOpenFileName(self, "Seleccionar Imagen", filter=imgFilter)

        if imageName:
            settings = settings_store.SettingsStore()

            try:
                image = images.CoverImage(imageName, allowProcessing=settings.allowImageProcessing)
            except images.InvalidDimensionsError:
                gui_utils.displayStdErrorDialog("La imagen de cubierta seleccionada no tiene las dimensiones requeridas, que deben ser "
                                                "de {0}px de ancho y {1}px de alto. Si desea que la imagen se redimensione "
                                                "automáticamente, habilite la opción para permitir el procesamiento de las imágenes desde el "
                                                "menú Preferencias.".format(images.CoverImage.WIDTH, images.CoverImage.HEIGHT))
                return
            except images.MaxSizeExceededError:
                gui_utils.displayStdErrorDialog("La imagen de cubierta excede el tamaño máximo permitido, que debe "
                                                "ser menor o igual a {0} kB. Si desea que la calidad de la imagen se ajuste automáticamente "
                                                "para reducir su tamaño, habilite la opción para permitir el procesamiento de las imágenes "
                                                "desde el menú Preferencias.".format(images.CoverImage.MAX_SIZE_IN_BYTES // 1000))
                return
            except images.ProgressiveImageError:
                gui_utils.displayStdErrorDialog("La imagen de cubierta no puede ser abierta porque fue guardada en modo progresivo. Guárdela de "
                                                "manera normal y vuelva a abrirla, o habilite la opción para permitir el procesamiento de las "
                                                "imágenes desde el menú Preferencias.")
                return

            self.setCoverImage(image)

            if settings.allowImageProcessing:
                self.editCoverImageButton.setEnabled(True)

    def _refreshCoverImage(self):
        pixmap = QtGui.QPixmap()
        pixmap.loadFromData(self._coverImage.toBytes())
        self.coverImage.setPixmap(pixmap)

    def _editCoverImage(self):
        clonedCoverImage = self._coverImage.clone()

        if image_edit.ImageEdit(clonedCoverImage, parent=self.window()).exec() == QtGui.QDialog.Accepted:
            self.setCoverImage(clonedCoverImage)

    def _addAuthorToList(self):
        name = self.authorInput.text().strip()
        fileAs = self.authorFileAsInput.text().strip()

        if name and fileAs:
            # Compruebo que el nombre del autor no haya sido agregado ya a la lista.
            for i in range(self.authorsList.count()):
                if self.authorsList.item(i).data(QtCore.Qt.UserRole).name == name:
                    return

            item = QtGui.QListWidgetItem("{0} --> {1}".format(name, fileAs))
            item.setData(QtCore.Qt.UserRole, ebook_metadata.Person(name, fileAs))
            self.authorsList.addItem(item)

            self.authorInput.clear()
            self.authorFileAsInput.clear()

    def _removeSelectedAuthorFromList(self):
        if self.authorsList.currentItem() is not None:
            self.authorsList.takeItem(self.authorsList.row(self.authorsList.currentItem()))

    def _editAuthorData(self, author):
        clonedAuthor = author.clone()
{'fraction_non_alphanumeric': 0.08103064666618819, 'fraction_numerical': 0.0022967056628148998, 'mean_word_length': 2.373033163882837, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 32, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1342185', 'n_tokens_mistral': 3926, 'n_tokens_neox': 3739, 'n_words': 915}