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