From 841b4f59c7f17466f3d2d5376921dbec3885d8e3 Mon Sep 17 00:00:00 2001 From: themighty1 Date: Fri, 26 Dec 2014 13:04:40 +0200 Subject: [PATCH] dont freeze UI when mass-moving to trash --- src/bitmessageqt/__init__.py | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index ec4452f8..306b99e5 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -2789,19 +2789,29 @@ class MyForm(QtGui.QMainWindow): # Send item on the Inbox tab to trash def on_action_InboxTrash(self): - while self.ui.tableWidgetInbox.selectedIndexes() != []: - currentRow = self.ui.tableWidgetInbox.selectedIndexes()[0].row() - inventoryHashToTrash = str(self.ui.tableWidgetInbox.item( - currentRow, 3).data(Qt.UserRole).toPyObject()) - sqlExecute('''UPDATE inbox SET folder='trash' WHERE msgid=?''', inventoryHashToTrash) - self.ui.textEditInboxMessage.setText("") - self.ui.tableWidgetInbox.removeRow(currentRow) - self.statusBar().showMessage(_translate( - "MainWindow", "Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back.")) - if currentRow == 0: - self.ui.tableWidgetInbox.selectRow(currentRow) - else: - self.ui.tableWidgetInbox.selectRow(currentRow - 1) + inventoryHashesToTrash = [] + unsorted_ranges = self.ui.tableWidgetInbox.selectedRanges() + ranges = sorted(unsorted_ranges, key=lambda r: r.topRow()) + for r in ranges: + for i in range(r.bottomRow()-r.topRow()+1): + inventoryHashToTrash = str(self.ui.tableWidgetInbox.item( + r.topRow()+i, 3).data(Qt.UserRole).toPyObject()) + inventoryHashesToTrash.append(inventoryHashToTrash) + #sqlite requires the exact number of ?s to prevent injection + sqlExecute('''UPDATE inbox SET folder='trash' WHERE msgid IN (%s)''' % ( + "?," * len(inventoryHashesToTrash))[:-1], *inventoryHashesToTrash) + + self.ui.textEditInboxMessage.setText("") + self.statusBar().showMessage(_translate( + "MainWindow", "Moved items to trash. There is no user interface to view your trash, but it is still on disk if you are desperate to get it back.")) + #remove ranges from model/view going from bottom to top + for r in ranges[::-1]: + self.ui.tableWidgetInbox.model().removeRows(r.topRow(), + r.bottomRow()-r.topRow()+1) + lastRow = r.topRow() + self.ui.tableWidgetInbox.selectRow(0 if lastRow == 0 else lastRow-1) + self.changedInboxUnread() + def on_action_InboxSaveMessageAs(self): currentInboxRow = self.ui.tableWidgetInbox.currentRow()