diff --git a/__main__.py b/__main__.py index 602aa21..87026e6 100755 --- a/__main__.py +++ b/__main__.py @@ -444,24 +444,36 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): self.thread.finished.connect(self.move_on) self.thread.start() - def delete_books(self): + def get_selection(self, library_widget): + selected_indexes = None + + if library_widget == self.listView: + selected_books = self.lib_ref.item_proxy_model.mapSelectionToSource( + self.listView.selectionModel().selection()) + selected_indexes = [i.indexes()[0] for i in selected_books] + + elif library_widget == self.tableView: + selected_books = self.tableView.selectionModel().selectedRows() + selected_indexes = [ + self.lib_ref.table_proxy_model.mapToSource(i) for i in selected_books] + + return selected_indexes + + def delete_books(self, selected_indexes=None): # TODO # ? Mirror selection # Ask if library files are to be excluded from further scans # Make a checkbox for this - # Get a list of QItemSelection objects - # What we're interested in is the indexes()[0] in each of them - # That gives a list of indexes from the view model - if self.listView.isVisible(): - selected_books = self.lib_ref.item_proxy_model.mapSelectionToSource( - self.listView.selectionModel().selection()) - selected_indexes = [i.indexes()[0] for i in selected_books] + if not selected_indexes: + # Get a list of QItemSelection objects + # What we're interested in is the indexes()[0] in each of them + # That gives a list of indexes from the view model + if self.listView.isVisible(): + selected_indexes = self.get_selection(self.listView) - elif self.tableView.isVisible(): - selected_books = self.tableView.selectionModel().selectedRows() - selected_indexes = [ - self.lib_ref.table_proxy_model.mapToSource(i) for i in selected_books] + elif self.tableView.isVisible(): + selected_indexes = self.get_selection(self.tableView) if not selected_indexes: return @@ -488,7 +500,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): self.thread.start() # Generate a message box to confirm deletion - selected_number = len(selected_books) + selected_number = len(selected_indexes) confirm_deletion = QtWidgets.QMessageBox() confirm_deletion.setText('Delete %d book(s)?' % selected_number) confirm_deletion.setIcon(QtWidgets.QMessageBox.Question) @@ -941,12 +953,19 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): if not index.isValid(): return + # It's worth remembering that these are indexes of the view_model + # and NOT of the proxy models + selected_indexes = self.get_selection(self.sender()) + context_menu = QtWidgets.QMenu() openAction = context_menu.addAction( QtGui.QIcon.fromTheme('view-readermode'), 'Start reading') - editAction = context_menu.addAction( - QtGui.QIcon.fromTheme('edit-rename'), 'Edit') + + if len(selected_indexes) == 1: + editAction = context_menu.addAction( + QtGui.QIcon.fromTheme('edit-rename'), 'Edit') + deleteAction = context_menu.addAction( QtGui.QIcon.fromTheme('trash-empty'), 'Delete') readAction = context_menu.addAction( @@ -956,6 +975,50 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): action = context_menu.exec_(self.sender().mapToGlobal(position)) + if action == openAction: + books_to_open = {} + for i in selected_indexes: + metadata = self.lib_ref.view_model.data(i, QtCore.Qt.UserRole + 3) + books_to_open[metadata['path']] = metadata['hash'] + + self.open_files(books_to_open) + + if action == editAction: + edit_book = selected_indexes[0] + metadata = self.lib_ref.view_model.data( + edit_book, QtCore.Qt.UserRole + 3) + + cover = self.lib_ref.view_model.item(edit_book.row()).icon() + title = metadata['title'] + author = metadata['author'] + year = str(metadata['year']) + tags = metadata['tags'] + + self.metadataDialog.load_book( + cover, title, author, year, tags, edit_book) + + self.metadataDialog.show() + + if action == deleteAction: + self.delete_books(selected_indexes) + + if action == readAction or action == unreadAction: + # TODO + # This will take some doing + # Best idea: Have another field in the db that returns an "is read" + # Have that supersede all other considerations of position + # Use that to generate a position in the tab when the file is opened + + # OR + # Simulate file opening and closure + + for i in selected_indexes: + metadata = self.lib_ref.view_model.data(i, QtCore.Qt.UserRole + 7) + metadata2 = self.lib_ref.view_model.data(i, QtCore.Qt.UserRole + 3) + print(metadata2['position']) + # self.lib_ref.view_model.setData( + # model_index, current_tab.metadata['position'], QtCore.Qt.UserRole + 7) + def generate_library_filter_menu(self, directory_list=None): self.libraryFilterMenu.clear() diff --git a/metadatadialog.py b/metadatadialog.py index c32011d..718d3fb 100644 --- a/metadatadialog.py +++ b/metadatadialog.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from PyQt5 import QtWidgets, QtCore +from PyQt5 import QtWidgets, QtCore, QtGui from resources import metadata class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog): @@ -27,6 +27,34 @@ class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog): self.parent = parent self.setWindowFlags( QtCore.Qt.Window | - QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowCloseButtonHint) self.setFixedSize(self.width(), self.height()) + + self.coverView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.coverView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + + def load_book(self, cover, title, author, year, tags, index): + image_pixmap = cover.pixmap(self.coverView.size()) + graphics_scene = QtWidgets.QGraphicsScene() + graphics_scene.addPixmap(image_pixmap) + self.coverView.setScene(graphics_scene) + + self.titleLine.setText(title) + self.authorLine.setText(author) + self.yearLine.setText(year) + self.tagsLine.setText(tags) + + def showEvent(self, event): + size = self.size() + desktop_size = QtWidgets.QDesktopWidget().screenGeometry() + top = (desktop_size.height() / 2) - (size.height() / 2) + left = (desktop_size.width() / 2) - (size.width() / 2) + self.move(left, top) + self.parent.setEnabled(False) + + def hideEvent(self, event): + self.parent.setEnabled(True) + + def closeEvent(self, event): + self.parent.setEnabled(True) + event.accept() diff --git a/resources/metadata.py b/resources/metadata.py index 0d725ed..19dac70 100644 --- a/resources/metadata.py +++ b/resources/metadata.py @@ -11,26 +11,26 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") - Dialog.resize(640, 212) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + Dialog.resize(700, 230) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) Dialog.setSizePolicy(sizePolicy) - Dialog.setMaximumSize(QtCore.QSize(700, 212)) + Dialog.setMaximumSize(QtCore.QSize(700, 230)) Dialog.setModal(True) self.gridLayout = QtWidgets.QGridLayout(Dialog) self.gridLayout.setObjectName("gridLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.coverView = QtWidgets.QGraphicsView(Dialog) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.coverView.sizePolicy().hasHeightForWidth()) self.coverView.setSizePolicy(sizePolicy) - self.coverView.setMinimumSize(QtCore.QSize(140, 200)) - self.coverView.setMaximumSize(QtCore.QSize(140, 200)) + self.coverView.setMinimumSize(QtCore.QSize(140, 218)) + self.coverView.setMaximumSize(QtCore.QSize(140, 218)) self.coverView.setBaseSize(QtCore.QSize(140, 200)) self.coverView.setObjectName("coverView") self.horizontalLayout.addWidget(self.coverView) diff --git a/resources/raw/metadata.ui b/resources/raw/metadata.ui index 40c2dea..7b02218 100644 --- a/resources/raw/metadata.ui +++ b/resources/raw/metadata.ui @@ -6,12 +6,12 @@ 0 0 - 640 - 212 + 700 + 230 - + 0 0 @@ -19,7 +19,7 @@ 700 - 212 + 230 @@ -34,7 +34,7 @@ - + 0 0 @@ -42,13 +42,13 @@ 140 - 200 + 218 140 - 200 + 218