From b4fa5d4abf3355de58ffc9f528c49629acc6a53b Mon Sep 17 00:00:00 2001 From: mailchuck Date: Sat, 3 Oct 2015 12:12:18 +0200 Subject: [PATCH] Gateway update and sort fix - shows gateway parser results more accurately - gateway class assigned dynamically - inbox sort order is aware of what you click on and defaults to ascending --- src/bitmessageqt/__init__.py | 228 +++++++++++---------------------- src/bitmessageqt/account.py | 46 +++++-- src/bitmessageqt/foldertree.py | 15 ++- 3 files changed, 123 insertions(+), 166 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 187b0192..9507ea6b 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -447,7 +447,9 @@ class MyForm(QtGui.QMainWindow): elif tab == 'chan': treeWidget = self.ui.treeWidgetChans - #treeWidget.clear() + # sort ascending when creating + if treeWidget.topLevelItemCount() == 0: + treeWidget.header().setSortIndicator(0, Qt.AscendingOrder) # init dictionary db = {} @@ -860,6 +862,10 @@ class MyForm(QtGui.QMainWindow): else: where = "toaddress || fromaddress || subject || message" + tableWidget.setColumnHidden(0, False) + tableWidget.setColumnHidden(1, True) + tableWidget.setSortingEnabled(False) + sqlStatement = ''' SELECT toaddress, fromaddress, subject, status, ackdata, lastactiontime FROM sent WHERE fromaddress=? AND folder="sent" AND %s LIKE ? @@ -868,60 +874,34 @@ class MyForm(QtGui.QMainWindow): while tableWidget.rowCount() > 0: tableWidget.removeRow(0) - + acct = None queryreturn = sqlQuery(sqlStatement, account, what) for row in queryreturn: toAddress, fromAddress, subject, status, ackdata, lastactiontime = row subject = shared.fixPotentiallyInvalidUTF8Data(subject) - - if shared.config.has_section(fromAddress): - fromLabel = shared.config.get(fromAddress, 'label') - else: - fromLabel = fromAddress - - toLabel = '' - queryreturn = sqlQuery( - '''select label from addressbook where address=?''', toAddress) - if queryreturn != []: - for row in queryreturn: - toLabel, = row - if toLabel == '': - # It might be a broadcast message. We should check for that - # label. - queryreturn = sqlQuery( - '''select label from subscriptions where address=?''', toAddress) - - if queryreturn != []: - for row in queryreturn: - toLabel, = row - - if toLabel == '': - if shared.config.has_section(toAddress): - toLabel = shared.config.get(toAddress, 'label') - if toLabel == '': - toLabel = toAddress + if acct is None: + acct = accountClass(fromAddress) + acct.parseMessage(toAddress, fromAddress, subject, "") tableWidget.insertRow(0) - toAddressItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8')) - toAddressItem.setToolTip(unicode(toLabel, 'utf-8')) + toAddressItem = QtGui.QTableWidgetItem(unicode(acct.toLabel, 'utf-8')) + toAddressItem.setToolTip(unicode(acct.toLabel, 'utf-8')) toAddressItem.setIcon(avatarize(toAddress)) toAddressItem.setData(Qt.UserRole, str(toAddress)) toAddressItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) tableWidget.setItem(0, 0, toAddressItem) - if fromLabel == '': - fromLabel = fromAddress - fromAddressItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8')) - fromAddressItem.setToolTip(unicode(fromLabel, 'utf-8')) + fromAddressItem = QtGui.QTableWidgetItem(unicode(acct.fromLabel, 'utf-8')) + fromAddressItem.setToolTip(unicode(acct.fromLabel, 'utf-8')) fromAddressItem.setIcon(avatarize(fromAddress)) fromAddressItem.setData(Qt.UserRole, str(fromAddress)) fromAddressItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) tableWidget.setItem(0, 1, fromAddressItem) - subjectItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8')) - subjectItem.setToolTip(unicode(subject, 'utf-8')) + subjectItem = QtGui.QTableWidgetItem(unicode(acct.subject, 'utf-8')) + subjectItem.setToolTip(unicode(acct.subject, 'utf-8')) subjectItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) tableWidget.setItem(0, 2, subjectItem) @@ -972,7 +952,9 @@ class MyForm(QtGui.QMainWindow): newItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) tableWidget.setItem(0, 3, newItem) - tableWidget.sortItems(3, Qt.DescendingOrder) + + tableWidget.setSortingEnabled(False) + tableWidget.horizontalHeader().setSortIndicator(3, Qt.DescendingOrder) tableWidget.keyPressEvent = self.tableWidgetInboxKeyPressEvent # Load messages from database file @@ -993,62 +975,43 @@ class MyForm(QtGui.QMainWindow): else: where = "toaddress || fromaddress || subject || message" - sqlStatement = ''' - SELECT msgid, toaddress, fromaddress, subject, received, read - FROM inbox WHERE toaddress=? AND folder=? AND %s LIKE ? - ORDER BY received - ''' % (where) + if folder != False: + sqlStatement = ''' + SELECT folder, msgid, toaddress, fromaddress, subject, received, read + FROM inbox WHERE toaddress=? 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 toaddress=? AND folder != "trash" AND %s LIKE ? + ORDER BY received + ''' % (where) + queryreturn = sqlQuery(sqlStatement, account, what) while tableWidget.rowCount() > 0: tableWidget.removeRow(0) + tableWidget.setColumnHidden(0, True) + tableWidget.setColumnHidden(1, False) + tableWidget.setSortingEnabled(False) + font = QFont() font.setBold(True) - queryreturn = sqlQuery(sqlStatement, account, folder, what) acct = None for row in queryreturn: - msgid, toAddress, fromAddress, subject, received, read = row + msgfolder, msgid, toAddress, fromAddress, subject, received, read = row if acct is None: acct = accountClass(toAddress) subject = shared.fixPotentiallyInvalidUTF8Data(subject) acct.parseMessage(toAddress, fromAddress, subject, "") - try: - if toAddress == self.str_broadcast_subscribers: - toLabel = self.str_broadcast_subscribers - else: - toLabel = shared.config.get(toAddress, 'label') - except: - toLabel = '' - if toLabel == '': - toLabel = toAddress - - fromLabel = '' - if type(acct) == MailchuckAccount: - fromLabel = acct.fromAddress - if shared.config.has_section(fromAddress): - fromLabel = shared.config.get(fromAddress, 'label') - - if fromLabel == '': # If the fromAddress isn't one of our addresses and isn't a chan - queryreturn = sqlQuery( - '''select label from addressbook where address=?''', fromAddress) - if queryreturn != []: - for row in queryreturn: - fromLabel, = row - - if fromLabel == '': # If this address wasn't in our address book... - queryreturn = sqlQuery( - '''select label from subscriptions where address=?''', fromAddress) - if queryreturn != []: - for row in queryreturn: - fromLabel, = row - if fromLabel == '': - fromLabel = fromAddress # message row tableWidget.insertRow(0) # to - to_item = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8')) - to_item.setToolTip(unicode(toLabel, 'utf-8')) + to_item = QtGui.QTableWidgetItem(unicode(acct.toLabel, 'utf-8')) + to_item.setToolTip(unicode(acct.toLabel, 'utf-8')) to_item.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) if not read: @@ -1061,8 +1024,8 @@ class MyForm(QtGui.QMainWindow): to_item.setIcon(avatarize(toAddress)) tableWidget.setItem(0, 0, to_item) # from - from_item = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8')) - from_item.setToolTip(unicode(fromLabel, 'utf-8')) + from_item = QtGui.QTableWidgetItem(unicode(acct.fromLabel, 'utf-8')) + from_item.setToolTip(unicode(acct.fromLabel, 'utf-8')) from_item.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) if not read: @@ -1091,7 +1054,8 @@ class MyForm(QtGui.QMainWindow): time_item.setFont(font) tableWidget.setItem(0, 3, time_item) - tableWidget.sortItems(3, Qt.DescendingOrder) + tableWidget.horizontalHeader().setSortIndicator(3, Qt.DescendingOrder) + tableWidget.setSortingEnabled(True) tableWidget.keyPressEvent = self.tableWidgetInboxKeyPressEvent # create application indicator @@ -1761,8 +1725,8 @@ class MyForm(QtGui.QMainWindow): def changedInboxUnread(self, row = None): self.drawTrayIcon(self.currentTrayIconFileName, self.findInboxUnreadCount()) self.rerenderTabTreeMessages() - if not row is None: - row[1], row[6] +# if not row is None: +# row[1], row[6] if self.ui.tabWidget.currentIndex() == 2: self.rerenderTabTreeSubscriptions() elif self.ui.tabWidget.currentIndex() == 3: @@ -2216,35 +2180,23 @@ more work your computer must do to send the message. A Time-To-Live of four or f return subject = shared.fixPotentiallyInvalidUTF8Data(subject) message = shared.fixPotentiallyInvalidUTF8Data(message) - try: - fromLabel = shared.config.get(fromAddress, 'label') - except: - fromLabel = '' - if fromLabel == '': - fromLabel = fromAddress + acct = accountClass(fromAddress) + acct.parseMessage(toAddress, fromAddress, subject, message) self.ui.tableWidgetInbox.setSortingEnabled(False) self.ui.tableWidgetInbox.insertRow(0) - if toLabel == '': - newItem = QtGui.QTableWidgetItem(unicode(toAddress, 'utf-8')) - newItem.setToolTip(unicode(toAddress, 'utf-8')) - else: - newItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8')) - newItem.setToolTip(unicode(toLabel, 'utf-8')) + newItem = QtGui.QTableWidgetItem(unicode(acct.toLabel, 'utf-8')) + newItem.setToolTip(unicode(acct.toLabel, 'utf-8')) newItem.setData(Qt.UserRole, str(toAddress)) newItem.setIcon(avatarize(toAddress)) self.ui.tableWidgetInbox.setItem(0, 0, newItem) - if fromLabel == '': - newItem = QtGui.QTableWidgetItem(unicode(fromAddress, 'utf-8')) - newItem.setToolTip(unicode(fromAddress, 'utf-8')) - else: - newItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8')) - newItem.setToolTip(unicode(fromLabel, 'utf-8')) + newItem = QtGui.QTableWidgetItem(unicode(acct.fromLabel, 'utf-8')) + newItem.setToolTip(unicode(acct.fromLabel, 'utf-8')) newItem.setData(Qt.UserRole, str(fromAddress)) newItem.setIcon(avatarize(fromAddress)) self.ui.tableWidgetInbox.setItem(0, 1, newItem) - newItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8)')) - newItem.setToolTip(unicode(subject, 'utf-8)')) + newItem = QtGui.QTableWidgetItem(unicode(acct.subject, 'utf-8)')) + newItem.setToolTip(unicode(acct.subject, 'utf-8)')) #newItem.setData(Qt.UserRole, unicode(message, 'utf-8)')) # No longer hold the message in the table; we'll use a SQL query to display it as needed. self.ui.tableWidgetInbox.setItem(0, 2, newItem) # newItem = QtGui.QTableWidgetItem('Doing work necessary to send @@ -2259,40 +2211,17 @@ more work your computer must do to send the message. A Time-To-Live of four or f self.ui.tableWidgetInbox.setSortingEnabled(True) def displayNewInboxMessage(self, inventoryHash, toAddress, fromAddress, subject, message): - if self.getCurrentFolder() != "inbox" or self.getCurrentAccount() != toAddress: + if (self.getCurrentFolder() != "inbox" and self.getCurrentFolder() != False) or self.getCurrentAccount() != toAddress: return subject = shared.fixPotentiallyInvalidUTF8Data(subject) - fromLabel = '' - queryreturn = sqlQuery( - '''select label from addressbook where address=?''', fromAddress) - if queryreturn != []: - for row in queryreturn: - fromLabel, = row - else: - # There might be a label in the subscriptions table - queryreturn = sqlQuery( - '''select label from subscriptions where address=?''', fromAddress) - if queryreturn != []: - for row in queryreturn: - fromLabel, = row - - try: - if toAddress == self.str_broadcast_subscribers: - toLabel = self.str_broadcast_subscribers - else: - toLabel = shared.config.get(toAddress, 'label') - except: - toLabel = '' - if toLabel == '': - toLabel = toAddress + acct = accountClass(toAddress) + acct.parseMessage(toAddress, fromAddress, subject, message) font = QFont() font.setBold(True) self.ui.tableWidgetInbox.setSortingEnabled(False) - account = accountClass(toAddress) - account.parseMessage(toAddress, fromAddress, subject, message) - newItem = QtGui.QTableWidgetItem(unicode(toLabel, 'utf-8')) - newItem.setToolTip(unicode(toLabel, 'utf-8')) + newItem = QtGui.QTableWidgetItem(unicode(acct.toLabel, 'utf-8')) + newItem.setToolTip(unicode(acct.toLabel, 'utf-8')) newItem.setFont(font) newItem.setData(Qt.UserRole, str(toAddress)) if shared.safeConfigGetBoolean(str(toAddress), 'mailinglist'): @@ -2303,27 +2232,16 @@ more work your computer must do to send the message. A Time-To-Live of four or f newItem.setIcon(avatarize(toAddress)) self.ui.tableWidgetInbox.setItem(0, 0, newItem) - if type(account) is MailchuckAccount: - newItem = QtGui.QTableWidgetItem(unicode(account.fromAddress, 'utf-8')) - newItem.setToolTip(unicode(account.fromAddress, 'utf-8')) - if shared.config.getboolean('bitmessagesettings', 'showtraynotifications'): - self.notifierShow(unicode(_translate("MainWindow",'New Message').toUtf8(),'utf-8'), unicode(_translate("MainWindow",'From ').toUtf8(),'utf-8') + unicode(account.fromAddress, 'utf-8'), self.SOUND_UNKNOWN, None) - elif fromLabel == '': - newItem = QtGui.QTableWidgetItem(unicode(fromAddress, 'utf-8')) - newItem.setToolTip(unicode(fromAddress, 'utf-8')) - if shared.config.getboolean('bitmessagesettings', 'showtraynotifications'): - self.notifierShow(unicode(_translate("MainWindow",'New Message').toUtf8(),'utf-8'), unicode(_translate("MainWindow",'From ').toUtf8(),'utf-8') + unicode(fromAddress, 'utf-8'), self.SOUND_UNKNOWN, None) - else: - newItem = QtGui.QTableWidgetItem(unicode(fromLabel, 'utf-8')) - newItem.setToolTip(unicode(unicode(fromLabel, 'utf-8'))) - if shared.config.getboolean('bitmessagesettings', 'showtraynotifications'): - self.notifierShow(unicode(_translate("MainWindow",'New Message').toUtf8(),'utf-8'), unicode(_translate("MainWindow",'From ').toUtf8(),'utf-8') + unicode(fromLabel, 'utf-8'), self.SOUND_KNOWN, unicode(fromLabel, 'utf-8')) + newItem = QtGui.QTableWidgetItem(unicode(acct.fromLabel, 'utf-8')) + newItem.setToolTip(unicode(acct.fromLabel, 'utf-8')) + 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) newItem.setData(Qt.UserRole, str(fromAddress)) newItem.setFont(font) newItem.setIcon(avatarize(fromAddress)) self.ui.tableWidgetInbox.setItem(0, 1, newItem) - newItem = QtGui.QTableWidgetItem(unicode(subject, 'utf-8)')) - newItem.setToolTip(unicode(account.subject, 'utf-8)')) + newItem = QtGui.QTableWidgetItem(unicode(acct.subject, 'utf-8)')) + newItem.setToolTip(unicode(acct.subject, 'utf-8)')) #newItem.setData(Qt.UserRole, unicode(message, 'utf-8)')) # No longer hold the message in the table; we'll use a SQL query to display it as needed. newItem.setFont(font) self.ui.tableWidgetInbox.setItem(0, 2, newItem) @@ -2334,7 +2252,7 @@ more work your computer must do to send the message. A Time-To-Live of four or f newItem.setFont(font) self.ui.tableWidgetInbox.setItem(0, 3, newItem) self.ui.tableWidgetInbox.setSortingEnabled(True) - self.ubuntuMessagingMenuUpdate(True, newItem, toLabel) + self.ubuntuMessagingMenuUpdate(True, newItem, self.toLabel) def click_pushButtonAddAddressBook(self): self.AddAddressDialogInstance = AddAddressDialog(self) @@ -2955,11 +2873,14 @@ more work your computer must do to send the message. A Time-To-Live of four or f tableWidget = self.getCurrentMessagelist() if not tableWidget: return + unread = False while tableWidget.selectedIndexes() != []: currentRow = tableWidget.selectedIndexes()[0].row() inventoryHashToTrash = str(tableWidget.item( currentRow, 3).data(Qt.UserRole).toPyObject()) sqlExecute('''UPDATE inbox SET folder='trash' WHERE msgid=?''', inventoryHashToTrash) + if tableWidget.item(currentRow, 0).font().bold(): + unread = True self.ui.textEditInboxMessage.setText("") tableWidget.removeRow(currentRow) self.statusBar().showMessage(_translate( @@ -2968,6 +2889,8 @@ more work your computer must do to send the message. A Time-To-Live of four or f tableWidget.selectRow(currentRow) else: tableWidget.selectRow(currentRow - 1) + if unread: + changedInboxUnread() def on_action_InboxSaveMessageAs(self): tableWidget = self.getCurrentMessagelist() @@ -3303,9 +3226,8 @@ more work your computer must do to send the message. A Time-To-Live of four or f treeWidget = self.ui.treeWidgetYourIdentities if treeWidget: currentItem = treeWidget.currentItem() - if currentItem: - account = currentItem.folderName - return account + if currentItem and hasattr(currentItem, 'folderName'): + return currentItem.folderName else: # TODO need debug msg? return False @@ -3518,7 +3440,7 @@ more work your computer must do to send the message. A Time-To-Live of four or f refresh = False for row in queryreturn: message, read = row - if folder == 'inbox' and read == 0: + if folder != 'sent' and read == 0: markread = sqlQuery( '''UPDATE inbox SET read = 1 WHERE msgid = ?''', msgid) refresh = True diff --git a/src/bitmessageqt/account.py b/src/bitmessageqt/account.py index b8171bc6..0ff0fa23 100644 --- a/src/bitmessageqt/account.py +++ b/src/bitmessageqt/account.py @@ -3,30 +3,58 @@ from PyQt4 import QtCore, QtGui import shared import re import sys +import inspect +from helper_sql import * def accountClass(address): if not shared.config.has_section(address): return None try: gateway = shared.config.get(address, "gateway") - if (gateway == "mailchuck"): - return MailchuckAccount(address) - else: - return GatewayAccount(address) + for name, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass): +# obj = g(address) + if issubclass(cls, GatewayAccount) and cls.gatewayName == gateway: + return cls(address) + # general gateway + return GatewayAccount(address) except: - return BMAccount(address) + pass + # no gateway + return BMAccount(address) class BMAccount(object): - def __init__(self, address): + def __init__(self, address = None): self.address = address + def getLabel(self, address = None): + if address is None: + address = self.address + label = address + if shared.config.has_section(address): + label = shared.config.get(address, 'label') + queryreturn = sqlQuery( + '''select label from addressbook where address=?''', address) + if queryreturn != []: + for row in queryreturn: + label, = row + else: + queryreturn = sqlQuery( + '''select label from subscriptions where address=?''', address) + if queryreturn != []: + for row in queryreturn: + label, = row + return label + def parseMessage(self, toAddress, fromAddress, subject, message): self.toAddress = toAddress self.fromAddress = fromAddress self.subject = subject self.message = message + self.fromLabel = self.getLabel(fromAddress) + self.toLabel = self.getLabel(toAddress) class GatewayAccount(BMAccount): + gatewayName = None def __init__(self, address): super(BMAccount, self).__init__(address) @@ -34,6 +62,8 @@ class GatewayAccount(BMAccount): super(BMAccount, self).parseMessage(toAddress, fromAddress, subject, message) class MailchuckAccount(GatewayAccount): + # set "gateway" in keys.dat to this + gatewayName = "mailchuck" registrationAddress = "BM-2cVYYrhaY5Gbi3KqrX9Eae2NRNrkfrhCSA" unregistrationAddress = "BM-2cVMAHTRjZHCTPMue75XBK5Tco175DtJ9J" relayAddress = "BM-2cWim8aZwUNqxzjMxstnUMtVEUQJeezstf" @@ -53,11 +83,11 @@ class MailchuckAccount(GatewayAccount): if not matches.group(3) is None: self.subject += matches.group(3) if not matches.group(2) is None: - self.fromAddress = matches.group(2) + self.fromLabel = matches.group(2) if toAddress == self.relayAddress: matches = self.regExpOutgoing.search(subject) if not matches is None: if not matches.group(2) is None: self.subject = matches.group(2) if not matches.group(1) is None: - self.toAddress = matches.group(1) \ No newline at end of file + self.toLabel = matches.group(1) \ No newline at end of file diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 78524187..41824b91 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -49,11 +49,13 @@ class Ui_FolderWidget(QtGui.QTreeWidgetItem): y = self.folderWeight[other.folderName] else: y = 4 - + reverse = False + if self.treeWidget().header().sortIndicatorOrder() == QtCore.Qt.DescendingOrder: + reverse = True if x == y: - return self.folderName > other.folderName + return self.folderName < other.folderName else: - return x > y + return (x >= y if reverse else x < y) return super(QtGui.QTreeWidgetItem, self).__lt__(other) @@ -117,6 +119,9 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem): # label (or address) alphabetically, disabled at the end def __lt__(self, other): if (isinstance(other, Ui_AddressWidget)): + reverse = False + if self.treeWidget().header().sortIndicatorOrder() == QtCore.Qt.DescendingOrder: + reverse = True if shared.config.getboolean(self.address, 'enabled') == shared.config.getboolean(other.address, 'enabled'): if shared.config.get(self.address, 'label'): x = shared.config.get(self.address, 'label').decode('utf-8').lower() @@ -126,8 +131,8 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem): y = shared.config.get(other.address, 'label').decode('utf-8').lower() else: y = other.address.decode('utf-8').lower() - return y < x + return x < y # else: - return (False if shared.config.getboolean(self.address, 'enabled') else True) + return (not reverse if shared.config.getboolean(self.address, 'enabled') else reverse) return super(QtGui.QTreeWidgetItem, self).__lt__(other)