177 lines
6.0 KiB
Python
177 lines
6.0 KiB
Python
# 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)
|