Edit Book: Saved Searches: Preserve selection when using arrows to move multiple items

This commit is contained in:
Kovid Goyal 2017-03-12 11:34:13 +05:30
parent ac1fd2b9b3
commit 6189ece113

View File

@ -624,6 +624,18 @@ class SearchesModel(QAbstractListModel):
self.filtered_searches.append(i) self.filtered_searches.append(i)
self.endResetModel() self.endResetModel()
def search_for_index(self, index):
try:
return self.searches[self.filtered_searches[index.row()]]
except IndexError:
pass
def index_for_search(self, search):
for row, si in enumerate(self.filtered_searches):
if self.searches[si] is search:
return self.index(row)
return self.index(-1)
def move_entry(self, row, delta): def move_entry(self, row, delta):
a, b = row, row + delta a, b = row, row + delta
if 0 <= b < len(self.filtered_searches): if 0 <= b < len(self.filtered_searches):
@ -1096,16 +1108,22 @@ class SavedSearches(QWidget):
def move_entry(self, delta): def move_entry(self, delta):
if self.editing_search: if self.editing_search:
return return
rows = {index.row() for index in self.searches.selectionModel().selectedIndexes()} - {-1} sm = self.searches.selectionModel()
rows = {index.row() for index in sm.selectedIndexes()} - {-1}
if rows: if rows:
searches = [self.model.search_for_index(index) for index in sm.selectedIndexes()]
current_search = self.model.search_for_index(self.searches.currentIndex())
with tprefs: with tprefs:
for row in sorted(rows, reverse=delta > 0): for row in sorted(rows, reverse=delta > 0):
self.model.move_entry(row, delta) self.model.move_entry(row, delta)
nrow = row + delta sm.clear()
index = self.model.index(nrow) for s in searches:
if index.isValid(): index = self.model.index_for_search(s)
sm = self.searches.selectionModel() if index.isValid() and index.row() > -1:
sm.setCurrentIndex(index, sm.ClearAndSelect) if s is current_search:
sm.setCurrentIndex(index, sm.Select)
else:
sm.select(index, sm.Select)
def search_editing_done(self, save_changes): def search_editing_done(self, save_changes):
if save_changes and not self.edit_search_widget.save_changes(): if save_changes and not self.edit_search_widget.save_changes():