Fix #1906791 [Look & Feel rules editors: Selecting multiple entries in menu editor only moves one](https://bugs.launchpad.net/calibre/+bug/1906791)

This commit is contained in:
Kovid Goyal 2020-12-10 21:34:03 +05:30
parent 20518c297b
commit d129c3b2a5
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -9,7 +9,7 @@ import textwrap
from PyQt5.Qt import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QListWidget, QIcon, QDialog,
QSize, QComboBox, QLineEdit, QListWidgetItem, QStyledItemDelegate, QAbstractItemView,
QStaticText, Qt, QStyle, QToolButton, QInputDialog, QMenu, pyqtSignal, QPalette
QStaticText, Qt, QStyle, QToolButton, QInputDialog, QMenu, pyqtSignal, QPalette, QItemSelectionModel
)
from calibre.ebooks.metadata.tag_mapper import map_tags, compile_pat
@ -344,25 +344,30 @@ class Rules(QWidget):
if changed:
self.changed.emit()
def move_up(self):
i = self.rule_list.currentItem()
if i is not None:
row = self.rule_list.row(i)
if row > 0:
def move_selected(self, delta=-1):
current_item = self.rule_list.currentItem()
items = self.rule_list.selectedItems()
if current_item is None or not items or not len(items):
return
row_map = {id(item): self.rule_list.row(item) for item in items}
items.sort(key=lambda item: row_map[id(item)])
num = self.rule_list.count()
for item in items:
row = row_map[id(item)]
nrow = (row + delta + num) % num
self.rule_list.takeItem(row)
self.rule_list.insertItem(row - 1, i)
self.rule_list.setCurrentItem(i)
self.rule_list.insertItem(nrow, item)
sm = self.rule_list.selectionModel()
for item in items:
sm.select(self.rule_list.indexFromItem(item), QItemSelectionModel.SelectionFlag.Select)
sm.setCurrentIndex(self.rule_list.indexFromItem(current_item), QItemSelectionModel.SelectionFlag.Current)
self.changed.emit()
def move_up(self):
self.move_selected()
def move_down(self):
i = self.rule_list.currentItem()
if i is not None:
row = self.rule_list.row(i)
if row < self.rule_list.count() - 1:
self.rule_list.takeItem(row)
self.rule_list.insertItem(row + 1, i)
self.rule_list.setCurrentItem(i)
self.changed.emit()
self.move_selected(1)
@property
def rules(self):