Added context menu functionality
This commit is contained in:
79
__main__.py
79
__main__.py
@@ -444,24 +444,36 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.thread.finished.connect(self.move_on)
|
self.thread.finished.connect(self.move_on)
|
||||||
self.thread.start()
|
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
|
# TODO
|
||||||
# ? Mirror selection
|
# ? Mirror selection
|
||||||
# Ask if library files are to be excluded from further scans
|
# Ask if library files are to be excluded from further scans
|
||||||
# Make a checkbox for this
|
# Make a checkbox for this
|
||||||
|
|
||||||
|
if not selected_indexes:
|
||||||
# Get a list of QItemSelection objects
|
# Get a list of QItemSelection objects
|
||||||
# What we're interested in is the indexes()[0] in each of them
|
# What we're interested in is the indexes()[0] in each of them
|
||||||
# That gives a list of indexes from the view model
|
# That gives a list of indexes from the view model
|
||||||
if self.listView.isVisible():
|
if self.listView.isVisible():
|
||||||
selected_books = self.lib_ref.item_proxy_model.mapSelectionToSource(
|
selected_indexes = self.get_selection(self.listView)
|
||||||
self.listView.selectionModel().selection())
|
|
||||||
selected_indexes = [i.indexes()[0] for i in selected_books]
|
|
||||||
|
|
||||||
elif self.tableView.isVisible():
|
elif self.tableView.isVisible():
|
||||||
selected_books = self.tableView.selectionModel().selectedRows()
|
selected_indexes = self.get_selection(self.tableView)
|
||||||
selected_indexes = [
|
|
||||||
self.lib_ref.table_proxy_model.mapToSource(i) for i in selected_books]
|
|
||||||
|
|
||||||
if not selected_indexes:
|
if not selected_indexes:
|
||||||
return
|
return
|
||||||
@@ -488,7 +500,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
self.thread.start()
|
self.thread.start()
|
||||||
|
|
||||||
# Generate a message box to confirm deletion
|
# Generate a message box to confirm deletion
|
||||||
selected_number = len(selected_books)
|
selected_number = len(selected_indexes)
|
||||||
confirm_deletion = QtWidgets.QMessageBox()
|
confirm_deletion = QtWidgets.QMessageBox()
|
||||||
confirm_deletion.setText('Delete %d book(s)?' % selected_number)
|
confirm_deletion.setText('Delete %d book(s)?' % selected_number)
|
||||||
confirm_deletion.setIcon(QtWidgets.QMessageBox.Question)
|
confirm_deletion.setIcon(QtWidgets.QMessageBox.Question)
|
||||||
@@ -941,12 +953,19 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
if not index.isValid():
|
if not index.isValid():
|
||||||
return
|
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()
|
context_menu = QtWidgets.QMenu()
|
||||||
|
|
||||||
openAction = context_menu.addAction(
|
openAction = context_menu.addAction(
|
||||||
QtGui.QIcon.fromTheme('view-readermode'), 'Start reading')
|
QtGui.QIcon.fromTheme('view-readermode'), 'Start reading')
|
||||||
|
|
||||||
|
if len(selected_indexes) == 1:
|
||||||
editAction = context_menu.addAction(
|
editAction = context_menu.addAction(
|
||||||
QtGui.QIcon.fromTheme('edit-rename'), 'Edit')
|
QtGui.QIcon.fromTheme('edit-rename'), 'Edit')
|
||||||
|
|
||||||
deleteAction = context_menu.addAction(
|
deleteAction = context_menu.addAction(
|
||||||
QtGui.QIcon.fromTheme('trash-empty'), 'Delete')
|
QtGui.QIcon.fromTheme('trash-empty'), 'Delete')
|
||||||
readAction = context_menu.addAction(
|
readAction = context_menu.addAction(
|
||||||
@@ -956,6 +975,50 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
|
|||||||
|
|
||||||
action = context_menu.exec_(self.sender().mapToGlobal(position))
|
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):
|
def generate_library_filter_menu(self, directory_list=None):
|
||||||
self.libraryFilterMenu.clear()
|
self.libraryFilterMenu.clear()
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from PyQt5 import QtWidgets, QtCore
|
from PyQt5 import QtWidgets, QtCore, QtGui
|
||||||
from resources import metadata
|
from resources import metadata
|
||||||
|
|
||||||
class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog):
|
class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog):
|
||||||
@@ -27,6 +27,34 @@ class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog):
|
|||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.setWindowFlags(
|
self.setWindowFlags(
|
||||||
QtCore.Qt.Window |
|
QtCore.Qt.Window |
|
||||||
QtCore.Qt.WindowMinimizeButtonHint |
|
|
||||||
QtCore.Qt.WindowCloseButtonHint)
|
QtCore.Qt.WindowCloseButtonHint)
|
||||||
self.setFixedSize(self.width(), self.height())
|
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()
|
||||||
|
@@ -11,26 +11,26 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
|||||||
class Ui_Dialog(object):
|
class Ui_Dialog(object):
|
||||||
def setupUi(self, Dialog):
|
def setupUi(self, Dialog):
|
||||||
Dialog.setObjectName("Dialog")
|
Dialog.setObjectName("Dialog")
|
||||||
Dialog.resize(640, 212)
|
Dialog.resize(700, 230)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
sizePolicy.setVerticalStretch(0)
|
sizePolicy.setVerticalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
|
||||||
Dialog.setSizePolicy(sizePolicy)
|
Dialog.setSizePolicy(sizePolicy)
|
||||||
Dialog.setMaximumSize(QtCore.QSize(700, 212))
|
Dialog.setMaximumSize(QtCore.QSize(700, 230))
|
||||||
Dialog.setModal(True)
|
Dialog.setModal(True)
|
||||||
self.gridLayout = QtWidgets.QGridLayout(Dialog)
|
self.gridLayout = QtWidgets.QGridLayout(Dialog)
|
||||||
self.gridLayout.setObjectName("gridLayout")
|
self.gridLayout.setObjectName("gridLayout")
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||||
self.coverView = QtWidgets.QGraphicsView(Dialog)
|
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.setHorizontalStretch(0)
|
||||||
sizePolicy.setVerticalStretch(0)
|
sizePolicy.setVerticalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(self.coverView.sizePolicy().hasHeightForWidth())
|
sizePolicy.setHeightForWidth(self.coverView.sizePolicy().hasHeightForWidth())
|
||||||
self.coverView.setSizePolicy(sizePolicy)
|
self.coverView.setSizePolicy(sizePolicy)
|
||||||
self.coverView.setMinimumSize(QtCore.QSize(140, 200))
|
self.coverView.setMinimumSize(QtCore.QSize(140, 218))
|
||||||
self.coverView.setMaximumSize(QtCore.QSize(140, 200))
|
self.coverView.setMaximumSize(QtCore.QSize(140, 218))
|
||||||
self.coverView.setBaseSize(QtCore.QSize(140, 200))
|
self.coverView.setBaseSize(QtCore.QSize(140, 200))
|
||||||
self.coverView.setObjectName("coverView")
|
self.coverView.setObjectName("coverView")
|
||||||
self.horizontalLayout.addWidget(self.coverView)
|
self.horizontalLayout.addWidget(self.coverView)
|
||||||
|
@@ -6,12 +6,12 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>640</width>
|
<width>700</width>
|
||||||
<height>212</height>
|
<height>230</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>700</width>
|
<width>700</width>
|
||||||
<height>212</height>
|
<height>230</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QGraphicsView" name="coverView">
|
<widget class="QGraphicsView" name="coverView">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
@@ -42,13 +42,13 @@
|
|||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>140</width>
|
<width>140</width>
|
||||||
<height>200</height>
|
<height>218</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>140</width>
|
<width>140</width>
|
||||||
<height>200</height>
|
<height>218</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="baseSize">
|
<property name="baseSize">
|
||||||
|
Reference in New Issue
Block a user