From be02116af9b9c84421aaa3125f5756856e1c8056 Mon Sep 17 00:00:00 2001 From: mailchuck Date: Fri, 27 Nov 2015 00:56:25 +0100 Subject: [PATCH] Global folder, global search, unread folder Fixes #38 Fixes #39 Minor unread refresh issues. --- src/bitmessageqt/__init__.py | 124 ++++++++++++++++++++------------- src/bitmessageqt/foldertree.py | 15 ++-- 2 files changed, 84 insertions(+), 55 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 658da6ed..81d9457f 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -377,7 +377,8 @@ class MyForm(settingsmixin.SMainWindow): def rerenderTabTreeSubscriptions(self): treeWidget = self.ui.treeWidgetSubscriptions - folders = ['inbox', 'sent', 'trash'] + folders = Ui_FolderWidget.folderWeight.keys() + folders.remove("new") # sort ascending when creating if treeWidget.topLevelItemCount() == 0: @@ -463,8 +464,8 @@ class MyForm(settingsmixin.SMainWindow): treeWidget = self.ui.treeWidgetYourIdentities elif tab == 'chan': treeWidget = self.ui.treeWidgetChans - folders = ['inbox', 'sent', 'trash'] - + folders = Ui_FolderWidget.folderWeight.keys() + # sort ascending when creating if treeWidget.topLevelItemCount() == 0: treeWidget.header().setSortIndicator(0, Qt.AscendingOrder) @@ -494,11 +495,18 @@ class MyForm(settingsmixin.SMainWindow): enabled[toAddress] = isEnabled # get number of (unread) messages + total = 0 queryreturn = sqlQuery('SELECT toaddress, folder, count(msgid) as cnt FROM inbox WHERE read = 0 GROUP BY toaddress, folder') for row in queryreturn: toaddress, folder, cnt = row + total += cnt if toaddress in db and folder in db[toaddress]: db[toaddress][folder] = cnt + if tab == "messages": + db[None] = {} + db[None]["inbox"] = total + db[None]["new"] = total + enabled[None] = True if treeWidget.isSortingEnabled(): treeWidget.setSortingEnabled(False) @@ -546,6 +554,10 @@ class MyForm(settingsmixin.SMainWindow): j = 0 unread = 0 for folder in folders: + if toAddress is not None and folder == "new": + continue + if toAddress is None and folder in ["trash", "sent"]: + continue subwidget = Ui_FolderWidget(widget, j, toAddress, folder, db[toAddress][folder]) unread += db[toAddress][folder] j += 1 @@ -914,22 +926,25 @@ class MyForm(settingsmixin.SMainWindow): if isinstance(item, Ui_AddressWidget): self.drawTrayIcon(self.currentTrayIconFileName, self.findInboxUnreadCount(self.unreadCount -1)) - if widget == None: + if widget == None or self.getCurrentAccount() == None: widgets = [self.ui.treeWidgetYourIdentities, self.ui.treeWidgetSubscriptions, self.ui.treeWidgetChans] else: widgets = [widget] + # FIXME this is a hack + if folder == "new": + folder = "inbox" for treeWidget in widgets: root = treeWidget.invisibleRootItem() for i in range(root.childCount()): addressItem = root.child(i) - if address is not None and addressItem.data(0, QtCore.Qt.UserRole) != address: + if addressItem.type != AccountMixin.ALL and address is not None and addressItem.data(0, QtCore.Qt.UserRole) != address: continue updateUnreadCount(addressItem) if addressItem.childCount == 0: continue for j in range(addressItem.childCount()): folderItem = addressItem.child(j) - if folder is not None and folderItem.folderName != folder: + if folder is not None and folderItem.folderName != folder and addressItem.type != AccountMixin.ALL: continue updateUnreadCount(folderItem) @@ -1052,46 +1067,56 @@ class MyForm(settingsmixin.SMainWindow): tableWidget.keyPressEvent = self.tableWidgetSentKeyPressEvent # Load messages from database file - def loadMessagelist(self, tableWidget, account, folder="inbox", where="", what=""): + def loadMessagelist(self, tableWidget, account, folder="inbox", where="", what="", unreadOnly = False): if folder == 'sent': self.loadSent(tableWidget, account, where, what) return - what = "%" + what + "%" - if where == _translate("MainWindow", "To"): - where = "toaddress" - elif where == _translate("MainWindow", "From"): - where = "fromaddress" - elif where == _translate("MainWindow", "Subject"): - where = "subject" - elif where == _translate("MainWindow", "Message"): - where = "message" + if what != "": + what = "%" + what + "%" + if where == _translate("MainWindow", "To"): + where = "toaddress" + elif where == _translate("MainWindow", "From"): + where = "fromaddress" + elif where == _translate("MainWindow", "Subject"): + where = "subject" + elif where == _translate("MainWindow", "Message"): + where = "message" + else: + where = "toaddress || fromaddress || subject || message" else: - where = "toaddress || fromaddress || subject || message" + what = None if tableWidget == self.ui.tableWidgetInboxSubscriptions: xAddress = "fromaddress" else: xAddress = "toaddress" + sqlStatementBase = '''SELECT folder, msgid, toaddress, fromaddress, subject, received, read + FROM inbox ''' + sqlStatementParts = [] + sqlArguments = [] + if account is not None: + sqlStatementParts.append(xAddress + " = ? ") + sqlArguments.append(account) if folder is not None: - sqlStatement = ''' - SELECT folder, msgid, toaddress, fromaddress, subject, received, read - FROM inbox WHERE ''' + xAddress + '''=? AND folder=? AND %s LIKE ? - ORDER BY received - ''' % (where) - queryreturn = sqlQuery(sqlStatement, account, folder, what) - else: - sqlStatement = ''' - SELECT folder, msgid, toaddress, fromaddress, subject, received, read - FROM inbox WHERE ''' + xAddress + '''=? AND folder != "trash" AND %s LIKE ? - ORDER BY received - ''' % (where) - queryreturn = sqlQuery(sqlStatement, account, what) + sqlStatementParts.append("folder = ? ") + sqlArguments.append(folder) + if what is not None: + sqlStatementParts.append("%s LIKE ?" % (where)) + sqlArguments.append(what) + if unreadOnly: + sqlStatementParts.append("read = 0") + if len(sqlStatementParts) > 0: + sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts) + queryreturn = sqlQuery(sqlStatementBase, sqlArguments) tableWidget.setRowCount(0) - - tableWidget.setColumnHidden(0, True) - tableWidget.setColumnHidden(1, False) + if account is not None: + tableWidget.setColumnHidden(0, True) + tableWidget.setColumnHidden(1, False) + else: + tableWidget.setColumnHidden(0, False) + tableWidget.setColumnHidden(1, False) tableWidget.setSortingEnabled(False) font = QFont() @@ -1911,7 +1936,7 @@ class MyForm(settingsmixin.SMainWindow): self.statusBar().showMessage(_translate( "MainWindow", "Message trashed")) treeWidget = self.widgetConvert(inbox) - self.propagateUnreadCount(self.getCurrentAccount(treeWidget), self.getCurrentFolder(treeWidget), treeWidget, 0) + self.propagateUnreadCount(str(inbox.item(i, 1 if inbox == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), self.getCurrentFolder(treeWidget), treeWidget, 0) inbox.removeRow(i) break @@ -2420,7 +2445,7 @@ class MyForm(settingsmixin.SMainWindow): self.propagateUnreadCount(acct.address) if shared.config.getboolean('bitmessagesettings', 'showtraynotifications'): self.notifierShow(unicode(_translate("MainWindow",'New Message').toUtf8(),'utf-8'), unicode(_translate("MainWindow",'From ').toUtf8(),'utf-8') + unicode(acct.fromLabel, 'utf-8'), self.SOUND_UNKNOWN, None) - if (self.getCurrentFolder(treeWidget) != "inbox" and self.getCurrentFolder(treeWidget) is not None) or self.getCurrentAccount(treeWidget) != acct.address: + if self.getCurrentAccount() is not None and ((self.getCurrentFolder(treeWidget) != "inbox" and self.getCurrentFolder(treeWidget) is not None) or self.getCurrentAccount(treeWidget) != acct.address): # Ubuntu should notify of new message irespective of whether it's in current message list or not self.ubuntuMessagingMenuUpdate(True, None, acct.toLabel) return @@ -3007,9 +3032,9 @@ class MyForm(settingsmixin.SMainWindow): "?," * len(inventoryHashesToMarkUnread))[:-1], *inventoryHashesToMarkUnread) if modified == 1: # performance optimisation - self.propagateUnreadCount(self.getCurrentAccount(), self.getCurrentFolder()) + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), self.getCurrentFolder()) else: - self.propagateUnreadCount(self.getCurrentAccount(), self.getCurrentFolder(), self.getCurrentTreeWidget(), 0) + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), self.getCurrentFolder(), self.getCurrentTreeWidget(), 0) # tableWidget.selectRow(currentRow + 1) # This doesn't de-select the last message if you try to mark it unread, but that doesn't interfere. Might not be necessary. # We could also select upwards, but then our problem would be with the topmost message. @@ -3170,7 +3195,10 @@ class MyForm(settingsmixin.SMainWindow): else: sqlExecute('''UPDATE inbox SET folder='trash' WHERE msgid=?''', inventoryHashToTrash) if tableWidget.item(currentRow, 0).font().bold(): - unread = True + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), folder, self.getCurrentTreeWidget(), -1) + if folder != "trash" and not shifted: + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), "trash", self.getCurrentTreeWidget(), 1) + self.getCurrentMessageTextedit().setText("") tableWidget.removeRow(currentRow) self.statusBar().showMessage(_translate( @@ -3179,8 +3207,6 @@ class MyForm(settingsmixin.SMainWindow): tableWidget.selectRow(currentRow) else: tableWidget.selectRow(currentRow - 1) - if unread: - self.propagateUnreadCount(self.getCurrentAccount(), None, self.getCurrentTreeWidget(), 0) def on_action_TrashUndelete(self): tableWidget = self.getCurrentMessagelist() @@ -3194,7 +3220,8 @@ class MyForm(settingsmixin.SMainWindow): currentRow, 3).data(Qt.UserRole).toPyObject()) sqlExecute('''UPDATE inbox SET folder='inbox' WHERE msgid=?''', inventoryHashToTrash) if tableWidget.item(currentRow, 0).font().bold(): - unread = True + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), "inbox", self.getCurrentTreeWidget(), 1) + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), "trash", self.getCurrentTreeWidget(), -1) self.getCurrentMessageTextedit().setText("") tableWidget.removeRow(currentRow) self.statusBar().showMessage(_translate( @@ -3203,8 +3230,6 @@ class MyForm(settingsmixin.SMainWindow): tableWidget.selectRow(currentRow) else: tableWidget.selectRow(currentRow - 1) - if unread: - self.propagateUnreadCount(self.getCurrentAccount(), None, self.getCurrentTreeWidget(), 0) def on_action_InboxSaveMessageAs(self): tableWidget = self.getCurrentMessagelist() @@ -3255,7 +3280,7 @@ class MyForm(settingsmixin.SMainWindow): else: sqlExecute('''UPDATE sent SET folder='trash' WHERE ackdata=?''', ackdataToTrash) if tableWidget.item(currentRow, 0).font().bold(): - unread = True + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), folder, self.getCurrentTreeWidget(), -1) self.getCurrentMessageTextedit().setPlainText("") tableWidget.removeRow(currentRow) self.statusBar().showMessage(_translate( @@ -3264,8 +3289,6 @@ class MyForm(settingsmixin.SMainWindow): self.ui.tableWidgetInbox.selectRow(currentRow) else: self.ui.tableWidgetInbox.selectRow(currentRow - 1) - if unread: - self.propagateUnreadCount(self.getCurrentAccount(), None, self.getCurrentTreeWidget(), 0) def on_action_ForceSend(self): currentRow = self.ui.tableWidgetInbox.currentRow() @@ -3630,7 +3653,7 @@ class MyForm(settingsmixin.SMainWindow): return currentItem return False - def getCurrentAccount(self, treeWidget = None): + def getCurrentAccount(self, treeWidget = None, force = None): currentItem = self.getCurrentItem(treeWidget) if currentItem: account = currentItem.address @@ -3895,7 +3918,10 @@ class MyForm(settingsmixin.SMainWindow): if messagelist: account = self.getCurrentAccount() folder = self.getCurrentFolder() - self.loadMessagelist(messagelist, account, folder) + if folder == "new": + self.loadMessagelist(messagelist, account, None, unreadOnly = True) + else: + self.loadMessagelist(messagelist, account, folder) def treeWidgetItemChanged(self, item, column): # only for manual edits. automatic edits (setText) are ignored @@ -3977,7 +4003,7 @@ class MyForm(settingsmixin.SMainWindow): tableWidget.item(currentRow, 1).setTextColor(AccountColor(str(tableWidget.item(currentRow, 1).data(Qt.UserRole).toPyObject())).accountColor()) tableWidget.item(currentRow, 2).setFont(font) tableWidget.item(currentRow, 3).setFont(font) - self.propagateUnreadCount(self.getCurrentAccount(), folder, self.getCurrentTreeWidget(), -1) + self.propagateUnreadCount(str(tableWidget.item(currentRow, 1 if tableWidget == self.ui.tableWidgetInboxSubscriptions else 0).data(Qt.UserRole).toPyObject()), folder, self.getCurrentTreeWidget(), -1) else: data = self.getCurrentMessageId() diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 9b01b9c3..03477218 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -39,7 +39,10 @@ class AccountMixin (object): return brush def setAddress(self, address): - self.address = str(address) + if address is None: + self.address = None + else: + self.address = str(address) self.updateText() def setUnreadCount(self, cnt): @@ -71,7 +74,7 @@ class AccountMixin (object): class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): - folderWeight = {"inbox": 1, "sent": 2, "trash": 3} + folderWeight = {"inbox": 1, "new": 2, "sent": 3, "trash": 4} def __init__(self, parent, pos = 0, address = "", folderName = "", unreadCount = 0): super(QtGui.QTreeWidgetItem, self).__init__() self.initialised = False @@ -110,11 +113,11 @@ class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): if self.folderName in self.folderWeight: x = self.folderWeight[self.folderName] else: - x = 4 + x = 99 if other.folderName in self.folderWeight: y = self.folderWeight[other.folderName] else: - y = 4 + y = 99 reverse = False if self.treeWidget().header().sortIndicatorOrder() == QtCore.Qt.DescendingOrder: reverse = True @@ -141,12 +144,12 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): def _getLabel(self): if self.address is None: - label = QtGui.QApplication.translate("MainWindow", "All accounts") + return unicode(str(QtGui.QApplication.translate("MainWindow", "All accounts")), 'utf-8') else: try: return unicode(shared.config.get(self.address, 'label'), 'utf-8)') except: - return self.address + return unicode(self.address, 'utf-8') def _getAddressBracket(self, unreadCount = False): ret = ""