From 90eca36b5da518c7cdd15b91291d27463887516b Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Tue, 6 Mar 2018 13:15:41 +0200 Subject: [PATCH 1/2] Module foldertree: simplified a bit and did flake8 --- src/bitmessageqt/foldertree.py | 239 +++++++++++++++++---------------- 1 file changed, 124 insertions(+), 115 deletions(-) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 22412a92..3ebdc580 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -1,10 +1,9 @@ from PyQt4 import QtCore, QtGui -from string import find, rfind, rstrip, lstrip from tr import _translate from bmconfigparser import BMConfigParser from helper_sql import * -from utils import * +from utils import avatarize from settingsmixin import SettingsMixin # for pylupdate @@ -22,7 +21,7 @@ class AccountMixin(object): SUBSCRIPTION = 4 BROADCAST = 5 - def accountColor (self): + def accountColor(self): if not self.isEnabled: return QtGui.QColor(128, 128, 128) elif self.type == self.CHAN: @@ -31,18 +30,18 @@ class AccountMixin(object): return QtGui.QColor(137, 04, 177) else: return QtGui.QApplication.palette().text().color() - - def folderColor (self): + + def folderColor(self): if not self.parent().isEnabled: return QtGui.QColor(128, 128, 128) else: return QtGui.QApplication.palette().text().color() - + def accountBrush(self): brush = QtGui.QBrush(self.accountColor()) brush.setStyle(QtCore.Qt.NoBrush) return brush - + def folderBrush(self): brush = QtGui.QBrush(self.folderColor()) brush.setStyle(QtCore.Qt.NoBrush) @@ -53,18 +52,23 @@ class AccountMixin(object): self.address = None else: self.address = str(address) - + def setUnreadCount(self, cnt): - if hasattr(self, "unreadCount") and self.unreadCount == int(cnt): - return + try: + if self.unreadCount == int(cnt): + return + except AttributeError: + pass self.unreadCount = int(cnt) if isinstance(self, QtGui.QTreeWidgetItem): self.emitDataChanged() def setEnabled(self, enabled): self.isEnabled = enabled - if hasattr(self, "setExpanded"): + try: self.setExpanded(enabled) + except AttributeError: + pass if isinstance(self, Ui_AddressWidget): for i in range(self.childCount()): if isinstance(self.child(i), Ui_FolderWidget): @@ -86,13 +90,16 @@ class AccountMixin(object): self.type = AccountMixin.SUBSCRIPTION else: self.type = self.NORMAL - + def defaultLabel(self): queryreturn = None retval = None - if self.type in (AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.MAILINGLIST): + if self.type in ( + AccountMixin.NORMAL, + AccountMixin.CHAN, AccountMixin.MAILINGLIST): try: - retval = unicode(BMConfigParser().get(self.address, 'label'), 'utf-8') + retval = unicode( + BMConfigParser().get(self.address, 'label'), 'utf-8') except Exception as e: queryreturn = sqlQuery( '''select label from addressbook where address=?''', self.address) @@ -107,15 +114,15 @@ class AccountMixin(object): elif self.address is None or self.type == AccountMixin.ALL: return unicode( str(_translate("MainWindow", "All accounts")), 'utf-8') - if retval is None: - return unicode(self.address, 'utf-8') - else: - return retval + + return retval or unicode(self.address, 'utf-8') class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): folderWeight = {"inbox": 1, "new": 2, "sent": 3, "trash": 4} - def __init__(self, parent, pos = 0, address = "", folderName = "", unreadCount = 0): + + def __init__( + self, parent, pos=0, address="", folderName="", unreadCount=0): super(QtGui.QTreeWidgetItem, self).__init__() self.setAddress(address) self.setFolderName(folderName) @@ -144,7 +151,7 @@ class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): # inbox, sent, thrash first, rest alphabetically def __lt__(self, other): - if (isinstance(other, Ui_FolderWidget)): + if isinstance(other, Ui_FolderWidget): if self.folderName in self.folderWeight: x = self.folderWeight[self.folderName] else: @@ -153,19 +160,19 @@ class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): y = self.folderWeight[other.folderName] else: y = 99 - reverse = False - if self.treeWidget().header().sortIndicatorOrder() == QtCore.Qt.DescendingOrder: - reverse = True + reverse = QtCore.Qt.DescendingOrder == \ + self.treeWidget().header().sortIndicatorOrder() if x == y: return self.folderName < other.folderName else: return (x >= y if reverse else x < y) return super(QtGui.QTreeWidgetItem, self).__lt__(other) - + class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): - def __init__(self, parent, pos = 0, address = None, unreadCount = 0, enabled = True): + def __init__( + self, parent, pos=0, address=None, unreadCount=0, enabled=True): super(QtGui.QTreeWidgetItem, self).__init__() parent.insertTopLevelItem(pos, self) # only set default when creating @@ -187,14 +194,14 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): except: return unicode(self.address, 'utf-8') - def _getAddressBracket(self, unreadCount = False): + def _getAddressBracket(self, unreadCount=False): ret = "" if unreadCount: ret += " (" + str(self.unreadCount) + ")" if self.address is not None: ret += " (" + self.address + ")" return ret - + def data(self, column, role): if column == 0: if role == QtCore.Qt.DisplayRole: @@ -204,7 +211,7 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): return self._getLabel() + self._getAddressBracket(False) elif role == QtCore.Qt.EditRole: return self._getLabel() - elif role == QtCore.Qt.ToolTipRole: + elif role == QtCore.Qt.ToolTipRole: return self._getLabel() + self._getAddressBracket(False) elif role == QtCore.Qt.DecorationRole: if self.address is None: @@ -218,23 +225,25 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): elif role == QtCore.Qt.ForegroundRole: return self.accountBrush() return super(Ui_AddressWidget, self).data(column, role) - + def setData(self, column, role, value): - if role == QtCore.Qt.EditRole and self.type != AccountMixin.SUBSCRIPTION: - if isinstance(value, QtCore.QVariant): - BMConfigParser().set(str(self.address), 'label', str(value.toString().toUtf8())) - else: - BMConfigParser().set(str(self.address), 'label', str(value)) + if role == QtCore.Qt.EditRole \ + and self.type != AccountMixin.SUBSCRIPTION: + BMConfigParser().set( + str(self.address), 'label', + str(value).toString().toUtf8() + if isinstance(value, QtCore.QVariant) else str(value) + ) BMConfigParser().save() return super(Ui_AddressWidget, self).setData(column, role, value) - + def setAddress(self, address): super(Ui_AddressWidget, self).setAddress(address) self.setData(0, QtCore.Qt.UserRole, self.address) - + def setExpanded(self, expand): super(Ui_AddressWidget, self).setExpanded(expand) - + def _getSortRank(self): ret = self.type if not self.isEnabled: @@ -243,21 +252,25 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): # 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 isinstance(other, Ui_AddressWidget): + reverse = QtCore.Qt.DescendingOrder == \ + self.treeWidget().header().sortIndicatorOrder() if self._getSortRank() == other._getSortRank(): x = self._getLabel().lower() y = other._getLabel().lower() return x < y - return (not reverse if self._getSortRank() < other._getSortRank() else reverse) + return ( + not reverse + if self._getSortRank() < other._getSortRank() else reverse + ) return super(QtGui.QTreeWidgetItem, self).__lt__(other) - + class Ui_SubscriptionWidget(Ui_AddressWidget, AccountMixin): - def __init__(self, parent, pos = 0, address = "", unreadCount = 0, label = "", enabled = True): + def __init__( + self, parent, pos=0, address="", unreadCount=0, label="", + enabled=True): super(QtGui.QTreeWidgetItem, self).__init__() parent.insertTopLevelItem(pos, self) # only set default when creating @@ -266,7 +279,7 @@ class Ui_SubscriptionWidget(Ui_AddressWidget, AccountMixin): self.setEnabled(enabled) self.setType() self.setUnreadCount(unreadCount) - + def _getLabel(self): queryreturn = sqlQuery( '''select label from subscriptions where address=?''', self.address) @@ -275,16 +288,16 @@ class Ui_SubscriptionWidget(Ui_AddressWidget, AccountMixin): retval, = row return unicode(retval, 'utf-8', 'ignore') return unicode(self.address, 'utf-8') - + def setType(self): - super(Ui_SubscriptionWidget, self).setType() # sets it editable - self.type = AccountMixin.SUBSCRIPTION # overrides type - + super(Ui_SubscriptionWidget, self).setType() # sets it editable + self.type = AccountMixin.SUBSCRIPTION # overrides type + def setData(self, column, role, value): if role == QtCore.Qt.EditRole: - from debug import logger if isinstance(value, QtCore.QVariant): - label = str(value.toString().toUtf8()).decode('utf-8', 'ignore') + label = str( + value.toString().toUtf8()).decode('utf-8', 'ignore') else: label = unicode(value, 'utf-8', 'ignore') sqlExecute( @@ -293,12 +306,10 @@ class Ui_SubscriptionWidget(Ui_AddressWidget, AccountMixin): return super(Ui_SubscriptionWidget, self).setData(column, role, value) -class MessageList_AddressWidget(QtGui.QTableWidgetItem, AccountMixin, SettingsMixin): - def __init__(self, parent, address = None, label = None, unread = False): +class MessageList_AddressWidget( + QtGui.QTableWidgetItem, AccountMixin, SettingsMixin): + def __init__(self, parent, address=None, label=None, unread=False): super(QtGui.QTableWidgetItem, self).__init__() - #parent.insertTopLevelItem(pos, self) - # only set default when creating - #super(QtGui.QTreeWidgetItem, self).setExpanded(BMConfigParser().getboolean(self.address, 'enabled')) self.isEnabled = True self.setAddress(address) self.setLabel(label) @@ -307,13 +318,17 @@ class MessageList_AddressWidget(QtGui.QTableWidgetItem, AccountMixin, SettingsMi self.setType() parent.append(self) - def setLabel(self, label = None): + def setLabel(self, label=None): newLabel = self.address if label is None: queryreturn = None - if self.type in (AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.MAILINGLIST): + if self.type in ( + AccountMixin.NORMAL, + AccountMixin.CHAN, AccountMixin.MAILINGLIST): try: - newLabel = unicode(BMConfigParser().get(self.address, 'label'), 'utf-8', 'ignore') + newLabel = unicode( + BMConfigParser().get(self.address, 'label'), + 'utf-8', 'ignore') except: queryreturn = sqlQuery( '''select label from addressbook where address=?''', self.address) @@ -326,9 +341,11 @@ class MessageList_AddressWidget(QtGui.QTableWidgetItem, AccountMixin, SettingsMi newLabel = unicode(row[0], 'utf-8', 'ignore') else: newLabel = label - if hasattr(self, 'label') and newLabel == self.label: - return - self.label = newLabel + try: + if self.label == newLabel: + return + except AttributeError: + self.label = newLabel def setUnread(self, unread): self.unread = unread @@ -341,7 +358,8 @@ class MessageList_AddressWidget(QtGui.QTableWidgetItem, AccountMixin, SettingsMi elif role == QtCore.Qt.ToolTipRole: return self.label + " (" + self.address + ")" elif role == QtCore.Qt.DecorationRole: - if BMConfigParser().safeGetBoolean('bitmessagesettings', 'useidenticons'): + if BMConfigParser().safeGetBoolean( + 'bitmessagesettings', 'useidenticons'): if self.address is None: return avatarize(self.label) else: @@ -355,7 +373,7 @@ class MessageList_AddressWidget(QtGui.QTableWidgetItem, AccountMixin, SettingsMi elif role == QtCore.Qt.UserRole: return self.address return super(MessageList_AddressWidget, self).data(role) - + def setData(self, role, value): if role == QtCore.Qt.EditRole: self.setLabel() @@ -363,17 +381,14 @@ class MessageList_AddressWidget(QtGui.QTableWidgetItem, AccountMixin, SettingsMi # label (or address) alphabetically, disabled at the end def __lt__(self, other): - if (isinstance(other, MessageList_AddressWidget)): + if isinstance(other, MessageList_AddressWidget): return self.label.lower() < other.label.lower() return super(QtGui.QTableWidgetItem, self).__lt__(other) class MessageList_SubjectWidget(QtGui.QTableWidgetItem, SettingsMixin): - def __init__(self, parent, subject = None, label = None, unread = False): + def __init__(self, parent, subject=None, label=None, unread=False): super(QtGui.QTableWidgetItem, self).__init__() - #parent.insertTopLevelItem(pos, self) - # only set default when creating - #super(QtGui.QTreeWidgetItem, self).setExpanded(BMConfigParser().getboolean(self.address, 'enabled')) self.setSubject(subject) self.setLabel(label) self.setUnread(unread) @@ -382,7 +397,7 @@ class MessageList_SubjectWidget(QtGui.QTableWidgetItem, SettingsMixin): def setLabel(self, label): self.label = label - + def setSubject(self, subject): self.subject = subject @@ -403,19 +418,16 @@ class MessageList_SubjectWidget(QtGui.QTableWidgetItem, SettingsMixin): elif role == QtCore.Qt.UserRole: return self.subject return super(MessageList_SubjectWidget, self).data(role) - - def setData(self, role, value): - return super(MessageList_SubjectWidget, self).setData(role, value) # label (or address) alphabetically, disabled at the end def __lt__(self, other): - if (isinstance(other, MessageList_SubjectWidget)): + if isinstance(other, MessageList_SubjectWidget): return self.label.lower() < other.label.lower() return super(QtGui.QTableWidgetItem, self).__lt__(other) class Ui_AddressBookWidgetItem(QtGui.QTableWidgetItem, AccountMixin): - def __init__ (self, text, type = AccountMixin.NORMAL): + def __init__(self, text, type=AccountMixin.NORMAL): super(QtGui.QTableWidgetItem, self).__init__(text) self.label = text self.type = type @@ -429,11 +441,9 @@ class Ui_AddressBookWidgetItem(QtGui.QTableWidgetItem, AccountMixin): elif role == QtCore.Qt.ToolTipRole: return self.label + " (" + self.address + ")" elif role == QtCore.Qt.DecorationRole: - if BMConfigParser().safeGetBoolean('bitmessagesettings', 'useidenticons'): - if self.address is None: - return avatarize(self.label) - else: - return avatarize(self.address) + if BMConfigParser().safeGetBoolean( + 'bitmessagesettings', 'useidenticons'): + return avatarize(self.address or self.label) elif role == QtCore.Qt.FontRole: font = QtGui.QFont() return font @@ -449,25 +459,26 @@ class Ui_AddressBookWidgetItem(QtGui.QTableWidgetItem, AccountMixin): self.label = str(value.toString().toUtf8()) else: self.label = str(value) - if self.type in (AccountMixin.NORMAL, AccountMixin.MAILINGLIST, AccountMixin.CHAN): + if self.type in ( + AccountMixin.NORMAL, + AccountMixin.MAILINGLIST, AccountMixin.CHAN): try: - a = BMConfigParser().get(self.address, 'label') + BMConfigParser().get(self.address, 'label') BMConfigParser().set(self.address, 'label', self.label) BMConfigParser().save() except: sqlExecute('''UPDATE addressbook set label=? WHERE address=?''', self.label, self.address) elif self.type == AccountMixin.SUBSCRIPTION: - from debug import logger sqlExecute('''UPDATE subscriptions set label=? WHERE address=?''', self.label, self.address) else: pass - return super(Ui_AddressBookWidgetItem, self).setData(role, value) + return super(Ui_AddressBookWidgetItem, self).setData(role, value) + + def __lt__(self, other): + if isinstance(other, Ui_AddressBookWidgetItem): + reverse = QtCore.Qt.DescendingOrder == \ + self.tableWidget().horizontalHeader().sortIndicatorOrder() - def __lt__ (self, other): - if (isinstance(other, Ui_AddressBookWidgetItem)): - reverse = False - if self.tableWidget().horizontalHeader().sortIndicatorOrder() == QtCore.Qt.DescendingOrder: - reverse = True if self.type == other.type: return self.label.lower() < other.label.lower() else: @@ -476,8 +487,8 @@ class Ui_AddressBookWidgetItem(QtGui.QTableWidgetItem, AccountMixin): class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem): - def __init__ (self, address, label, type): - Ui_AddressBookWidgetItem.__init__(self, label, type) + def __init__(self, address, label, type): + super(Ui_AddressBookWidgetItemLabel, self).__init__(label, type) self.address = address self.label = label @@ -487,8 +498,8 @@ class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem): class Ui_AddressBookWidgetItemAddress(Ui_AddressBookWidgetItem): - def __init__ (self, address, label, type): - Ui_AddressBookWidgetItem.__init__(self, address, type) + def __init__(self, address, label, type): + super(Ui_AddressBookWidgetItemAddress, self).__init__(address, type) self.address = address self.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) @@ -502,26 +513,22 @@ class Ui_AddressBookWidgetItemAddress(Ui_AddressBookWidgetItem): class AddressBookCompleter(QtGui.QCompleter): def __init__(self): - super(QtGui.QCompleter, self).__init__() + super(AddressBookCompleter, self).__init__() self.cursorPos = -1 - + def onCursorPositionChanged(self, oldPos, newPos): if oldPos != self.cursorPos: self.cursorPos = -1 - + def splitPath(self, path): - stringList = [] - text = unicode(path.toUtf8(), encoding="UTF-8") - splitIndex = rfind(text[0:self.widget().cursorPosition()], ";") + 1 - str = text[splitIndex:self.widget().cursorPosition()] - str = rstrip(lstrip(str)) - stringList.append(str) - return stringList - + text = unicode(path.toUtf8(), 'utf-8') + return [text[:self.widget().cursorPosition()].split(';')[-1].strip()] + def pathFromIndex(self, index): - autoString = unicode(index.data(QtCore.Qt.EditRole).toString().toUtf8(), encoding="UTF-8") - text = unicode(self.widget().text().toUtf8(), encoding="UTF-8") - + autoString = unicode( + index.data(QtCore.Qt.EditRole).toString().toUtf8(), 'utf-8') + text = unicode(self.widget().text().toUtf8(), 'utf-8') + # If cursor position was saved, restore it, else save it if self.cursorPos != -1: self.widget().setCursorPosition(self.cursorPos) @@ -530,15 +537,17 @@ class AddressBookCompleter(QtGui.QCompleter): # Get current prosition curIndex = self.widget().cursorPosition() - - # prev_delimiter_index should actually point at final white space AFTER the delimiter + + # prev_delimiter_index should actually point at final white space + # AFTER the delimiter # Get index of last delimiter before current position - prevDelimiterIndex = rfind(text[0:curIndex], ";") + prevDelimiterIndex = text[0:curIndex].rfind(";") while text[prevDelimiterIndex + 1] == " ": prevDelimiterIndex += 1 - - # Get index of first delimiter after current position (or EOL if no delimiter after cursor) - nextDelimiterIndex = find(text, ";", curIndex) + + # Get index of first delimiter after current position + # (or EOL if no delimiter after cursor) + nextDelimiterIndex = text.find(";", curIndex) if nextDelimiterIndex == -1: nextDelimiterIndex = len(text) @@ -546,9 +555,9 @@ class AddressBookCompleter(QtGui.QCompleter): part1 = text[0:prevDelimiterIndex + 1] # Get string value from before auto finished string is selected - pre = text[prevDelimiterIndex + 1:curIndex - 1]; + # pre = text[prevDelimiterIndex + 1:curIndex - 1] # Get part of string that occurs AFTER cursor part2 = text[nextDelimiterIndex:] - return part1 + autoString + part2; + return part1 + autoString + part2 From 6cefaf87e98f74dc85f34e25fb09de60a997274c Mon Sep 17 00:00:00 2001 From: Dmitri Bogomolov <4glitch@gmail.com> Date: Mon, 12 Mar 2018 11:40:50 +0200 Subject: [PATCH 2/2] Module foldertree: changed subclassing order to reuse common code --- src/bitmessageqt/foldertree.py | 290 +++++++++++++++------------------ 1 file changed, 131 insertions(+), 159 deletions(-) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 3ebdc580..f3ac38d8 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -118,35 +118,54 @@ class AccountMixin(object): return retval or unicode(self.address, 'utf-8') -class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): +class BMTreeWidgetItem(QtGui.QTreeWidgetItem, AccountMixin): + """A common abstract class for Tree widget item""" + def __init__(self, parent, pos, address, unreadCount): + super(QtGui.QTreeWidgetItem, self).__init__() + self.setAddress(address) + self.setUnreadCount(unreadCount) + self._setup(parent, pos) + + def _getAddressBracket(self, unreadCount=False): + return (" (" + str(self.unreadCount) + ")") if unreadCount else "" + + def data(self, column, role): + if column == 0: + if role == QtCore.Qt.DisplayRole: + return self._getLabel() + self._getAddressBracket( + self.unreadCount > 0) + elif role == QtCore.Qt.EditRole: + return self._getLabel() + elif role == QtCore.Qt.ToolTipRole: + return self._getLabel() + self._getAddressBracket(False) + elif role == QtCore.Qt.FontRole: + font = QtGui.QFont() + font.setBold(self.unreadCount > 0) + return font + return super(BMTreeWidgetItem, self).data(column, role) + + +class Ui_FolderWidget(BMTreeWidgetItem): 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.setAddress(address) self.setFolderName(folderName) - self.setUnreadCount(unreadCount) + super(Ui_FolderWidget, self).__init__( + parent, pos, address, unreadCount) + + def _setup(self, parent, pos): parent.insertChild(pos, self) + def _getLabel(self): + return _translate("MainWindow", self.folderName) + def setFolderName(self, fname): self.folderName = str(fname) def data(self, column, role): - if column == 0: - if role == QtCore.Qt.DisplayRole: - return _translate("MainWindow", self.folderName) + ( - " (" + str(self.unreadCount) + ")" - if self.unreadCount > 0 else "" - ) - elif role in (QtCore.Qt.EditRole, QtCore.Qt.ToolTipRole): - return _translate("MainWindow", self.folderName) - elif role == QtCore.Qt.FontRole: - font = QtGui.QFont() - font.setBold(self.unreadCount > 0) - return font - elif role == QtCore.Qt.ForegroundRole: - return self.folderBrush() + if column == 0 and role == QtCore.Qt.ForegroundRole: + return self.folderBrush() return super(Ui_FolderWidget, self).data(column, role) # inbox, sent, thrash first, rest alphabetically @@ -170,17 +189,16 @@ class Ui_FolderWidget(QtGui.QTreeWidgetItem, AccountMixin): return super(QtGui.QTreeWidgetItem, self).__lt__(other) -class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): +class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin): def __init__( self, parent, pos=0, address=None, unreadCount=0, enabled=True): - super(QtGui.QTreeWidgetItem, self).__init__() - parent.insertTopLevelItem(pos, self) - # only set default when creating - #super(QtGui.QTreeWidgetItem, self).setExpanded(BMConfigParser().getboolean(self.address, 'enabled')) - self.setAddress(address) + super(Ui_AddressWidget, self).__init__( + parent, pos, address, unreadCount) self.setEnabled(enabled) - self.setUnreadCount(unreadCount) + + def _setup(self, parent, pos): self.setType() + parent.insertTopLevelItem(pos, self) def _getLabel(self): if self.address is None: @@ -195,33 +213,17 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): return unicode(self.address, 'utf-8') def _getAddressBracket(self, unreadCount=False): - ret = "" - if unreadCount: - ret += " (" + str(self.unreadCount) + ")" + ret = "" if self.isExpanded() \ + else super(Ui_AddressWidget, self)._getAddressBracket(unreadCount) if self.address is not None: ret += " (" + self.address + ")" return ret def data(self, column, role): if column == 0: - if role == QtCore.Qt.DisplayRole: - if self.unreadCount > 0 and not self.isExpanded(): - return self._getLabel() + self._getAddressBracket(True) - else: - return self._getLabel() + self._getAddressBracket(False) - elif role == QtCore.Qt.EditRole: - return self._getLabel() - elif role == QtCore.Qt.ToolTipRole: - return self._getLabel() + self._getAddressBracket(False) - elif role == QtCore.Qt.DecorationRole: - if self.address is None: - return avatarize(self._getLabel().encode('utf8')) - else: - return avatarize(self.address) - elif role == QtCore.Qt.FontRole: - font = QtGui.QFont() - font.setBold(self.unreadCount > 0) - return font + if role == QtCore.Qt.DecorationRole: + return avatarize( + self.address or self._getLabel().encode('utf8')) elif role == QtCore.Qt.ForegroundRole: return self.accountBrush() return super(Ui_AddressWidget, self).data(column, role) @@ -241,14 +243,8 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): super(Ui_AddressWidget, self).setAddress(address) self.setData(0, QtCore.Qt.UserRole, self.address) - def setExpanded(self, expand): - super(Ui_AddressWidget, self).setExpanded(expand) - def _getSortRank(self): - ret = self.type - if not self.isEnabled: - ret += 100 - return ret + return self.type if self.isEnabled else (self.type + 100) # label (or address) alphabetically, disabled at the end def __lt__(self, other): @@ -267,18 +263,12 @@ class Ui_AddressWidget(QtGui.QTreeWidgetItem, AccountMixin, SettingsMixin): return super(QtGui.QTreeWidgetItem, self).__lt__(other) -class Ui_SubscriptionWidget(Ui_AddressWidget, AccountMixin): +class Ui_SubscriptionWidget(Ui_AddressWidget): def __init__( self, parent, pos=0, address="", unreadCount=0, label="", enabled=True): - super(QtGui.QTreeWidgetItem, self).__init__() - parent.insertTopLevelItem(pos, self) - # only set default when creating - #super(QtGui.QTreeWidgetItem, self).setExpanded(BMConfigParser().getboolean(self.address, 'enabled')) - self.setAddress(address) - self.setEnabled(enabled) - self.setType() - self.setUnreadCount(unreadCount) + super(Ui_SubscriptionWidget, self).__init__( + parent, pos, address, unreadCount, enabled) def _getLabel(self): queryreturn = sqlQuery( @@ -306,71 +296,88 @@ class Ui_SubscriptionWidget(Ui_AddressWidget, AccountMixin): return super(Ui_SubscriptionWidget, self).setData(column, role, value) -class MessageList_AddressWidget( - QtGui.QTableWidgetItem, AccountMixin, SettingsMixin): - def __init__(self, parent, address=None, label=None, unread=False): +class BMTableWidgetItem(QtGui.QTableWidgetItem, SettingsMixin): + """A common abstract class for Table widget item""" + def __init__(self, parent=None, label=None, unread=False): super(QtGui.QTableWidgetItem, self).__init__() - self.isEnabled = True - self.setAddress(address) self.setLabel(label) self.setUnread(unread) - self.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - self.setType() - parent.append(self) + self._setup() + if parent is not None: + parent.append(self) - def setLabel(self, label=None): - newLabel = self.address - if label is None: - queryreturn = None - if self.type in ( - AccountMixin.NORMAL, - AccountMixin.CHAN, AccountMixin.MAILINGLIST): - try: - newLabel = unicode( - BMConfigParser().get(self.address, 'label'), - 'utf-8', 'ignore') - except: - queryreturn = sqlQuery( - '''select label from addressbook where address=?''', self.address) - elif self.type == AccountMixin.SUBSCRIPTION: - queryreturn = sqlQuery( - '''select label from subscriptions where address=?''', self.address) - if queryreturn is not None: - if queryreturn != []: - for row in queryreturn: - newLabel = unicode(row[0], 'utf-8', 'ignore') - else: - newLabel = label - try: - if self.label == newLabel: - return - except AttributeError: - self.label = newLabel + def setLabel(self, label): + self.label = label def setUnread(self, unread): self.unread = unread def data(self, role): - if role == QtCore.Qt.DisplayRole: + if role in ( + QtCore.Qt.DisplayRole, QtCore.Qt.EditRole, QtCore.Qt.ToolTipRole + ): return self.label - elif role == QtCore.Qt.EditRole: - return self.label - elif role == QtCore.Qt.ToolTipRole: - return self.label + " (" + self.address + ")" - elif role == QtCore.Qt.DecorationRole: - if BMConfigParser().safeGetBoolean( - 'bitmessagesettings', 'useidenticons'): - if self.address is None: - return avatarize(self.label) - else: - return avatarize(self.address) elif role == QtCore.Qt.FontRole: font = QtGui.QFont() font.setBold(self.unread) return font + return super(BMTableWidgetItem, self).data(role) + + +class BMAddressWidget(BMTableWidgetItem, AccountMixin): + """A common class for Table widget item with account""" + def _setup(self): + self.setEnabled(True) + + def data(self, role): + if role == QtCore.Qt.ToolTipRole: + return self.label + " (" + self.address + ")" + elif role == QtCore.Qt.DecorationRole: + if BMConfigParser().safeGetBoolean( + 'bitmessagesettings', 'useidenticons'): + return avatarize(self.address or self.label) elif role == QtCore.Qt.ForegroundRole: return self.accountBrush() - elif role == QtCore.Qt.UserRole: + return super(BMAddressWidget, self).data(role) + + +class MessageList_AddressWidget(BMAddressWidget): + def __init__(self, parent, address=None, label=None, unread=False): + self.setAddress(address) + super(MessageList_AddressWidget, self).__init__(parent, label, unread) + + def _setup(self): + self.isEnabled = True + self.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + self.setType() + + def setLabel(self, label=None): + super(MessageList_AddressWidget, self).setLabel(label) + if label is not None: + return + newLabel = self.address + queryreturn = None + if self.type in ( + AccountMixin.NORMAL, + AccountMixin.CHAN, AccountMixin.MAILINGLIST): + try: + newLabel = unicode( + BMConfigParser().get(self.address, 'label'), + 'utf-8', 'ignore') + except: + queryreturn = sqlQuery( + '''select label from addressbook where address=?''', self.address) + elif self.type == AccountMixin.SUBSCRIPTION: + queryreturn = sqlQuery( + '''select label from subscriptions where address=?''', self.address) + if queryreturn: + for row in queryreturn: + newLabel = unicode(row[0], 'utf-8', 'ignore') + + self.label = newLabel + + def data(self, role): + if role == QtCore.Qt.UserRole: return self.address return super(MessageList_AddressWidget, self).data(role) @@ -386,36 +393,19 @@ class MessageList_AddressWidget( return super(QtGui.QTableWidgetItem, self).__lt__(other) -class MessageList_SubjectWidget(QtGui.QTableWidgetItem, SettingsMixin): +class MessageList_SubjectWidget(BMTableWidgetItem): def __init__(self, parent, subject=None, label=None, unread=False): - super(QtGui.QTableWidgetItem, self).__init__() self.setSubject(subject) - self.setLabel(label) - self.setUnread(unread) - self.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - parent.append(self) + super(MessageList_SubjectWidget, self).__init__(parent, label, unread) - def setLabel(self, label): - self.label = label + def _setup(self): + self.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) def setSubject(self, subject): self.subject = subject - def setUnread(self, unread): - self.unread = unread - def data(self, role): - if role == QtCore.Qt.DisplayRole: - return self.label - elif role == QtCore.Qt.EditRole: - return self.label - elif role == QtCore.Qt.ToolTipRole: - return self.label - elif role == QtCore.Qt.FontRole: - font = QtGui.QFont() - font.setBold(self.unread) - return font - elif role == QtCore.Qt.UserRole: + if role == QtCore.Qt.UserRole: return self.subject return super(MessageList_SubjectWidget, self).data(role) @@ -426,39 +416,22 @@ class MessageList_SubjectWidget(QtGui.QTableWidgetItem, SettingsMixin): return super(QtGui.QTableWidgetItem, self).__lt__(other) -class Ui_AddressBookWidgetItem(QtGui.QTableWidgetItem, AccountMixin): - def __init__(self, text, type=AccountMixin.NORMAL): - super(QtGui.QTableWidgetItem, self).__init__(text) - self.label = text +class Ui_AddressBookWidgetItem(BMAddressWidget): + def __init__(self, label=None, type=AccountMixin.NORMAL): self.type = type - self.setEnabled(True) + super(Ui_AddressBookWidgetItem, self).__init__(label=label) def data(self, role): - if role == QtCore.Qt.DisplayRole: - return self.label - elif role == QtCore.Qt.EditRole: - return self.label - elif role == QtCore.Qt.ToolTipRole: - return self.label + " (" + self.address + ")" - elif role == QtCore.Qt.DecorationRole: - if BMConfigParser().safeGetBoolean( - 'bitmessagesettings', 'useidenticons'): - return avatarize(self.address or self.label) - elif role == QtCore.Qt.FontRole: - font = QtGui.QFont() - return font - elif role == QtCore.Qt.ForegroundRole: - return self.accountBrush() - elif role == QtCore.Qt.UserRole: + if role == QtCore.Qt.UserRole: return self.type return super(Ui_AddressBookWidgetItem, self).data(role) def setData(self, role, value): if role == QtCore.Qt.EditRole: - if isinstance(value, QtCore.QVariant): - self.label = str(value.toString().toUtf8()) - else: - self.label = str(value) + self.label = str( + value.toString().toUtf8() + if isinstance(value, QtCore.QVariant) else value + ) if self.type in ( AccountMixin.NORMAL, AccountMixin.MAILINGLIST, AccountMixin.CHAN): @@ -490,7 +463,6 @@ class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem): def __init__(self, address, label, type): super(Ui_AddressBookWidgetItemLabel, self).__init__(label, type) self.address = address - self.label = label def data(self, role): self.label = self.defaultLabel()