# This file is a part of Lector, a Qt based ebook reader # Copyright (C) 2017-2019 BasioMeusPuga # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import logging from PyQt5 import QtWidgets, QtCore, QtGui from lector import database from lector.widgets import PliantQGraphicsScene from lector.resources import metadata logger = logging.getLogger(__name__) class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog): def __init__(self, parent): super(MetadataUI, self).__init__() self.setupUi(self) self._translate = QtCore.QCoreApplication.translate self.setWindowFlags( QtCore.Qt.Popup | QtCore.Qt.FramelessWindowHint) self.parent = parent radius = 15 path = QtGui.QPainterPath() path.addRoundedRect(QtCore.QRectF(self.rect()), radius, radius) try: mask = QtGui.QRegion(path.toFillPolygon().toPolygon()) self.setMask(mask) except TypeError: # Required for older versions of Qt pass self.parent = parent self.database_path = self.parent.database_path self.book_index = None self.book_year = None self.previous_position = None self.cover_for_database = None self.coverView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.coverView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.okButton.clicked.connect(self.ok_pressed) self.cancelButton.clicked.connect(self.cancel_pressed) self.dialogBackground.clicked.connect(self.color_background) self.titleLine.returnPressed.connect(self.ok_pressed) self.authorLine.returnPressed.connect(self.ok_pressed) self.yearLine.returnPressed.connect(self.ok_pressed) self.tagsLine.returnPressed.connect(self.ok_pressed) def load_book(self, cover, title, author, year, tags, book_index): self.previous_position = None self.cover_for_database = None self.book_index = book_index self.book_year = year self.load_cover(cover) self.titleLine.setText(title) self.authorLine.setText(author) self.yearLine.setText(year) self.tagsLine.setText(tags) def load_cover(self, cover, use_as_is=False): if use_as_is: image_pixmap = cover else: image_pixmap = cover.pixmap(QtCore.QSize(140, 205)) graphics_scene = PliantQGraphicsScene(self) graphics_scene.addPixmap(image_pixmap) self.coverView.setScene(graphics_scene) def ok_pressed(self, event=None): book_item = self.parent.lib_ref.libraryModel.item(self.book_index.row()) title = self.titleLine.text() author = self.authorLine.text() tags = self.tagsLine.text() try: year = int(self.yearLine.text()) except ValueError: year = self.book_year author_string = self._translate('MetadataUI', 'Author') year_string = self._translate('MetadataUI', 'Year') tooltip_string = f'{title} \n{author_string}: {author} \n{year_string}: {str(year)}' book_item.setData(title, QtCore.Qt.UserRole) book_item.setData(author, QtCore.Qt.UserRole + 1) book_item.setData(year, QtCore.Qt.UserRole + 2) book_item.setData(tags, QtCore.Qt.UserRole + 4) book_item.setToolTip(tooltip_string) book_hash = book_item.data(QtCore.Qt.UserRole + 6) database_dict = { 'Title': title, 'Author': author, 'Year': year, 'Tags': tags} if self.cover_for_database: database_dict['CoverImage'] = self.cover_for_database self.parent.cover_functions.cover_loader( book_item, self.cover_for_database) self.parent.lib_ref.update_proxymodels() self.hide() database.DatabaseFunctions(self.database_path).modify_metadata( database_dict, book_hash) def cancel_pressed(self, event=None): self.hide() def generate_display_position(self, mouse_cursor_position): size = self.size() desktop_size = QtWidgets.QDesktopWidget().screenGeometry() display_x = mouse_cursor_position.x() display_y = mouse_cursor_position.y() if display_x + size.width() > desktop_size.width(): display_x = desktop_size.width() - size.width() if display_y + size.height() > desktop_size.height(): display_y = desktop_size.height() - size.height() return QtCore.QPoint(display_x, display_y) def color_background(self, set_initial=False): if set_initial: background = self.parent.settings['dialog_background'] else: self.previous_position = self.pos() self.parent.get_color() background = self.parent.settings['dialog_background'] self.setStyleSheet( "QDialog {{background-color: {0}}}".format(background.name())) self.coverView.setStyleSheet( "QGraphicsView {{background-color: {0}}}".format(background.name())) if not set_initial: self.show() def showEvent(self, event): if self.previous_position: self.move(self.previous_position) else: display_position = self.generate_display_position(QtGui.QCursor.pos()) self.move(display_position) self.titleLine.setFocus() self.color_background(True)