mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Fix shift click not working reliably in the book list
This commit is contained in:
parent
5345e78982
commit
751b5f9cc2
@ -13,7 +13,7 @@ from collections import OrderedDict
|
|||||||
from PyQt5.Qt import (
|
from PyQt5.Qt import (
|
||||||
QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, QFont, QModelIndex,
|
QTableView, Qt, QAbstractItemView, QMenu, pyqtSignal, QFont, QModelIndex,
|
||||||
QIcon, QItemSelection, QMimeData, QDrag, QStyle, QPoint, QUrl, QHeaderView,
|
QIcon, QItemSelection, QMimeData, QDrag, QStyle, QPoint, QUrl, QHeaderView,
|
||||||
QStyleOptionHeader, QItemSelectionModel, QSize, QFontMetrics)
|
QStyleOptionHeader, QItemSelectionModel, QSize, QFontMetrics, QApplication)
|
||||||
|
|
||||||
from calibre.constants import islinux
|
from calibre.constants import islinux
|
||||||
from calibre.gui2.library.delegates import (RatingDelegate, PubDateDelegate,
|
from calibre.gui2.library.delegates import (RatingDelegate, PubDateDelegate,
|
||||||
@ -960,6 +960,56 @@ class BooksView(QTableView): # {{{
|
|||||||
self.show_context_menu(self.context_menu, event)
|
self.show_context_menu(self.context_menu, event)
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
def handle_mouse_press_event(self, ev):
|
||||||
|
if QApplication.keyboardModifiers() & Qt.ShiftModifier:
|
||||||
|
# Shift-Click in QTableView is badly behaved.
|
||||||
|
index = self.indexAt(ev.pos())
|
||||||
|
if not index.isValid():
|
||||||
|
return QTableView.mousePressEvent(self, ev)
|
||||||
|
ci = self.currentIndex()
|
||||||
|
if not ci.isValid():
|
||||||
|
return QTableView.mousePressEvent(self, ev)
|
||||||
|
clicked_row = index.row()
|
||||||
|
current_row = ci.row()
|
||||||
|
sm = self.selectionModel()
|
||||||
|
if clicked_row == current_row:
|
||||||
|
sm.setCurrentIndex(index, sm.NoUpdate)
|
||||||
|
return
|
||||||
|
sr = sm.selectedRows()
|
||||||
|
if not len(sr):
|
||||||
|
sm.select(index, sm.Select | sm.Clear | sm.Current | sm.Rows)
|
||||||
|
return
|
||||||
|
|
||||||
|
m = self.model()
|
||||||
|
|
||||||
|
def new_selection(upper, lower):
|
||||||
|
top_left = m.index(upper, 0)
|
||||||
|
bottom_right = m.index(lower, m.columnCount(None) - 1)
|
||||||
|
return QItemSelection(top_left, bottom_right)
|
||||||
|
|
||||||
|
currently_selected = tuple(x.row() for x in sr)
|
||||||
|
min_row = min(currently_selected)
|
||||||
|
max_row = max(currently_selected)
|
||||||
|
outside_current_selection = clicked_row < min_row or clicked_row > max_row
|
||||||
|
existing_selection = sm.selection()
|
||||||
|
if outside_current_selection:
|
||||||
|
# We simply extend the current selection
|
||||||
|
if clicked_row < min_row:
|
||||||
|
upper, lower = clicked_row, min_row
|
||||||
|
else:
|
||||||
|
upper, lower = max_row, clicked_row
|
||||||
|
existing_selection.merge(new_selection(upper, lower), sm.Select)
|
||||||
|
else:
|
||||||
|
if current_row < clicked_row:
|
||||||
|
upper, lower = current_row, clicked_row
|
||||||
|
else:
|
||||||
|
upper, lower = clicked_row, current_row
|
||||||
|
existing_selection.merge(new_selection(upper, lower), sm.Toggle)
|
||||||
|
sm.select(existing_selection, sm.ClearAndSelect)
|
||||||
|
sm.setCurrentIndex(index, sm.Select | sm.Rows) # ensure clicked row is always selected
|
||||||
|
else:
|
||||||
|
return QTableView.mousePressEvent(self, ev)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def column_map(self):
|
def column_map(self):
|
||||||
return self._model.column_map
|
return self._model.column_map
|
||||||
|
Loading…
x
Reference in New Issue
Block a user